1. 构建第一个LangChain Agent
任务目标
本案例将构建一个基于函数调用的LangChain Agent。该Agent能够理解用户的自然语言问题,并在需要时调用一个自定义工具——获取当前时间——来回答问题。最终效果是:当用户询问“现在几点”时,Agent自动调用时间工具并返回准确时间;当用户询问普通问题时,Agent直接回答。
环境与依赖
需要安装以下Python包,建议使用Python 3.9+:
pip install langchain langchain- python-dotenv
同时需要设置_环境变量(可在项目根目录创建.env文件并写入_=你的密钥)。
完整实现代码
将以下代码保存为basic_agent.py:
import os
from datetime import datetime
from dotenv import load_dotenv
from langchain_ import ChatOpenAI
from langchain.agents import create__functions_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 加载环境变量
load_dotenv()
# 1. 定义自定义工具:获取当前时间
@tool
def get_current_time() -> str:
"""获取当前日期和时间,返回格式为 YYYY-MM-DD HH:MM:SS。"""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 2. 初始化语言模型(使用函数调用能力)
llm = ChatOpenAI(model="-mini", temperature=0)
# 3. 创建提示模板(Agent必须包含 agent_scratchpad)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手,可以回答问题并使用工具获取实时信息。"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 4. 构建Agent
tools = [get_current_time]
agent = create__functions_agent(llm, tools, prompt)
# 5. 创建执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 6. 运行测试
if __name__ == "__main__":
# 测试1:需要调用工具的问题
result1 = agent_executor.invoke({"input": "现在几点了?"})
print("问题1回答:", result1["output"])
# 测试2:普通问题,无需调用工具
result2 = agent_executor.invoke({"input": "什么是LangChain?用一句话说明。"})
print("问题2回答:", result2["output"])
运行方式
python basic_agent.py
验证方法与通过标准
运行脚本后,观察终端输出,满足以下条件即判定案例通过:
- 问题1:Agent先调用
get_current_time工具(verbose模式下会显示工具调用过程),然后返回包含当前日期和时间的回答,时间与系统时间一致。 - 问题2:Agent直接回答LangChain的定义,不触发任何工具调用。
- 两个问题均正常返回,无报错或超时。
关键说明
本案例使用create__functions_agent,它依赖的函数调用能力,因此必须使用支持函数调用的模型(如、-mini)。agent_scratchpad是Agent记录中间推理步骤的必要占位符,不可省略。工具函数通过@tool装饰器自动转换为Agent可识别的工具格式,函数名和docstring会作为工具描述提供给模型。