新闻详情

新闻详情

首页 / 资讯中心 / 详情

手把手教你用LangChain搭建企业级RAG问答系统,解决大模型知识幻觉难题

发布时间:2026/11/4 6:56:12来源:尧图网络
手把手教你用LangChain搭建企业级RAG问答系统,解决大模型知识幻觉难题
你有没有遇到过这种情况让大模型回答公司内部文档的问题它要么编答案要么说我不清楚RAGRetrieval-Augmented Generation检索增强生成就是解决这个问题的——先从你的文档里检索出相关内容再让模型基于这些内容回答。RAG是目前AI落地最成熟的场景没有之一。客服系统、文档问答、企业知识库、法律助手……底层都是RAG。今天这篇文章我带你用LangChain 1.0从零搭一个完整的RAG系统。RAG的核心思路一句话说清楚先把文档切成小块存进向量数据库用户提问时检索出最相关的几块然后把这些块塞进提示词让模型回答。流程图用户问题 ↓[Embedding模型把问题转成向量] ↓[在向量数据库中检索最相似的文档块] ↓[把检索结果用户问题一起发给大模型] ↓[大模型基于检索到的内容生成回答]第一步加载和切分文档RAG的第一步是把你的文档读进来并切成小块。为什么不能整篇喂给模型两个原因一是模型的上下文窗口有限装不下整篇文档二是小块检索精度更高整篇检索噪音太多。文档加载from langchain_community.document_loaders import TextLoader, PyPDFLoader# 加载txt文件loader TextLoader(company_faq.txt, encodingutf-8)docs loader.load()# 加载PDF文件loader PyPDFLoader(product_manual.pdf)docs loader.load()LangChain支持几十种文档格式Word、Markdown、HTML、CSV、Notion、飞书文档……在langchain-community里基本都能找到对应的Loader。文本切分from langchain_text_splitters import RecursiveCharacterTextSplittersplitter RecursiveCharacterTextSplitter( chunk_size500, # 每块最多500个字符 chunk_overlap50, # 相邻块之间重叠50个字符避免关键信息被切断 separators[\n\n, \n, 。, , , , , ], # 按优先级切分)chunks splitter.split_documents(docs)print(f文档被切成了 {len(chunks)} 块)几个要点chunk_size不是越小越好——太小会丢失上下文太大检索噪音多。500-1000字符是比较通用的范围chunk_overlap建议设为chunk_size的10%左右防止关键信息正好被切断separators的顺序很重要优先在段落、句子级别切分不到万不得已别在词中间切第二步向量化并存入数据库把文本块转成向量一串数字然后存进向量数据库。向量数据库能根据语义相似度快速检索。from langchain_openai import OpenAIEmbeddingsfrom langchain_community.vectorstores import Chroma# 选择Embedding模型embeddings OpenAIEmbeddings(modeltext-embedding-3-small)# 创建向量数据库并存入文档块vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db, # 持久化存储目录)# 测试检索results vectorstore.similarity_search(产品退货流程是什么, k3)for doc in results: print(doc.page_content) print(---)向量数据库怎么选数据库特点适用场景Chroma轻量、本地运行、开箱即用开发测试、小规模数据FAISSMeta开源、纯内存、速度极快大规模数据、不需要持久化Milvus分布式、高性能、生产级企业级大规模部署Pinecone全托管云服务、免运维不想自己管基础设施QdrantRust实现、性能好、过滤能力强需要元数据过滤的场景我的建议开发阶段用Chroma或FAISS快且省事上生产换Milvus或Pinecone。Embedding模型用OpenAI的text-embedding-3-small就行性价比高国内可以用智谱或百度的Embedding。第三步构建RAG链有了向量数据库接下来把检索和生成串起来。基础版RAG链from langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthrough# 检索器retriever vectorstore.as_retriever( search_typesimilarity, # 相似度搜索 search_kwargs{k: 3}, # 返回最相似的3个文档块)# 提示词模板prompt ChatPromptTemplate.from_template(基于以下参考资料回答用户问题。如果参考资料中没有相关信息请说根据现有资料无法回答。参考资料{context}用户问题{question}回答)# 模型model ChatOpenAI(modelgpt-4o-mini)# 构建RAG链def format_docs(docs): return\n\n.join(doc.page_content for doc in docs)rag_chain ( {context: retriever | format_docs, question: RunnablePassthrough()} | prompt | model | StrOutputParser())# 使用answer rag_chain.invoke(产品退货流程是什么)print(answer)这段LCEL链的意思是用户问题同时传给retriever检索相关文档和question原样传递检索结果格式化后和问题一起塞进提示词发给模型生成回答解析输出进阶版带来源引用的RAG让模型回答时标注信息来源方便用户验证from langchain_core.runnables import RunnableParallel# 提示词加上来源引用要求prompt_with_source ChatPromptTemplate.from_template(基于以下参考资料回答用户问题。回答时请标注信息来源的编号如[1][2]。参考资料{context}用户问题{question}回答格式回答内容[来源编号])rag_chain_with_source RunnableParallel( {context: retriever | format_docs, question: RunnablePassthrough()}) | prompt_with_source | model | StrOutputParser()第四步把RAG封装成Agent工具上面的RAG链是固定流程但你可能想让Agent自己判断什么时候该查文档、什么时候直接回答。这时候可以把RAG封装成工具from langchain.agents import create_agentdef search_knowledge_base(query: str) - str: 搜索公司知识库获取产品、流程、政策等相关信息。 当用户询问公司内部信息时应使用此工具。 results rag_chain.invoke(query) return resultsagent create_agent( modelgpt-4o-mini, tools[search_knowledge_base, search_web], # 知识库 网络搜索 system_prompt你是一个智能客服助手。- 公司内部信息产品、流程、政策等用search_knowledge_base查询- 实时信息、新闻、外部知识用search_web查询- 不要编造答案查不到就说不知道,)这样Agent就能根据问题类型自己选检索方式了——内部文档走知识库实时信息走搜索。高级RAG策略基础RAG能覆盖60%的场景剩下40%需要一些高级策略1. 查询改写用户的提问往往不是最优的检索query。比如用户问怎么退货但文档里写的是退换货流程。让模型先改写query再检索query_rewrite_prompt ChatPromptTemplate.from_template( 请将以下问题改写为更适合检索的查询词\n原始问题{question}\n改写后)rewrite_chain query_rewrite_prompt | model | StrOutputParser()# 用户问怎么退货 → 改写为退换货流程 退货条件 退货步骤 → 检索更准2. 混合检索纯向量检索擅长语义匹配但对关键词精确匹配不太行。混合检索结合了向量搜索和关键词搜索# Chroma支持的混合搜索配置retriever vectorstore.as_retriever( search_typemmr, # Maximum Marginal Relevance兼顾相关性和多样性 search_kwargs{k: 5, fetch_k: 10},)3. 父文档检索有时候切太碎了检索到的小块缺乏上下文。父文档检索的思路是检索小块返回小块所属的大块from langchain.retrievers import ParentDocumentRetrieverfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.storage import InMemoryStore# 子块切分器用于检索child_splitter RecursiveCharacterTextSplitter(chunk_size200)# 父块切分器用于返回parent_splitter RecursiveCharacterTextSplitter(chunk_size1000)retriever ParentDocumentRetriever( vectorstorevectorstore, docstoreInMemoryStore(), child_splitterchild_splitter, parent_splitterparent_splitter,)我踩过的RAG坑1. 文档切分粒度不对检索效果差这个得调。建议先用500字符的chunk_size试如果检索不到相关内容试着调大到800如果检索到了但回答跑偏试着调小到300。2. Embedding模型和生成模型的语言不匹配如果你的文档是中文的但用了英文为主的Embedding模型如早期的text-embedding-ada-002检索效果会很差。推荐用text-embedding-3-small或中文Embedding模型如BGE系列。3. 检索到的内容与问题无关这往往是因为query太模糊。加一个查询改写步骤或者用混合检索效果会好很多。4. 模型不按检索内容回答自己编在提示词里加上仅基于参考资料回答不要编造信息的约束并且明确告诉模型如果参考资料中没有相关信息请回答’根据现有资料无法回答’。假如你从2026年开始学大模型按这个步骤走准能稳步进阶。接下来告诉你一条最快的邪修路线3个月即可成为模型大师薪资直接起飞。阶段1:大模型基础阶段2:RAG应用开发工程阶段3:大模型Agent应用架构阶段4:大模型微调与私有化部署配套文档资源全套AI 大模型 学习资料朋友们如果需要可以微信扫描下方二维码免费领取【保证100%免费】配套文档资源全套AI 大模型 学习资料朋友们如果需要可以微信扫描下方二维码免费领取【保证100%免费】
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/3 7:07:39

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/3 12:09:35

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/3 12:09:38

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/3 12:09:41

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉