如何将自定义ConversationalRetrievalChain与智能体结合?
自定义Conversational Retrieval Agent实现方案
要在保留你现有question_generator_chain和qa_chain的前提下,让智能体自主决定是否执行检索操作,核心思路是把你已定义好的ConversationalRetrievalChain包装成Agent可调用的工具,再通过自定义Prompt引导Agent判断何时触发检索。以下是具体实现步骤:
1. 将现有ConversationalRetrievalChain包装为Tool
首先把你的convR_qa转换成LangChain的Tool,让Agent能识别并调用它:
from langchain.tools import Tool # 定义工具函数,接收用户问题和对话历史,调用你的检索链 def retrieval_tool(inputs): # inputs为字典,包含"question"和"chat_history"字段 result = convR_qa({ "question": inputs["question"], "chat_history": inputs["chat_history"] }) # 返回格式化结果,包含回答和来源文档摘要 return f"检索回答:{result['answer']}\n来源文档摘要:{[doc.page_content[:100] + '...' for doc in result['source_documents']]}" # 创建工具实例,明确工具适用场景 retrieval_tool_instance = Tool( name="知识库检索工具", func=retrieval_tool, description="仅当用户问题需要从指定知识库获取专属信息时调用,比如产品细节、内部文档内容;一般性闲聊、常识问题无需调用。" )
2. 配置Agent的Prompt与初始化
使用ChatAgent结合你的工具和现有memory,通过自定义Prompt引导Agent的决策逻辑:
from langchain.agents import AgentExecutor, ChatAgent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.chat_models import ChatOpenAI # 定义Agent Prompt模板,明确决策规则 prompt = ChatPromptTemplate.from_messages([ ("system", "你需要根据用户问题判断是否调用知识库检索工具:无需专属信息的问题直接回答,需要则调用工具。"), MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad") ]) # 创建Agent实例 agent = ChatAgent.from_llm_and_tools( llm=ChatOpenAI(temperature=0), # 替换为你使用的LLM tools=[retrieval_tool_instance], prompt=prompt ) # 初始化Agent执行器,复用你已有的memory agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=[retrieval_tool_instance], memory=memory, verbose=True )
3. 测试Agent运行
现在可以通过Agent处理用户问题,它会自主判断是否触发检索:
# 测试需要检索的问题 response = agent_executor.run(input="请说明我们产品的API认证流程?") print(response) # 测试无需检索的问题 response = agent_executor.run(input="你好,帮我推荐一部科幻电影?") print(response)
关键说明
- 你的
question_generator_chain和qa_chain完全保留在convR_qa中,Agent仅通过工具调用复用该链,不会修改原有组件逻辑。 - 可通过调整Tool的
description字段,更精准地限定工具调用场景,提升Agent决策准确性。 - 若需更复杂的决策逻辑,可扩展Prompt内容或使用
ZeroShotAgent等自定义Agent类优化判断规则。
内容的提问来源于stack exchange,提问作者Cehao Yang
相关产品推荐
相关产品推荐

