【LangChain进阶04:RAG】—— LangChain RAG Agent 实战:把检索器变成工具,构建能查私有库的智能助手
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_splitterRecursiveCharacterTextSplitter(chunk_size200,chunk_overlap30)chunkstext_splitter.create_documents(knowledge_docs)# 向量化存储embeddingsOpenAIEmbeddings(modeltext-embedding-3-small)vector_storeChroma.from_documents(documentschunks,embeddingembeddings,)retrievervector_store.as_retriever(search_kwargs{k:3}) 没有 OpenAI key 时可改用阿里云百炼的 Embedding 服务接口兼容 OpenAI指base_url即可fromlangchain_openaiimportOpenAIEmbeddings embeddingsOpenAIEmbeddings(modeltext-embedding-v4,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1,check_embedding_ctx_lengthFalse,chunk_size10,)2.2 把检索器包装成工具用tool装饰器把 retriever 包成一个工具。重点是写清 description——它决定模型何时会调用这个工具。fromlangchain.toolsimporttool# ----- 步骤 2创建检索工具 -----tooldefsearch_knowledge_base(query:str)-str:在菜鸟教程 RUNOOB 知识库中搜索相关信息。 当用户询问关于菜鸟教程的具体信息时如课程数量、平台历史、功能特性等 必须使用此工具查询知识库获取准确信息。 Args: query: 搜索关键词或问题 docsretriever.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_agentfromlangchain.agentsimportcreate_agentfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessage# ----- 步骤 3创建 RAG Agent -----modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0)agentcreate_agent(modelmodel,tools[search_knowledge_base],system_prompt你是菜鸟教程 RUNOOB 的智能客服助手。 ## 规则 1. 当用户询问关于菜鸟教程的具体信息时必须使用 search_knowledge_base 工具查询 2. 基于检索到的信息回答不要编造知识库中没有的内容 3. 如果知识库中没有相关信息诚实地告诉用户 4. 回答要友好、简洁、准确,)四、测试 RAG Agent# ----- 步骤 4测试 -----questions[菜鸟教程是什么时候创立的,Python3 基础教程有多少章,菜鸟教程一共有多少套教程,]forqinquestions:resultagent.invoke({messages:[HumanMessage(contentq)]})print(fQ:{q})print(fA:{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里的sourcefromlangchain_core.documentsimportDocumenttooldefsearch_with_sources(query:str)-str:在菜鸟教程知识库中搜索返回带来源标注的结果。 Args: query: 搜索关键词 docsretriever.invoke(query)ifnotdocs:return未找到相关信息。results[]fori,docinenumerate(docs,1):sourcedoc.metadata.get(source,菜鸟教程知识库)results.append(f[来源{i}:{source}]\n{doc.page_content})return\n\n.join(results)# 如需在文档中保留来源信息可在创建时添加元数据doc_with_metaDocument(page_contentPython3 基础教程共 30 章...,metadata{source:Python3 基础教程-课程介绍,url:https://www.runoob.com/python3/})✅ 加了来源回答的可信度和可追溯性都上了一个台阶。七、向量存储的持久化每次启动都重建向量索引太浪费——尤其文档多的时候重新算 Embedding 可能要几十分钟。Chroma 支持持久化首次构建后直接加载。# 创建持久化向量存储首次运行embeddingsOpenAIEmbeddings(modeltext-embedding-3-small)vector_storeChroma.from_documents(documentschunks,embeddingembeddings,persist_directory./runoob_vector_db,# 持久化目录)# 后续运行直接加载loaded_storeChroma(persist_directory./runoob_vector_db,embedding_functionembeddings,)retrieverloaded_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/langchainLangChain 官方 · Tools: https://docs.langchain.com/oss/python/langchain/tools菜鸟教程 · LangChain 构建 RAG Agent: https://www.runoob.com/langchain/langchain-rag-overview.html说明文中模型名与 API 以官方文档和菜鸟教程为准具体版本细节请以你安装的 LangChain 为准。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →