RAG检索增强生成实战教程:从零搭建一个会“查资料”的智能问答系统

📅 2026/7/1 4:27:08
RAG检索增强生成实战教程:从零搭建一个会“查资料”的智能问答系统
引言你有没有遇到过这样的困境让大语言模型回答一个简单的问题它却信誓旦旦地给出了错误答案甚至凭空捏造这就是大模型“幻觉”的典型表现。为了让大模型变得靠谱我们需要让它拥有查阅外部知识库的能力——RAGRetrieval-Augmented Generation检索增强生成就是为了解决这个问题而生。简单说RAG 的工作流程就像一位严谨的作者先检索相关文档再基于这些资料回答问题。它不依赖模型内部的记忆而是“依据资料说话”因此能够显著提升回答的准确性和时效性。本文将通过一个完整的实战项目带你从零搭建一个基于 RAG 的智能问答系统手把手写出可运行的代码让你彻底掌握这一热门技术。核心概念RAG 是如何工作的在动手之前我们必须先理解 RAG 背后的几个关键组件1. 文档加载与分割我们需要先把各种格式的文档PDF、TXT、网页读入内存然后切分成一个个小段落。为什么要切分因为检索时我们找的是与问题最相关的“片段”而不是整本书同时切分后的片段更容易被嵌入模型转化为向量。2. 嵌入Embedding将文本片段转换成固定长度的浮点数向量。语义相近的文本它们的向量在空间中的距离也会更近。这个神奇的过程通过嵌入模型比如 OpenAI 的text-embedding-ada-002完成。有了向量我们就可以用数学方法衡量“相关度”。3. 向量数据库专门存储和查询向量的数据库。收到用户问题后我们把问题也向量化然后在向量数据库中搜索最相似的几个文档片段Top-k。常用的向量数据库有 Chroma、FAISS、Weaviate 等。4. 大模型生成回答将检索到的相关片段连同用户问题一起作为 Prompt 输入给大语言模型如 GPT-3.5/4由模型综合这些参考资料生成最终答案。这样生成的回答既有依据又能避免凭空编造。整个流程如下图所示用户提问 → 问题向量化 → 向量数据库检索 → 得到相关片段 → 拼接Prompt → 大模型回答理解这些概念后我们开始写代码实战示例构建本地知识库问答系统我们使用 Python LangChain OpenAI Chroma 来实现。LangChain 提供了非常简洁的链式调用接口让 RAG 开发变得像搭积木一样简单。环境准备请确保已安装以下库pip install langchain langchain-openai chromadb pypdf tiktoken如果使用 OpenAI 的模型还需要设置 API Keyimport os os.environ[OPENAI_API_KEY] 你的API密钥 # 或通过 dotenv 等方式设置第一步加载并切分文档这里我们用一个简单的 txt 文件模拟本地知识库。实际项目中你可以换成 PDF、网页等。from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import TextLoader # 1. 加载文档 loader TextLoader(knowledge.txt, encodingutf-8) # 假设有一个 knowledge.txt 文件 documents loader.load() # 2. 将文档切分成段落chunk_size500表示每段约500字符overlap50让段落之间有重叠避免语义被切断 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, length_functionlen, separators[\n\n, \n, 。, , , , , ] ) texts text_splitter.split_documents(documents) print(f文档被切分为 {len(texts)} 个片段)说明切分策略对检索效果影响很大较小的 chunk 能更精准匹配但可能丢失上下文较大的 chunk 则相反。实际中需要根据知识库内容反复调整。第二步生成嵌入并存入向量数据库from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # 使用 OpenAI Embeddings 将文本转为向量 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 创建 Chroma 向量库将切分后的文本向量化并存储 vectorstore Chroma.from_documents( documentstexts, embeddingembeddings, persist_directory./chroma_db # 持久化存储下次可直接加载 ) print(向量数据库构建完成)如果想复用已有的向量库可以这样加载vectorstore Chroma( persist_directory./chroma_db, embedding_functionembeddings )第三步创建检索问答链LangChain 提供了RetrievalQA链能自动完成“检索 生成”的步骤。from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI # 创建检索器设置检索返回最相关的3个片段 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 使用 GPT-3.5-turbo 作为生成模型 llm ChatOpenAI(model_namegpt-3.5-turbo, temperature0) # 构建 RAG 链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 简单地将所有检索到的片段拼接到 prompt retrieverretriever, return_source_documentsTrue # 同时返回源文档方便查看引用来源 )chain_type还有其他选项比如map_reduce、refine适合片段较多时的情况。stuff最简单高效但受限于模型的上下文长度。第四步提问并查看结果# 发起提问 question 什么是检索增强生成 result qa_chain.invoke({query: question}) print(回答, result[result]) print(\n引用来源) for i, doc in enumerate(result[source_documents]): print(f来源 {i1}: {doc.page_content[:200]}...)运行后你将看到模型基于本地知识库生成的专业回答并附带引用的原文片段。完整运行示例为了让你能直接体验我准备了一个简单的knowledge.txt文件内容你可以直接保存为本地文件检索增强生成RAG是一种结合信息检索与自然语言生成的技术框架。 在RAG流程中系统首先从外部知识库中检索与用户问题相关的文档片段然后将这些片段作为上下文输入给语言模型最后生成回答。 相比于仅依赖内部参数的传统大模型RAG能够有效降低幻觉提升回答的准确性和可解释性。 RAG广泛应用于智能客服、知识问答、辅助写作等场景。将以上代码整合到一个 Python 脚本中并运行即可看到完整的 RAG 效果。常见问题与避坑指南在开发 RAG 应用时你可能会踩到以下坑提前了解能节省大量调试时间1. 文档切分尺寸如何选择如果要保证事实细节不丢失建议 chunk 偏小300~500字符overlap 保留50~100字符如果答案需要较长的上下文推理可适当增大 chunk800~1000字符可以使用 LangChain 的TokenTextSplitter按 token 数切分对模型更友好。2. 检索返回的片段不精准怎么办确保嵌入模型的质量text-embedding-3-small性价比高text-embedding-3-large效果更好尝试增加检索数量k但过多会引入噪声可以采用多路检索策略Hybrid Search结合关键词检索BM25和向量检索LangChain 提供了EnsembleRetriever对检索结果进行重排序Re-rank进一步提升 Top-k 片段的准确性。3. 生成的回答中出现幻觉还是存在即使 RAG 提供了参考资料模型有时仍会“固执”地编造信息。可以通过以下方式缓解- 在 Prompt 中明确要求“如果不知道就说不知道不要编造”- 设置模型的temperature0提升确定性和一致性- 使用专门的 Prompt 模板限定模型只能根据提供的资料回答不能引入外部知识。4. 向量数据库的选择开发测试用 Chroma轻量、无需部署生产环境若数据量大推荐使用 Milvus、Weaviate 或云服务Pinecone等它们对索引和查询做了大量优化。5. 嵌入模型的开销OpenAI 嵌入模型按照 token 计费大规模文档向量化成本不低。如对中文场景可以考虑使用开源嵌入模型如text2vec-large-chinese或bge-large-zh部署在本地方便又省钱。总结本文从 RAG 的核心概念出发带你一步步实现了基于 LangChain Chroma 的本地知识库问答系统。你不仅掌握了文档切分、向量化、检索和生成的全链路代码还了解了实际落地中常见的优化方向和避坑技巧。RAG 是大模型走向企业应用的“双脚”因为它让模型不再停留在空洞的“知识记忆”上而是能够动态地查资料、讲证据。你可以在这个基础框架之上轻松扩展接入企业内部的规章制度、产品手册、技术文档甚至实时抓取网页打造一个真正能干的“知识管家”。动手试一下吧当你看到大模型引经据典地回答问题时你一定会感受到这种“增强”的魅力。后续我还将分享更进阶的话题如何用 Agent 做多步检索、如何处理表格数据等欢迎持续关注。完整示例代码已收录在本文配套仓库自行创建knowledge.txt后即可运行。希望这篇教程能成为你进入 RAG 世界的钥匙祝你编码愉快