如何强制LangChain Agent始终使用工具?数据库专属查询场景需求
强制LangChain Agent始终使用工具的方案
针对你的场景——要求Agent仅从私有数据库获取信息、完全不依赖公开知识,以下是几种可行的实现方式:
1. 硬编码强制调用逻辑
直接重写Agent的工具选择方法,跳过模型的自主决策步骤,让它始终调用你的数据库检索工具。
from langchain.agents import ZeroShotAgent, AgentExecutor from langchain.chat_models import ChatOpenAI from langchain.tools import Tool # 定义数据库检索工具 def db_query_tool(query): # 替换为你的数据库查询实现 return f"数据库返回结果:针对'{query}'的查询数据..." tools = [ Tool( name="DatabaseQuery", func=db_query_tool, description="用于查询私有数据库的唯一工具,必须优先使用" ) ] # 自定义Agent类,强制选择指定工具 class ForcedDbAgent(ZeroShotAgent): def _choose_tool(self, intermediate_steps, **kwargs): # 固定返回数据库检索工具 return self.tools[0] # 初始化组件 llm = ChatOpenAI(temperature=0) custom_prompt = """你只能使用DatabaseQuery工具获取信息,所有回答必须基于工具返回的内容,绝对不能用自身知识作答。 输入问题:{input} 思考过程:{agent_scratchpad}""" agent = ForcedDbAgent.from_llm_and_tools(llm=llm, tools=tools, prompt=custom_prompt) agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True) # 测试调用 agent_executor.run("查询用户张三的历史订单")
2. 通过Prompt严格约束行为
在Agent的系统提示词中加入强制指令,结合temperature=0的模型配置,让模型严格遵循规则,不自主生成回答。
from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI from langchain.tools import Tool # 定义数据库工具 def db_retrieval(query): # 你的数据库查询逻辑 return "从私有数据库获取的具体数据..." tools = [ Tool( name="PrivateDBRetrieval", func=db_retrieval, description="唯一可用于获取信息的工具,必须调用它来回答所有问题" ) ] # 强制型Prompt forced_prompt = """你是一个只能通过PrivateDBRetrieval工具获取信息的助手,规则如下: 1. 无论任何问题,必须先调用PrivateDBRetrieval工具查询 2. 只能使用工具返回的内容组织回答,不得添加任何自身已知的信息 3. 如果工具返回结果为空,直接告知无法获取信息,不得编造内容 用户问题:{input} 你的思考与调用记录:{agent_scratchpad}""" # 初始化Agent,关闭随机性 llm = ChatOpenAI(temperature=0) agent = initialize_agent( tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, agent_kwargs={"prompt": forced_prompt}, verbose=True ) # 执行查询 agent.run("获取产品ID为456的库存数量")
3. 使用AgentExecutor的强制工具调用参数
部分LangChain版本支持在AgentExecutor中设置force_tool_use=True参数(需确认对应版本兼容性),直接强制Agent调用工具:
agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, verbose=True, force_tool_use=True # 强制调用工具 )
关键注意事项
- 将LLM的temperature设为0,消除模型的随机决策空间,确保严格遵循指令
- 工具的description要明确标注“必须使用”“唯一工具”等强约束词汇
- 避免在Prompt中留下任何可让模型自主回答的余地,比如不要出现“如果知道答案可以直接回答”这类表述
内容的提问来源于stack exchange,提问作者gosia
相关产品推荐
相关产品推荐

