【大模型】传统 RAG+向量召回

65 阅读2分钟

传统 RAG + 向量召回 简单解释

“把文档切成小段→变成向量→扔向量数据库→用户问题也变成向量→按相似度 Top-K 捞回→塞给 LLM 生成答案”,全程靠向量距离找相关文本,不碰图、不碰 SQL、不碰关键词。

为什么非要“向量召回”

  • 大模型上下文窗口有限(4 k/8 k/128 k token),不能把整个知识库全塞进去。
  • 传统关键词检索(BM25/ES)只能字面匹配,同义词、语法变换就翻车。
  • 向量语义检索可以把“狗咬人”和“宠物攻击事件”映射到相近空间,召回率↑ 30–50%。

常规做法

1、切块(Chunking)

  • 按固定 token 数(512/1 k)或语义边界(句号、段落标题)切。
  • 保留 metadata:文件名、页码、章节、时间戳。

2、向量化(Embedding)

  • 模型:text-embedding-ada-002、bge-large-zh、m3e-base 等。
  • 输出:1536/768 维 float32 向量。
  • 批量:GPU 一秒 2 k–5 k 段。

3、入库(Vector DB)

  • 选型:FAISS(本地)、Milvus、Pinecone、Weaviate、Qdrant、PGvector。
  • 索引:IVF-PQ / HNSW,召回率 95 % 时延迟 5–20 ms。

4、查询(Retrieval)

  • 用户问题 → 同一模型 embed → 向量 q。
  • 在向量空间找 Top-K(K=4/10/20)最邻近块。
  • 可加后置过滤器:时间范围、文件类型、权限标签。

5、生成(Generation)

  • LLM 生成答案,附引用编号,可返回 source 链接。

痛点

  • 多跳需拼接:“张三 2022 年所在的部门负责人是谁?” → 要先找“张三→部门→负责人”,向量只能分别召回两段,容易丢中间链接。
  • 数值过滤:“找出 2023 年以后股价 >50 USD 的公司年报” → 向量无法做范围过滤,得靠后置 SQL,召回段数爆炸。
  • 一致性与可追溯:向量相似度是黑盒,很难解释“为什么选这段”;图查询可以把路径画出来。
  • 更新频繁:向量索引每次插入/删除都要重建部分 HNSW 图,高频实时成本高于 KV。