Files
SmartVoyage/demo/agent/react_agent.py
liangfangxing 0b087df55e feat: mcp
2026-03-20 11:26:44 +08:00

106 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import AgentExecutor, create_react_agent
from conf import settings
# 创建模型
llm = ChatOpenAI(
base_url=settings.base_url,
api_key=settings.api_key,
model=settings.model_name,
temperature=0.1
)
# 2.定义工具
# 关键修改:重写 multiply 工具,使其只接受一个字符串参数,并在内部解析。
@tool
def multiply(numbers_str: str) -> int:
"""用于计算两个整数的乘积。
参数:
numbers_str (str): 包含两个整数的字符串,用逗号分隔,例如:"100,25"
返回:
int: 两个整数的乘积。
"""
print(f"正在执行乘法: {numbers_str}")
try:
a_str, b_str = numbers_str.split(',')
a = int(a_str.strip())
b = int(b_str.strip())
return a * b
except ValueError:
return "输入的格式不正确,请确保是两个用逗号分隔的整数,例如:'100,25'"
@tool
def search_weather(city: str) -> str:
"""用于查询指定城市的实时天气。"""
print(f"正在查询天气: {city}")
if "北京" in city:
return "北京今天是晴天气温25摄氏度。"
elif "上海" in city:
return "上海今天是阴天有小雨气温22摄氏度。"
else:
return f"抱歉,我没有'{city}'的天气信息。"
# 将工具列表放入一个变量
tools = [multiply, search_weather]
# 3.自定义 ReAct 风格的 Prompt
react_prompt_template = """你是一个有用的 AI 助手,可以访问以下工具:
{tools}
请根据用户输入一步步推理,并按以下规则操作:
1. 每次输出只能包含一个动作Action 和 Action Input或一个最终答案Final Answer
2. 如果用户输入包含多个任务,依次处理每个任务,不要一次性输出所有步骤。
3. 每次行动前说明你的思考Thought并选择合适的工具或直接给出最终答案。
4. 如果需要使用工具,格式必须为:
Thought: [你的思考]
Action: [工具名称]
Action Input: [工具的输入参数例如对于multiply工具使用'100,25'格式]
5. 如果可以直接回答或所有任务都完成,格式为:
Thought: [你的思考]
Final Answer: [最终答案]
可用的工具名称有: {tool_names}
用户输入: {input}
{agent_scratchpad}
"""
react_prompt = ChatPromptTemplate.from_template(react_prompt_template)
# 4.创建 ReAct 风格的 Agent
react_agent = create_react_agent(llm, tools, react_prompt)
# 5.创建 Agent Executor
react_executor = AgentExecutor(
agent=react_agent,
tools=tools,
verbose=True,
handle_parsing_errors=True # 启用错误处理,自动重试解析错误
)
# 6: 运行并测试 Agent
if __name__ == "__main__":
# 测试用例1: 查询天气
print("--- 运行Agent查询: 上海今天的天气怎么样? ---")
response_weather = react_executor.invoke({"input": "上海今天的天气怎么样?"})
print(f"\n--- Agent响应: ---")
print(response_weather.get("output", "没有找到输出。"))
print("-" * 30 + "\n")
# 测试用例2: 数学计算
print("--- 运行Agent查询: 100乘以25等于多少 ---")
response_math = react_executor.invoke({"input": "100乘以25等于多少"})
print(f"\n--- Agent响应: ---")
print(response_math.get("output", "没有找到输出。"))
print("-" * 30 + "\n")
# 测试用例3: 包含多个任务
print("--- 运行Agent查询: 100乘以25等于多少 上海的天气如何? ---")
response_multi = react_executor.invoke({"input": "100乘以25等于多少 上海的天气如何?"})
print(f"\n--- Agent响应: ---")
print(response_multi.get("output", "没有找到输出。"))
print("-" * 30 + "\n")