LangChain 1.0 构建 RAG Agent 智能问答系统完整代码
基于LangChain1 0最新版API,构建了RAGAgent智能检索问答系统。系统集成大语言模型、文本嵌入模型与向量存储器,实现网页文档加载、递归分片及向量入库。提供工具调用型与上下文注入型两种Agent方案,分别适用于复杂多轮问答与简单单轮场景,代码完整可运行。
✨ 本文所有代码均为可直接运行的完整示例,基于 LangChain 最新版 API 编写,无任何过时语法,放心使用~

如果要说大模型落地中最实用的技术,RAG(检索增强生成)绝对名列前茅。它有效解决了大模型“知识过时、生成幻觉、领域知识不足”等几大核心痛点。今天,我们将手把手带你搭建一套基于 LangChain 的 RAG Agent 智能检索问答系统,从依赖安装到两种主流实现方案,全部附带可运行代码,拿到即用。
一、安装项目依赖包
首先,让我们一次性安装所有核心依赖,一条命令轻松搞定:
pip install langchain langchain-text-splitters langchain-community bs4 python-dotenv
安装完成后,即可开始配置三大核心组件。
二、初始化三大核心组件(核心配置)
构建 RAG Agent 的核心,就是将三部分组件有机组合:对话大模型、文本嵌入模型、向量存储器。下面逐一配置。
1. 配置大语言模型(LLM)——对话生成核心
# 导入对话模型及环境变量配置依赖from langchain_openai import ChatOpenAIimport osfrom dotenv import load_dotenv# 加载.env文件中的环境变量(私密密钥管理,规范开发)load_dotenv()# 配置通义千问大模型(qwen-max)参数model_name = "qwen-max"api_key = os.getenv("DASHSCOPE_API_KEY")base_url = os.getenv("DASHSCOPE_BASE_URL")# 初始化聊天模型:低随机性保证回答严谨,适配知识类问答场景model = ChatOpenAI(model=model_name,api_key=api_key,base_url=base_url,temperature=0.1,# 温度值越低,回答越精准、确定性越强)
这里将 temperature 设置为 0.1,属于低随机性参数,可确保回答精准、不易跑偏。在知识型问答场景中,这一设置尤为关键。
2. 配置文本嵌入模型——文本向量化核心
# 导入HuggingFace嵌入模型from langchain_huggingface import HuggingFaceEmbeddings# 初始化嵌入模型,行业主流轻量级高质量选型# 特点:文本表征能力强、适配中文+英文,首次运行自动缓存至本地,无需重复下载embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
文本嵌入模型选用 all-mpnet-base-v2,它是一个轻量且质优的模型,支持中英文。首次运行时会自动缓存至本地,后续无需重复下载。
3. 配置向量存储器——向量数据存储核心
# 导入内存级向量存储库from langchain_core.vectorstores import InMemoryVectorStore# 初始化内存向量库,轻量化无部署,无需持久化磁盘,适合快速开发/演示场景# 绑定已初始化的嵌入模型,实现文本-向量的自动转换与匹配vector_store = InMemoryVectorStore(embeddings)
这里使用内存级向量库,非常适合开发与演示阶段,无需部署或持久化。若需上线生产环境,可替换为 Chroma 或 Pinecone 等持久化向量数据库。
三、文档处理全流程:加载 → 分片 → 入库(构建检索知识库)
RAG 的核心前置步骤,是将网页上的非结构化文本转化为结构化的向量知识库。总共三步,每一环节都采用规范做法。
1. 文档加载:精准爬取网页核心内容
# 导入网页加载器及网页解析依赖import bs4from langchain_community.document_loaders import WebBaseLoader# 网页解析规则:只提取指定class的核心内容(标题/头部/正文),过滤冗余HTML标签,提升数据质量bs4_strainer = bs4.SoupStrainer(class_=("post-title", "post-header", "post-content"))# 初始化网页加载器,指定爬取路径+解析规则loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),bs_kwargs={"parse_only": bs4_strainer},)# 加载网页文档至上下文docs = loader.load()# 校验加载结果:确保成功加载1篇文档assert len(docs) == 1# 输出文档总字符数,直观查看文本体量print(f"✅ 文档加载完成,总字符数:{len(docs[0].page_content)}")
这里只抓取 post-title、post-header、post-content 三个 CSS 类对应的内容,过滤掉网页上的无效信息,大幅提升数据质量。
2. 文档分片:最优策略切割文本,保留上下文关联
# 导入递归字符分割器from langchain_text_splitters import RecursiveCharacterTextSplitter# 初始化文本分割器,采用行业最优的递归分割策略text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,# 单个文本块最大字符数,适配嵌入模型输入长度限制chunk_overlap=200,# 相邻文本块重叠字符数,避免关键信息被截断,保留上下文关联性add_start_index=True, # 记录文本块在原始文档中的起始索引,便于溯源匹配内容)# 对加载的文档进行分片处理all_splits = text_splitter.split_documents(docs)# 输出分片结果print(f"✅ 文档分片完成,原始文档切分为 {len(all_splits)} 个子文档")
采用 chunk_size=1000、chunk_overlap=200 的参数组合,既能保证文本块长度适宜,又避免关键信息因切分而丢失。同时记录起始索引,便于后续溯源,非常实用。
3. 向量入库:将分片文本存入向量库,完成知识库构建
# 将所有文本分片存入向量存储器,自动完成「文本→向量」转换+存储document_ids = vector_store.add_documents(documents=all_splits)# 预览前3个文本块的唯一标识IDprint(f"✅ 向量入库完成,文本块ID预览:{document_ids[:3]}")
入库过程完全自动化,只需将分好的文本块传入,向量库随即构建完成。输出前三个 ID 进行预览,确保一切正常。
四、核心实现:构建 RAG Agent 检索问答智能体(两种主流方案)
RAG 的精髓在于,让大模型在回答问题时,首先到知识库中进行检索,再基于检索到的内容生成答案。下面提供两种工业界主流方案,你可根据实际需求直接选用,均可运行。
方案一:工具调用型 RAG Agent(推荐)
核心逻辑
自定义一个检索工具,让大模型自主决定何时调用该工具,然后基于检索结果生成答案。这种方式具备“工具调用思维”,特别适用于复杂多轮问答或多步骤查询场景,灵活性极高。
# 导入工具装饰器,封装自定义检索工具from langchain.tools import tool# 封装检索工具:返回检索到的上下文内容+原始文档对象,指定返回格式规范def retrieve_context(query: str):"""核心检索工具:根据用户查询语句,从向量库中检索相关上下文信息,辅助回答问题"""# 相似度检索:返回匹配度最高的2条文本内容(k值可按需调整)retrieved_docs = vector_store.similarity_search(query, k=2)# 格式化拼接检索结果:带上元数据+文本内容,提升大模型理解效率serialized_context = "nn".join((f"Source: {doc.metadata}nContent: {doc.page_content}")for doc in retrieved_docs)# 返回格式化文本 + 原始文档,兼顾可读性与溯源性return serialized_context, retrieved_docs# 构建工具调用型智能体from langchain.agents import create_agent# 配置智能体核心参数:绑定大模型+检索工具+系统提示词tools = [retrieve_context]# 系统提示词:明确智能体能力边界与行为准则,精准引导大模型调用工具system_prompt = ("你是一个专业的问答助手,你可以调用检索工具获取外部知识库的上下文信息。n""请务必使用检索工具辅助回答用户的查询问题,确保答案的准确性和事实性。")# 初始化工具调用型RAG Agentagent = create_agent(model, tools, system_prompt=system_prompt)
测试:复杂多步骤查询(智能体自主调用工具)
query = ("What is the standard method for Task Decomposition?nn""Once you get the answer, look up common extensions of that method.")print("===== 工具调用型RAG Agent 回答结果 =====")for event in agent.stream({"messages": [{"role": "user", "content": query}]},stream_mode="values",):event["messages"][-1].pretty_print()
这个测试案例非常典型——首先询问任务分解的标准方法,然后进一步追问该方法的常见扩展。智能体需要自行判断,第一步需要调用检索工具查询“标准方法”,第二步可能还需再次检索。流式输出能够实时展示其思考链条,体验出色。
方案二:上下文注入型 RAG Agent(极简高效)
核心逻辑
通过中间件(middleware)实现“全自动检索 + 上下文注入”。无需显式定义工具,智能体在回答前会自动完成检索,并将结果注入到系统提示词中。整个过程对开发者透明,代码极简,运行高效,特别适合简单的单轮问答场景。
# 构建上下文注入型智能体from langchain.agents.middleware import dynamic_prompt, ModelRequest# 定义动态提示词中间件:自动检索+注入上下文,无感知完成检索逻辑def prompt_with_context(request: ModelRequest) -> str:"""核心中间件:从请求中提取用户最新问题,检索相关上下文并注入系统提示词"""# 提取用户最新的查询语句last_query = request.state["messages"][-1].text# 自动执行相似度检索,获取相关上下文retrieved_docs = vector_store.similarity_search(last_query)# 格式化拼接检索到的文本内容docs_content = "nn".join(doc.page_content for doc in retrieved_docs)# 构造带上下文的系统提示词,让大模型基于外部知识回答system_message = ("你是一个专业且乐于助人的问答助手,请严格基于下方提供的上下文信息回答用户问题:nn"f"{docs_content}")return system_message# 初始化上下文注入型RAG Agent:无需传入工具,中间件自动完成检索逻辑agent = create_agent(model, tools=[], middleware=[prompt_with_context])
测试:基础单轮查询(极简高效)
# 测试提问:基础单轮查询,验证上下文注入效果query = "What is task decomposition?"# 流式输出回答结果print("n===== 上下文注入型RAG Agent 回答结果 =====")for step in agent.stream({"messages": [{"role": "user", "content": query}]},stream_mode="values",):step["messages"][-1].pretty_print()
一个简单的提问,中间件自动完成检索,代码量相比方案一大幅减少。对于只需要单轮问答的场景,此方案一键即可搞定。
核心知识点补充
两种Agent方案对比 & 选型建议
- 工具调用型(方案一):适合复杂查询、多轮问答、多步骤推理。大模型自主决定是否调用工具,灵活性极强,是工业界的首选做法。
- 上下文注入型(方案二):适合简单单轮问答、快速原型开发。代码量少,检索过程对开发者透明,但灵活性稍弱。
核心优化点说明
- temperature=0.1:低温度确保回答精准、确定性高,特别适用于问答场景,避免生成发散内容。
- chunk_overlap=200:相邻文本块设置重叠,彻底解决关键信息被截断的问题,提升检索召回率。
- 流式输出stream():实时返回答案,用户无需等待,体验更佳。
- InMemoryVectorStore:轻量、免部署,适合快速开发。生产环境可替换为 Chroma、Pinecone 等持久化向量库。
总结
本文完整实现了基于 LangChain 的 RAG Agent 智能检索问答系统,从环境配置到文档处理再到两种 Agent 方案构建,全流程一气呵成。代码直接复制即可运行,同时覆盖两种主流方案,能够适应不同业务场景的需要。RAG 作为 LLM 落地的核心技术之一,这套代码稍加改造即可迁移到 PDF、本地文档等知识库场景,实用性极强。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
MyShell发布开源AI语音克隆工具OpenVoice,瞄准语音模仿领域
MyShell最新推出的开源语音克隆工具OpenVoice引起了广泛关注。这一创新产品由麻省理工学院(MIT)、清华大学以及加拿大人工智能初创公司MyShell合作开发。OpenVoice采用了一种概念简单但高效的方法,可几乎即时克隆用户的语音,并使用明显更少的计算资源。该工具不仅具备语音克隆的基本
Open Voice:轻松克隆任何声音,免费开源的AI语音克隆项目
Open Voice是由MyShell推出的一个免费开源的AI即时语音克隆项目,相较于其他的语音克隆技术,OpenVoice的优势在于仅需一段简短的音频,便能以惊人的准确度复刻说话者的音色,创造出让人信以为真的自然语音。除开复制和参考说话者的音色之外,OpenVoice还可以对语音风格进行精细控制,
VoiceCanvas-AI语音克隆 & TTS工具 | 40+种语言语音合成
VoiceCanvas是什么?VoiceCanvas是由先进AI驱动的语音克隆与文本转语音工具,支持40+种语言的即时语音合成。其核心能力包括:高质量语音合成:具有自然语调和节奏的清晰人声个性化语音克隆:通过3-10秒语音样本创建专属AI声纹多语言支持:覆盖全球主流语种的男 女声选择进阶调控功能:语
Github爆火AI语音克隆项目OpenVoice,精准进行声音复刻
最近,Github上的一个名为OpenVoice的AI语音克隆项目爆火,该项目由myshell-ai开源,仅开源了不到三周,就有了6 1k的star。OpenVoice仅需参考说话者的短音频片段,即可复制其声音并生成多种语言的语音。这一技术不仅实现了对音色的准确克隆,还在语音生成过程中提供了对情感、
Free Voice Cloning-免费AI语音克隆工具 | 5秒生成你的数字声音
Free Voice Cloning,一款真正0成本、无限制、跨语言的高质量AI语音克隆平台。适合内容创作者、教育者、AI开发者、播客人群等所有想要“复制自己的声音”并进行语音合成的用户。?️ Free Voice Cloning 是什么?Free Voice Cloning 是一个基于先进AI语音
- 热门数据榜
相关攻略
2026-07-14 17:32
2026-07-14 17:30
2026-07-14 17:30
2026-07-14 17:27
2026-07-14 17:27
2026-07-14 16:20
2026-07-14 16:19
2026-07-14 16:19
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

