LangChain Agent工具能否用硬编码消息?自定义问候工具结果适配问题
LangChain问候工具返回硬编码结果的解决方案
核心方案:启用Tool的直接返回参数
给问候工具添加return_direct=True,让Agent调用该工具后直接返回硬编码响应,跳过大模型的二次生成逻辑。修改后的Tool定义如下:
tools = [ Tool( name="Greetings", func=lambda string: Greetings(string), description="use for general greetings", return_direct=True ) ]
添加该参数后,只要Agent触发Greetings工具,就会直接返回你预设的硬编码内容,不会让大模型重新生成回复。
辅助优化:修复函数变量名冲突
原Greetings函数存在循环变量与结果变量重名的问题,可能引发逻辑混淆,建议调整变量名并补充未匹配场景的处理:
import re def Greetings(user_question): Generic_statements = ["hello", "hi", "good morning"] # 替换为你的实际问候词列表 Farewell = ["bye", "goodbye", "see you"] # 替换为你的实际告别词列表 if any(re.search(fr'\b{greeting}\b', user_question, re.IGNORECASE) for greeting in Generic_statements): return "We are here to help! Let me know if I can help you with anything else." elif any(re.search(fr'\b{farewell}\b', user_question, re.IGNORECASE) for farewell in Farewell): return "I'm here whenever you need anything. I'll be looking forward to our next conversation. Take care. Goodbye!" return "" # 处理未匹配到问候/告别的情况,避免返回None
进阶方案:自定义输出解析器
如果需要更精细的控制(比如结合其他工具逻辑),可以自定义Agent输出解析器,当检测到调用Greetings工具时直接返回预设结果:
from langchain.agents import AgentOutputParser from langchain.schema import AgentAction, AgentFinish class GreetingDirectParser(AgentOutputParser): def parse(self, llm_output: str) -> AgentAction | AgentFinish: # 先按默认ReAct逻辑解析(此处简化,实际需参考默认解析器实现) if "Action: Greetings" in llm_output: # 提取用户问题并匹配响应,或直接返回预设内容 return AgentFinish( return_values={"output": Greetings(llm_output.split("Action Input:")[-1].strip())}, log="Direct return from Greetings tool" ) # 其他工具按原逻辑处理 from langchain.agents.react.base import ReActSingleInputOutputParser return ReActSingleInputOutputParser().parse(llm_output) # 创建Agent时指定自定义解析器 agent = create_react_agent( llm=your_llm_instance, tools=tools, prompt=your_agent_prompt, output_parser=GreetingDirectParser() )
内容的提问来源于stack exchange,提问作者AqashaT
相关产品推荐
相关产品推荐

