AI Agent设计模式六:ReAct
概念 :思考-执行循环系统
- ✅ 优点:提升任务完成度,适合复杂问题拆解
- ❌ 缺点:执行延迟较高,资源消耗大
from langchain_core.messages import SystemMessage, HumanMessage, ToolMessage, AIMessage
from langgraph.prebuilt import ToolNode
from langchain_core.tools import tool
from langgraph.graph import MessagesState, StateGraph,START, END
from langchain_openai import ChatOpenAI
import os
# 初始化模型
llm = ChatOpenAI(
model="gpt-3.5-turbo",
openai_api_key=os.environ["GPT_API_KEY"],
openai_api_base="https://api.chatanywhere.tech/v1",
streaming=False # 禁用流式传输
)
# 定义函数,后续作为节点
@tool
def add_numbers(a: float, b: float) -> float:
"""
计算两数之和
参数:
a (float): 第一个数字
b (float): 第二个数字
返回:
float: 两数之和
"""
print(f"开始计算:{a} + {b} = {a+b}")
return a + b
@tool
def get_planet_mass(planet: str):
"""
查询星球质量(单位:千克)
参数:
planet (str): 星球名称,例如 'Earth' 或 '地球'
返回:
float: 星球质量
"""
PLANET_MASSES = {
'Mercury': 3.301e23,
'Venus': 4.867e24,
'Earth': 5.972e24,
'Mars': 6.417e23,
'Jupiter': 1.899e27,
'Saturn': 5.685e26,
'Uranus': 8.682e25,
'Neptune': 1.024e26,
'Sun': 1.989e30
}
print(f"查询星球质量:{planet}")
mass = PLANET_MASSES.get(planet, 0)
print(f"{planet}的星球质量为:{mass} kg")
return f"{planet}的质量为{mass} 10^24千克"
# 所有的tool 工具列表
tools = [get_planet_mass, add_numbers]
def llm_call(state: MessagesState):
# 将工具列表绑定到大模型上
llm_with_tools = llm.bind_tools(tools)
print(f"大模型开始判断")
response = llm_with_tools.invoke(
[
SystemMessage(content="""你是一个智能助手"""),
*state["messages"]
]
)
return {"messages": state["messages"] + [response]}
def should_continue(state: MessagesState):
"""
判断是否继续执行
"""
messages = state["messages"]
last_message = messages[-1]
if last_message.tool_calls:
print(f"调用工具: {last_message.tool_calls}")
return "Action"
print(f"流程结束")
return END
#定义图
workflow = StateGraph(MessagesState)
# 定义节点
workflow.add_node("llm_call", llm_call)
# 将所有的工具封装成工具节点
workflow.add_node("tools", ToolNode(tools=tools))
# 定义边
workflow.add_edge(START,"llm_call")
workflow.add_conditional_edges(
"llm_call",
should_continue,
{
"Action": "tools",
END: END
}
)
workflow.add_edge("tools", "llm_call")
# 编译
graph = workflow.compile()
# 执行
graph.invoke({"messages": [HumanMessage(content="请计算一下Earth和Sun的质量之和。")]})
执行结果