AI Agent

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import tool
from langchain_core.prompts import PromptTemplate
import os

# ============================================
# 第一部分:定义工具(Tools)
# 工具是Agent可以调用的外部函数,扩展了LLM的能力
# ============================================

@tool
def calculator(expression: str) -> str:
    """
    计算数学表达式。
    输入应该是一个有效的数学表达式,如 '2 + 2' 或 '3 * 4 + 5'。
    """
    try:
        # 安全地计算数学表达式
        result = eval(expression, {"__builtins__": {}}, {})
        returnf"计算结果: {expression} = {result}"
    except Exception as e:
        returnf"计算错误: {str(e)}"

@tool
def get_current_weather(city: str) -> str:
    """
    获取指定城市的当前天气信息。
    输入应该是城市名称,如 '北京' 或 '上海'。
    """
    # 模拟天气数据(实际应用中应调用真实的天气API)
    weather_data = {
        "北京": "晴天,温度 5°C,湿度 30%",
        "上海": "多云,温度 12°C,湿度 65%",
        "广州": "小雨,温度 18°C,湿度 80%",
        "深圳": "晴天,温度 20°C,湿度 70%",
    }
    return weather_data.get(city, f"抱歉,暂无{city}的天气信息")

@tool
def search_knowledge(query: str) -> str:
    """
    搜索知识库获取相关信息。
    输入应该是要搜索的问题或关键词。
    """
    # 模拟知识库搜索(实际应用中可接入向量数据库或搜索引擎)
    knowledge_base = {
        "python": "Python是一种高级编程语言,以简洁易读著称,广泛应用于数据科学、Web开发和人工智能领域。",
        "agent": "AI Agent(智能体)是能够感知环境、做出决策并采取行动的自主系统。它由模型、工具和指令三部分组成。",
        "langchain": "LangChain是一个用于开发LLM应用的框架,提供了构建Agent、链式调用、记忆管理等功能。",
    }
    
    for key, value in knowledge_base.items():
        if key in query.lower():
            return value
    returnf"未找到与'{query}'相关的信息"

# ============================================
# 第二部分:定义指令(Instructions)
# 通过Prompt模板定义Agent的行为方式和安全策略
# ============================================

# ReAct风格的Prompt模板
AGENT_PROMPT = """你是一个智能助手,能够帮助用户完成各种任务。

你可以使用以下工具:
{tools}

工具名称列表: {tool_names}

请按照以下格式回答问题:

Question: 用户的输入问题
Thought: 你需要思考应该做什么
Action: 要使用的工具名称,必须是[{tool_names}]中的一个
Action Input: 工具的输入参数
Observation: 工具返回的结果
... (这个Thought/Action/Action Input/Observation可以重复多次)
Thought: 我现在知道最终答案了
Final Answer: 对用户问题的最终回答

重要指导方针:
1. 仔细分析用户的问题,选择合适的工具
2. 如果问题可以直接回答,无需使用工具
3. 回答要准确、简洁、有帮助
4. 如果不确定,诚实地说明

开始!

Question: {input}
Thought: {agent_scratchpad}"""

# ============================================
# 第三部分:创建Agent
# 组合模型、工具和指令
# ============================================

def create_simple_agent():
    """创建一个简单的Agent"""
    
    # 1. 初始化模型(Model)
    # 这里使用OpenAI的GPT模型,你也可以替换为其他LLM
    llm = ChatOpenAI(
        model="gpt-3.5-turbo",  # 或 "gpt-4"
        temperature=0,  # 设为0使输出更确定性
        # api_key=os.getenv("OPENAI_API_KEY"),  # 从环境变量获取
    )
    
    # 2. 准备工具列表(Tools)
    tools = [calculator, get_current_weather, search_knowledge]
    
    # 3. 创建Prompt模板(Instructions)
    prompt = PromptTemplate.from_template(AGENT_PROMPT)
    
    # 4. 创建ReAct Agent
    agent = create_react_agent(
        llm=llm,
        tools=tools,
        prompt=prompt
    )
    
    # 5. 创建Agent执行器
    agent_executor = AgentExecutor(
        agent=agent,
        tools=tools,
        verbose=True,  # 打印详细的执行过程
        handle_parsing_errors=True,  # 处理解析错误
        max_iterations=5,  # 最大迭代次数,防止无限循环
    )
    
    return agent_executor

# ============================================
# 第四部分:运行示例
# ============================================

def main():
    """运行Agent示例"""
    
    print("=" * 60)
    print("LangChain Agent 示例")
    print("=" * 60)
    
    # 创建Agent
    agent = create_simple_agent()
    
    # 测试用例
    test_questions = [
        "计算 (15 + 25) * 3 等于多少?",
        "北京今天天气怎么样?",
        "什么是LangChain?",
        "帮我计算一下,如果北京温度是5度,上海是12度,它们的平均温度是多少?",
    ]
    
    for i, question in enumerate(test_questions, 1):
        print(f"\n{'='*60}")
        print(f"测试 {i}: {question}")
        print("=" * 60)
        
        try:
            result = agent.invoke({"input": question})
            print(f"\n最终答案: {result['output']}")
        except Exception as e:
            print(f"执行出错: {str(e)}")

if __name__ == "__main__":
    main()

评论