RAG 知识库问答实战(1):RAG 是什么与整体架构拆解
很多团队第一次做知识库问答会把任务理解成“把公司文档塞给大模型”。真正的难点却是模型参数里没有刚发布的制度提示窗口也装不下全部资料即便回答碰巧正确用户仍会追问依据在哪里。RAGRetrieval-Augmented Generation检索增强生成解决的不是模型训练问题而是在回答前动态寻找证据把外部知识与问题一起交给模型并保留可核验的来源。一、痛点先把“会聊天”和“有依据地回答”分开纯大模型依靠训练时见过的统计模式生成文本知识有截止日期企业内部资料通常从未进入训练集。微调可以改变语气、格式和行为偏好却不适合每天同步几十份制度训练成本高更新慢也难删除某一条过期知识。RAG 将“知道什么”放在可更新的索引里将“怎样回答”留给生成模型因此文档变动时通常只需重建受影响的索引。一条完整链路分离为离线和在线两部分。离线侧加载 PDF、网页或数据库记录清洗噪声切成可检索片段为片段计算嵌入并写入向量库同时保存文档 ID、页码、版本和权限。在线侧接收问题改写查询召回候选片段按相关性重排拼装上下文调用大模型生成答案最后返回引用。观测系统贯穿两侧记录召回、延迟、成本和失败阶段。二、原理检索器负责找证据生成器负责组织答案嵌入模型把文本映射为向量语义接近的文本通常距离更近。向量检索擅长同义表达但对产品编号、错误码等精确词未必可靠BM25 关键词检索正好互补。生产系统常用混合检索再用重排模型逐对判断“问题—片段”相关性。大模型不应看到整个库而只看到少量高质量候选以及明确的回答约束。下面以词项集合模拟最小检索器。它不是生产嵌入模型却完整展示索引、打分、Top-K 和带来源回答的数据流换成向量库时接口仍可保持一致。fromdataclassesimportdataclassimportredataclass(frozenTrue)classChunk:chunk_id:strsource:strtext:strdeftokens(text:str)-set[str]:returnset(re.findall(r[A-Za-z0-9]|[\u4e00-\u9fff],text.lower()))defscore(query:str,chunk:Chunk)-float:q,dtokens(query),tokens(chunk.text)returnlen(qd)/len(q|d)ifq|delse0.0chunks[Chunk(c1,报销制度.md,差旅报销应在出差结束后十个工作日内提交),Chunk(c2,休假制度.md,年假申请需提前三个工作日提交),Chunk(c3,采购制度.md,采购金额超过五万元需要财务复核),]query出差结束后多久提交报销rankedsorted(chunks,keylambdax:(-score(query,x),x.chunk_id))foriteminranked[:2]:print(f{item.chunk_id}\t{score(query,item):.3f}\t{item.source})bestranked[0]print(fanswer{best.text}[来源:{best.source}#{best.chunk_id}])运行输出c1 0.450 报销制度.md c2 0.091 休假制度.md answer差旅报销应在出差结束后十个工作日内提交 [来源: 报销制度.md#c1]这个例子揭示两个重要契约检索结果必须携带稳定标识和元数据排序相同时必须有确定的次级排序否则离线评测会漂移。生成阶段使用的不是裸文本列表而是带编号的证据包。回答中的引用编号再映射回原文 URL 或页码用户才能复核。三、实现先建立可替换组件和失败边界最小系统可定义五个接口Loader产出文档Splitter产出片段Retriever返回候选Reranker调整顺序Generator基于证据回答。不要一开始把它们写进一个函数。组件边界允许分别测试“没找到”和“找到了却答错”前者优化索引与查询后者优化上下文和提示。容量规划也应从数据流开始。假设每个片段平均 400 字、保留 80 字重叠十万页可能产生数十万向量在线一次检索只取 20 条重排后送 5 条。下列脚本用漏斗方式估算上下文预算并在证据超限时按排序截断。question_tokens24system_tokens180answer_reserve500context_window2048chunks[(c1,310),(c2,280),(c3,460),(c4,390)]budgetcontext_window-question_tokens-system_tokens-answer_reserve selected[]used0forchunk_id,sizeinchunks:ifusedsizebudget:selected.append(chunk_id)usedsizeprint(fevidence_budget{budget})print(fselected{,.join(selected)})print(fused{used}, remaining{budget-used})运行输出evidence_budget1344 selectedc1,c2,c3 used1050, remaining294预算必须预留系统提示、问题、回答和工具协议空间。按字符粗估只适合原型接入具体模型后应使用对应 tokenizer。截断也不能从字符串中间硬切应以片段为单位并尽量保留标题路径让一段话脱离原页后仍有语义。四、踩坑不要用一次漂亮演示替代系统验收常见误区是只观察最终答案。答案错可能因为源文档缺失、解析乱码、切分破坏语义、检索漏召回、重排错序、上下文被截断或模型无视证据。每阶段都要输出可观察事件索引版本、查询、候选 ID 与分数、最终证据、提示版本、模型版本和引用映射。日志应脱敏权限过滤必须发生在返回候选之前不能依赖提示词要求模型“别泄露”。另一个误区是把相似度当可信度。向量库总能返回 Top-K即便所有结果都不相关。因此要设置拒答机制可以用校准过的分数阈值也可以要求重排器和生成器共同判断证据是否充分。阈值不能凭感觉确定要用包含“库内可答”和“库外不可答”的验证集选择。架构设计还要明确数据新鲜度。高频变动的公告可以分钟级增量同步稳定手册则按日扫描索引响应应返回语料版本使用户知道答案依据哪个时间点。原文被删除或权限收紧后片段、向量、关键词索引和缓存都必须同步失效不能只在源系统隐藏文件。五、验证用分层指标建立第一条基线离线验收至少包含检索 RecallK、引用命中率、答案正确性和拒答准确率在线还要看 p50/p95 延迟、空结果率、每次调用 token 与用户追问率。准备二十个真实问题作为起点每题标注可接受答案、证据文档和是否应该拒答。先手工跑通并保存各阶段产物再引入框架能够显著降低“框架能跑但不知道为何错”的排障成本。本篇建立了 RAG 的双流水线和组件边界。下一篇将进入离线链路的第一站把杂乱文档稳定加载、清洗并切成既能召回又能读懂的片段。参考来源Lewis 等Retrieval-Augmented Generation for Knowledge-Intensive NLP TasksMicrosoftAdvanced RAG TechniquesPineconeRetrieval-Augmented Generation 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《RAG 知识库问答实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。

相关新闻

SRC 挖洞半年一分钱没赚到?拆解高奖金漏洞的共性规律与提交技巧

SRC 挖洞半年一分钱没赚到?拆解高奖金漏洞的共性规律与提交技巧

一、现实痛点:多数新人陷入低危漏洞内卷很多新人学习完 Web 漏洞后,第一时间涌入各大 SRC 平台提交漏洞,忙活数月奖金寥寥无几,甚至大量漏洞被判定无效、驳回。 本质原因是新人长期盯着 XSS、目录遍历这类基础漏洞,竞争…

2026/10/13 5:39:03 阅读更多 →
法治综评空白怎么办?法治科普筑牢德育成长根基

法治综评空白怎么办?法治科普筑牢德育成长根基

法治综评空白怎么办?法治科普筑牢德育成长根基法治素养是思想品德综评的重要组成部分,也是很多学生容易失分的隐形板块。多数学生缺少法治学习渠道,法治实践素材空白,导致德育档案不够饱满,综评评级难以提升。常态化的…

2026/10/13 5:39:03 阅读更多 →
心理综评容易失分?常态化心理培育助力身心成长

心理综评容易失分?常态化心理培育助力身心成长

心理综评容易失分?常态化心理培育助力身心成长在综评身心健康维度中,心理健康是极易被忽视的细分板块,很多学生只注重体育锻炼,完全忽视心理素养积累,导致该板块内容单薄、评级偏低,莫名丢失综评分数。常态…

2026/10/6 20:31:48 阅读更多 →

最新新闻

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

简介:这是一份数据库课程设计完整参考项目——某商店进销存管理系统,面向计算机类专业学生、数据库初学者及需要完成课设的开发者,用于解决数据库原理课程设计中从系统分析到数据库实现的全流程问题。资源为RAR压缩包,共3个文件&a…

2026/10/13 5:38:34 阅读更多 →
轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

周五下午,我盯着屏幕上那个快要跑完的批处理任务,心里很清楚:今天这已经是第七次重复同样的操作了。从压缩日志、生成报表、按规则归档,到清理临时目录、把结果文件挪到共享目录,每一步单独看都不复杂,合在…

2026/10/13 5:38:34 阅读更多 →
Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

1. 项目定位:为什么是 Spring Boot AI 对话接口1.1 HR 政策问答机器人的核心需求拆解这个项目叫“AI全栈12-02”,名字里已经透露出完整的信息:它属于一条 AI 全栈学习路线的中期实践,前一步多半是把模型 API 跑通,从这…

2026/10/13 5:38:34 阅读更多 →
CS2启动器Overflow闪退根源与显存调度修复指南

CS2启动器Overflow闪退根源与显存调度修复指南

1. 问题本质:这不是“闪退”,而是内存管理机制被触发的保护性中断 “CS2更新后Valve界面闪退、Overflow溢出错误”——这个标题里藏着一个被广泛误读的关键点。很多用户一看到“闪退”就下意识归因于显卡驱动或系统兼容性,甚至反复重装客户端…

2026/10/13 5:38:34 阅读更多 →
x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

简介:x64dbg 2025版逆向调试工具,面向软件安全分析人员、恶意代码逆向工程师以及CTF竞赛爱好者,用于在缺少源码、难以静态阅读的场景下开展动态调试,覆盖断点控制、单步跟踪、内存与寄存器监控、异常处理等核心操作,并…

2026/10/13 5:38:34 阅读更多 →
大厂Python编码规范的核心要点与工程实践

大厂Python编码规范的核心要点与工程实践

1. 为什么大厂如此重视Python编码规范?第一次接触Google的Python代码时,我盯着那些整齐划一的import分组和严格的命名规则发了半天呆。当时很不理解为什么要把时间花在这些"表面功夫"上,直到后来自己维护了三个月前的代码才恍然大悟…

2026/10/13 5:37:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →