多智能体Agent编排实战:ReAct到GraphWorkflow的几种架构模式

Agent 开发从入门到实战(022):LangChain 工具与 Agent 实战——@tool 装饰器与 create_react_agent 本文系统讲解智能体开发三步法:通过@tool装饰器自动构建工具说明书,bind_tools一键绑定模型,create_react_agent实现零代码组装。结合单测验证、结构化工具调用与框架自动化,将复杂流程从200行精简至3行,核心聚焦于模型决策与工具质量,告别胶水代码,高效构建可扩展的AI智能体。 阅读详情

引言:Agent 不是单模型的循环

做 Agent 应用时很多人一开始就想"让模型多跑几次"——给个工具清单、一个 while 循环,让模型自己决定下一步。这在玩具 Demo 里够用,但一旦任务变成"先检索再分析、查不到就换策略、最后写成结构化报告",单循环就兜不住了。原因很简单:复杂任务天然有依赖关系、有分支、有先后顺序,而单循环只能表达"一条线走到底"。这篇文章用可跑的 Python 代码,从 ReAct 讲起,一路到多 Agent 协作和图工作流,把几种主流编排架构拆开给你看。

文中所有代码用 openai + anthropic 客户端均可运行,也可换成任意 OpenAI 兼容网关。核心是编排思想,不是某个框架。

一、ReAct:把"思考-行动-观察"循环显式化

ReAct 把模型的每一步拆成 Thought(想什么)、Action(调什么工具)、Observation(工具返回什么),模型按这个节奏一路推进直到拿到答案。

一个最简实现,核心就一个循环:

from openai import OpenAI

client = OpenAI()

def run_react(prompt, tools, max_steps=10):
    messages = [{"role": "system",
                 "content": "你是ReAct代理。请按如下格式回答:\n"
                            "Thought: 你现在的推理\n"
                            "Action: 工具名(参数)\n"
                            "Observation: 工具结果\n"
                            "当得到最终答案时输出 Final Answer: ..."}]
    messages.append({"role": "user", "content": prompt})
    for _ in range(max_steps):
        resp = client.chat.completions.create(
            model="gpt-4o", messages=messages)
        text = resp.choices[0].message.content
        print(">>>", text)
        if "Final Answer" in text:
            return text
        # 解析 Action 行,调用对应工具
        action = parse_action(text)  # 比如 "Action: search(\"python\")"
        result = run_tool(action, tools)
        messages.append({"role": "assistant", "content": text})
        messages.append({"role": "user", "content": f"Observation: {result}"})
    return "达到步数上限"

def parse_action(text):
    import re
    m = re.search(r"Action:\s*(\w+)\((.*)\)", text)
    return (m.group(1), m.group(2)) if m else (None, None)

def run_tool(action, tools):
    name, arg = action
    return tools.get(name, lambda _: "未知工具")(arg)

这段代码的价值在于把 Agent 的"自主性"摊开给你看:循环、记忆(messages)、工具路由三件事就构成了一个最小的自主 Agent。生产里你不需要手写正则解析,LangChain 的 create_react_agent 或 OpenAI 的 Agent SDK 都封装好了,但理解这个循环,后面看多 Agent 才有基础。

优点:实现直观、调试容易、适合工具数量少(几个到十几个)的检索问答。 局限:步数多了上下文迅速膨胀;没有并行;任务一旦需要"分工",单循环无能为力。

二、Router/路由:先分诊,再派活

任务种类一多,第一步往往是分诊——用一个轻量模型判断任务类型,再路由到对应的专用流程。这在客服、工单、内容生成场景最常见。

def route(user_input):
    route_prompt = (
        "判断下面用户问题的类别,只输出一个词:"
        "summary | extract | code | default\n\n" + user_input)
    kind = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": route_prompt}]
    ).choices[0].message.content.strip()
    return {"summary": summarize, "extract": extract,
            "code": write_code, "default": faq_answer}[kind]

result = route("帮我总结这份会议纪要的关键决定")

路由架构的好处是每个分支可以各自优化:摘要走长上下文模型、代码走带沙箱的流程、FAQ 直接查库,互不拖累。代价是要维护分类质量和路由兜底——分类错一次,整个下游都错。

三、Pipeline/流水线:固定的有序多阶段

当任务阶段是确定的(A 完成后才能做 B),流水线是最朴素的编排:输入依次流过若干阶段,每阶段一个职责。

def pipeline(pdf_path):
    text   = extract_text(pdf_path)      # 1. 抽取
    chunks = split_into_chunks(text)     # 2. 切块
    nodes  = [embed_and_lookup(c) for c in chunks]  # 3. 检索
    report = synthesize(nodes)           # 4. 生成
    return report

业界标准实现有 LangGraph 的链式节点、CrewAI 的顺序任务(SequentialProcess)。流水线适合流程固定、质量要求稳定的场景,比如文档处理、定时报表。缺点也很直白:中间某阶段失败整条链断,且阶段间不能复用中间结果到别处。

四、多 Agent 协作:分工、交流、汇总

任务大到"调研 + 写作 + 校对 + 排版",单 Agent 力不从心,于是出现多 Agent:每个 Agent 负责一个子任务,通过共享消息或显式交接协作。两种主流模式:

分工(Executor)模式——一个协调者拆分任务,多个执行者并行干,最后汇总:

from concurrent.futures import ThreadPoolExecutor

def research_team(topic):
    subtasks = split(topic)          # 协调者拆解
    with ThreadPoolExecutor(max_workers=4) as pool:
        results = list(pool.map(lambda t: researcher(t), subtasks))
    return synthesize_report(results)

讨论/接力模式——Agent 之间互相传递中间产物。典型如"一个写代码、一个审代码、一个补测试",每个 Agent 的结果是下一个的输入,多轮收敛到合格答案。

code = coder(spec)
for i in range(3):
    review = reviewer(code)
    if review.ok:
        break
    code = coder(code, review.comments)  # 把意见传回

多 Agent 的核心难点是沟通协议与状态共享:谁拥有最终结果?中间结果放哪?怎么防死循环?这就是为什么工程上要把多 Agent 落在结构化图上,而不是让 Agent 自由聊天。

五、Graph Workflow:把编排显式化为有向图

LangGraph 的出现把上面所有模式统一到一个抽象:状态机 + 有向图。节点是处理函数,边是条件转移,共享状态是一个 dict。前面所有模式都是它的特例。

from typing import TypedDict
from langgraph.graph import StateGraph, END

class State(TypedDict):
    question: str
    route: str
    answer: str

def classify(state: State) -> State:
    state["route"] = "code" if "code" in state["question"] else "summary"
    return state

def run_code(state: State) -> State:
    state["answer"] = f"代码处理: {state['question']}"
    return state

def run_summary(state: State) -> State:
    state["answer"] = f"摘要处理: {state['question']}"
    return state

g = StateGraph(State)
g.add_node("classify", classify)
g.add_node("code", run_code)
g.add_node("summary", run_summary)
g.set_entry_point("classify")
g.add_conditional_edges("classify", lambda s: s["route"],
                        {"code": "code", "summary": "summary"})
g.add_edge("code", END)
g.add_edge("summary", END)
app = g.compile()

这个 20 行示例表达了完整的"分诊 + 分支 + 汇合":classify 节点根据 state["route"] 条件跳转到不同分支。图编排的威力在于:

  1. 显式控制流:谁能走、什么时候走、走哪条边一目了然;
  2. 检查点与恢复:状态可持久化,任务中断可从最近节点续跑;
  3. 人机回环:可插入人工审批节点,符合生产合规要求;
  4. 可观测性:每一步的状态转移都能被记录和追踪。

再往上,多 Agent 在 LangGraph 里就是"多个子图 + 一个 Supervisor"(主管 Agent 动态决定把任务派给哪个子 Agent),对应 create_agent / add_node("supervisor", ...) 的组合。这就是生产级多 Agent 的标准形态。

六、怎么选?一张图看清你的场景

模式适用场景并行能力控制流表达工程复杂度
ReAct 循环工具少、检索问答无弱(靠模型自觉)低
Router 路由任务类型多、分类明确无中低
Pipeline 流水线阶段固定、流程确定有限中低-中
多 Agent 协作大任务分工、讨论收敛强中中
Graph 工作流复杂分支、人机回环、需要可恢复强强(显式)中-高

选型口诀:

  • 工具少、单任务 → ReAct 够了,别过度设计;
  • 任务种类多但每类独立 → Router;
  • 阶段固定不变 → Pipeline;
  • 任务大、要并行和分工 → 多 Agent;
  • 既要分工又要复杂分支/回环/恢复 → Graph Workflow。

总结

从 ReAct 到 Graph Workflow,本质是把 Agent 的"自由度"一步步收进可控的结构里:自由循环适合探索,路由适合分流,流水线适合固定流程,多 Agent 适合分工,图则把它们统一成可观测、可恢复、可人机回环的工程体系。实际项目中,它们通常组合出现——入口路由分诊、主干走图工作流、叶子节点用 ReAct 单步。先想清楚你的任务依赖关系,再选编排形态,比追新框架重要得多。

SAP-HR 模块 PPOSE 的详细信息标签页增强 步骤1:T-CODE : SE11 创建一个名为 HRI9106 的结构 命名:HRI + 91 + 两位数字。人事管理 - 组织管理 - 集成新信息类型 - 将信息类型添加为明细范围中的标签页。步骤6:SE51 查看 7000屏幕,修改屏幕属性 让其更美观。步骤3:T-CODE : SM30维护 T777I 表。步骤5:PPCI 新建 7000屏幕用于显示。标签页 IT 开头 + 信息类型 9106。步骤2:T-CODE : PPCI。步骤4:T-CODE : SPRO。 阅读详情

相关推荐

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1897

多智能体(Multi-Agent)架构选型:四种模式,一张图看懂

多智能体架构选型摘要:多智能体通过更高系统复杂度换取上下文隔离、并行化和流程可控性。核心选型原则包括:强控制权选Subagents(主-子架构),单Agent多专业选Skills,多阶段流程选Handoffs(状态驱动),多领域并行选Router(路由分发)。四种模式对比:Subagents适合集中编排但延迟高,Skills轻量但易上下文污染,Handoffs流程可控但状态管理复杂,Router并行高效但路由风险大。决策时需评估是否必须上下文隔离、并行执行或状态机需求,否则优先考虑单Agent+工具方案。

小一的专栏 2754

Second-Order Cone Programming(SOCP) 二阶锥规划

个人博客Glooow,欢迎各位老师来踩踩 文章目录1. 二阶锥1.1 二阶锥定义1.2 二阶锥约束2. 优化问题建模3. 类似问题转化3.1 二次规划3.2 随机线性规划4. 问题求解 1. 二阶锥 1.1 二阶锥定义 在此之前,先给出二阶锥的定义。 在 kkk 维空间中二阶锥 (Second-order cone) 的定义为 Ck={[ut]∣u∈Rk−1,t∈R,∥u∥≤t} \mathc...

Glooow的博客 3万+

AI Agent 五大经典设计模式深度解析:从RAG到ReAct,拆解智能体的核心架构与落地实践

query: str“”“查询理解节点:解析问题,识别涉及的领域”“”# 此处调用LLM做意图识别与领域判断target_agents = [“finance_agent”, “hr_agent”] # 示例结果“”“财务领域检索智能体”“”# 此处执行财务领域的RAG检索逻辑result = “财务检索结果:2024年总营收12亿元,同比增长15%”“”“人力领域检索智能体”“”# 此处执行人办领域的RAG检索逻辑。

AI天才研究院 477

研究生课程笔记:软件包在流行病学中的应用(三)——STATA软件

关键词:STATA软件基本操作、STATA对于流行病学研究的实现、STATA对复杂抽样设计样本量计算的实现 一、STATA软件基本操作 这部分网上教程有很多,也可以直接根据stata自带的help功能进行自学,在此只记录课程中提及的功能项。 1. 变量编辑 1.1 赋值:label type(按精度区分) 1) 整型:int(32), short(16), long(32) 2) 实型:flo...

weixin_45463530的博客 2432

Verilog的综合指令

Synopsys综合指令

烟花一时的博客 5447

手搓 AI Agent 02:让模型第一次“动手“——Agent Loop 与 ReAct

本系列第2篇实现Agent核心循环——ReAct模式,让模型从“被动回答”变为“主动执行”。通过LLMClient工具调用能力,构建think → act → observe闭环,首次实现模型自主调用计算器、读取结果并继续推理。代码支持安全算术、步数限制与错误隔离,升级终端REPL为可观察的智能体交互界面。每步操作清晰可见,为后续多工具、规划与协作打下基础。

快乐来自程序里 106

GD32F450以太网(1):ETH 外设接口简介

GD32F450以太网ETH MAC外设接口简介

Zhichao_Zhang的博客 1万+

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 328

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

m0_58098052的博客 1599

React 错误边界 Error Boundary

用类组件 ErrorBoundary 隔离渲染错误,讲清能接住/接不住、重置策略与上报。

JudithHuang的博客 298

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 368

【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战

SSE 是单向推送(服务器→客户端),无法客户端→服务器实时发送;双向需用 WebSocket。SSE 是 HTML5 标准,服务器向客户端推送事件流,单向通信,适合流式输出场景。流式输出让用户看到 AI "边想边写",首字响应时间大幅降低(通常在 1 秒内)大模型响应通常需要几秒甚至几十秒,如果等全部生成完再返回,用户体验极差。流式输出中发生异常,要及时关闭流并通知客户端,避免客户端永久等待。,否则 SSE 不会实时推送。

qq_38196449的博客 215

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

React 鉴权路由守卫直觉

用布局路由 + Navigate 做登录拦截和登录回跳,并说明前端守卫不是安全边界。

JudithHuang的博客 126

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

我写了一个 Windows 开发环境管理平台:Nexus(Tauri 2 + Rust + React)

文件监听事件很密集。如果节流窗口内的变更直接丢弃,最后一次改动就永远加载不到——所以窗口结束时必须补一轮。只对「失败」重试,不对「启动中」重试。启动慢不代表启动失败,盲目重试只会把健康的服务越搞越糟。Nexus 原本是为了解决自己日常开发里「窗口太多、状态不清、日志找不到」的问题,后来慢慢补成了现在这个样子:项目与服务管理、日志、服务健康、文件与代码查看、文件监听、开机启动、Node 版本管理,以及一个内嵌的 AI 助手。如果你也在 Windows 上同时维护多个服务,欢迎试用。

hi星尘的博客 568

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

React Fragment与空标签的终极对比

在React类式组件中,<div>是渲染时必需的外层标签,但可通过Fragment或空标签<></>避免额外DOM节点。Fragment支持传入key,适用于列表遍历场景,而空标签不支持key,且仅允许key属性。两者均可减少冗余标签,提升性能与结构清晰度。

var_let_const的博客 188

Linux网络学习【Reactor反应堆模式】

本文围绕 Linux 网络编程中的 Reactor 反应堆模式展开,以“事件驱动—组件协作—线程模型—代码实践”为主线,解析事件源、多路复用器、事件分发器与处理器的协作机制,梳理等待就绪、事件分发与回调执行流程,对比单 Reactor 单线程、单 Reactor 多线程及主从 Reactor 的组织方式。结合 epoll 与非阻塞读写,分析事件注册、连接接收、缓冲区管理、部分收发及资源清理,厘清就绪通知与操作完成的区别,讨论耗时任务对事件循环的影响,为构建结构清晰、便于扩展的并发网络服务器提供实践思路。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

成为全栈·Vue 管理后台篇·Vue响应式与 React Hooks:同一交互的两种运行模型

本文以同一套管理后台中的文章筛选、分页和权限展示为例,对比 Vue 响应式依赖追踪与 React 组件重新渲染模型。通过 ref、computed、watch 和 useState、useMemo、useEffect,解释两种框架的状态传播、闭包与依赖处理差异,并给出从 React 页面迁移 Vue 时区分本地状态、派生状态、服务器状态和副作用的检查方法。

FungLeo's Blog 254

React Context:解决组件间通信难题

Context是React中用于组件间通信的机制,尤其适合祖辈与后代组件间数据传递。它避免了多层props逐级传递的冗余问题。通过createContext()创建上下文,用Provider提供数据,Consumer或contextType读取。类组件可用static contextType,函数组件则使用Consumer。虽功能强大,但实际开发中常被封装好的库(如react-redux)替代,以提升可维护性与复用性。

var_let_const的博客 289

后端够硬就行?错!用 React/Vue/Next.js 补齐全栈拼图

后端再强,前端体验崩了也白搭。本文以真实项目为镜,揭示后端开发者补全前端能力的五大核心痛点:状态调度误判、并发渲染竞态、加载体验缺失、响应式陷阱与组件边界混淆。通过 React 的函数式更新、并发渲染清理机制,Vue 的 nextTick 与 ref 安全传递,以及 Next.js 服务端组件的架构级优化,提供可直接落地的工程方案。强调“状态生命周期”与“渲染时机”的感知,才是全栈拼图中不可或缺的一块。

2302_80138126的博客 471

Reactor Flux/Mono、SSE 协议格式、背压概念

本工程流式输出(/ai/stream)背后的三个知识点,全部对照工程真实代码讲解。属于 LEARNING_PLAN.md 第 1 周复习要点。

空灵的专栏 297

rust: Reactor Pattern

本项目基于Rust实现珠宝行业全流程业务的反应器模式(ReactorPattern),采用六层分层架构,通过12个事件处理器模拟采购、设计、生产、质检等环节。核心机制为事件分发协调器(ReactorCoordinator)将请求按序或并发分发至各处理器,结合依赖注入、线程安全原子计数与重试熔断适配器,保障高并发下流程稳定执行。数据通过DTO跨层传递,日志按等级与日期分文件输出,仓储持久化执行记录,完整演示了企业级并发型系统的设计与实现。

Geovin Du Dream Park 122

React 19

React开发者工具,Chrome插件React Developer Tools。Hooks使用规则 必须用useXxx命名 只能在两个地方调用Hook。使用create-react-app创建React项目。React核心价值 组件化、数据驱动视图。使用useCallback缓存函数。vite与webpack的区别。

creator_Li的博客 175

ReAct

ReAct是一种基于“思考-行动-观察”循环的交互决策范式,广泛应用于工具型Agent(如LangChain、LlamaIndex)。该范式让大模型交替进行内部推理(Thought)、调用外部工具(Action)并接收结果(Observation),通过迭代优化逐步逼近答案。核心流程为:Thought → Action → Observation → … → FinalAnswer,直至信息充分终止。其本质是将大模型的推理能力与外部工具结合,实现复杂任务的自主规划与执行。

Pniubi的博客 973

前端基础之《React(17)—上下文》

Consumer:在孩子组件中,使用Consumer消费上下文中的数据(函数式组件推荐用useContext Hook代替)(3)在父级组件中provide提供数据,在后代组件中注入并使用,这种通信不具有响应式。(2)使用<Provider value={}> 向组件树中提供数据。(1)使用React.createContext()创建上下文。(1)在组件树中,自上而下的一种单向数据流通信,不能倒着来。(2)组件关系只要满足“父级-后代”这种关系,都可以通信。(3)Provider和Consumer组件。

csj50的专栏 146
上一篇: 多份PDF要合成一份?分享几种实用的PDF合并方法
下一篇: 多张Excel表要合成一张怎么弄?分享几种表格合并的实用方法
aitool
博客等级 码龄5年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值