1 StarryRAG所用到的一些技术概念

1 StarryRAG所用到的一些技术概念

先把几个概念说清楚:Embedding、RAG、SSE 和向量数据库 StarryRAG 里有不少技术概念:Embedding、向量数据库、RAG、重排、Prompt、SSE。第一次接触时,可能会觉得有点抽象,但其实它们各自解决不同问题。把职责拆开以后,整个系统就不难理解了。

先把几个概念说清楚: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 更像这样:

浏览器发请求
  -> 服务器发送第一段
  -> 服务器发送第二段
  -> 服务器发送更多片段
  -> 服务器发送 done

StarryRAG 使用 SSE 把大模型的增量结果逐步展示出来。SSE 只解决传输和展示过程,不会让模型本身变快。反向代理缓冲、浏览器绘制节奏、前端事件解析,任何一层处理不当,页面都可能看起来像一次性返回。

9. 缓存、限流和熔断分别是什么

这三个词经常一起出现,但目的不同。

缓存是重复利用已经得到的结果。StarryRAG 会保存回答缓存和会话摘要。精确问题可以直接命中缓存,语义缓存则需要额外一次 Embedding 查询,所以默认关闭。

限流是限制单位时间内允许通过的请求数,避免模型接口和 Embedding 接口被连续请求打满。

熔断是上游持续失败时暂时停止继续调用。它让系统从“每个请求都等待失败”变成“短时间内直接走兜底”。

可以把它们放在一条请求链上理解:

请求
  -> 限流:现在能不能进来
  -> 缓存:以前有没有结果
  -> 熔断:上游是否值得继续调用
  -> 检索和生成
  -> 异步保存结果

LICENSED UNDER CC BY-NC-SA 4.0
Comment