
AI全栈知识06RAG实战 - 检索增强生成写在前面上一篇我们知道了RAG是开卷考试先搜资料再让AI参考回答。但具体怎么搜为什么不能用百度那种关键词搜索向量到底是什么这篇文章帮你把RAG的每个环节彻底搞清楚。学完后你能理解FastGPT内部在做什么也能自己动手搭一个简单的知识库问答。为什么关键词搜索不行假设你的知识库里有这样一段文档“当容器内存使用超过limit时K8s会触发OOMKilled终止Pod”用户问的问题是“为什么Pod一直重启”搜索方式能找到这段文档吗原因关键词搜索找不到用户问题里没有OOMKilled“内存”limit这些词向量检索能找到虽然字面不同但Pod重启和OOMKilled终止Pod说的是同一件事核心区别关键词搜索看有没有相同的字向量检索看说的是不是同一件事生活类比你去图书馆找书关键词搜索 在电脑上按书名搜。你输入Pod重启系统只找标题里有Pod重启这四个字的书。找不到任何结果。向量检索 你跟图书管理员说我想了解容器为什么会崩溃。管理员理解了你的意思帮你找出了好几本相关的书虽然标题是OOMKilled故障处理“内存管理最佳实践”字面上跟你说的不一样但内容都相关。向量检索就像一个懂你意思的图书管理员。向量是什么一句话向量就是一组数字用来表示一段文字的语义位置。怎么理解想象一个巨大的语义空间每段文字在里面都有一个坐标点。意思相近的文字坐标点挨得近意思无关的文字坐标点离得远。Pod一直重启 → [0.12, -0.34, 0.78, 0.56, ...] OOMKilled导致容器终止 → [0.15, -0.31, 0.75, 0.52, ...] ← 坐标很接近 今天天气真好 → [0.92, 0.44, -0.61, 0.08, ...] ← 坐标差很远这组数字不是人写的是Embedding模型专门的小模型算出来的。你只需要把文字丢给它它返回一组数字。文档切分 - 把大文档变成小段为什么要切公司文档可能几十页甚至几百页。不能整篇塞给模型Token有上限也太贵所以要切成小段。类比你不会把整本字典塞给别人让他找答案而是翻到相关的那一页递给他。切多大合适切分大小优点缺点太小100字检索精准上下文不够模型看不懂太大5000字上下文完整检索不精准Token浪费多适中500-1000字平衡精准和完整通常最佳选择切分时的重叠技巧最怕什么关键信息正好被切在两段的交界处两边各一半哪边都不完整。解决方法相邻的段之间留一些重叠内容。原文2500字AAAAABBBBBCCCCCDDDDDEEEEE 不带重叠可能丢信息 段1AAAAA 段2BBBBB ← 如果关键信息跨AB边界两段都不完整 段3CCCCC 带重叠overlap100字 段1AAAAA BBB的前100字 段2BBBBB CCC的前100字 ← 关键信息至少在一段里是完整的 段3CCCCC DDD的前100字Embedding模型 - 把文字变成向量它是什么Embedding模型是一个专门把文字变成数字向量的小模型。注意它不是大语言模型。它不会对话不会生成回答。它只做一件事输入一段文字输出一组数字。Embedding模型LLM大语言模型做什么文字 → 一组数字文字 → 文字回答输出[0.12, -0.34, 0.78, …]“Pod Pending通常是因为…”大小小几百MB大几GB到几十GB用在RAG哪步建库时查询时转向量最后一步生成回答类比Embedding模型是翻译官把人话翻译成机器能比较的数字。LLM是答题者看着参考资料写答案。常见的Embedding模型模型维度来源费用text-embedding-3-small1536OpenAI收费bge-large-zh1024智源免费开源m3e-base768社区免费开源通义千问Embedding1536阿里有免费额度向量数据库 - 存储和检索向量为什么需要专门的数据库操作普通数据库MySQL向量数据库精确查找WHERE name xxx不擅长相似度查找做不到“找到跟这个向量最接近的前5个”适合场景结构化数据语义搜索常见向量数据库名称特点适合场景Chroma轻量pip install就能用学习、开发、小规模Milvus高性能分布式生产环境QdrantRust写的性能好中等规模pgvectorPostgreSQL插件已有PG的团队FAISSFacebook的库嵌入Python代码中用学习用Chroma生产用Milvus。你们公司的FastGPT大概率用的是Milvus或pgvector。相似度怎么算两个向量之间用余弦相似度计算最常用值范围-1 到 11 语义完全相同0 完全无关-1 语义完全相反Pod重启 vs OOMKilled终止容器 → 相似度 0.92很相关 Pod重启 vs 今天天气真好 → 相似度 0.05无关你不需要自己算。向量数据库帮你算好返回按相似度排序的结果。完整流程串一遍阶段一建知识库一次性做好你的运维文档10000字 ↓ 第1步切分chunk_size500, overlap100 20个文档段 ↓ 第2步每段调Embedding模型 20个向量 ↓ 第3步存入向量数据库 知识库建好了阶段二回答问题每次用户提问都做用户Pod一直Pending怎么办 ↓ 第1步问题也转成向量 查询向量 ↓ 第2步在向量数据库中找最相似的3段 返回段7调度问题、段12资源不足、段15节点亲和性 ↓ 第3步拼装Prompt 参考以下资料回答[段7][段12][段15]。用户问Pod一直Pending怎么办 ↓ 第4步调LLM生成回答 Pod Pending通常有以下原因1.资源不足 2.节点选择器不匹配 3.PVC未绑定... ↓ 返回给用户RAG的关键参数参数含义典型值影响chunk_size每段切多大500-1000字太小丢上下文太大不精准chunk_overlap重叠多少50-200字防止关键信息被切断top_k检索返回几段3-5段太少可能漏信息太多浪费Tokensimilarity_threshold相似度阈值0.7低于此值的不要不相关面试怎么说如果被问RAG是什么你了解它的原理吗RAG是检索增强生成。核心思路是先从知识库中检索相关文档再让大模型参考这些文档生成回答。具体流程文档先切分成小段用Embedding模型转成向量存到向量数据库。用户提问时问题也转成向量通过余弦相似度在向量库中找到最相关的几段文档拼到Prompt里让模型参考回答。关键参数有chunk_size控制切分粒度、top_k控制检索几段、overlap防止信息切断。我们公司的FastGPT就是RAG架构我负责它的部署和运维。延伸思考问题答案RAG和微调哪个好RAG灵活文档随时更新微调效果更好但成本高。大多数企业先用RAGRAG搜到的文档不相关怎么办调高similarity_threshold过滤低质量结果或优化文档切分策略文档更新了怎么办重新切分重新Embedding更新向量数据库增量更新top_k设多少好3-5段。太多会浪费Token且干扰模型太少可能漏掉关键信息小结本篇核心收获向量检索 关键词搜索因为它理解语义不只是匹配字面Embedding模型把文字变成向量一组数字语义相近的向量距离近文档切分要带重叠overlap防止关键信息被切断向量数据库专门做相似度搜索学习用Chroma生产用Milvus完整流程切分 → Embedding → 存库 → 查询时检索 → 拼Prompt → LLM回答下一篇预告AI全栈知识07向量数据库 - Milvus/Chroma实战下一篇我们将动手用Chroma在本地跑通一个向量检索搭建一个简单的知识库问答Demo理解Milvus在生产中怎么部署参考链接RAG论文Lewis et al.LangChain RAG教程Chroma官方文档Milvus官方文档通义千问Embedding API