跳到主要内容

CAMEL — 架构与原理

30 秒导读: CAMEL 是一个研究「智能体规模化规律」的多智能体框架。它的地基是一个能边想边调工具的单体 agent(ChatAgent);在它之上提供两种让多个 agent 协作的方式——对称的双人对话(RolePlaying)和非对称的「协调者派活给工人、失败自动重试」的工厂(Workforce)。

1. 这是什么(零基础也能懂)

一句话定义: CAMEL(Communicative Agents for "Mind" Exploration of Large language model society)是一个用 Python 写的框架,让你用几行代码搭出一个或一群会用工具、有记忆、能互相协作的 AI 智能体

解决什么问题 / 给谁用: 假设你想做的事情,单次问一下 LLM 答不完——比如「为在柏林发布电动滑板车做一份完整市场分析」。这需要:先上网查资料、再分析、再写报告,中间可能要调好几次工具、出错了要重试。CAMEL 帮你把这件事拆成几个各有专长的 agent,自动分工、传递结果、容错。它面向做 agent 研究和应用的工程师

它能做什么(功能):

  • 跑一个会自动循环调用工具的单体 agent(ChatAgent)。
  • 让两个 agent 扮演不同角色互相对话推进任务(RolePlaying)。
  • 搭一个多智能体「工厂」:一个协调者把任务拆开、派给最合适的工人,失败了自动选恢复策略(Workforce)。
  • 统一接入 40+ 模型后端(OpenAI / Anthropic / 本地 Ollama / vLLM …)、90+ 工具箱、多种记忆策略。

用起来什么样: 最小的单体 agent 只要三行——

# 示意,基于 examples 的真实用法
from camel.agents import ChatAgent

agent = ChatAgent("You are a helpful assistant.") # 系统提示
response = agent.step("柏林有多少人口?") # 问一句
print(response.msgs[0].content) # 取回答

搭一个三人协作的工厂也只要把三个 ChatAgent 塞进 Workforce(完整代码见 examples/workforce/multiple_single_agents.py)。

一句话直觉/类比:ChatAgent 当成一个会自己反复「想 → 动手 → 看结果 → 再想」的员工;RolePlaying让两个员工结对(一个不停下指令、一个不停干活);Workforce一个有项目经理的小公司(经理拆活、派活、有人搞砸了就换策略重来)。

2. 顶层全景(它大概怎么转)

CAMEL 是三层金字塔:地基(消息/记忆/模型/工具)→ 单体 agent → 多智能体编排。

┌─────────────────────────────────────────────┐
编排层 │ RolePlaying(对称双人) Workforce(非对称) │
│ 两个 agent 互相提问/作答 协调者+工人+恢复 │
└───────────────┬───────────────┬─────────────┘
│ 都由若干 │ 都由若干
▼ ▼
┌─────────────────────────────────────────────┐
智能体层 │ ChatAgent(单体核心循环) │
│ step(): 想 → 调工具 → 看结果 → 再想,直到收敛 │
└───────────────┬─────────────────────────────┘
│ 依赖

┌─────────────────────────────────────────────┐
地基层 │ BaseMessage AgentMemory ModelBackend FunctionTool │
│ 统一消息格式 记忆+上下文 40+ 模型后端 工具 schema │
└─────────────────────────────────────────────┘

部件一句话职责:

部件干什么在哪个文件
ChatAgent单体 agent 的核心循环:发请求、解析工具调用、执行工具、写记忆camel/agents/chat_agent.py
RolePlaying把两个 ChatAgent(assistant / user)接成一来一回的对话camel/societies/role_playing.py
Workforce协调者派活、工人干活、失败恢复的多智能体编排camel/societies/workforce/workforce.py
BaseMessage框架内统一的消息对象,能转成各家 LLM 的格式camel/messages/base.py
AgentMemory存历史 + 按 token 预算产出「喂给模型的上下文」camel/memories/
BaseModelBackend把 40+ 家模型抽象成统一的 run() 接口camel/models/base_model.py
FunctionTool把一个 Python 函数包成带 JSON schema 的工具camel/toolkits/function_tool.py

主线走一遍(以 Workforce 处理一个任务为例,高层):

  1. 你给 Workforce 一个 Task("做柏林市场分析")。
  2. 任务规划 agent 把它拆成子任务(查资料 / 分析 / 写报告)。
  3. 协调者 agent 看每个工人的能力描述,把每个子任务派给最合适的工人。
  4. 工人(本质是 ChatAgent)各自跑自己的 step() 循环干活,通过一个任务通道(TaskChannel)异步领活、交活。
  5. 某个子任务失败 → 协调者分析失败原因 → 选恢复策略(重试 / 重新规划 / 再拆 / 造个新工人)。
  6. 全部子任务完成 → 把结果组合成最终答案。

3. 怎么读这套文档(阅读地图)

由浅入深顺序,建议这样读:

顺序章节讲什么谁该读
01-chat-agent.md单体 agent 的 step() 循环:边想边调工具直到收敛,是整个框架的心脏所有人,必读
02-role-playing.md两个 agent 对称对话的「AI 社会」,CAMEL 论文的原始点子想理解 CAMEL 由来的人
03-workforce.md协调者-工人流水线 + 任务通道 + 失败恢复,现代多智能体编排要搭真实多 agent 系统的人
04-foundations.md地基:消息、记忆+摘要压缩、模型后端、工具想深入或要扩展框架的人

最短路径: 只想跑个 agent → 读 ①。要搭多 agent 协作 → 读 ① + ③。

4. 巧妙之处(先剧透三个精华)

  • 统一 step() 是一切的复用点。 工人、协调者、规划者、对话双方,全都是 ChatAgent——多智能体不过是「多个 ChatAgent + 一套消息路由」。一份循环逻辑撑起三种编排。
  • Workforce 用一个 asyncio.Condition 任务通道做生产者-消费者。 派活/领活/交活全是往一个共享通道里改任务状态 + notify_all,工人各自 await,天然支持并行和动态增删工人(见 03)。
  • 失败不是异常,是一次「让 LLM 决策」的机会。 任务失败时,Workforce 把错误信息喂给协调者,让它在「重试/重规划/再拆/造新工人」里选一个——容错本身被做成了一次智能体推理(见 03 §恢复策略)。

5. 边界与局限(诚实)

  • ChatAgent 单文件 6468 行(camel/agents/chat_agent.py),职责极重:循环、工具、记忆摘要、流式、结构化输出、token 计量都挤在一个类里。强大但难改。
  • Workforceshare_memory 只支持 SingleAgentWorker,RolePlayingWorker 和嵌套 Workforce 不参与记忆共享(见类 docstring,workforce.py:225-233)。
  • 协调者/规划者的产出依赖 LLM 输出结构化 JSON;为兼容不可靠模型,默认走「提示词 + 正则抽取」而非原生 structured output(use_structured_output_handler=True)。

6. 代码地图(导航索引)

主题文件关键符号
单体 agent 循环camel/agents/chat_agent.pyChatAgent.step / ChatAgent._step_impl
工具执行camel/agents/chat_agent.pyChatAgent._execute_tool
上下文摘要压缩camel/agents/chat_agent.pyChatAgent._get_context_with_summarization
双人对话编排camel/societies/role_playing.pyRolePlaying.step
多智能体工厂camel/societies/workforce/workforce.pyWorkforce.process_task / Workforce._listen_to_channel
任务通道camel/societies/workforce/task_channel.pyTaskChannel / Packet
工人节点camel/societies/workforce/worker.pyWorker._listen_to_channel
失败恢复策略camel/societies/workforce/utils.pyRecoveryStrategy
记忆camel/memories/agent_memories.pyChatHistoryMemory / LongtermAgentMemory
模型工厂camel/models/model_factory.pyModelFactory.create