
第 12 课 | RAG 检索增强生成让 LLM 基于真实知识回答前 3 课我们分别搭建了嵌入、向量数据库、Rerank 三个组件。这节课我们把它们串起来构建第一个完整的 RAG 系统——让 LLM 基于真实知识回答问题告别幻觉。一、什么是 RAG1.1 LLM 的两个致命问题LLM 很强大但有两个致命问题知识截止日期训练数据有截止时间训练后的新知识它不知道幻觉Hallucination遇到不知道的它会编造一个看起来很合理的答案比如你问“你们的智能手表 Ultra 有什么功能” 纯 LLM 会回答“智能手表通常具有心率监测、运动追踪、消息通知等功能…”看起来对但这是泛泛而谈不是基于你的实际产品。如果你问它一个具体产品“扫地机器人 S8 的吸力是多少” 纯 LLM 回答不了——它不知道。1.2 RAG 的解决方案RAGRetrieval Augmented Generation检索增强生成的核心思想很简单先检索再回答。用户问题 → 从知识库检索相关文档 → 把文档和问题一起给 LLM → LLM 基于文档回答类比LLM 是学生RAG 是开卷考试。不给资料纯 LLM学生只能凭记忆回答给资料RAG学生可以查阅资料后给出准确答案。1.3 业务价值在竞品监控 Agent 中RAG 的价值非常直接场景纯 LLMRAG 增强“竞品 X 最近有什么动作”泛泛回答可能编造基于最新爬取的新闻回答“我们的价格和竞品比怎么样”不知道没有数据基于数据库中的价格对比“最近一周有什么行业动态”训练数据截止了基于实时数据回答二、RAG 架构全景在线阶段问答离线阶段知识入库原始文档文本分块BGE 嵌入ChromaDB 存储用户问题BGE 嵌入ChromaDB 检索粗排 Top-20BGE-Reranker精排 Top-5构建 Prompt问题 文档LLM 生成基于文档回答最终答案图 1RAG 完整架构本节课串联的组件BGE-large-zh第 9 课嵌入模型ChromaDB第 10 课向量数据库BGE-Reranker第 11 课精排模型LLMClient第 7 课统一 LLM 客户端三、RAG 核心流程实现code/rag_qa.py实现了完整的 RAG 系统核心类RAGSystem封装了三个关键方法3.1 检索模块defretrieve(self,query:str)-list[dict]:# 阶段 1粗排ChromaDB 向量检索coarseself.collection.query(query_texts[query],n_resultsself.recall_k,# 默认 20)# 阶段 2精排BGE-Rerankerpairs[[query,doc]fordocincoarse[documents][0]]scoresself.reranker.compute_score(pairs,normalizeTrue)# 过滤低分 排序results[rforrinresultsifr[score]self.similarity_threshold]returnresults[:self.top_k]3.2 Prompt 构建这是 RAG 最关键的部分——如何把检索结果有效地嵌入 Promptdefbuild_prompt(self,query:str,docs:list[dict])-str:context_parts[]fori,docinenumerate(docs,1):context_parts.append(f[{i}]{doc[metadata][name]}({doc[metadata][category]})\nf{doc[document]}\nf 相关性:{doc[score]:.2f})context\n\n.join(context_parts)promptf你是一个专业的商品顾问。请根据以下商品信息回答用户的问题。 ## 已知商品信息{context}## 回答要求 1. 只基于上述商品信息回答不要编造信息 2. 如果上述信息不足以回答问题请明确说明 3. 回答时引用具体的商品名称 4. 如果合适可以对比多个商品的特点 ## 用户问题{query}## 你的回答returnpromptPrompt 的设计要点明确信息来源用## 已知商品信息分隔让 LLM 知道哪些是事实约束行为要求只基于上述信息回答防止幻觉引用要求要求引用具体商品名让 LLM 的回答可追溯降级处理如果信息不足要求 LLM 明确说明3.3 问答接口defask(self,query:str,verbose:boolTrue)-dict:docsself.retrieve(query)ifnotdocs:return{answer:抱歉在知识库中没有找到相关信息...,sources:[]}promptself.build_prompt(query,docs)answerself.llm.chat(prompt,temperature0.3)return{query:query,answer:answer,sources:[{name:d[metadata][name],score:d[score]}fordindocs],}四、RAG vs 纯 LLM 对比我们用同一个问题在两种模式下测试问题“你们的智能手表有什么功能”维度纯 LLMRAG 增强回答内容“智能手表通常具有心率监测、运动追踪…”“智能手表 Ultra 支持血氧、心率、睡眠监测100 运动模式续航 14 天5ATM 防水支持独立通话”准确性泛泛而谈不一定准确基于实际产品数据100% 准确具体性没有具体型号引用了具体产品名和参数可追溯无法追溯可追溯到来源文档幻觉风险高低有约束结论RAG 把 LLM 从凭记忆回答变成了查阅资料回答准确性和可靠性大幅提升。五、RAG 效果优化5.1 检索参数调优参数推荐值说明recall_k20粗排召回数太少漏召回太多 Rerank 慢top_k5精排返回数太多 Prompt 过长太少信息不足similarity_threshold0.3低于此分数的文档不纳入 Prompt5.2 Prompt 优化技巧在实际测试中我们发现了几个有效的 Prompt 优化技巧编号文档[1] [2] [3]让 LLM 更容易引用标注相关性显示相关性: 0.96让 LLM 知道哪些文档更可靠明确禁止编造最好加上如果信息不足说’不知道’控制 temperatureRAG 场景建议temperature0.3降低随机性5.3 降级策略当检索不到相关内容时相似度都低于阈值有三种处理方式# 策略 1直接拒绝回答推荐ifnotdocs:return抱歉在知识库中没有找到相关信息。# 策略 2降级为纯 LLM不推荐可能幻觉ifnotdocs:returnllm.chat(query)# 策略 3提示用户换个问法ifnotdocs:return未找到相关信息请尝试换个方式提问。六、实战商品知识库问答运行code/rag_qa.py你就能体验完整的 RAG 问答用户: 我想买一个适合在办公室长时间使用的设备有什么推荐 检索到 3 篇相关文档: [1] 人体工学办公椅 (家居办公) - 0.96 [2] 升降桌 E5 (家居办公) - 0.91 [3] 护眼台灯 L1 (家居办公) - 0.73 助手: 根据您的需求我推荐以下办公设备 1. **人体工学办公椅** — 这款椅子专为长期办公设计4D 可调扶手、 135° 后仰、自适应腰靠、透气网布座垫能有效缓解腰背疲劳。 2. **升降桌 E5** — 电动升降办公桌双电机驱动支持坐站交替健康办公。 4 档记忆高度LED 触控面板避免久坐带来的健康问题。 3. **护眼台灯 L1** — 国 AA 级照度Ra98 高显色无频闪无蓝光危害 适合长时间阅读和办公保护视力。 建议您优先考虑人体工学椅和升降桌的组合这是长时间办公最有效的配置。 来源: 人体工学办公椅, 升降桌 E5, 护眼台灯 L1七、小结与预告这节课我们完成了 RAG 系统的端到端搭建——从嵌入到检索从 Rerank 到 LLM 生成形成了一个完整的知识问答闭环。核心收获RAG 检索 生成先检索相关文档再让 LLM 基于文档回答四个组件协同BGE → ChromaDB → BGE-Reranker → LLMClientPrompt 是关键好的 Prompt 约束 LLM 行为防止幻觉RAG 比纯 LLM 更准确基于真实数据回答具体、可追溯从下一节课开始我们将进入LangChain的世界——用框架来简化 Agent 开发不再从头造轮子。我们下一课见。系列教程导航上一篇第 11 课 | Rerank 模型部署粗排 精排双重保险下一篇第 13 课 | LangChain 入门Chain 与 Prompt 模板本系列共 50 课持续更新中。关注我不迷路。