跳到主要内容

解题框架:四阶段流水线与反馈循环

本章讲什么: AgentVerse 解题框架怎么把多个智能体组织成一条「能自我迭代直到达标」的流水线。核心是 step() 的四个阶段,以及把评委意见喂回下一轮的反馈循环。这是 AgentVerse 论文(ICLR 2024)的主体框架。

1. 它要解决的小问题

模拟框架是「让智能体自由演」,解题框架要的是收敛到一个好答案。论文提出的范式是模仿人类专家团队:

  1. 招募合适的专家(不同任务要不同专家)。
  2. 专家们讨论出一个方案。
  3. 执行方案(可能要用工具、跑代码)。
  4. 一个评委给方案打分、提改进建议。
  5. 不达标?带着建议重新来一轮

这正是「角色分工 + 多轮迭代 + 批评反馈」的多智能体系统(论文 Multi-agent as system)。

2. 思路/直觉:四件套 + 一个循环

TasksolvingRule 把四个阶段的组件打包(tasksolving_env/rules/base.py:28-32):

阶段组件干什么
招募role_assigner给一组「待定」智能体填上具体专家身份
讨论decision_maker让专家们按某种拓扑讨论出方案(见 03 章)
执行executor执行方案(默认 none,可挂工具/跑代码)
评分evaluator给方案多维度打分 + 给建议

这四个组件对应四类智能体角色,角色用一个枚举编号(utils.py:30-36):

# utils.py:30-36
class AGENT_TYPES(Enum):
ROLE_ASSIGNMENT = 0
SOLVER = 1 # 真正出方案的人
CRITIC = 2 # 被招募的专家们(评论者)
EXECUTION = 3
EVALUATION = 4
MANAGER = 5 # 仅 dynamic 讨论用

注意一个细节:解题框架里 agents 不是列表而是按角色索引的字典 Dict[AGENT_TYPES, Agent],CRITIC 那格还是一个列表(多个专家)。装配时按 cnt_agents 深拷贝出多个 critic(tasksolving.py:40-48)。

3. 主线:一次 step() 的四阶段

怎么读这张图

从上到下是一轮(一个 Loop Round),四个阶段顺序执行;最右边的 advice/plan 是跨轮的反馈线,会被带进下一轮。

task_description ─┐
advice(上轮建议) ─┤
previous_plan ────┤

① role_assign ──► 给 critic 们填上专家身份

② decision_making ──► 专家讨论 → plan(方案) [拓扑见 03 章]

③ execute ──► 执行 plan → result(默认 none,原样)

④ evaluate ──► score(各维度分) + advice(建议)

score 全 ≥ 8 ?
├─ 是 → success=True,退出
└─ 否 → advice/plan 带回 ① 再来一轮

真实实现

BasicEnvironment.step 把四阶段写得像四个带横幅的段落(tasksolving_env/basic.py:45-109):

# tasksolving_env/basic.py:53-84(节选,去掉日志)
agents = await self.rule.role_assign(task_description, self.agents, cnt_turn, advice) # ①
plan = await self.rule.decision_making(task_description, self.agents, previous_plan, advice) # ②
result = await self.rule.execute(task_description, self.agents, plan) # ③
score, advice = await self.rule.evaluate(task_description, self.agents, plan, result) # ④

合格判定(反馈循环的闸门)

第四阶段后,用一个硬编码阈值决定收敛(tasksolving_env/basic.py:95-107):

# tasksolving_env/basic.py:95-104(节选)
if score is not None and (
(isinstance(score, bool) and score is True)
or (isinstance(score, (list, tuple)) and all([s >= 8 for s in score]))
):
# TODO: 8 is an arbitrary threshold
self.success = True

重点看: 评委可以返回布尔(代码测试通过/不通过)或一组整数评分(多维度)。整数情况要每一维都 ≥ 8 才算过——8 是作者自己标注的「随意阈值」。

4. 反馈循环:advice 怎么流回去

顶层 TaskSolving.run() 是循环的真正发动机(tasksolving.py:59-72):

# tasksolving.py:62-72(节选)
advice = "No advice yet."
previous_plan = "No solution yet."
while not self.environment.is_done():
result, advice, previous_plan, logs, success = asyncio.run(
self.environment.step(advice, previous_plan) # 把上轮的 advice/plan 喂回去
)

这条 advice 反馈线贯穿全程:

  • 进招募:role_assign 拿 advice 重新招专家(评委可能建议「该换个经济学家」)。
  • 进讨论:decision_making 把 advice 广播给所有专家当作改进方向(见 horizontalbroadcast_messages,03 章)。
  • 出评委:新一轮评委再产生新的 advice。

is_done() 的退出条件是两者取或:cnt_turn >= max_turn success(tasksolving_env/basic.py:134-136)——达标就提前停,否则跑满轮数。

5. 阶段细节里的巧思

5.1 招募可以「只做一次」

role_assign_only_once 开关:开了之后,只有第 0 轮真招募,后续轮直接复用同一批专家(tasksolving_env/rules/base.py:79-91)。省 token,也保持团队稳定。

5.2 执行结果可选择性回灌

execute 后有两个开关决定要不要把执行结果塞进谁的记忆(tasksolving_env/rules/base.py:133-137):

# tasksolving_env/rules/base.py:133-137
if self.add_execution_result_to_critic:
for agent in agents[AGENT_TYPES.CRITIC]:
agent.add_message_to_memory(results)
if self.add_execution_result_to_solver:
agents[AGENT_TYPES.SOLVER].add_message_to_memory(results)

这让「执行 → 观察结果 → 下轮改进」的闭环成为可能(比如代码跑出错,把错误喂回 solver)。

5.3 评委多维度打分

BasicEvaluator 把方案、结果、所有角色描述拍平成字符串,丢给评委智能体打分(evaluator/basic.py:17-36)。从 brainstorming 的 YAML 能看到评委被要求按 4 个维度(Comprehensiveness / Detailedness / Feasibility / Novelty)各打 0-9 分(tasks/tasksolving/brainstorming/config.yaml:71-92)。

6. 巧妙之处

  • 角色用枚举索引、critic 用列表:agentsDict[AGENT_TYPES, ...],让「按角色取智能体」一目了然,同时 critic 那格放列表天然支持「招募 N 个专家」(tasksolving.py:40-48)。
  • advice 作为唯一的跨轮记忆:整个迭代不靠复杂状态机,就靠 advice+previous_plan 两个字符串在轮间传递,简单到能一眼看懂收敛逻辑。
  • 执行默认 none:大量解题任务(头脑风暴、生成)其实不需要真执行,框架默认空执行器,需要时(工具、代码)才换上 tool-using/code-test

7. 边界与局限

  • 合格线硬编码 >= 8,且注释直认是 arbitrary(tasksolving_env/basic.py:97-99)。想调阈值得改源码。
  • 评委是单个 LLM 智能体,打分本身可能不稳;框架没有对评委做交叉验证。
  • human_eval(人类打分)的分支被注释掉了(tasksolving_env/rules/base.py:148-164),目前只有 LLM 评委。

8. 横向对比

相比模拟框架(01 章)的「自由轮转」,解题框架是目标导向的收敛循环:有明确的方案产物、有评委闸门、有带建议重试。它和经典的 generator–critic / actor–critic 多智能体结构一脉相承,区别是 AgentVerse 把「招募」也做成了一个可迭代的阶段——评委甚至能建议换人。讨论阶段本身的多种拓扑见下一章 03-decision-makers.md

9. 代码地图

主题文件符号
解题环境主循环(四阶段)agentverse/environments/tasksolving_env/basic.pyBasicEnvironment.step
顶层迭代循环(advice 反馈)agentverse/tasksolving.pyTaskSolving.run
四件套容器 + 各阶段编排agentverse/environments/tasksolving_env/rules/base.pyTasksolvingRule
招募阶段agentverse/environments/tasksolving_env/rules/role_assigner/role_description.pyDescriptionAssigner.astep
评分阶段agentverse/environments/tasksolving_env/rules/evaluator/basic.pyBasicEvaluator.astep
角色枚举agentverse/utils.pyAGENT_TYPES
合格阈值agentverse/environments/tasksolving_env/basic.pyBasicEnvironment.step(s >= 8)