LangChain对话Agent:工具执行后终止链并返回原始输出
解决对话式Agent工具调用后直接返回原始输出的问题
方法一:通过自定义回调强制终止链并返回工具结果
这种方法能在指定工具调用完成后立即终止Agent的后续处理,直接返回工具原始输出,适合需要严格避免LLM额外处理的场景(比如图表序列化数据)。
实现步骤
- 定义回调处理器,检测目标工具调用并触发终止:
from langchain.callbacks.base import BaseCallbackHandler class DirectToolResultCallback(BaseCallbackHandler): def __init__(self, target_tool_names): self.target_tool_names = target_tool_names # 指定需要直接返回结果的工具名称 def on_tool_end(self, output, tool_name, **kwargs): if tool_name in self.target_tool_names: # 抛出特定异常以终止Agent执行 raise ValueError(f"DIRECT_RETURN:{output}")
- 初始化Agent并添加该回调,同时封装运行逻辑捕获异常返回结果:
# 配置需要直接返回结果的工具名称(根据你的工具实际name字段调整) target_tools = ["Calculator", "ChartSerializer"] # 创建回调实例 result_callback = DirectToolResultCallback(target_tools) # 初始化Agent conversational_agent = initialize_agent( agent='chat-conversational-react-description', tools=[CalculatorTool()], # 加入你的所有工具 llm=llm_gpt4, verbose=True, max_iterations=2, early_stopping_method="generate", memory=memory, callbacks=[result_callback] ) # 封装Agent运行函数 def run_agent(input_text): try: return conversational_agent.run(input_text) except ValueError as e: error_msg = str(e) if error_msg.startswith("DIRECT_RETURN:"): # 提取并返回工具原始输出 return error_msg.split(":", 1)[1].strip() # 其他异常正常抛出 raise
方法二:修改Agent提示词,让LLM直接返回工具输出
通过修改Agent的系统提示,明确告知LLM在调用指定工具后无需添加额外格式化内容,直接返回工具结果。这种方法更简洁,但依赖LLM遵循提示指令。
实现步骤
from langchain.agents.chat.prompt import CHAT_CONVERSATIONAL_REACT_DESCRIPTION_PROMPT # 自定义系统提示,添加特定工具的返回规则 custom_system_prompt = """你是对话式助手,需按以下规则处理工具调用: - 调用Calculator或ChartSerializer工具后,直接返回工具的输出结果,不要添加任何解释、格式化文本; - 其他工具按正常流程处理,生成合适的最终回答。""" # 替换原prompt的系统消息部分 custom_prompt = CHAT_CONVERSATIONAL_REACT_DESCRIPTION_PROMPT.partial( system_message=custom_system_prompt ) # 使用自定义prompt初始化Agent conversational_agent = initialize_agent( agent='chat-conversational-react-description', tools=[CalculatorTool()], llm=llm_gpt4, verbose=True, max_iterations=2, early_stopping_method="generate", memory=memory, agent_kwargs={"prompt": custom_prompt} )
说明
- 方法一的优势是强制终止链,完全避免LLM后续处理,适合对输出准确性要求极高的场景(比如序列化图表数据);
- 方法二更简洁,无需额外异常处理,但需要确保LLM能准确遵循提示中的规则。
内容的提问来源于stack exchange,提问作者Aviran
相关产品推荐
相关产品推荐

