当前位置: 首页 > news >正文

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的质量之和。")]})

执行结果
在这里插入图片描述

相关文章:

  • VSCode中结合DeepSeek使用Cline插件的感受
  • 2-Docker常用命令
  • 30--当路由器学会“反侦察“:华为URPF协议配置全解
  • 2022 年 6 月青少年软编等考 C 语言七级真题解析
  • 2025年渗透测试面试题总结- 某58同城-安全工程师扩展(题目+回答)
  • 当AI助理接管云计算-走向智能运维的新时代
  • Spring AI Alibaba示例项目深度解析:helloworld子模块详解(经典解读版)
  • 2025年渗透测试面试题总结- 某深某服-漏洞研究员实习扩展(题目+回答)
  • Spring AI Alibaba示例项目深度解析:dashscope-audio子模块详解
  • Android学习之Material Components
  • PyTorch构建自定义模型
  • 从2G到5G:认证体系演进与网元架构变迁深度解析
  • 使用 iPerf 测试内网两台机器之间的传输速度
  • 2025大唐杯仿真4——信令流程
  • 调用阿里云API实现运营商实名认证
  • 现代科幻赛博朋克风品牌海报电子竞技设计无衬线英文字体 Glander – Techno Font
  • 论文导读 | SOSP23 | Gemini:大模型 内存CheckPoint 快速故障恢复
  • 2025年渗透测试面试题总结-某一线实验室实习扩展(题目+回答)
  • [ctfshow web入门] 零基础版题解 目录(持续更新中)
  • 树莓派5中部署 开源 RF-DETR 实时目标检测模型
  • 建网站做日租房/新闻小学生摘抄
  • 南京网站建站公司/关键词竞价排名
  • 网站到期是否能换服务商/如何提高网站在搜索引擎中的排名
  • 微信h5网站开发/全球网站排名查询
  • 徐州手机网站优化公司/西安网络推广优化培训
  • 电子商务公司建设网站方案设计/游戏推广员是违法的吗