3. 自定义工具集成到Agent
任务目标
本案例要求编写一个自定义工具(获取当前时间),并将其集成到Agent中,使Agent在收到相关提问时能够自动调用该工具并返回结果。我们将使用LangChain框架完成集成,最终通过命令行交互验证Agent是否正确路由到工具。
环境依赖
需要安装以下Python包:
pip install langchain langchain-
同时需要配置 (环境变量 _),或替换为其他兼容的LLM。
核心实现
以下代码定义了一个获取当前时间的自定义工具,并将其绑定到Agent。Agent通过ReAct逻辑决定何时调用该工具:
from datetime import datetime
from langchain.tools import tool
from langchain.agents import initialize_agent, AgentType
from langchain_ import ChatOpenAI
# 1. 定义自定义工具
@tool
def get_current_time(format: str = "%Y-%m-%d %H:%M:%S") -> str:
"""获取当前系统时间。当用户询问"现在几点"、"今天日期"等时间相关问题时使用。"""
return datetime.now().strftime(format)
# 2. 初始化LLM(需设置_环境变量)
llm = ChatOpenAI(model="-mini", temperature=0)
# 3. 将工具集成到Agent
agent = initialize_agent(
tools=[get_current_time],
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
handle_parsing_errors=True
)
# 4. 调用入口
if __name__ == "__main__":
# 测试用例1:应触发工具调用
response1 = agent.invoke("现在几点了?")
print("回答1:", response1["output"])
# 测试用例2:不应触发工具调用
response2 = agent.invoke("1+1等于多少?")
print("回答2:", response2["output"])
运行方式
- 将上述代码保存为
time_agent.py。 - 在终端执行:
python time_agent.py
验证方法与通过条件
运行后观察输出,满足以下条件即判定通过:
- 工具调用验证:在verbose输出中,针对“现在几点了”的提问,Agent的思考链中应出现
Action: get_current_time和Action Input: {"format":"%Y-%m-%d %H:%M:%S"},最终回答包含当前真实时间(与系统时间一致)。 - 不误调用验证:针对“1+1等于多少”的提问,Agent不应调用工具,直接返回计算结果2。
- 格式正确性:返回的时间字符串符合
YYYY-MM-DD HH:MM:SS格式。
若上述两点均满足,说明自定义工具已成功集成并被Agent正确路由调用。
常见问题
- 未设置:运行前需在终端执行
export _="sk-...",否则会报认证错误。 - 工具描述不清晰:若Agent未触发工具调用,请检查
@tool装饰器下的docstring是否明确说明了工具的适用场景,LangChain依赖该描述进行路由决策。 - 解析错误:若出现输出解析异常,
handle_parsing_errors=True会返回原始输出而非崩溃,可据此调整工具描述或模型。