目录结构 init_model.py 和 tools文件在历史文章中
05 - Simple Agent (简单 Agent)
├── tools
│ ├── __pycache__
│ ├── __init__.py
│ ├── calculator.py
│ ├── weather.py
│ └── web_search.py
├── main.py
├── 其他练习
├── .env
└── init_model.py
创建 Agent并调用工具
"""
LangChain 1.0 - Simple Agent (使用 create_agent)
=============================================
本模块重点讲解:
1. 使用 create_agent 创建 Agent(LangChain 1.0 统一API)
2. Agent 自动决定何时使用工具
3. Agent 执行循环的工作原理
"""
import sys
import os
from openai import chat
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from init_model import get_chat_model
from langchain_core.tools import tool
from init_model import get_chat_model
from langchain.agents import create_agent
# 导入自定义工具
from tools import weather
from tools import web_search
from tools import calculator
# 初始化数据
weather_tool = weather.get_weather
web_search_tool = web_search.web_search
calculator_tool = calculator.calculator
chat_model = get_chat_model()
def example_1_basic_agent():
"""
示例1:基本 Agent 演示
"""
# 创建 Agent
agent = create_agent(model=chat_model, tools=[weather_tool]) # 只给一个工具
# 测试:需要工具的问题
print("\n测试1:询问天气(需要工具)")
response = agent.invoke(
{"messages": [{"role": "user", "content": "北京今天天气怎么样?"}]}
)
final_message = response["messages"][-1]
print(final_message.content)
# 测试 不需要工具的问题
print("\n测试2:简单介绍(不需要工具)")
response = agent.invoke(
{
"messages": [
{"role": "user", "content": "你好,请简单介绍一下你自己,20字以内"}
]
}
)
final_message = response["messages"][-1]
print(final_message.content)
# ============================================================================
# 示例 2:多工具 Agent
# ============================================================================
def example_2_multi_tools_agent():
"""
示例2:多工具 Agent 演示
"""
# 创建 Agent
agent = create_agent(
model=chat_model, tools=[weather_tool, web_search_tool, calculator_tool]
)
print("\n配置的工具:")
print(" - get_weather(天气查询)")
print(" - calculator(计算器)")
print(" - web_search(网页搜索)")
# 测试不同类型的问题
tests = [
"上海的天气怎么样?", # 应该用 get_weather
"15 乘以 23 等于多少?", # 应该用 calculator
]
for test in tests:
print(f"\n测试:{test}")
response = agent.invoke({"messages": [{"role": "user", "content": test}]})
final_message = response["messages"][-1]
print(final_message.content)
print("\n关键点:")
print(" - Agent 从多个工具中选择最合适的")
print(" - 基于工具的 docstring 理解工具用途")
# ============================================================================
# 示例 3:带系统提示的 Agent
# ============================================================================
def example_3_system_prompt_agent():
"""
示例3:带系统提示的 Agent
使用 system_prompt 参数
"""
# 创建带系统提示的 Agent
agent = create_agent(
model=chat_model,
tools=[weather_tool, calculator_tool],
system_prompt="""你是一个友好的助手。特点:
- 使用工具前先说明是否需要使用工具,及调用工具的参数
- 结果用表格或列表清晰展示
""",
)
print("\n测试:自定义行为的 Agent")
response = agent.invoke(
{
"messages": [
{"role": "user", "content": "北京天气如何?顺便算一下 100 加 50"}
]
}
)
final_message = response["messages"][-1]
print(final_message.content)
print("\n关键点:")
print(" - system_prompt 定义 Agent 的行为风格")
print(" - 可以指定输出格式、语气、工作流程等")
# ============================================================================
# 示例 4:Agent 执行过程详解
# ============================================================================
def example_4_agent_execution_details():
"""
示例4:查看 Agent 执行的完整过程
理解 Agent 如何一步步工作
"""
agent = create_agent(model=chat_model, tools=[calculator_tool])
response = agent.invoke(
{"messages": [{"role": "user", "content": "25 乘以 8 等于多少?"}]}
)
# 显示完整的消息历史
print("\n完整消息历史:")
for i, msg in enumerate(response["messages"], 1):
print(f"\n--- 消息 {i} ({msg.__class__.__name__}) ---")
if hasattr(msg, "content"):
print(f"内容:{msg.content}")
if hasattr(msg, "tool_calls") and msg.tool_calls:
print(f"工具调用:{msg.tool_calls}")
# ============================================================================
# 示例 5:多轮对话 Agent
# ============================================================================
def example_5_multi_turn_agent():
"""
示例5:Agent 的多轮对话
关键:传入历史消息
"""
agent = create_agent(model=chat_model, tools=[calculator_tool])
response1 = agent.invoke(
{"messages": [{"role": "user", "content": "10 加 5 等于多少?"}]}
)
print(f"Agent:{response1['messages'][-1].content}")
# 第二轮:继续上一轮的对话
print("\n用户:再乘以 3 呢?")
response2 = agent.invoke(
{
"messages": response1["messages"]
+ [{"role": "user", "content": "再乘以 3 呢?"}]
}
)
print(f"Agent:{response2['messages'][-1].content}")
# ============================================================================
# 示例 6:Agent 最佳实践
# ============================================================================
def example_6_agent_best_practices():
"""
示例6:Agent 最佳实践
"""
# 最佳实践:
# 1. 工具选择
# - 只给 Agent 需要的工具(工具太多会混淆)
# - 工具的 docstring 要清晰
# - 每个工具功能单一
# 2. System Prompt
# - 明确说明 Agent 的角色
# - 定义输出格式
# - 说明何时使用工具
# 3. 错误处理
# - 工具内部捕获异常
# - 返回友好的错误信息
# - Agent 可以处理工具失败
# 4. 性能优化
# - 减少不必要的工具调用
# - 缓存常用查询结果
# - 使用流式输出(后续学习)
# 5. 测试
# - 测试各种问题类型
# - 测试边界情况
# - 验证工具选择是否正确
# """)
print("\n示例:良好配置的 Agent")
agent = create_agent(
model=chat_model,
tools=[weather_tool, calculator_tool],
system_prompt="""你是一个专业的助手。
工作流程:
1. 仔细理解用户问题
2. 如果需要工具,先说明将要做什么
3. 调用工具获取准确信息
4. 基于结果给出清晰答案
输出要求:
- 简洁明了
- 数据准确
- 格式清晰
""",
)
print("\n测试:")
response = agent.invoke(
{"messages": [{"role": "user", "content": "北京天气如何?"}]}
)
print(f"Agent 回复:{response['messages'][-1].content}")
def main():
# example_1_basic_agent()
# example_2_multi_tools_agent()
# example_3_system_prompt_agent()
# example_4_agent_execution_details()
# example_5_multi_turn_agent()
example_6_agent_best_practices()
if __name__ == "__main__":
main()