Simple Agent -main(创建 Agent调用工具).py

目录结构 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()
添加新评论