【LangChain进阶04:RAG】—— LangChain RAG Agent 实战:把检索器变成工具,构建能查私有库的智能助手
2026/9/8 17:31:36 网站建设 项目流程

LangChain RAG Agent 实战:把检索器变成工具,构建能查私有库的智能助手

上一篇我们把文档切分、向量化、存进了向量库,还拿到了一个retriever。但 retriever 只是检索能力,还不会「主动用」。这篇就把检索器包装成工具,塞进一个RAG Agent——让它能基于你的私有知识库自动检索、引用、回答。

这也补齐了 RAG 的在线阶段:从「能检索」到「会按需检索并回答」。


一、先厘清:RAG Agent 和普通 Agent 差在哪

普通 Agent 只能靠模型自身知识 + 传入的消息回答。RAG Agent 多了一个能访问私有知识库的工具

  • 用户问私有库里的东西 → Agent 判断需要查询 → 调检索工具 → 拿到相关内容 → 基于它回答。
  • 关键在system_prompt里写清楚规则:必须用工具、不要编造、查不到就说不知道。

✅ 一句话总结:RAG Agent = 会「检索」这个动作的 Agent。


二、创建 Retriever 工具

2.1 准备检索器

先建好向量库并拿到 retriever(上一篇的成果):

importosfromdotenvimportload_dotenv load_dotenv()fromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_chromaimportChromafromlangchain_text_splittersimportRecursiveCharacterTextSplitter# ----- 步骤 1:准备知识库 -----# 模拟菜鸟教程 RUNOOB 的知识文档knowledge_docs=["菜鸟教程(RUNOOB)创立于 2013 年,是一个完全免费的编程学习平台。","平台已上线 300+ 套教程,涵盖前端、后端、数据库、移动开发等领域。","Python3 基础教程是平台最受欢迎的课程,累计学习人次超过 500 万。","Python3 基础教程共 30 章,包含环境搭建、基本语法、函数、类、异常处理等内容。","HTML 基础教程共 25 章,从 HTML 基本结构讲到表单与多媒体元素。","菜鸟教程支持在线运行代码,学习者无需安装任何软件即可编写和运行代码。","平台提供移动端适配,用户可以在手机上随时随地学习编程。","菜鸟教程的会员服务提供视频课程、项目实战、一对一答疑等增值服务。",]# 切分text_splitter=RecursiveCharacterTextSplitter(chunk_size=200,chunk_overlap=30)chunks=text_splitter.create_documents(knowledge_docs)# 向量化存储embeddings=OpenAIEmbeddings(model="text-embedding-3-small")vector_store=Chroma.from_documents(documents=chunks,embedding=embeddings,)retriever=vector_store.as_retriever(search_kwargs={"k":3})

💡 没有 OpenAI key 时,可改用阿里云百炼的 Embedding 服务(接口兼容 OpenAI,指base_url即可):

fromlangchain_openaiimportOpenAIEmbeddings embeddings=OpenAIEmbeddings(model="text-embedding-v4",api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",check_embedding_ctx_length=False,chunk_size=10,)

2.2 把检索器包装成工具

@tool装饰器把 retriever 包成一个工具。重点是写清 description——它决定模型何时会调用这个工具。

fromlangchain.toolsimporttool# ----- 步骤 2:创建检索工具 -----@tooldefsearch_knowledge_base(query:str)->str:"""在菜鸟教程 RUNOOB 知识库中搜索相关信息。 当用户询问关于菜鸟教程的具体信息时(如课程数量、平台历史、功能特性等), 必须使用此工具查询知识库获取准确信息。 Args: query: 搜索关键词或问题 """docs=retriever.invoke(query)ifnotdocs:return"知识库中未找到相关信息。"results=[]fori,docinenumerate(docs,1):results.append(f"[{i}]{doc.page_content}")return"\n\n".join(results)

🔴 重点:description里明确写了「当用户询问菜鸟教程的具体信息时,必须使用此工具」。description 是模型判断要不要用工具的「说明书」,写得越具体,Agent 用得越准。


三、创建 RAG Agent

把工具和 system_prompt 交给create_agent

fromlangchain.agentsimportcreate_agentfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessage# ----- 步骤 3:创建 RAG Agent -----model=init_chat_model("deepseek:deepseek-v4-flash",temperature=0)agent=create_agent(model=model,tools=[search_knowledge_base],system_prompt="""你是菜鸟教程 RUNOOB 的智能客服助手。 ## 规则 1. 当用户询问关于菜鸟教程的具体信息时,必须使用 search_knowledge_base 工具查询 2. 基于检索到的信息回答,不要编造知识库中没有的内容 3. 如果知识库中没有相关信息,诚实地告诉用户 4. 回答要友好、简洁、准确""",)

四、测试 RAG Agent

# ----- 步骤 4:测试 -----questions=["菜鸟教程是什么时候创立的?","Python3 基础教程有多少章?","菜鸟教程一共有多少套教程?",]forqinquestions:result=agent.invoke({"messages":[HumanMessage(content=q)]})print(f"Q:{q}")print(f"A:{result['messages'][-1].content}")print("-"*60)

运行结果:

Q: 菜鸟教程是什么时候创立的? A: 菜鸟教程(RUNOOB)创立于 2013 年,是一个完全免费的编程学习平台。 ------------------------------------------------------------ Q: Python3 基础教程有多少章? A: Python3 基础教程共 30 章,包含环境搭建、基本语法、函数、类、异常处理等内容。 ------------------------------------------------------------ Q: 菜鸟教程一共有多少套教程? A: 菜鸟教程已上线 300+ 套教程,涵盖前端、后端、数据库、移动开发等多个领域。 ------------------------------------------------------------

五、RAG Agent 的执行流程

以第三个问题「菜鸟教程一共有多少套教程?」为例,Agent 内部走的是这条链路:

  1. 用户提问
  2. 模型判断需要查询知识库 → 调用search_knowledge_base("菜鸟教程 教程数量")
  3. 检索器从向量数据库中搜索语义最相似的文档块
  4. 将检索结果返回给模型
  5. 模型基于检索结果生成准确回答

✅ 这就是 RAG 的核心价值:模型不靠猜,靠查。


六、添加引用来源

专业 RAG 系统通常会附带引用来源,让用户知道信息出自哪里。做法是在工具返回里附上metadata里的source

fromlangchain_core.documentsimportDocument@tooldefsearch_with_sources(query:str)->str:"""在菜鸟教程知识库中搜索,返回带来源标注的结果。 Args: query: 搜索关键词 """docs=retriever.invoke(query)ifnotdocs:return"未找到相关信息。"results=[]fori,docinenumerate(docs,1):source=doc.metadata.get("source","菜鸟教程知识库")results.append(f"[来源{i}:{source}]\n{doc.page_content}")return"\n\n".join(results)# 如需在文档中保留来源信息,可在创建时添加元数据doc_with_meta=Document(page_content="Python3 基础教程共 30 章...",metadata={"source":"Python3 基础教程-课程介绍","url":"https://www.runoob.com/python3/"})

✅ 加了来源,回答的可信度和可追溯性都上了一个台阶。


七、向量存储的持久化

每次启动都重建向量索引太浪费——尤其文档多的时候,重新算 Embedding 可能要几十分钟。Chroma 支持持久化,首次构建后直接加载。

# 创建持久化向量存储(首次运行)embeddings=OpenAIEmbeddings(model="text-embedding-3-small")vector_store=Chroma.from_documents(documents=chunks,embedding=embeddings,persist_directory="./runoob_vector_db",# 持久化目录)# 后续运行直接加载loaded_store=Chroma(persist_directory="./runoob_vector_db",embedding_function=embeddings,)retriever=loaded_store.as_retriever()# 无需重新计算向量!

🔴 重点:持久化能大幅提升启动速度。文档量大时(成千上万篇),重算所有向量非常昂贵;持久化后只需加载即可。


八、总结:你真正需要记住的这几件事

  1. RAG Agent = 会检索的 Agent,核心是把 retriever 包装成工具。
  2. 工具 description 决定调用准确性——写清「何时用、查什么」。
  3. system_prompt 里写规则:必须用工具、不编造、查不到就说不知道。
  4. 加引用来源提升可信度与可追溯性。
  5. 向量库持久化避免每次启动重算 Embedding。

验证清单

  • 能把 retriever 用@tool包装成工具
  • Agent 在询问私有库问题时自动调用检索工具
  • 检索结果被用于回答,而非编造
  • 知识库查不到时诚实告知
  • 返回带引用来源的结果
  • 向量库持久化后二次启动无须重算

参考资源

  • LangChain 官方 · Short-term memory / RAG 相关: https://docs.langchain.com/oss/python/langchain
  • LangChain 官方 · Tools: https://docs.langchain.com/oss/python/langchain/tools
  • 菜鸟教程 · LangChain 构建 RAG Agent: https://www.runoob.com/langchain/langchain-rag-overview.html

说明:文中模型名与 API 以官方文档和菜鸟教程为准,具体版本细节请以你安装的 LangChain 为准。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询