当前位置:首页 > 技术 > 正文内容

大语言模型智能体架构演进:从ReAct推理到多智能体协同调度

访客 技术 2026年9月11日 12

智能体工程化的四层架构范式

在当前的智能体(Agent)工程实践中,将系统架构解耦为四个核心层级已成为主流标准。这种分层设计本质上是对智能体"感知、推理、行动、协作"四大核心能力的工程化映射。

智能体感知模块架构

通过这种分层,复杂的 Agentic Workflow 被有效拆解:

  • 指令层(Prompt):负责结构化输入输出与模板生成,塑造模型的行为边界(Behavior Shaping),决定模型"如何思考"。
  • 上下文层(Context):管理动态上下文窗口与 RAG(检索增强生成),注入外部知识(Knowledge Injection),决定模型"知道什么"。
  • 工具层(Tool):基于 MCP 等协议接入外部 API,赋予模型执行能力(Action Execution),决定模型"能做什么"。
  • 编排层(Agent):统筹规划、记忆管理及多智能体协同(Orchestration & Planning),决定"整体如何运作"。
Agentic Workflow 解耦示意图

相较于早期的单层 ReAct 或简单的链式调用,四层架构在处理多轮对话、长周期任务以及 RAG 与工具混合调用的场景中表现出极高的工程鲁棒性。

ReAct 范式的核心机制

ReAct 的核心思想可以概括为:显式推理(Reasoning)与工具调用(Acting)的交替循环。其基本执行流为:思考(Thought) → 行动(Action) → 观察(Observation)。

以下是重构后的 ReAct 核心循环代码,采用更面向对象的封装方式:


class CognitiveAgent:
    def __init__(self, llm_client, tool_registry, max_iterations=10):
        self.llm = llm_client
        self.tools = tool_registry
        self.max_iterations = max_iterations

    def execute(self, objective: str) -> str:
        memory_trace = []
        current_feedback = ""
        
        for _ in range(self.max_iterations):
            # 1. 推理阶段 (Reasoning)
            reasoning_step = self.llm.generate_reasoning(
                goal=objective,
                history=memory_trace,
                latest_feedback=current_feedback
            )
            
            # 2. 决策阶段 (Action)
            decision = self.llm.determine_action(
                reasoning=reasoning_step,
                available_tools=self.tools.get_schemas()
            )
            
            # 3. 终止条件判断
            if decision.is_terminal():
                return decision.final_payload
                
            # 4. 执行与观察阶段 (Observation)
            current_feedback = self.tools.invoke(
                tool_name=decision.target_tool,
                parameters=decision.tool_params
            )
            
            # 5. 状态更新
            memory_trace.append({
                "reasoning": reasoning_step,
                "decision": decision.to_dict(),
                "feedback": current_feedback
            })
            
        return "Error: Maximum iteration limit reached without final answer."

该循环的本质在于:模型首先基于当前状态生成下一步计划,随后决定调用特定工具,系统执行工具并将环境反馈返回给模型,模型再基于新反馈进行下一轮推理,直至任务完成。

思维链(CoT)与 ReAct 的本质差异

在探讨智能体推理时,常将 Few-shot CoT 与 ReAct 进行对比。两者的核心分歧在于是否具备环境交互能力:

  • CoT(思维链):纯粹的"内部思考"。通过 Few-shot 提示让模型学习输出中间推理步骤(Step-by-step),但不与外部环境发生实质性交互。
  • ReAct:"思考"与"行动"的结合。模型不仅在内部推理,还能通过工具调用获取外部真实世界的反馈,并据此修正后续推理。
CoT与ReAct对比图

多智能体协同调度模式

当单一 Agent 无法胜任复杂任务时,多智能体(Multi-Agent)架构成为必然选择。其协作模式主要分为两类:

  1. 水平协同(并行专家模式):多个 Agent 同时处理同类或同层级任务,最终通过投票、融合等机制输出结果。适用于高吞吐需求、RAG 多路召回等场景。
  2. 垂直协同(流水线分工模式):多个 Agent 按阶段串行处理任务,上游输出作为下游输入。适用于长链路推理和复杂的 Agentic Workflow。

在真实的工程落地中,系统通常采用混合架构:先进行垂直拆解,再进行水平扩展,最后垂直收敛。


           [Planner / 任务拆解]
                  │
      ┌───────────┼───────────┐
      ▼           ▼           ▼
 [Worker A]  [Worker B]  [Worker C]  <- (水平并行执行)
      │           │           │
      └───────────┼───────────┘
                  ▼
         [Critic / 结果收敛]

在这种混合架构中,每个节点本质上仍是一个 ReAct 循环,只是其角色定位(规划、执行、评估)有所不同。

多智能体调度代码实现

以下使用 Python 的 asyncio 异步框架重构了多智能体调度器,以更好地支持高并发的水平扩展场景:


import asyncio
import json

class BaseAgent:
    def __init__(self, llm, role="worker"):
        self.llm = llm
        self.role = role

    async def call_llm(self, prompt: str) -> str:
        # 模拟异步 LLM 调用
        return await self.llm.async_generate(prompt)

class TaskDecomposer(BaseAgent):
    async def decompose(self, objective: str) -> list[str]:
        prompt = f"""作为任务规划师,请将以下复杂目标拆解为独立的子任务列表。
目标:{objective}
请仅返回 JSON 格式的字符串数组。"""
        response = await self.call_llm(prompt)
        return json.loads(response)

class ParallelExecutor:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools

    async def _run_single_worker(self, subtask: str) -> str:
        worker = CognitiveAgent(self.llm, self.tools)
        # 复用 ReAct 核心逻辑,将同步执行放入线程池以适配异步事件循环
        loop = asyncio.get_running_loop()
        return await loop.run_in_executor(None, worker.execute, subtask)

    async def execute(self, subtasks: list[str]) -> list[str]:
        # 使用 asyncio.gather 实现真正的异步并发
        tasks = [self._run_single_worker(task) for task in subtasks]
        return await asyncio.gather(*tasks)

class ResultSynthesizer(BaseAgent):
    async def synthesize(self, objective: str, candidate_results: list[str]) -> str:
        prompt = f"""作为结果评估与融合专家,请基于以下候选结果,评估其正确性并融合出最终答案。
原始目标:{objective}
候选结果:{candidate_results}
请直接输出最终答案。"""
        return await self.call_llm(prompt)

class SwarmDirector:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools

    async def run(self, objective: str) -> str:
        # 阶段 1:垂直拆解
        decomposer = TaskDecomposer(self.llm, role="planner")
        subtasks = await decomposer.decompose(objective)
        print(f"[Planner] 拆解子任务: {subtasks}")

        # 阶段 2:水平扩展
        executor = ParallelExecutor(self.llm, self.tools)
        parallel_results = await executor.execute(subtasks)
        print(f"[Workers] 并行执行结果: {parallel_results}")

        # 阶段 3:垂直收敛
        synthesizer = ResultSynthesizer(self.llm, role="critic")
        final_output = await synthesizer.synthesize(objective, parallel_results)
        
        return final_output

# 运行示例
if __name__ == "__main__":
    # 伪代码:初始化异步 LLM 客户端和工具注册表
    mock_llm = MockAsyncLLM()
    mock_tools = MockToolRegistry()
    
    director = SwarmDirector(mock_llm, mock_tools)
    final_result = asyncio.run(director.run("分析全球宏观经济趋势对新能源车企供应链的影响"))
    print(f"[Director] 最终输出: {final_result}")

该架构通过 TaskDecomposer 进行垂直拆解,利用 ParallelExecutor 结合异步并发实现水平扩展,每个 Worker 内部维持独立的 ReAct 循环,最终由 ResultSynthesizer 完成垂直收敛。这种设计显著提升了复杂任务的处理效率与系统的整体鲁棒性。

标签: LLMAgent

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。