街角新开了一家“如意小馆”,老板张叔很快就发现:如果让一个厨师既接单、又设计菜谱、又炒菜、又试味,高峰期必然手忙脚乱——菜炒糊了、单记错了、客人等急了。于是他把小店拆成四个岗位:老板娘坐前台理解客人的需求并拍板菜品(CEO),老李负责设计菜谱和统筹后厨(CTO),小周专门掌勺炒菜(程序员),徒弟小陈负责试味把关(测试员)。四个岗位各司其职,客人从进门说一句“想吃辣子鸡”,到色香味俱全的菜端上桌,中间是一条清晰、稳定的流水线。 ChatDev 正是把这家“虚拟餐厅”搬进了 AI 世界。它是一个由清华大学团队提出的多智能体框架:把一家软件公司的组织架构复制进大模型里,让 CEO、CTO、程序员、测试员四个 Agent 角色各自承担一个开发阶段,用自然语言对话传递需求和代码产物,最终实现“你说一句话,它交给你一个可运行的程序”。听起来像科幻?其实背后的原理很简单——就像餐厅分工一样,把一个大任务拆成多个小阶段,每个角色只做好自己那一段。

岗位关联

学会 ChatDev 的多角色流水线,你就掌握了多智能体协作的核心范式:如何拆解任务、如何定义角色、如何让多个 Agent 顺畅接力。这是从“单个大模型助手”走向“AI 团队自动化”的关键一步,也是 CrewAI、AutoGen、MetaGPT 等主流框架共同的设计思想。

目录
  1. 可视化演示
  2. 多角色分工:一个店为什么需要四个人
  3. 流水线流程:从点单到上桌的固定顺序
  4. 对话协作:后厨窗口前的“喊单传菜”
  5. 端到端交付:客人只要动嘴,菜就上桌
  6. 质量保障:试味、退菜、重新炒
  7. 实际应用:口碑如何变成金字招牌
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示ChatDev模拟虚拟软件公司的需求分析编码测试文档四阶段Agent流水线、CEO-CTO-程序员-测试员角色间的自然语言对话传递与代码产物交接、以及标准精简扩展三种团队配置模式的角色规模对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

四阶段开发流水线 需求分析阶段CEO与CTO讨论确定技术方案 编码测试文档阶段各角色协作交付产物 4阶段 需求-编码-测试-文档端到端

多角色分工:一个店为什么需要四个人

“如意小馆”最初只有张大厨一个人:他既要听客人点菜,又要自己设计新菜,还要炒菜、端盘、收银。结果一到饭点就乱成一锅粥——锅里的菜还没熟,门口排队的人已经不耐烦了。后来他狠下心招了三个帮手:老板娘接单决策,老李专管菜谱设计,小周负责掌勺,小徒弟负责试味。神奇的是,同样的小店,出菜速度和质量都翻了一倍。

ChatDev 把同样的道理搬进了 AI。单个大模型就像一个“全能张大厨”,如果你让它一口气完成需求分析、架构设计、编码和测试,它会陷入两难:写代码时要回忆需求,测代码时要回忆实现逻辑,上下文一长,思路就“打架”了。ChatDev 的做法是实例化四个独立的大模型对话角色——CEO、CTO、程序员、测试员,每个角色只承担一个阶段的职责。这种“一个角色一个 LLM 实例”的模式,本质上是把复杂任务拆解成了多个专业化子任务。

在实现层面,每个角色都通过一段精心构造的提示词(Prompt)来定义身份。角色提示词可以抽象成一个四段式模板:

回到餐厅的故事:正是每个人只专注一件事,才让“如意小馆”在高峰期也能有条不紊。ChatDev 的多角色分工也是如此——每个 LLM 实例的认知负担大幅降低,输出的专业性和一致性自然就上来了。这也正是 CrewAI、AutoGen 等框架都在强调“角色化”的原因。

Promptrole=[系统提示, 角色描述, 任务要求, 输出约束]\text{Prompt}_{\text{role}} = \left[ \text{系统提示},\ \text{角色描述},\ \text{任务要求},\ \text{输出约束} \right]
这条公式说明:每个 Agent 不是“裸奔”的大模型,而是被一段结构化的提示词“包装”成了特定职业身份,让它知道自己是谁、该干什么、怎么输出。
  1. 系统提示先给 Agent 设定整个协作的语境,让它知道自己生活在一个虚拟软件公司中。
    系统提示=“你正在 ChatDev 虚拟软件公司中参与协作开发”\text{系统提示} = \text{“你正在 ChatDev 虚拟软件公司中参与协作开发”}
  2. 角色描述定义具体身份和职责边界,这是“多角色分工”的关键。
    角色描述=“你是 CEO,负责理解需求并做出整体决策”\text{角色描述} = \text{“你是 CEO,负责理解需求并做出整体决策”}
  3. 任务要求描述当前阶段的具体子任务,让 Agent 聚焦在本阶段目标上。
    任务要求=“请根据用户需求分析功能清单”\text{任务要求} = \text{“请根据用户需求分析功能清单”}
  4. 输出约束规定产出格式,方便下游 Agent 直接解析和接力。
    输出约束=“请以项目符号输出,简明扼要”\text{输出约束} = \text{“请以项目符号输出,简明扼要”}

流水线流程:从点单到上桌的固定顺序

“如意小馆”的出菜顺序是固定的:客人点菜 → 老板娘下单 → 老李定菜谱 → 小周炒菜 → 小陈试味 → 上桌。这个顺序绝不能乱。如果让小周直接炒菜,没有菜谱他不知道做什么;如果让小陈先试味,锅里什么也没有。每一步都依赖上一步的产物,这种“前一步的输出是后一步的输入”的结构,就是流水线。

ChatDev 把软件开发流程也设计成了一条流水线,官方称为 ChatChain(聊天链)。用户的需求首先交给 CEO 角色,CEO 输出产品方案;方案传给 CTO,CTO 输出技术架构;架构传给程序员,程序员写出代码;代码最后传给测试员,测试员执行并给出报告。每个阶段是一个独立的 Agent 节点,节点之间按照固定的编排顺序执行。

我们可以把这条流水线表示为一个状态转换过程:每个阶段是一个状态 $S_i$,经过一个 LLM 处理函数后,转换为下一个状态 $S_{i+1}$:

这就像“如意小馆”的传菜流程:每个岗位只等前一个岗位的“接力棒”递过来,接到手后专心完成自己的环节,再稳稳传下去。流水线的价值在于,它把“天马行空的创意”变成了一套有迹可循、可拆解、可优化的工程流程。

Si+1=LLMi(Si),i=1,2,3,4S_{i+1} = \text{LLM}_i(S_i), \quad i = 1, 2, 3, 4
这里的 $S_i$ 是第 $i$ 个阶段的“中间产物”,比如需求文档、架构方案、代码文件、测试报告。整个开发过程,就是把这些产物按顺序“接力”下去。
  1. 状态定义$S_i$ 表示第 $i$ 个阶段完成后的产物状态。
    S1=需求描述,S2=架构方案,S3=代码,S4=测试报告S_1 = \text{需求描述}, S_2 = \text{架构方案}, S_3 = \text{代码}, S_4 = \text{测试报告}
  2. 转换函数$\text{LLM}_i$ 是第 $i$ 个阶段对应的角色 Agent,它把输入状态映射为输出状态。
    LLMi:Si→Si+1\text{LLM}_i: S_i \rightarrow S_{i+1}
  3. 顺序约束流水线要求严格的先后顺序,$S_1$ 必须先于 $S_2$ 存在。
    S1→S2→S3→S4S_1 \rightarrow S_2 \rightarrow S_3 \rightarrow S_4
  4. 整体链路四个阶段串起来形成完整流水线。
    需求→方案→代码→测试报告\text{需求} \rightarrow \text{方案} \rightarrow \text{代码} \rightarrow \text{测试报告}

对话协作:后厨窗口前的“喊单传菜”

“如意小馆”的后厨有一个传菜窗口。老板娘接完单,朝窗口喊一声:“三号桌辣子鸡,微辣!”老李听到了,就在窗口贴出菜谱;小周照着炒,炒完放在窗口;小陈尝一口,觉得淡了,又端回去让小周加点盐。整个过程没有复杂的系统对接,全靠——自然语言。

ChatDev 的 Agent 之间也是靠自然语言对话来完成协作的。上游 Agent 的文本输出,就是下游 Agent 的文本输入。CEO 说“我们要做一个带登录功能的网站”,这句话原封不动地传给 CTO;CTO 回应“请定义用户表结构”,程序员看到后直接生成建表代码。这种消息传递机制可以抽象成一个结构化消息:

自然语言作为“交接协议”有个巨大优势:它不需要预定义复杂的结构化接口。就像后厨里喊一声“辣子鸡微辣”,人人都能听懂——相比严格的 JSON 或函数调用,自然语言对不同角色的 LLM 来说都是最“舒适区”的沟通方式。

Message=⟨发送者, 接收者, 内容, 上下文⟩\text{Message} = \langle \text{发送者},\ \text{接收者},\ \text{内容},\ \text{上下文} \rangle
这条公式揭示了一个重要事实:Agent 之间的对话不是随意的闲聊,而是带有明确发送方、接收方和上下文载荷的“结构化消息传递”。
  1. 发送者标识消息从哪里来,默认是上一阶段的角色。
    发送者=CEO/CTO/程序员/测试员\text{发送者} = \text{CEO} / \text{CTO} / \text{程序员} / \text{测试员}
  2. 接收者标识消息流向哪里,默认是下一阶段的角色。
    接收者=下游阶段对应的角色\text{接收者} = \text{下游阶段对应的角色}
  3. 内容消息正文,通常是需求、方案、代码或测试反馈。
    内容=自然语言文本,包含阶段性产物\text{内容} = \text{自然语言文本,包含阶段性产物}
  4. 上下文记录完整历史,保证 Agent 在接力时不“失忆”。
    上下文={原始需求,历史消息,当前状态}\text{上下文} = \{\text{原始需求}, \text{历史消息}, \text{当前状态}\}

端到端交付:客人只要动嘴,菜就上桌

在“如意小馆”,客人全程只需要对老板娘说一句“我要吃鱼香肉丝”,至于怎么买食材、怎么切菜、怎么调味、怎么摆盘,都不用客人操心。一顿饭的完整交付,从“一句话需求”到“一盘菜上桌”,是全链路自动化的。

ChatDev 的目标也是端到端交付:用户输入一句自然语言需求,系统自动完成需求分析、架构设计、代码编写、测试验证,最终输出一个可运行的程序。在数学上,这相当于把四个角色 Agent 视作四个函数,然后做函数复合——前一个函数的输出是后一个函数的输入:

客人只动嘴、菜就上桌,这背后是四个岗位的默契接力。ChatDev 的端到端交付也是如此:用户不需要写一行代码,只需要把自己的想法说清楚,系统就会把“一句话”变成“一个能跑起来的程序”。虽然目前还不能应付极其复杂的商业系统,但对于原型验证、小工具开发、教学示例等场景,已经展示出惊人的效率。

App=P4∘P3∘P2∘P1(需求)\text{App} = P_4 \circ P_3 \circ P_2 \circ P_1(\text{需求})
这个公式是“端到端”的数学表达:需求先经过 $P_1$(CEO),再依次经过 $P_2$(CTO)、$P_3$(程序员)、$P_4$(测试员),最终得到可运行程序。
  1. 单角色函数$P_i$ 是第 $i$ 个角色 Agent 的完整处理逻辑。
    Pi(输入)=LLMi(Prompti,输入)P_i(\text{输入}) = \text{LLM}_i(\text{Prompt}_i, \text{输入})
  2. 函数复合$(P_2 \circ P_1)(x)$ 表示先把 $x$ 交给 $P_1$,再把结果交给 $P_2$。
    (P2∘P1)(需求)=P2(P1(需求))(P_2 \circ P_1)(\text{需求}) = P_2(P_1(\text{需求}))
  3. 完整串联四个角色按顺序拼接,形成一个复合函数。
    App=P4(P3(P2(P1(需求))))\text{App} = P_4(P_3(P_2(P_1(\text{需求}))))
  4. 最终产物复合函数的输出就是一个可运行程序。
    App=可直接运行的软件项目\text{App} = \text{可直接运行的软件项目}

质量保障:试味、退菜、重新炒

小陈每天的工作就是“挑毛病”——菜太咸了端回去,摆盘不美观重新来,火候不到位再炒一次。正因为有他这一关,“如意小馆”的菜才始终稳定。如果少了他,菜好不好吃全看小周心情。

ChatDev 的质量保障同样依赖“测试员”这个角色。程序员交付代码后,测试员会执行测试用例,给出反馈报告。如果报告显示有 bug,代码会被退回给程序员修复;修复后再测试,再反馈……形成一个迭代循环。这个过程可以从反馈回路的角度进行表达:

这和小陈“尝一口、不行就退回去重炒”的逻辑一模一样。ChatDev 的研究者们发现,正是这种多轮反馈迭代,让系统生成软件的“完成度”和“质量”比单次生成的方案高出一大截。质量不是一次写出来的,而是反复“试”出来的。

Cn+1=程序员(测试员(Cn))C_{n+1} = \text{程序员}(\text{测试员}(C_n))
这里的 $C_n$ 是第 $n$ 轮生成的代码,$C_{n+1}$ 是测试反馈后修复的代码,直到测试通过才停止迭代。
  1. 测试执行测试员先对当前代码做一轮验证,生成测试报告。
    报告n=测试员(Cn)\text{报告}_n = \text{测试员}(C_n)
  2. 质量判断根据报告判断是否达到交付标准,决定“上桌”还是“退回”。
    分支条件={交付若报告显示通过修复若报告显示失败\text{分支条件} = \begin{cases} \text{交付} & \text{若报告显示通过} \\ \text{修复} & \text{若报告显示失败} \end{cases}
  3. 修复动作程序员收到报告后,针对失败点修改代码。
    Cn+1=程序员(Cn,报告n)C_{n+1} = \text{程序员}(C_n, \text{报告}_n)
  4. 迭代终止经过若干轮修复,最终代码通过全部测试。
    最终代码=CN,满足 测试员(CN)=全部通过\text{最终代码} = C_N, \quad \text{满足} \ \text{测试员}(C_N) = \text{全部通过}

实际应用:口碑如何变成金字招牌

“如意小馆”开了三个月,客人们发现:这家店不管多忙,菜的味道始终稳定。因为流水线把“碰运气式的好吃”变成了“制度化的好吃”。消息传开,门口排起了长队。

ChatDev 在真实应用中也扮演了类似的角色。研究表明,采用多角色流水线后,Agent 系统在软件开发类任务上的完成质量和可靠性显著提升:哪怕用户给出的需求比较模糊,系统也能通过 CEO 的分析、CTO 的设计、测试员的把关,把模糊需求逐步收敛为清晰的产品。ChatDev 的整个流程可以用一个核心指标来量化:

“如意小馆”的成功不是靠某个厨神,而是靠一套可复制的分工协作机制。ChatDev 的意义也不在于某一个角色的智能有多高,而在于它证明了:把多个大模型组织成一条“AI 流水线”,可以让每个模型的短板被队友补上、长板被复用,最终整体输出远超单体能力——这正是多智能体协作最迷人的地方。

成功率=N任务完成N总任务×100%\text{成功率} = \frac{N_{\text{任务完成}}}{N_{\text{总任务}}} \times 100\%
这是衡量多智能体系统“靠不靠谱”的通用指标:用“成功完成的任务数”除以“总任务数”。ChatDev 流水线让这个比例远高于单 Agent 直出方案。
  1. 分子定义$N_{\text{任务完成}}$ 是达到验收标准的任务数。
    N任务完成=通过测试并成功运行的任务数量N_{\text{任务完成}} = \text{通过测试并成功运行的任务数量}
  2. 分母定义$N_{\text{总任务}}$ 是实验中所有尝试过的任务数。
    N总任务=全部测试用例或需求的数量N_{\text{总任务}} = \text{全部测试用例或需求的数量}
  3. 百分比换算除以总数再乘 $100\%$,得到直观的成功率。
    成功率=完成数总数×100%\text{成功率} = \frac{\text{完成数}}{\text{总数}} \times 100\%

AI 应用场景

场景一:自然语言驱动的软件原型生成

阶段:需求分析 → 架构设计 → 代码生成 → 测试验证

解决的问题:传统软件开发需要产品经理、架构师、程序员、测试员多名角色协作,沟通成本高、周期长。创业团队想在几小时内验证一个想法,往往卡在“没人写代码”这一步。使用 ChatDev 后,团队成员只需用自然语言描述需求,系统会自动完成从需求到原型的全流程。

具体案例:某个 5 人创业小团队想做一个“会议室预订小程序”。他们把需求输入 ChatDev 系统,CEO Agent 拆解出“登录、预订、取消、管理端”四个模块;CTO Agent 设计了前后端结构;程序员 Agent 生成了 Flask 后端代码;测试员 Agent 验证接口逻辑并反馈修复。两个小时后,团队就拿到了一个可运行的最小原型,直接用浏览器演示给投资人看。

场景二:自动化代码审查与 Bug 修复流水线

阶段:编码 → 测试 → 反馈 → 修复

解决的问题:大型项目中代码审查和 Bug 修复占据大量人力,而且人工审查容易出现遗漏。借鉴 ChatDev 的多角色流水线,团队可以搭建一条“程序员 + 测试员”的自动修复循环:程序员 Agent 生成代码,测试员 Agent 自动运行测试并定位问题,再把问题反馈给程序员 Agent 修复。

具体案例:某互联网公司在其 CI/CD 流水线中接入了一个“AI 测试-修复循环”:每当开发人员提交代码,测试员 Agent 自动执行单元测试,若发现失败用例,程序员 Agent 会根据失败信息生成补丁,循环若干次后仍无法通过才转人工处理。上线三个月后,该团队的线上缺陷率下降了 30%。

Python 演示

python76 行
"""mini_chatdev.py一个简化的 ChatDev 流水线演示:用一个 MockLLM 模拟四个角色在软件开发中的协作接力。""" class Agent:    def __init__(self, role, system_prompt):        self.role = role        self.system_prompt = system_prompt     def execute(self, llm, message):        prompt = f"【{self.role}】{self.system_prompt}\n收到上游产物:{message}"        return llm.generate(prompt)  class MockLLM:    def __init__(self):        self.gc_count = 0        self.tester_count = 0     def generate(self, prompt):        self.gc_count += 1        if "CEO" in prompt:            return "功能清单:登录、注册、个人中心;技术选型:Python + Flask。"        if "CTO" in prompt:            return "数据库设计:user 表;接口设计:/api/register、/api/login。"        if "程序员" in prompt:            return "app.py 完整代码:Flask 应用,实现了三个路由。"        if "测试员" in prompt:            self.tester_count += 1            if self.tester_count == 1:                return "测试结果:2 个用例通过,1 个失败,请修复登录接口。"            return "测试结果:3 个用例通过,0 个失败,可以交付。"        return ""  class ChatDev:    def __init__(self, llm):        self.ceo = Agent("CEO", "你负责理解需求并拆解功能模块")        self.cto = Agent("CTO", "你负责架构设计与技术选型")        self.programmer = Agent("程序员", "你负责编写可运行代码")        self.tester = Agent("测试员", "你负责运行测试并给出反馈报告")     def develop(self, requirement):        plan = self.ceo.execute(llm, requirement)        design = self.cto.execute(llm, plan)        code = self.programmer.execute(llm, design)        report = self.tester.execute(llm, code)        if "失败" in report:            code = self.programmer.execute(llm, "修复反馈:" + report)            report = self.tester.execute(llm, code)        return {            "需求": requirement,            "方案": plan,            "设计": design,            "代码": code,            "测试": report,        }  if __name__ == "__main__":    llm = MockLLM()    dev = ChatDev(llm)    result = dev.develop("请开发一个用户注册登录系统")    print("=== 原始需求 ===")    print(result["需求"])    print("=== CEO 方案 ===")    print(result["方案"])    print("=== CTO 设计 ===")    print(result["设计"])    print("=== 最终代码 ===")    print(result["代码"])    print("=== 测试报告 ===")    print(result["测试"])    print(f"=== 统计:共 {llm.gc_count} 次 LLM 调用 ===")
目的:用不到 80 行代码演示 ChatDev 的核心思想——四个角色按流水线顺序接力,测试不通过就触发“修复-再测试”的反馈循环。
  1. class Agent封装一个角色,role 是岗位名,system_prompt 是角色提示词
  2. prompt = f"【{self.role}】{self.system_prompt}\n收到上游产物:{message}"把角色身份和上游产物拼成完整提示词
  3. MockLLM.generate()模拟大模型返回,实际项目中这里替换成真实的 LLM API 调用
  4. self.tester_count记录测试员被调用次数,第一次返回失败、第二次返回通过,模拟迭代修复
  5. if "失败" in report:核心反馈逻辑:测试报告含“失败”就退回程序员修复
  6. dev.develop("请开发一个用户注册登录系统")端到端入口:输入一句话需求,输出完整交付物

常见误区

误区ChatDev 不就是给同一个大模型写四段不同的话,按顺序调用一遍吗?感觉没什么技术含量,我自己用提示词也能实现。

正解ChatDev 的关键不在于“四段提示词”,而在于“结构化流水线 + 反馈迭代”的系统设计。每个角色独立维护自己的对话上下文,产物按 ChatChain 有序传递,测试员的反馈还能驱动程序员返工。这就像一个餐厅不只是有四个人,而是有一套“点单-配菜-炒菜-试味-上桌”的流程制度。简单拼接提示词只是让同一个模型反复扮演不同角色,缺少阶段产物隔离和反馈闭环,效果会大打折扣。

为何常见:因为从表面看,代码里确实只是调用了四次 LLM,初学者很容易忽略背后的流程编排和状态管理设计。

误区既然 CEO、CTO、程序员、测试员四个角色效果好,那我加一个“产品经理”、再来一个“运维工程师”,总共六个角色,任务一定能完成得更好。

正解多角色协作有一个重要成本——通信开销。每增加一个角色,流水线就多一次交接,自然语言传递的信息损耗和非确定性也会累积。ChatDev 选择四角色是有权衡的:覆盖核心流程的同时保持流水线简洁。餐厅如果每个环节配十个人,传话都要传半天,反而拖慢上菜速度。角色数量应该根据任务复杂度来定,而不是盲目堆砌。

为何常见:受“人多力量大”的直觉影响,忽略了 Agent 之间的通信成本和上下文链条过长带来的风险。

误区ChatDev 里的 CEO 和 CTO 就像两个人用微信聊天一样,你一句我一句地闲谈,最后聊着聊着就把代码聊出来了。

正解ChatDev 的“对话”本质上是有严格结构的状态传递。每轮对话都是上游产出的一个阶段结果,接收方在此基础上完成本阶段任务。消息体包含明确的角色、内容和上下文,而不是自由闲聊。就像餐厅后厨的“喊单”不是聊天,而是精确的指令传递:“三号桌辣子鸡”意味着必须按固定流程执行。理解这一点,才能明白为什么 ChatDev 的消息格式要精心设计。

为何常见:人看到“自然语言”就会联想到日常聊天,忽略了在工程系统中,自然语言只是载体,背后是严谨的协议和流程。

误区测试员跑测试发现代码有 bug,那就让测试员直接改代码呗,反正都是 AI,谁改不一样?

正解ChatDev 的角色职责是严格分离的:测试员只负责“发现问题、输出报告”,修复工作必须交还给程序员完成。因为测试员的提示词被设定为“质检角色”,它没有完整的代码上下文和编程职责,如果让它改代码,反而可能引入新的问题。这就像小陈只负责尝菜,他发现问题后会端回给炒菜的小周,而不是自己冲上去掌勺——各司其职才能保证流程清晰可控。

为何常见:初学者容易认为“反正都是大模型,换谁干都一样”,忽略了角色提示词赋予的行为边界和职责划分。

误区ChatDev 能从一句话生成一个完整程序,以后公司不需要招程序员了,普通用户说话就能开发软件。

正解ChatDev 目前解决的是“从模糊需求到可运行原型”这个环节,它的输出质量高度依赖用户的输入清晰度和任务边界。对于复杂的业务逻辑、性能优化、安全合规、架构扩展性等真实工程问题,仍然需要人类专家把关。ChatDev 更像一个“自动炒菜机”——它能稳定炒出家常菜,但米其林餐厅的主厨依然是人类。

为何常见:媒体对 AI 写代码的渲染容易让人产生“全自动取代”的幻想,忽略了工程实践中人机协作才是主流形态。

面试题

Q1. 在 ChatDev 中,CEO 角色的核心职责是什么?

单选题 · easy

  • A.理解需求并做整体决策← 正确答案
  • B.编写最终交付的源码
  • C.运行测试并输出报告
  • D.部署并上线软件产品

答案:A。ChatDev 中 CEO 对应“理解需求并拍板方案”的角色,就像餐厅老板娘接单决策;写代码是程序员的事,测试是测试员的事,部署不在四角色流水线范围内。

Q2. ChatDev 流水线的正确阶段顺序是?

单选题 · easy

  • A.需求分析→设计→编码→测试← 正确答案
  • B.编码→设计→测试→需求分析
  • C.测试→编码→需求分析→设计
  • D.设计→需求分析→测试→编码

答案:A。流水线严格遵循“先有需求才能设计方案,先有方案才能写代码,写完代码才能测试”的依赖关系,类似餐厅先点单、再配菜、再炒菜、再试味。

Q3. ChatDev 的 Agent 之间传递产物主要依靠什么?

单选题 · easy

  • A.自然语言消息传递← 正确答案
  • B.二进制共享内存
  • C.外部数据库字段
  • D.本地文件系统读写

答案:A。ChatDev 的核心创新正是用自然语言对话作为 Agent 间的“交接协议”,如同后厨窗口喊单传菜,无需预定义结构化接口。

Q4. 在流水线公式 $S_{i+1}=\text{LLM}_i(S_i)$ 中,$S_i$ 表示什么?

单选题 · hard

  • A.第 i 阶段的中间产物状态← 正确答案
  • B.第 i 个 LLM 模型的名称
  • C.第 i 轮自然语言对话次数
  • D.第 i 段源代码的注释文本

答案:A。$S_i$ 是第 $i$ 个阶段完成后的产物,如需求文档、架构方案、代码等;LLM_i 是第 i 阶段的角色 Agent,负责把 $S_i$ 转换为 $S_{i+1}$。

Q5. ChatDev 中测试员发现 Bug 后,正确的处理流程是?

单选题 · mid

  • A.把报告退回程序员修复再测试← 正确答案
  • B.测试员直接修改代码再自测
  • C.忽略该 Bug 继续下一轮流程
  • D.立即终止整个流水线开发

答案:A。职责分离是 ChatDev 的设计原则:测试员只负责发现问题并反馈,修复必须由程序员完成,然后重新测试,形成迭代闭环,就像小陈尝菜不合格就退回小周重炒。

Q6. 多角色流水线相比单 Agent 直出的最主要优势是什么?

单选题 · mid

  • A.每个阶段职责单一减少上下文冲突← 正确答案
  • B.训练速度可以提升数十倍以上
  • C.不再需要调用大模型接口
  • D.可以完全省略测试这个环节

答案:A。单 Agent 处理长流程任务时,需求、设计、代码全部挤在一个上下文里容易“精神分裂”;多角色让每个 Agent 只看自己阶段的信息,任务更专注、输出更稳定。

Q7. 端到端流水线 $\text{App}=P_4 \circ P_3 \circ P_2 \circ P_1(\text{需求})$ 的正确含义是?

单选题 · hard

  • A.需求先由 P1 处理再依次传递到 P4← 正确答案
  • B.P4 最先拿到原始需求并处理
  • C.四个角色并行处理同一个需求
  • D.随机决定角色处理需求的顺序

答案:A。函数复合的运算是从右往左:先算 $P_1(\text{需求})$,再把结果给 $P_2$,依次类推,最后 $P_4$ 输出最终产物——和流水线“先 CEO 后 CTO 再程序员最后测试员”的顺序一致。

Q8. ChatDev 中测试员输出的反馈报告通常包含哪些信息?

多选题 · mid

  • A.测试用例执行结果汇总← 正确答案
  • B.失败用例的定位信息← 正确答案
  • C.修复代码的具体补丁内容
  • D.是否达到交付标准结论← 正确答案

答案:ABD。测试员负责“发现问题”,报告里包含执行结果、失败定位和交付结论;而“修复代码补丁”是程序员的工作产出,测试员提示词中不包含修改代码的职责。

Q9. ChatDev 采用多角色协作带来了哪些实际收益?

多选题 · mid

  • A.显著提升任务完成质量和可靠性← 正确答案
  • B.完全取代所有人类软件工程师
  • C.将复杂需求拆解成可控子任务← 正确答案
  • D.减少 Agent 间的循环迭代次数

答案:AC。多角色分工让每个子任务更聚焦,从而提升质量和可靠性,这也是“拆解复杂需求”的直接收益;但它并不能完全取代人类工程师,而且反馈迭代是质量保障的必要环节,不是被“减少”的对象。

Q10. 关于 ChatDev 与单 Agent 的对比,以下说法正确的有哪些?

多选题 · hard

  • A.多角色能减轻单个 Agent 的上下文负担← 正确答案
  • B.多角色流水线不会出现返工迭代
  • C.自然语言交接让产物格式更灵活← 正确答案
  • D.反馈循环是质量保障的关键机制← 正确答案

答案:ACD。多角色把任务拆到不同上下文里,确实减轻了单个模型的负担;自然语言作为边界协议具备天然灵活性;反馈循环让 bug 被逐轮修复,是质量核心。B 错误,因为 ChatDev 恰恰依赖“返工迭代”来保障质量。