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()