如何为 LLM 代理设计两个实用的编排循环

发布: (2025年12月8日 GMT+8 19:00)
7 min read
原文: Dev.to

Source: Dev.to

你应该始终分离的三层

执行层

代理(agents)和响应器(responders)位于此层。
**Agent(代理)**指任何执行工作的单元:模型调用、工具、启发式函数、路由器。
**Responder(响应器)**是生成每轮或每个会话最终面向用户输出的代理。

通信层

代理之间以及与编排器之间的通信方式。
示例:队列、事件、内部 RPC 调用、函数回调。

你很少希望代理直接相互调用。将所有交互都通过此层路由,这样才能追踪和控制。

记忆层

用于跨时间存储和检索状态的地方。
可以是向量库、键值存储、数据库或日志。

不要把它“隐藏在提示里”。把记忆视为独立的组件。

将时间视为一等维度

两种循环都显式地处理 时间

  • 线性循环 – 离散步骤:T0、T1、T2、T3。
  • 循环循环 – 在对话活跃期间持续流动的流。

有了这些要素,就可以设计两种编排模式。

循环 1:用于上下文提取和分析的线性编排器

Linear loop diagram

何时使用线性循环

当你拥有 固定输入(文本、转录、文档、一组日志)并希望对其进行 多次分析 时使用。延迟重要,但不要求亚秒级交互。典型输出包括摘要、报告、分类或结构化数据。

典型示例

  • 通话结束后的对话分析。
  • 从聊天日志中抽取实体和主题。
  • 多阶段文档处理(OCR → 清洗 → 分类 → 摘要)。
  • 对历史会话进行离线质量检查。

思维模型

想象一张水平图:

  • INPUT →(时间步 T0 … Tn)→ Responder(最终结构化输出)
  • 输入与响应器之间:
    • 每个时间片的执行层代理。
    • 中间的通信层。
    • 顶部的记忆层。

在每一步,代理可以从记忆中读取,也可以将新事实或摘要写回记忆。编排器逐步遍历这些步骤。

步骤化设计

步骤 1:定义最终输出

确定响应器将产生的内容,例如:

{
  "intent": "...",
  "sentiment": "...",
  "entities": {...},
  "summary": "..."
}

或是可供人阅读的报告,亦或是供其他系统使用的标签/分数。所有其他代理的存在都是为了帮助该响应器成功。

步骤 2:将工作拆分为阶段

识别依赖关系和独立工作。以下是对话分析的示例:

  1. 规范化 & 语言检测。
  2. 实体抽取(姓名、账户 ID、产品)。
  3. 主题 & 意图检测。
  4. 情感 & 升级风险。
  5. 最终摘要 & 建议。

每个阶段成为一个 时间片,其中包含一个或多个代理。

步骤 3:设计记忆模式

为每个阶段列出代理读取和写入的内容。一个简单的模式:

{
  "language": "en",
  "entities": {...},
  "topics": [...],
  "sentiment": {...},
  "summary": "..."
}

你也可以按 session_iduser_idtime_window(用于滚动分析)来划分记忆。
关键规则: 代理接收干净的输入和结构化的记忆切片;不要在提示内部隐藏上下文。

步骤 4:接线读取与写入

为每个代理定义两个小函数:

def read(memory) -> context:
    ...

def write(memory, result) -> memory:
    ...

一个最小的编排循环如下:

for step in steps:
    # 1. 加载本步骤所需的内容
    ctx = step.read(memory)

    # 2. 使用输入和上下文运行代理
    result = step.agent.run(raw_input, ctx)

    # 3. 将新事实写回记忆
    memory = step.write(memory, result)

有的步骤只写,有的只读。

步骤 5:将响应器实现为最后一步

响应器只是另一个拥有特殊角色的代理:

  • 从记忆中读取所需的全部信息。
  • 生成最终答案(通常是一次聊天完成调用,结合原始输入、前置分析代理的输出以及任何长期用户/会话记忆)。
  • 可能会把额外的元数据记录回记忆。

示例:对话分析流水线

代理(Agent)读取内容(Reads)写入内容(Writes)
LanguageDetectorAgent原始转录memory["language"]
EntityExtractorAgent转录、语言memory["entities"]
TopicClassifierAgent转录、实体memory["topics"]
SentimentAgent转录memory["sentiment"]
SummaryResponder转录、实体、主题、情感最终可读摘要 & JSON 记录

该表直接映射到线性图示,便于逐步调试。

循环 2:用于实时聊天和语音的循环流式编排器

Circular loop diagram

第二种模式出现在你从离线分析转向 实时交互(语音或交互式聊天)时。此时你需要:

  • 在用户仍在说话或输入时快速响应。
  • 并行运行多个后台分析。
  • 避免在每个回合把完整转录发送给每个代理。

循环循环(circular loop)模式正是为此而生。

何时使用循环循环

当你满足以下任意条件时使用:

  • 以流式方式输入/输出音频或 token。
  • 拥有一个与用户对话的中心“助理”。
  • 希望后台代理能够检测情感变化、安全合规问题、意图切换、CRM 实体更新或标记有价值的瞬间。

想象一个语音助理或实时会议转录系统:主助理在与用户对话的同时,辅助代理持续丰富上下文。

Back to Blog

相关文章

阅读更多 »