Day 48 / 共 68 天 · 阶段 8 多智能体
多智能体实战:三 Agent 协作产出一篇报告
这是阶段 8 的收官实战。前三天我们学了协作模式(Day 45)、协作协议(Day 46)、主管-专家结构(Day 47)。今天全部串起来,亲手跑通一个研究员 + 写手 + 审校三 Agent 协作系统,端到端产出一篇小报告。代码能直接运行(先用"假模型"跑通结构,再教你换成真模型)。明天(Day 49)进入全课最重要的阶段——评测。
📍 你在阶段 8(多智能体 D45-48)的位置
D45 协作模式→
D46 协作协议→
D47 主管-专家→
D48 多智能体实战
💡 用一个类比兜住今天(今天全程沿用「一家三人内容工作室接了个写报告的单」的世界观)
今天 = 三个人的小工作室接了个"写份主题报告"的活。研究员 = 满世界找料、带回要点和出处的实习生;写手 = 把零散素材写成通顺文章的编辑;审校 = 交稿前逐句挑错、不合格打回的把关人。三人像流水线(Day 45 的 pipeline 拓扑)一样把活接力传递,最后交出一份能见人的报告。你今天当的是"把这三人组织起来的老板"。
L01
今天要做什么:目标与验收标准
🤔 痛点学了一堆多智能体概念,可"到底怎么落地成一个能跑的东西"心里还是没底。光懂道理,手上没跑过,面试一问就露馅。
💡 本质今天的目标很具体:输入一个主题(如"远程办公的利弊"),输出一篇结构完整、有要点支撑、经过审校的小报告。用三个各司其职的 Agent 接力完成——这就是把前三天的知识"落地成代码"。
验收标准(做完能对照):① 三个角色职责清晰、互不越位;② 素材→初稿→审校→定稿的流水线跑通;③ 审校不通过能打回重写且有次数上限(Day 47 学的返工闭环);④ 换掉"假模型"接上真模型后,无需改结构就能用。
📝 举个例子:最终产出长这样
输入:
"远程办公的利弊" → 输出:一段有"利:省通勤、弹性;弊:沟通成本、易孤独"等要点、组织成段落、并标注"已通过审校"的报告文本。整个过程你只按一次"开始",三个 Agent 自动接力。L02
三个角色的设计(各写各的提示词)
🤔 痛点三个 Agent 用的其实是同一个大模型,凭什么它们会表现得像三个不同的人?
💡 本质靠不同的"系统提示词(角色设定)"。同一个演员,给不同剧本就演不同角色。每个 Agent 的提示词要短、专注、职责单一——这正是 Day 45"分工"和 Day 16"角色设定"的落地。
# 三个角色 = 三份不同的"系统提示词"(决定它扮演谁、只干什么)
ROLES = {
"researcher": "你是研究员。只负责就给定主题列出 4-6 个关键要点,"
"每点后用〔〕标一个来源提示。不要写成文章。",
"writer": "你是写手。把给你的要点组织成一篇 200 字左右、"
"有开头结尾的通顺短文。不要新增没给的事实。",
"critic": "你是审校。检查文章是否通顺、要点是否都用上、有没有"
"编造。通过就只回复『通过』;否则回复『打回:<原因>』。",
}
# 注意三点:① 每个角色只干一件事;② 明确"不要做什么"(防越位/防幻觉);
# ③ critic 的输出格式被约束死,方便程序判断(呼应 Day 14 结构化输出)
👶 为什么提示词里要写"不要做什么"?模型很爱"帮你多做"——研究员会忍不住直接写成文章、写手会自己编数据。把边界("不要写成文章""不要新增事实")写清楚,才能守住分工、少出幻觉。约束和任务一样重要。
L03
消息如何在三者之间流转
🤔 痛点三个 Agent 之间传的到底是什么?会不会传着传着信息就丢了、或越传越乱?
💡 本质传递的是"上一环的产出":研究员产出要点 → 交给写手 → 写手产出初稿 → 交给审校 → 审校产出判定。像工厂传送带,每个工位只接收上一站的成品、加工后传给下一站。关键:每一环的输入输出都明确,就不会乱。
图注:正向是流水线,审校不通过则回退到写手——这就是 Day 47 讲的"返工闭环"的最小版。
L04
用代码搭起来(能直接跑)
💡 本质先用一个"假模型"把整套流程结构跑通(不花钱、不用密钥、0 基础也能立刻看到效果),最后一步再教你换成真模型。先让骨架跑起来,再换心脏——这是工程里非常实用的习惯。
# ===== 第 1 块:一个"模型调用"入口。现在是假的,最后再替换成真的 =====
def call_llm(system_prompt, user_input):
"""假模型:按角色返回写死的示例输出,好让你先看清流程。
真接模型时,只改这一个函数即可(见 L05 说明)。"""
if "研究员" in system_prompt:
return "1. 省通勤〔来源A〕\n2. 时间弹性〔来源B〕\n3. 沟通成本高〔来源C〕\n4. 易孤独〔来源D〕"
if "写手" in system_prompt:
return ("远程办公各有利弊。好处上,它省去通勤、带来时间弹性;"
"但也存在沟通成本升高、员工易感孤独的问题。总体需权衡岗位性质而定。")
if "审校" in system_prompt:
# 假审校:第一次故意打回,第二次通过(模拟返工,见下方 run 里的逻辑)
return "通过" if "已修订" in user_input else "打回:结尾建议更具体"
return ""
# ===== 第 2 块:三个角色(就是三份系统提示词,同 L02)=====
ROLES = {
"researcher": "你是研究员。就主题列出 4-6 个要点,每点标来源,不要写成文章。",
"writer": "你是写手。把要点写成 200 字通顺短文,不要新增没给的事实。",
"critic": "你是审校。通过就回复『通过』,否则回复『打回:原因』。",
}
# ===== 第 3 块:主流程(老板 = supervisor,负责调度 + 返工控制)=====
def run(topic, max_retry=3):
print(f"📌 主题:{topic}\n")
points = call_llm(ROLES["researcher"], topic) # ① 研究员出要点
print("【研究员】要点:\n" + points + "\n")
draft = call_llm(ROLES["writer"], points) # ② 写手出初稿
for i in range(max_retry): # ③ 送审 + 返工循环(带上限)
verdict = call_llm(ROLES["critic"], draft)
print(f"【审校 第{i+1}轮】{verdict}")
if verdict.startswith("通过"):
print("\n✅ 定稿:\n" + draft)
return draft
# 没通过:把审校意见 + "已修订"标记给写手,让它带着意见重写
draft = call_llm(ROLES["writer"], points + f"\n(审校意见:{verdict}) 已修订")
print("\n⚠️ 返工超过上限,转人工处理")
return draft
run("远程办公的利弊")
通读一遍你会发现:整套多智能体系统的骨架,就是"几份提示词 + 一个带返工上限的调度循环"。没有魔法。你之前学的 function calling、结构化输出、角色设定,在这里全用上了。
L05
跑一遍看输出 & 换成真模型
🤔 痛点假模型跑通了,可我要的是"真会思考"的版本。怎么从玩具变成真家伙?
💡 本质因为我们把"模型调用"收敛在了唯一一个
call_llm 函数里,换真模型只改这一处,三个角色和调度逻辑一行都不用动。这就是"入口收敛"的好处——也是好架构的标志。# 把 L04 里那个"假的 call_llm"替换成下面这个真的即可(其余代码不变)
# 说明:这里用兼容 OpenAI 接口风格的写法演示;换成 Anthropic 等 SDK 思路一样,
# 核心都是"传入 system + user,拿回一段文本"。密钥从环境变量读(别写死!)
from openai import OpenAI # 先 pip install openai
client = OpenAI() # 会自动读环境变量里的 API Key(回忆 Day 07)
def call_llm(system_prompt, user_input):
resp = client.chat.completions.create(
model="gpt-4o-mini", # 便宜的活用便宜模型(Day 13/15)
messages=[
{"role": "system", "content": system_prompt}, # 角色设定
{"role": "user", "content": user_input}, # 这一环的输入
],
)
return resp.choices[0].message.content # 取出模型回复的文本
# 换完再跑 run("远程办公的利弊"),三个 Agent 就"真的会写"了
👶 小白:真模型下,审校会不会永远不通过,一直返工把钱烧光?
👨🏫 老师:好问题!这正是我们加 max_retry 的原因——无论如何最多返工几轮,超了就转人工,钱和时间都封了顶。这种"闸门"思维在真实系统里至关重要,Day 54 会专门讲"失败闸门与预算闸"。多智能体最容易失控在"两个 Agent 互相拉扯停不下来",上限就是保险丝。
L06
常见坑与调优
🤔 痛点结构跑通了,但真用起来常常"不如预期"。新手最容易栽在哪几个坑?
| 坑 | 症状 | 解法 |
|---|---|---|
| 角色越位 | 研究员直接写起了文章 | 提示词里明确"不要做什么"(L02) |
| 无限返工 | 审校一直打回,烧钱不停 | 设 max_retry 上限,超了转人工 |
| 信息丢失 | 写手没用上研究员的要点 | 把上一环产出完整传下去,别截断 |
| 审校太松/太严 | 烂稿也通过 / 好稿也打回 | 给 critic 明确评判清单(Day 50 讲 rubric) |
| 成本失控 | 三个 Agent 都用最贵模型 | 简单角色用便宜模型(Day 13/15 分流) |
📝 举个例子:一个小改动大幅提质
原来 critic 只说"打回:不够好",写手一头雾水改不对。改成让 critic 输出具体清单——"①缺结尾 ②要点3没用上"——写手照单修改,一轮就过。反馈越具体,返工越高效,这条对人对 Agent 都成立。
L07
今日小结 + 阶段收官 + 明日预告
🧠 今天你应该能回答(也是阶段 8 的自测)
- 三个 Agent 用同一个模型,靠什么表现得像三个人?
- 多智能体系统的骨架,本质上就是"____ + ____"?(提示词 + 带上限的调度循环)
- 为什么模型调用要收敛在一个函数里?换真模型时的好处是什么?
- 返工循环为什么必须设上限?这呼应了后面哪一天的内容?
- 说出至少三个多智能体常见坑及其解法。
✋ 动手 10 分钟:让工作室多招一个人 / 换个主题
基于 L04 的可运行代码,任选一个改造(都是面试能讲的加分项):
# 挑战 1(简单):换主题跑,观察三个角色的接力
run("每天喝咖啡的利弊")
# 挑战 2(进阶):给工作室加第 4 个角色——"翻译",在定稿后把报告译成英文
ROLES["translator"] = "你是翻译。把给你的中文报告忠实译成通顺英文,不增删内容。"
# 然后在 run() 定稿返回前,加一行:
# en = call_llm(ROLES["translator"], draft); print("EN:\n" + en)
# 挑战 3(关键思维):把 critic 的假逻辑改成"要点少于4个就打回",
# 体会"审校标准越具体,返工越有效"(为 Day 50 的评分 rubric 埋伏笔)
阶段 8 收官 & 明日预告 · Day 49:恭喜!你已经能把一队 Agent 组织起来交付成果了。但一个尖锐的问题随之而来——你怎么知道它产出的报告到底好不好?明天进入全课最重要的阶段 9:评测。第一课就讲"为什么评测最重要、没有评测等于盲改、离线 vs 在线"——这也是面试官最爱深挖的地方。把评测学扎实,你就从"会搭"跃升到"会验证",真正拉开与其他候选人的差距。