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 内部走的是这条链路:
- 用户提问
- 模型判断需要查询知识库 → 调用
search_knowledge_base("菜鸟教程 教程数量") - 检索器从向量数据库中搜索语义最相似的文档块
- 将检索结果返回给模型
- 模型基于检索结果生成准确回答
✅ 这就是 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()# 无需重新计算向量!🔴 重点:持久化能大幅提升启动速度。文档量大时(成千上万篇),重算所有向量非常昂贵;持久化后只需加载即可。
八、总结:你真正需要记住的这几件事
- RAG Agent = 会检索的 Agent,核心是把 retriever 包装成工具。
- 工具 description 决定调用准确性——写清「何时用、查什么」。
- system_prompt 里写规则:必须用工具、不编造、查不到就说不知道。
- 加引用来源提升可信度与可追溯性。
- 向量库持久化避免每次启动重算 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 为准。