用 LangGraph 实现 Agent 经典模式 ReAct

Langgraph实战-Agent-ReAct(Reason+Act)概述 ReAct 架构将推理与动作相结合,使Agent能够通过生成想法并基于这些想法执行动作。这种决策透明度使Agent能够更负责地执行任务,因为它会记录每一步的推理过程。 阅读详情


  1. LangGraph 核心概念

1.0 先看个最小例子

from typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, ENDclassCountState(TypedDict):    count: intdefincrement(state: CountState) -> dict:    return {"count": state["count"] + 1}defshould_stop(state: CountState) -> str:    return"stop"if state["count"] >= 3else"continue"graph = StateGraph(CountState)graph.add_node("increment", increment)graph.add_edge(START, "increment")graph.add_conditional_edges(    "increment",    should_stop,    {"continue": "increment", "stop": END},)app = graph.compile()print(app.invoke({"count": 0}))   # {'count': 3}

LangGraph 的 API解读:

  • StateGraph(CountState) —— 一张图,全局 state 是 CountState
  • add_node("increment", increment) —— 注册节点
  • add_edge(START, "increment") —— 普通边
  • add_conditional_edges(..., should_stop, {...}) —— 条件边
  • compile() —— 把声明式结构变成可执行对象
  • invoke(...) —— 启动图,跑一次到结束

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

条件边:“stop” → END, “continue” → 回 increment 自身。

1.1 图的三个核心元素

┌───────────────────────────────────────────┐│                                           ││  State   →  全局上下文 / 状态机的全局变量   ││  Node    →  处理函数 / 读 state 写回 state ││  Edge    →  节点之间的转移规则              ││                                           │└───────────────────────────────────────────┘

LangGraph 对应到代码上,就是 StateGraph 类的 add_node / add_edge / 状态 schema 定义。

1.2 State 在节点间自动累积

节点之间传 state,要回答一个问题:节点返回的部分 state 是覆盖还是追加?

默认是覆盖。简单字段(比如 count: int)这样没问题,但 messages: list 就不行——每一轮 LLM 调用、工具调用都要把新消息追加到对话历史里。

LangGraph 用类型注解里挂一个"如何合并"的小函数来解决:

from collections.abc import Sequencefrom typing import Annotatedfrom typing_extensions import TypedDictfrom langchain_core.messages import BaseMessagefrom langgraph.graph.message import add_messagesclass AgentState(TypedDict):    messages: Annotated[Sequence[BaseMessage], add_messages]

add_messages 就是那个合并函数,合并规则是追加而不是替换:

# 节点 A 返回 {"messages": [msg1, msg2]}   → state["messages"] 追加 msg1, msg2# 节点 B 返回 {"messages": [msg3]}         → state["messages"] 追加 msg3

这样 ReAct 那张图才能"循环跑 N 轮,每一轮的对话历史都保留下来",下一轮 LLM 看到的是完整历史。

不挂合并函数会怎样:

class AgentState(TypedDict):    messages: list                  # ← 默认行为 = 替换# 节点返回 {"messages": [AIMessage(content="...")]}# state["messages"] 整个被替换为那条 AI 消息# HumanMessage("天气?") 丢了,下一轮 LLM 不知道用户问的什么

1.3 边的两类

  • 普通边add_edge("A", "B") —— A 跑完一定跳 B
  • 条件边add_conditional_edges("A", router_fn, path_map) —— A 跑完调 router_fn(state),根据返回值查 path_map 决定下一步

ReAct 的"要不要继续调工具"循环,天然需要条件边。

1.4 入口与终止

  • 入口:START 节点,或 set_entry_point("agent") 显式指定第一个节点
  • 终止:END 特殊标识,代表图跑完了

LangGraph 内置了 START 哨兵节点(不需要 add_node("START", ...) 注册),compile() 后图从它开始执行。


  1. 如何用 LangGraph 实现 ReAct 模式

2.1 ReAct 是什么

ReAct深度解析:从方法论到工程实践

ReAct(Reason-Action)的核心:让大模型在思考的同时也能动手——不是先全部想完再调工具,而是每想一步都可能动手,再根据工具返回的结果继续推理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

循环路径:思考 → 行动 → 观察 → 思考 → … 退出路径:思考 → 最终回答

模型自己决定每一步该做什么。这种"思考 → 行动 → 观察 → 思考 → …"循环可能跑很多次才停,也可能一轮就够。

2.2 用 LangGraph 中图的概念实现 ReAct

把 ReAct 翻译成 LangGraph 的图,3 个决策:

决策 1:有几个节点? —— 2 个。ReAct 行为里两个不同的工作:调大模型让它思考、跑工具拿到结果。

  • agent 节点 = 调大模型
  • tools 节点 = 执行模型声明的工具调用

决策 2:有几条边? —— 1 条普通边 + 1 条条件边。

  • tools 跑完一定回到 agent → 普通边 tools → agent
  • agent 跑完后不一定去 tools,模型觉得答完了就直接结束 → 条件边 agent → {tools, END}

决策 3:条件边的路由器怎么写? —— "是否继续"等价于:最近一条 AI 消息里有没有 tool_calls?

  • 有 → 模型想调工具,跳 tools
  • 没有 → 模型给出最终答案,跳 END

完整拓扑:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决策点放在 agent 之后(不是 tools 之后),因为"要不要继续"取决于 AI 的最新输出,不是工具结果。回边只画 tools → agent,反过来不会发生。

2.3 核心代码解读

2.3.1 图装配

build_app 把"图怎么装起来"全说清楚:state schema、三个处理单元、Provider/checkpointer 全部串成一张可执行图。先看完整骨架,后面 §2.3.2-§2.3.4 再拆每个零件。

from langgraph.checkpoint.memory import InMemorySaverfrom langgraph.graph import END, StateGraphfrom langgraph.graph.state import CompiledStateGraphdefbuild_app(model=None, tools=None, checkpointer=None) -> CompiledStateGraph:    if tools isNone:        tools = ALL_TOOLS                                       # §2.3.3 ② 默认工具集    if model isNone:        model = make_default_model().bind_tools(tools)          # §2.3.4 ② + ③    checkpointer = checkpointer or InMemorySaver()    workflow = StateGraph(AgentState)                           # §2.3.2    workflow.add_node("agent", make_call_model(model))          # §2.3.3 ①    workflow.add_node("tools", make_tool_node(tools))           # §2.3.3 ②    # 入口    workflow.set_entry_point("agent")    # 条件边:agent 出来后路由器判下一步    workflow.add_conditional_edges(        "agent",        should_continue,                                        # §2.3.3 ③        {"continue": "tools", "end": END},    )    # 回边    workflow.add_edge("tools", "agent")    # 编译成可执行对象    return workflow.compile(checkpointer=checkpointer)

add_conditional_edges 是三元组:源节点 + 路由器 + 路径映射表。set_entry_point("agent") 是 add_edge(START, "agent") 的简写。compile(checkpointer=...) 实例化整张图,带上 InMemorySaver —— 这个 checkpointer 不是摆设,它给图配上一个"按 thread_id 持久化 state"的存储后端。

2.3.2 状态 schema
from collections.abc import Sequencefrom typing import Annotatedfrom typing_extensions import TypedDictfrom langchain_core.messages import BaseMessagefrom langgraph.graph.message import add_messagesclass AgentState(TypedDict):    """ReAct 唯一的全局状态:messages 列表。"""    messages: Annotated[Sequence[BaseMessage], add_messages]

AgentState 是图的全局 state,只有 1 个字段 messages,装着对话历史。每节点产生的新消息按 add_messages 的合并规则追加到这个列表里。

2.3.3 三个处理单元

① 大模型调用(agent 节点)

from langchain_core.messages import SystemMessagefrom langchain_core.runnables import RunnableConfigSYSTEM_PROMPT = SystemMessage(    "You are a helpful AI assistant, please respond to the users query to the best of your ability!")defmake_call_model(model):    """工厂:返回一个能被 LangGraph 当作节点调用的函数。"""    defcall_model(state: AgentState, config: RunnableConfig = None) -> dict:        response = model.invoke([SYSTEM_PROMPT] + list(state["messages"]), config)        return {"messages": [response]}   # list 包一层,因为合并函数需要列表    return call_model

工厂模式是为了测试时方便换底层模型——FakeMessagesListChatModel 是 langchain_core 自带的假模型,不需要调真 API:

fake_model = FakeMessagesListChatModel(responses=[...])call_model = make_call_model(fake_model)graph.add_node("agent", call_model)

直接定义 call_model(state) 会硬编码(hardcode)用哪个模型,测试得 monkeypatch 替换。工厂把"用什么模型"作为参数注入。

② 工具执行(tools 节点)

import jsonfrom langchain_core.messages import ToolMessagedefmake_tool_node(tools):    tools_by_name = {t.name: t for t in tools}   # 只算一次,后续节点调用复用    deftool_node(state: AgentState) -> dict:        outputs = []        # 取最新那条 AI 消息里的所有 tool_calls,逐个执行        for tool_call in state["messages"][-1].tool_calls:            tool_result = tools_by_name[tool_call["name"]].invoke(tool_call["args"])            outputs.append(                ToolMessage(                    content=json.dumps(tool_result),                    name=tool_call["name"],                    tool_call_id=tool_call["id"],   # 必须跟 AI 消息的 id 配对                )            )        return {"messages": outputs}    return tool_node

state["messages"][-1].tool_calls —— 只读最新那条 AI 消息里的 tool_calls。LLM 一次能 emit 多个 tool_call,逐个跑。

tool_call_id=tool_call["id"] —— 协议强约束。每条 ToolMessage 必须带 tool_call_id 跟产生它的 AI 消息里 tool_call["id"] 配对,否则下一轮 LLM 看不到对应关系。

工具定义:

from langchain_core.tools import tool@tooldefget_weather(location: str) -> str:    """Call to get the weather from a specific location."""    ifany(city in location.lower() for city in ["sf", "san francisco"]):        return"It's sunny in San Francisco, but you better look out if you're a Gemini 😈."    returnf"I am not sure what the weather is in {location}"ALL_TOOLS = [get_weather]

@tool 装饰器把普通函数转成 BaseTool,bind_tools(tools) 就会把它的函数签名 + docstring(name="get_weather"、参数 location: str、docstring 当 description)打包成 JSON Schema 塞进 LLM 调用。

注:项目的 get_weather 是占位实现(notebook 作者标注 “Don’t let the LLM know this though 😊”),真实场景要接天气 API。这里只演示工具协议怎么走通。

③ 是否继续(条件边路由器)

def should_continue(state: AgentState) -> str:    """最近一条 AI 消息有没有 tool_calls。"""    last_message = state["messages"][-1]    if not last_message.tool_calls:        return "end"    return "continue"

把 ReAct 论文里"模型在 Thought 字段里写 Finish[answer]“这种文本级约定,翻译成了协议级判定——只要消息没有 tool_calls,就等于"答完了”。模型不用老老实实写 Finish[...]。

2.3.4 LLM Provider 与模型工厂

① Provider 抽象

LLM 服务都长这样:模型名 + base_url + api key 三件套。把它们收成一张表,加 provider 就加一行:

from dataclasses import dataclass@dataclass(frozen=True)classProvider:    key_env: str                  # api key 存在哪个 env var    model_default: str            # 默认模型名    base_url_default: str | None# 默认 base_url(None = 走 ChatOpenAI 官方)PROVIDERS: dict[str, Provider] = {    "zhipu": Provider(        key_env="ZHIPUAI_API_KEY",        model_default="GLM-5.1",        base_url_default="https://open.bigmodel.cn/api/coding/paas/v4",    ),    "minimax": Provider(        key_env="MINIMAX_API_KEY",        model_default="MinMax-M3",        base_url_default="https://api.minimaxi.com/v1",    ),    "openai": Provider(        key_env="OPENAI_API_KEY",        model_default="gpt-4o-mini",        base_url_default=None,    ),}

三家都走 OpenAI 兼容的 /chat/completions 接口 + OpenAI 风格 tools 协议——所以只要换 base_url 和 api key,LangGraph 这边的图一行业务代码都不用改。

② 工厂方法 make_default_model

import osimport sysfrom langchain_openai import ChatOpenAIDEFAULT_PROVIDER = "zhipu"defrequire_env(name: str) -> str:    """读必需 env var,缺失就 stderr + sys.exit(2)('用法错误'惯例)。"""    val = os.environ.get(name)    ifnot val:        sys.stderr.write(            f"error: required env var '{name}' is not set. "            f"Copy .env.example to .env and fill it in, or export it "            f"in your shell.\n"        )        sys.exit(2)    return valdefmake_default_model() -> ChatOpenAI:    provider = os.getenv("LLM_PROVIDER", DEFAULT_PROVIDER).lower()    if provider notin PROVIDERS:        sys.stderr.write(            f"error: unknown LLM_PROVIDER='{provider}'. "            f"Choose one of: {', '.join(sorted(PROVIDERS))}.\n"        )        sys.exit(2)    cfg = PROVIDERS[provider]    api_key = require_env(cfg.key_env)    kwargs = {"model": cfg.model_default, "api_key": api_key}    if cfg.base_url_default:        kwargs["base_url"] = cfg.base_url_default    return ChatOpenAI(**kwargs)

ChatOpenAI 是 langchain_openai 封装的 OpenAI 客户端,base_url 一改,就从 OpenAI 切到 GLM / MiniMax / DeepSeek 等任意兼容端点。

③ bind_tools(tools) — 让模型"知道"有工具

model = make_default_model()model_with_tools = model.bind_tools(tools)   # ← 关键一行

bind_tools 把 tools 列表里每个工具的 schema(name、参数、docstring)塞进 LLM 调用,协议级告诉模型:“你可以 emit tool_calls 字段”。

模型返回的 AIMessage 因此有两种形态:

模型觉得要调工具模型觉得答完了
AIMessage(content="", tool_calls=[...])AIMessage(content="It's sunny...")

——这就是路由器 should_continue 工作的前提,bind_tools 装上协议,should_continue 才有 tool_calls 字段可读。

2.3.5 REPL 入口
import uuidfrom collections.abc import Iterablefrom langchain_core.messages import BaseMessagefrom .config import load_envfrom .graph import build_appBANNER = (    "ReAct REPL — type a message and press Enter.\n"    "  :clear  reset the conversation history (new thread)\n"    "  :quit   exit the REPL\n"    "  Ctrl-D  exit the REPL")def_format_message(msg: BaseMessage | tuple) -> str:    """LangGraph `stream_mode="values"` 的元素可能是 BaseMessage 也可能是历史 tuple,两种都格式化输出。"""    ifisinstance(msg, tuple):        returnstr(msg)    return msg.pretty_print()defprint_stream(stream: Iterable[dict]) -> None:    """每个 state 快照只打最后一条新追加的消息,避免 spam。"""    for s in stream:        msg = s["messages"][-1]        print(_format_message(msg))defrepl() -> None:    load_env()                  # 读 .env    app = build_app()           # §2.3.1 装好的图    print(BANNER)    thread_id = str(uuid.uuid4())    config = {"configurable": {"thread_id": thread_id}}        # ① 运行时配置    whileTrue:        try:            user_input = input("\n> ").strip()        except (EOFError, KeyboardInterrupt):            print("\nbye")            return        ifnot user_input:            continue        if user_input == ":quit":            print("bye")            return        if user_input == ":clear":                             # ③ 换 thread_id            thread_id = str(uuid.uuid4())            config = {"configurable": {"thread_id": thread_id}}            print("(history cleared)")            continue        inputs = {"messages": [("user", user_input)]}          # ② 初始 state        print_stream(app.stream(inputs, config, stream_mode="values"))if __name__ == "__main__":    repl()

① config —— 运行时配置

config = {"configurable": {"thread_id": thread_id}}

configurable 是 LangGraph 预留的 key,图运行时从这里读每次调用可变的参数。关键是 thread_id:LangGraph 的 checkpointer 按这个值存/读 state——换 thread_id = 开新对话,同一个 = 继续上次对话。configurable 里还能塞别的(user_id / recursion_limit 等),本教程只用 thread_id。

② inputs —— 图的初始 state

inputs = {"messages": [("user", user_input)]}

字段名要跟 AgentState 对得上——这里只有 messages,所以 inputs 只放 messages。元组 ("user", "...") 是 langchain_core 简写,langchain_core 看到元组就按第一个元素当 role 转成对应 BaseMessage("user" → HumanMessage、"assistant" → AIMessage)。直接传 HumanMessage(content=...) 也行,只是元组写法更简洁。

③ :clear 重置 thread_id

if user_input == ":clear":    thread_id = str(uuid.uuid4())    config = {"configurable": {"thread_id": thread_id}}

:clear不删 state(checkpointer 不暴露删接口)——而是换一个新 thread_id,旧 thread 还在内存里,新 thread 从空 state 启动。InMemorySaver 进程退出就清空,所以对用户来说"删"等价于"换"。

2.3.6 一轮 ReAct 跑起来

输入:用户问 “what’s the weather in sf?”,state["messages"] = [HumanMessage("what's the weather in sf?")]。

Agent 节点的输出 ≈ ReAct 的"思考 + 行动",Tools 节点的输出 ≈ ReAct 的"观察",should\_continue 路由 ≈ "下一步该思考还是该停止"决策,add\_messages 合并规则 ≈ 把每一轮的输出串成完整历史。

一轮跑完 3 个节点、2 段边(条件边 + 回边),ReAct 调一次工具就给出最终答案。


  1. 总结

  • LangGraph 用 Python 类表达"图"的语义。核心元素:State(全局上下文) + Node(处理函数) + Edge(转移规则)。State 自动在节点间累积,关键靠 Annotated[..., 合并函数] 的类型注解装配合并规则,最常见是 add_messages(追加而不是覆盖)。
  • 边的两类:普通边无条件,条件边靠路由器函数决定下一步
  • ReAct 在 LangGraph 里翻译成 2 节点 + 1 条件边:节点 agent 调大模型,节点 tools 跑工具,条件边 agent → {tools, END} 由 should_continue 路由,普通回边 tools → agent
  • ReAct 循环不是 for/while,是节点之间反复跳。决策点放在 agent 之后,因为"要不要继续"取决于 AI 的最新输出
  • should_continue 把 ReAct 论文里"Thought 里写 Finish[answer]"的文本约定,改成协议级判定(tool_calls 字段是否存在)
  • ToolMessage 的 tool_call_id 必须跟 AI 消息里 tool_call.id 配对,这是 OpenAI/Anthropic/GLM 的协议强约束

理解这套"2 节点 + 1 条件边"的最小骨架,后面所有 LangGraph agent 模式都只是在这套骨架上增加节点、增加状态字段、调整终止策略:

  • 把 END 换成 ask_human(human-in-the-loop)
  • 给 agent 节点配更复杂的 prompt,产出结构化输出
  • 多加几个 agent 节点,分别负责规划和执行
  • 在节点之间加 self-critique 节点

本质上都是"图的形态变化",LangGraph 的基本元素没变。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

LangGraph+ReAct构建可落地的AI Agent工作流 AI Agent 是指具备自主规划、工具调用与状态记忆能力的智能体,其核心原理在于将大模型的推理(Reasoning)与行动(Acting)解耦为可验证的闭环流程。LangGraph 通过有向图建模实现稳定的状态流转与错误隔离,ReAct 框架则提供结构化决策范式,显著提升多步任务的鲁棒性与可观测性。该技术组合在电商客服、智能运维、金融风控等需跨系统协同的场景中展现出强工程价值。本文聚焦 LangGraph 与 ReAct 的生产级集成实践,涵盖状态设计、工具绑定、记忆持久化及调试策略,直击‘大模型不会主动 阅读详情

相关推荐

Agent工程化演进:从ReAct到LangGraph与Dify的范式跃迁

Agent已超越‘能调用API的聊天机器人’概念,成为具备可调度、可审计、可回滚能力的生产级数字员工。其技术演进本质是解决LLM不确定性与业务确定性之间的根本矛盾:ReAct擅长动态推理与实时响应,但决策不可见、不可控;LangGraph通过显式状态机和确定性边路由重建执行可靠性;Dify则将二者封装为开箱即用的工作流操作系统,支持本地部署、知识库集成与企业级服务嵌入。当前一线开发热词如‘dify本地部署教程’‘langgraph面试题’‘hermes agent桌面版’,正印证开发者关注点已从模型调用转向

张 作强 BLOG 472

ReAct Agent(LangGraph实现)

ReAct Agent(LangGraph实现)

缘友一世的博客 1706

ReAct Agent架构设计与LangGraph实现详解

AI Agent开发中,工具调用与决策循环是核心技术难点。ReAct模式通过动态路由机制,将大语言模型(LLM)的推理能力与外部工具API相结合,有效解决了传统AI系统的时效性局限和资源浪费问题。在工程实现层面,LangGraph框架提供了状态机管理和条件路由支持,开发者可以构建包含工具注册中心、参数校验、并行调用等特性的生产级系统。这类架构特别适用于金融数据分析、智能客服等需要实时获取外部数据并执行多步推理的场景。通过模块化的子图设计和异常处理体系,系统能保持99.5%以上的工具调用成功率,同时支持跨平台

weixin_30383279的博客 368

LangGraph构建你的第一个 Tool Agent:从零理解 ReAct 循环

从一个“多步工具调用”问题切入,讲解ReAct Agent核心机制:LLM如何在推理、行动、观察之间循环,直到任务完成。以LangGraph拆解create_react_agent背后的实现原理,说明为什么仅靠agent节点、tools节点和一条条件边,就能构建出可自主决策的Tool Agent。同时结合Demo展示工具定义、状态管理、ToolMessage回写、路由判断和最大迭代限制等关键细节,并总结无限循环、工具误选、消息链丢失等常见问题及工程化解决方案,帮助读者从原理到实践掌握ReAct循环。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 3万+

Agent开发实战诊断手册:ReAct、LangChain与LangGraph避坑指南

Agent是大语言模型(LLM)驱动的智能体系统,其核心在于推理与行动的闭环协同。ReAct通过结构化输出约束保障可控性,LangChain提供可组合的运行时抽象,而LangGraph则以显式状态和有向无环图实现分布式事务协调。三者共同构成现代AI应用的工程基座,支撑客服对话、订单追踪、多源比价等真实场景。本文聚焦生产环境中高频崩溃点——如Action字段匹配失败、Observation错误截断、State字段缺失及条件边注册异常——结合2024年Q3真实案例,详解调试命令、日志定位与代码级修复方案,助力开

weixin_34198762的博客 445

LangGraph原生Agent架构:从ReAct到状态机的范式跃迁

Agent本质上是一种具备感知、决策与执行能力的智能体系统,其核心演进路径是从基于文本推理的ReAct模式,升级为以状态机、可插拔节点和持久化检查点为特征的确定性程序范式。这一转变使Agent从不可预测的‘语言游戏’走向可测试、可审计、可扩展的工程化系统。LangGraph作为底层执行引擎,通过state-node-edge抽象统一建模运行时行为,而create_agent则成为声明式构建LangGraph子图的轻量DSL。它天然支持多模型适配、细粒度流式更新(stream_mode='updates')与

weixin_34389926的博客 370

LangGraph实现ReACT架构Agent

本文介绍了LangGraph中预构建智能体的使用方法和核心组件。主要内容包括:1)通过预构建函数快速创建ReACT智能体和工具调用智能体;2)展示了完整实现示例,包括工具定义、模型创建和智能体调用流程;3)详细解析了LangGraph内置的高频组件,如MessagesState、ToolNode、ValidationNode和InjectedState的功能与使用方式。这些预构建组件能显著简化开发流程,同时保持系统灵活性,开发者可根据需求选择使用或自定义扩展。特别提示ReACT智能体在0.3.0版本后将更新

hh051020的博客 1079

五、AIGC大模型_09手动实现ReAct_Agent

是 LangGraph 提供的一个预构建方法(from langgraph.prebuilt import create_react_agent),它可以将语言模型(LLM)和一组工具(Tools)结合起来,创建一个能够根据用户输入自动调用工具的智能代理,这个代理可以根据用户的请求,决定是否需要调用某个工具,并将工具的输出反馈给用户这个函数如此好用,那么,其实现原理是什么,我们能否自定义方法实现ReAct_Agent呢?

LC的博客 1557

LangGraph进阶:构建ReACT架构的智能Agent

本文将深入探讨如何使用LangGraph来实现ReACT架构,并提供详细的代码示例和解释。

2401_82469710的博客 2463

MacOS蓝牙连接疑难杂症:从基础排查到高级修复全攻略

本文提供了一份全面的MacOS蓝牙故障排查与修复指南。从基础的菜单栏检查、终端命令诊断,到软/硬重启蓝牙服务、删除配置文件,再到使用blueutil工具、重置NVRAM等高级方法,系统性地解决了蓝牙无法连接、连接不稳定等常见问题。最后还分享了环境干扰排查、预防措施及硬件故障自检方法,帮助用户彻底解决Mac蓝牙连接难题。

weixin_29271263的博客 451

自偏置电流镜设计实例

自偏置电流镜设计实例 一、概述 ​ 众所周知,电流镜属于模拟电路设计中的一个基本模块,可为其他模块提供偏置电流,例如在放大器中提供偏置电流以形成尾电流源并确定直流偏置点。本文将会介绍一种自偏置的电流镜,从原理出发,并以0.18um的工艺进行设计和仿真。 二、原理 ​ 如图一所示的电路,也称之为Beta-multiply reference电路,其中M2的尺寸是M1的k倍。M3复制M4的电流,M2和M1的漏极电流相同,但是VGS并不相等。其中 VGS=2IμnCoxW/...

aonuanjiang的博客 1万+

LangGraph中预构件,creat_react_agent的实现流程

本文档展示了LangGraph的prebuilt模块中Agent的实现流程,重点是函数构建的代理系统流程和结构。

刘培玉-大王 2092

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。

weixin_30632089的博客 398

Agentic RAG系列:2、AI Agent 架构和原理-LangGraph实现ReAct代理

本文介绍了AI Agent的基本概念及其动态循环学习机制,通过ReAct框架实现推理与行动的协同。AI Agent通过感知环境输入、大脑处理(存储记忆与知识、决策制定)和执行行动,完成复杂任务。文章重点解析了ReAct技术,它结合思想链推理与实时行动观察循环,有效减少大语言模型的幻觉错误。通过LangGraph框架从零实现ReAct代理,展示了如何利用外部工具获取实时网络信息,并提供了测试代码验证功能。这种AI代理架构适用于聊天机器人、自动翻译等需要理解自然语言的场景。

1817

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 948

基于Simulink/Matlab的VSG并网系统单相接地与相间短路故障仿真建模与特性分析

本文详细介绍了基于Simulink/Matlab搭建虚拟同步发电机(VSG)并网系统仿真模型的方法,并重点分析了单相接地与相间短路故障下的系统特性。通过设置三相故障模块参数,模拟了故障发生时的电压、电流变化及VSG动态响应,为理解故障机理、优化控制策略及设计继电保护提供了仿真依据与实践指导。

t8u9v0w1x的博客 516

基于Langgraph创建ReAct Agent应用示例

这是一个循环过程,如果代理LLM要调用工具,将运行工具并将结果传回Agent,Agent添加工具现场后继续请求代理LLM是否使用工具;如果LLM没要求运行工具,将结束循环并响应用户。这里尝试基于langgraph+ollama构建上述agent代理应用,示例agent代理架构的真实运行过程。ReAct Agent应用由一个代理LLM和工具组成。与应用交互时,调用代理LLM决定是否使用工具。使用自定义工具get_weather,返回nyc、sf预置天气数据,实现方式与mcp工具定义类似。

liliang199的专栏 1590

PCL 将对象模板与点云对齐【2025最新版】

PCL模版匹配算法的使用案例,博客长期更新,本文最近更新时间为:2025年1月18日。

点云侠的博客 5379

【LangGraph】langgraph.prebuilt.create_react_agent() 函数:快速创建基于 ReAct(Reasoning + Acting)架构的智能代理

langgraph.prebuilt.create_react_agent 是 LangGraph 库中的一个预构建函数,位于 langgraph.prebuilt 模块,用于快速创建基于 ReAct(Reasoning + Acting)架构的智能代理。LangGraph 是 LangChain 生态的扩展,专注于构建复杂、有状态的工作流,通过状态图(State Graph)管理节点和边,支持动态路由、循环和多代理协作。它通过封装 LLM、工具和状态管理,简化了开发流程,支持多轮对话、工具调用和流式输出。

彬彬侠的博客 8500

[AI] 企业内网部署大模型的三种常见方案:从“能用”到“好用”的技术选型指南

企业内网部署大模型的三种方案解析:本地模型安全但门槛高,平台方案(如Dify)最平衡推荐,混合架构适合进阶需求。关键路径是渐进式演进,从快速验证到平台化建设,核心在于流程优化而非单纯选模型。数据安全、成本可控和工程落地能力是决策重点。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 773

【打卡帖】7日玩转ESP32——(第4日) 串口的输入输出

【福利帖】7日玩转ESP32——(第4日) 串口的输入输出

1377

深入 LangGraph:mcp-client-cli 的 ReAct Agent 与工具调用确认机制

mcp-client-cli 是一款基于 LangGraph 构建的 MCP 客户端命令行工具,它把"LLM 提示词 + MCP 服务器工具"无缝封装进一个 `llm` 命令。本文带你深入它的核心:LangGraph 如何驱动 ReAct Agent 完成"思考-行动-观察"循环,以及工具调用确认机制如何为每一次工具执行加一道人工安全闸。无论你是刚接触 MCP 的新手,还是想借鉴 Agent 工程

gitblog_00961的博客 1031

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

初识 LangGraph ReAct Agent:一步步教你构建自己的智能 Agent

摘要:本文介绍了如何构建具有自主思考和行动能力的ReAct智能体。ReAct框架通过"推理-行动-观察"循环,使AI能像人类一样完成复杂任务。文章首先区分了AI智能体与ReAct智能体的概念,指出ReAct是AI智能体的一种实现方式,适用于需要多步推理和工具调用的场景。随后提供了使用LangChain和LangGraph构建搜索型ReAct智能体的完整代码示例,包括环境配置、工具集成和执行流程。该智能体能自动搜索并分析2025年TIOBE指数排名前五的编程语言,展示了ReAct框架的实际

gto310850806的博客 1400

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LangGraph从零构建生产级 AI Agent 平台的递进式学习项目

本文介绍了《LangGraph 实战系列》的整体学习路线与项目规划,涵盖 LangGraph 基础、Tool Calling、Memory、Reasoning Agent、Multi-Agent 及生产级 AI Agent 平台构建,帮助开发者从原理到工程化系统掌握 AI Workflow 与 Agent 编排能力。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于LangGraph的ReAct Agent图文生成系统设计与实现

大语言模型(LLM)通过工具调用和动态决策能力可以显著提升AI应用的智能化水平。ReAct(Reasoning+Acting)框架通过'思考-行动-观察'的循环机制,使AI系统能够像人类一样进行多步骤决策。这种架构特别适合需要复杂逻辑处理的内容生成场景,如跨平台图文创作。LangGraph作为实现框架,提供了条件路由和子图设计等关键功能,支持模块化开发和灵活扩展。在实际应用中,这种技术方案能有效提升内容通过率和用户互动率,日均处理10万+请求。图文生成Agent通过智能工具调用实现多平台适配和内容安全审查,

cihongmo6452的博客 438

LangGraph中ReAct的构建原理

以ReAct提示为例,在LangGraph基于图的实现过程中,用于构建中间的agent节点。当通过LangGraph预构建的ReAct组件创建自主循环代理节点并接收用户问题时,该节点(可以是agent、LM或直接的大模型 )会先接收start节点传来的原始输入,接着对输入信息进行修饰。若需调用工具,则进入循环过程,在工具库中选择工具执行,通过ToolNode预构建组件返回结果并封装在ToolMessage里,不断循环直至得到最终结果。其具备实验追踪功能,能记录模型、提示词、工具调用等数据;

qq_43588095的博客 1549
上一篇: Hermes Agent 的上下文与内存存储:从 Prompt Cache 到长期记忆的技术实现
下一篇: 多模型架构怎么选?
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2841原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值