LangChain Agent实践:构建智能推理和工具调用系统
引言
LangChain的Agent(智能体)系统提供了一种强大的机制,能够让AI模型进行推理并自主决定何时调用工具函数。本文将详细介绍如何使用LangChain构建和使用Agent系统。
环境准备
import os
from dotenv import load_dotenv
from langchain.agents import initialize_agent, AgentType
from langchain.tools import tool
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
# 加载环境变量
load_dotenv()
模型配置
model = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("KEY"),
model="google/gemini-2.0-flash-001"
)
工具函数定义
1. 使用StructuredTool
def get_sunset(region: str):
"""
获取指定地区的日落时间
:param region: 地区
:return: 日落时间信息
"""
return f"{region}日落时间为18:30"
# 转换为工具
getSunsetTool = StructuredTool.from_function(
func=get_sunset,
description="获取指定地区的日落时间",
name="get_sunset"
)
2. 使用@tool装饰器
@tool
def get_weather(region: str):
"""
获取指定地区的天气
:param region: 地区
:return: 天气信息
"""
return f"{region}晴天,25度"
Agent初始化和使用
# 初始化Agent
agent = initialize_agent(
tools=[get_weather, getSunsetTool],
llm=model,
agent_type=AgentType.OPENAI_FUNCTIONS,
verbose=True # 启用详细输出
)
# 使用Agent处理查询
query = "上海今天天气怎么样什么时候日落"
response = agent.invoke(query)
print(response)
Agent工作流程解析
当Agent收到查询时,会经历以下步骤:
-
思考阶段(Thought)
I need to find out the weather and sunset time for Shanghai.
-
行动选择(Action)
Action: get_weather Action Input: 上海
-
观察结果(Observation)
Observation: 上海晴天,25度
-
继续推理
Thought: I have the weather information for Shanghai. Now I need to get the sunset time.
-
执行下一个动作
Action: get_sunset Action Input: 上海
-
生成最终答案
Final Answer: 上海今天晴天,25度,日落时间为18:30
技术要点解析
1. Agent类型
agent_type=AgentType.OPENAI_FUNCTIONS
- OPENAI_FUNCTIONS:使用OpenAI函数调用方式
- 其他可用类型:ZERO_SHOT_REACT_DESCRIPTION, STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION等
2. 工具注册
tools=[get_weather, getSunsetTool]
- 支持多个工具同时注册
- 工具可以混合使用@tool和StructuredTool
3. 详细输出
verbose=True
- 显示Agent的思考和决策过程
- 便于调试和理解Agent的行为
最佳实践
1. 工具函数设计
@tool
def get_detailed_weather(region: str):
"""
获取详细的天气信息
Args:
region: 地区名称
Returns:
包含温度、湿度、风向等信息的详细天气报告
"""
return {
"temperature": "25度",
"humidity": "65%",
"wind": "东北风3级"
}
2. 错误处理
@tool
def safe_tool_call(func_name: str, *args):
try:
return globals()[func_name](*args)
except Exception as e:
return f"调用{func_name}失败:{str(e)}"
3. 复杂查询处理
def process_complex_query(query):
try:
response = agent.invoke({
"input": query,
"context": {"time": "morning", "location": "Shanghai"}
})
return response["output"]
except Exception as e:
return f"处理查询失败:{str(e)}"
应用场景
-
智能助手
- 个人助理
- 客服系统
- 信息查询
-
自动化工作流
- 数据处理
- 系统集成
- 任务调度
-
决策支持
- 数据分析
- 推荐系统
- 风险评估
注意事项
-
性能优化
- 避免过多的工具调用
- 合理设置超时时间
- 使用缓存机制
-
安全性
- 输入验证
- 权限控制
- 资源限制
-
可维护性
- 清晰的工具文档
- 模块化设计
- 日志记录
结论
LangChain的Agent系统提供了一种智能的方式来组合和使用工具函数,通过合理的配置和使用,可以构建出强大的AI应用系统。
参考资料
- LangChain官方文档
- OpenAI Functions文档
- Agent系统最佳实践指南
通过本文的介绍,你应该能够理解如何使用LangChain的Agent系统来构建智能的工具调用流程,为AI应用添加更多的实用功能。