先把几个概念说清楚:Embedding、RAG、SSE 和向量数据库
StarryRAG 里有不少技术概念:Embedding、向量数据库、RAG、重排、Prompt、SSE。第一次接触时,可能会觉得有点抽象,但其实它们各自解决不同问题。把职责拆开以后,整个系统就不难理解了。
1. 大模型负责什么
大模型擅长根据上下文生成自然语言。它可以总结、解释、改写,也可以根据资料组织一段回答。
但它不应该被当成博客数据库。模型训练数据不一定包含最新文章,也不知道某个个人博客里的全部内容。即使它“听起来知道”,也可能是在根据常见表达猜测。
StarryRAG 把模型放在回答阶段:
检索到的文章片段 + 用户问题
-> 放入提示词
-> 大模型生成回答模型负责组织语言,事实资料由博客知识库提供。
2. 什么是 Embedding
Embedding 可以理解成一种语义编码。它把一段文字转换成一串浮点数,也就是向量:
"项目使用 Qdrant 保存文章向量"
-> [0.12, -0.08, 0.31, ...]这串数字单独看没有意义。它的用途是比较两段文字在语义空间中的距离。
例如:
问题:这个项目用了什么向量数据库?
文章:项目使用 Qdrant 保存文章向量。两段话的字面表达不同,但语义接近。Embedding 检索可以把文章片段找出来。
Embedding 不负责写回答,也不负责判断事实。它只负责把文本变成可以比较的表示。文章入库和用户查询必须使用同一个模型,否则两边的向量不在同一个空间里。
3. 什么是向量数据库
普通数据库擅长精确查询:
SELECT * FROM article WHERE title = 'RAG 实践';向量数据库擅长相似度查询:
给定一个问题向量
-> 找出距离最近的文章向量Qdrant 就是 StarryRAG 使用的向量数据库。它保存三类信息:
文章片段的向量。
文章片段的正文。
source、title 等元数据。
只保存向量是不够的。检索到文章后,系统还需要正文放进提示词,也需要 source URL 告诉用户答案来自哪里。
向量数据库不会替你决定“这篇文章一定相关”。它通常只返回候选结果,候选是否足够好,还要看切分、相似度阈值和重排。
4. 什么是 RAG
RAG 是 Retrieval-Augmented Generation 的缩写,中文通常译作“检索增强生成”。
它的基本思路是:
Retrieval:先从外部知识库检索资料
Augmented:把资料放进模型上下文
Generation:让模型根据资料生成回答StarryRAG 的 RAG 流程是:
用户问题
-> 问题 Embedding
-> Qdrant 检索文章片段
-> RRF 重排
-> 拼接 source 和正文
-> 发送给大模型
-> SSE 流式返回RAG 和“训练调优一个模型”不是一回事。RAG 不修改模型参数,知识更新时只需要重新抓取、切分和向量化文章。
这也是它适合个人博客的原因:文章会变化,模型本身不需要跟着重新训练。
5. RAG 为什么还需要切分
一整篇文章直接向量化,粒度太粗。用户问的是某个具体问题,系统却只能返回整篇文章,相关信息会被大量无关内容稀释。
文本切分就是把文章拆成多个片段:
一篇文章
-> 标题和引言
-> 配置说明
-> 代码片段
-> 部署记录每个片段单独生成向量,检索时更容易找到局部内容。
但切得太碎也会出问题。一个结论可能被拆到两个片段里,单独拿到其中一段时,模型缺少上下文。因此 StarryRAG 使用固定大小和重叠区域,让相邻片段保留一部分共同内容。
切分参数不是越小越好,也不是越大越好。应该用真实问题测试:用户问文章标题、配置项、代码类名时,召回结果是否仍然完整。
6. 什么是重排
向量检索返回的是候选列表。候选列表中可能有语义相近、但没有直接回答问题的片段。
重排会再次检查这些候选,调整它们的顺序。StarryRAG 的默认策略是 RRF,它把向量相似度排名和词法命中排名合并:
向量排名:关注整体语义
词法排名:关注类名、路径、专有名词
RRF:合并两个排名重排不是再次生成答案。它仍然属于检索阶段,作用是让后面的提示词拿到更合适的上下文。
7. 什么是 Prompt
Prompt 可以理解成给模型的完整输入,不只是用户最后发来的那句话。
StarryRAG 的 Prompt 至少包含:
系统规则
-> 只能依据参考资料回答
-> 没有资料时要说明没有找到
参考资料
-> source URL
-> 文章片段
对话上下文
-> 摘要
-> 最近几轮消息
当前问题Prompt 的作用是规定模型“根据什么回答”和“遇到未知内容怎么办”。它不能替代检索,也不能保证模型永远不出错。真正有用的 Prompt 通常比较具体,少写口号,多写边界和格式。
8. 什么是 SSE
SSE 是 Server-Sent Events,服务端推送事件。它建立一条 HTTP 长连接,让服务器可以不断把事件发给浏览器。
普通请求更像这样:
浏览器发请求
-> 服务器处理很久
-> 一次性返回完整结果SSE 更像这样:
浏览器发请求
-> 服务器发送第一段
-> 服务器发送第二段
-> 服务器发送更多片段
-> 服务器发送 doneStarryRAG 使用 SSE 把大模型的增量结果逐步展示出来。SSE 只解决传输和展示过程,不会让模型本身变快。反向代理缓冲、浏览器绘制节奏、前端事件解析,任何一层处理不当,页面都可能看起来像一次性返回。
9. 缓存、限流和熔断分别是什么
这三个词经常一起出现,但目的不同。
缓存是重复利用已经得到的结果。StarryRAG 会保存回答缓存和会话摘要。精确问题可以直接命中缓存,语义缓存则需要额外一次 Embedding 查询,所以默认关闭。
限流是限制单位时间内允许通过的请求数,避免模型接口和 Embedding 接口被连续请求打满。
熔断是上游持续失败时暂时停止继续调用。它让系统从“每个请求都等待失败”变成“短时间内直接走兜底”。
可以把它们放在一条请求链上理解:
请求
-> 限流:现在能不能进来
-> 缓存:以前有没有结果
-> 熔断:上游是否值得继续调用
-> 检索和生成
-> 异步保存结果