主题
一句话定位
面向内部文档的检索增强问答系统:用户提问 → 向量检索 + 重排 → LLM 生成带引用的回答。
STAR
- S(背景):内部文档散落在多个平台,查资料靠人工翻找,平均要 15 分钟
- T(任务):做一个能引用原文的文档问答系统并在内部试用
- A(行动):负责整体链路设计:解析 → 切分 → 向量化 → 检索 → 重排 → 生成 → 评测
- R(结果):(示例数据)回答引用准确率 92%,平均响应 3s,试用 200 人
架构与关键决策
| 决策点 | 选择 | 为什么不选另一个 |
|---|---|---|
| 向量库 | Milvus | faiss 是库不是服务,多副本/标量过滤要自己造;数据量千万级以下,Milvus 够用且运维简单 |
| 切分 | 结构感知 + 父子块 | 纯固定大小切分会切碎表格和标题层级(详见八股 chunk 策略) |
| 编排 | 自研(约 500 行) | LangChain 抽象太厚,排障要看源码;我们的链路简单且要深度定制重排 |
| 重排 | bge-reranker | 纯向量召回 top10 直接生成时,引用错误率明显偏高 |
可被追问的点清单
- 为什么还要重排?向量检索不行吗? → 向量召回是「语义近似」,rerank 是精排;top50 → top5 后幻觉明显下降(有离线 hit rate 数据支撑)
- 幻觉怎么缓解? → prompt 强制「仅依据引用回答」+ 无检索命中时拒答 + 引用回链到原文块
- 评测怎么做的? → 离线:标注 200 条 QA 对,看 hit rate@5 / MRR;在线:用户点踩率
- 多轮对话的指代怎么处理? → 会话内先做 query 改写(把「它」替换成实体)再检索
- 成本怎么样? → 索引一次性 embedding 成本 + 每次 query 一次 embedding + LLM tokens,要能报出量级
数据与成果
(示例)索引文档 1.2 万篇、日均 300 次问答、点踩率 4%。