3. 自定义工具集成到Agent

自定义工具集成到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"])

运行方式

  1. 将上述代码保存为 time_agent.py。
  2. 在终端执行: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 会返回原始输出而非崩溃,可据此调整工具描述或模型。