给一堆文档做个问答机器人:一次 RAG 实践记录
RAG(检索增强生成)这个词听着唬人,本质很简单:先在资料里找到相关内容,再把内容连同问题一起交给大模型回答。这样模型就不用"凭记忆"瞎编,而是照着你给的材料说。
整体流程就五步
- 切片:把长文档切成若干小段(通常 300–800 字一段)
- 向量化:用嵌入模型把每段文字转成一串数字(向量)
- 存起来:把向量放进向量库,同时保留原文
- 检索:用户提问时,把问题也转成向量,找出最相似的几段原文
- 生成:把这几段原文和问题一起交给大模型,让它基于材料作答
真正影响效果的三个地方
1. 切片方式比想象中重要
一开始我按固定字数硬切,结果经常把一段完整的说明拦腰截断,检索回来的片段上下文不全,答非所问。后来改成按标题层级切——先把文档按小节拆开,只有小节太长时才继续切,并让相邻片段保留一小段重叠。效果立刻好了一截。
2. 检索回来几条,需要实测
返回 3 条还是 8 条,没有标准答案。太少会漏掉关键信息,太多会把无关内容混进来稀释答案。我的做法是按自己的真实问题测二十来条,从 3 开始往上调,找到效果不再变好的那个点。
3. 要求它"只根据资料回答"
这一步是关键。提示词里明确写:"请只根据以下资料回答;资料中没有的内容,直接说明'资料中未提及',不要自行补充。" 加上这句之后,答非所问和编造的情况明显变少。
对于严肃场景(政策、制度、技术参数),"承认不知道"远比"编一个像样的答案"有价值。
踩过的坑
- 扫描件 PDF 直接丢进去:识别出来是乱码,等于喂了垃圾。先做文字识别(OCR)再入库。
- 表格被切成碎片:表格按行切会丢表头。遇到表格多的文档,考虑单独处理或整表入库。
- 文档更新后忘了重建:资料改了但向量库没更新,答的还是旧内容,这是最容易被投诉的地方。
- 中文嵌入模型没选对:通用模型对中文的支持参差,选专门优化过中文的,检索质量差别很大。
效果期望要合理
它能做好"资料里有的,快速找到并说清楚",做不好"资料里没有的,帮我推导出来"。如果你的期待是后者,那不是 RAG 能解决的。
小结
这套东西的门槛主要在工程细节,不在概念。先把流程跑通,再花时间调切片和检索,最后加上"只根据资料回答"的约束,基本就能用了。