![](https://i-blog.csdnimg.cn/img_convert/8ccd85316caba597b849f85675cf4ef6.png)
前言
Hello,大家好,我是
GISer Liu
😁,一名热爱AI技术的GIS开发者,本系列是作者参加DataWhale2025年2月份组队学习的技术笔记文档,这里整理为博客,希望能帮助学习Agent的开发者少走弯路!
一、CAMEL Multi-Agent 框架介绍
1.框架概述
CAMEL Multi-Agent 是一个开源的灵活框架,专注于构建和模拟多智能体系统(MAS)。它提供了一套完整的工具链,支持从智能体角色定义、协作流程设计到复杂环境模拟的全流程开发。其核心优势在于 轻量级架构 、高度可定制化 和 面向多角色协作的交互设计,特别适合需要模拟人类-智能体或智能体-智能体协作的场景。
2.核心作用
- 多角色协作模拟:支持定义不同角色的智能体(如「程序员」「产品经理」「医生」等),并通过角色扮演完成复杂任务。
- 自主决策与学习:提供基于大语言模型(LLM)的决策引擎,支持智能体的自主推理和行为优化。
- 环境交互:内置沙盒环境,允许智能体与外部工具(如Python解释器、API服务)安全交互。
- 可观测性:实时监控智能体状态、通信日志和任务执行轨迹。
3.与其他 Agent 框架对比
框架 | 核心定位 | 多智能体支持 | 角色定制化 | 环境交互 | 典型应用场景 |
---|---|---|---|---|---|
CAMEL | 多角色协作与模拟 | ✅ 原生支持 | ✅ 高度定制 | ✅ 沙盒环境 | 社会模拟/复杂任务分解 |
LangChain | LLM应用开发框架 | ❌ 单智能体 | ⚠️ 有限 | ⚠️ 需扩展 | 文档问答/简单工具调用 |
AutoGen | 多智能体对话系统 | ✅ 支持 | ⚠️ 中等 | ✅ 集成工具 | 自动化工作流 |
MetaGPT | SOP驱动的多智能体协作 | ✅ 支持 | ✅ 角色模板 | ⚠️ 需扩展 | 软件项目开发 |
LlamaIndex | 数据索引与检索增强 | ❌ 无关 | ❌ 无 | ❌ 无 | 知识库问答 |
- 与 LangChain 的区别
LangChain 侧重 单智能体场景下的工具链集成 ,而 CAMEL 专精于 多智能体的角色化协作 。例如在「产品需求评审」场景中:- LangChain 更适合构建一个能调用市场数据API的独立分析师智能体
- CAMEL 则擅长模拟产品经理、工程师、测试人员的多方协作过程
- 与 MetaGPT 的区别
MetaGPT 强调 标准化流程(SOP) ,通过预定义的工作流模板(如软件开发生命周期)驱动智能体协作;而 CAMEL 提供 更自由的交互模式,支持开放式的智能体对话和动态任务分解。 - 与 AutoGen 的区别
AutoGen 提供更完善的外部工具集成,但 CAMEL 在以下方面更具优势:- 角色定义系统:支持细粒度的角色属性设置(知识背景、沟通风格等)
- 对话管理:内置基于主题的对话路由机制
- 训练接口:提供智能体行为微调API
二、环境配置
以下是 CAMEL Multi-Agent 的几种安装方式及其适用场景:
- 基础安装
安装方式 | 适用场景 | 备注 |
---|---|---|
PyPI 安装 | 快速体验基础功能 | 不含额外依赖 |
完整版安装 | 需要全部功能 | 使用清华源加速:-i https://pypi.tuna.tsinghua.edu.cn/simple |
Conda 环境 | 已有Anaconda环境 | 避免依赖冲突 |
- 开发者安装
安装方式 | 适用场景 | 备注 |
---|---|---|
Poetry 安装 | 需要修改源码/参与开发 | 自动创建虚拟环境 |
源码安装 (Pip) | 直接调试代码 | 需手动管理虚拟环境 |
这里有一些前置条件:
这里作者介绍两种安装方法!😉,个人推荐后者!
1.纯净pip直接安装
最简单的方式安装!
plain
pip install camel-ai
![](https://i-blog.csdnimg.cn/img_convert/02d6532b58e164ca88cf92b25aea9937.png)
如果下载卡顿,也可以配置清华源进行下载:
plain
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple camel-ai
完整版本下载:
plain
pip install "camel-ai[all]==0.2.19"
![](https://i-blog.csdnimg.cn/img_convert/a047ddc34074e16b792805ba8445e67a.png)
2.miniconda安装
当然,以上是纯净计算机下环境的安装教程,不过考虑到大多数用户更喜欢用conda,作者这里使用了miniconda配置环境,流程如下::
- 创建Conda虚拟环境:
plain
conda create --name camel python=3.10
![](https://i-blog.csdnimg.cn/img_convert/05deeb6825c3e6f66b74b7184e377399.png)
这里记得输入y确认;🤔
- 激活Conda虚拟环境:
plain
conda activate camel
![](https://i-blog.csdnimg.cn/img_convert/8b374423233bab922fc05bfcc84bff70.png)
- 克隆Github仓库:
plain
git clone -b v0.2.19 https://github.com/camel-ai/camel.git
这里由于是clone GitHub上的项目,需要将自己的科学网络工具提前全局开代理;注意接口要根据科学工具调整,如果是国外网络则无需配置代理;
![](https://i-blog.csdnimg.cn/img_convert/4c3ad3c0f937352a7b628aeb0773aa9e.png)
![](https://i-blog.csdnimg.cn/img_convert/290eae713035e168364d3ef48362b166.png)
OK,拉取成功!
切换到项目目录,从源代码安装::
plain
cd camel
pip install -e .[all]
![](https://i-blog.csdnimg.cn/img_convert/0cc94efecc52c2bbdc58818cbfb96530.png)
安装完毕!本地环境配置完成!🎉👌
这里安装的东西比较多,需要耐心等待;
三、获取API及接口测试
接下来我们获取大模型的API Key,最近DeepSeek很火爆,并且DeepSeek的接口形式和OpenAI的兼容,因此我们选择DeepSeek为例进行测试:
1.登录注册deepseek:https://platform.deepseek.com/usage
这里新用户有免费的API Key额度,作者这里是老玩家了,已经充值了部分金额🙂;按照下面的截图依次创建API Key;
![](https://i-blog.csdnimg.cn/img_convert/b70bf16221440971182725ce33bb45ce.png)
![](https://i-blog.csdnimg.cn/img_convert/d3097a3fc90fa74ae0dc0173b038a09a.png)
![](https://i-blog.csdnimg.cn/img_convert/ac0af0d594eac029460727375ba77b84.png)
现在复制保存下来这个API Key即可;
注意这里保密,不要将自己的API Key外泄,以免造成经济损失;
其他平台接口申请可以参考作者之前的文章:
https://giserliu.blog.csdn.net/article/details/139667632?spm=1001.2014.3001.5502
四、接口测试与参数细节
1.参数介绍
好了,我们开始测试;🤔下面是一个Camel框架的测试代码:
python
from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
model_type="deepseek-chat",
url='https://api.deepseek.com',
api_key='你的api_key'
)
agent = ChatAgent(
model=model,
output_language='中文'
)
response = agent.step("你好,你是谁?")
print(response.msgs[0].content)
可以看到这里model_platform指的是接口类型。为OpenAI类型接口,因此下面的模型参数比较统一:
model_type:模型名称或型号
url:接口请求地址
api_key:我们刚刚保存的token
这里我们可以参考deepseek的接口文档辅助理解:
运行一下测试看看:
![](https://i-blog.csdnimg.cn/img_convert/6cab183f8efe0f36b0d03334507ff5a8.png)
没什么问题!
如果要测试其他接口,可以参考官方提供的文档链接:
官方链接:https://docs.camel-ai.org/key_modules/models.html#using-models-by-api-calling
2.环境变量配置
当然上面的代码总归是不安全的,我们一不小心就可以能将自己的api key泄露出去造成经济损失,因此作者推荐通过环境变量来访问API_KEY;
在当前根目录下创建一个.env文件,然后再其中设置环境变量;
![](https://i-blog.csdnimg.cn/img_convert/55a9392466a678134f35aa14e87ca291.png)
我们也可以将这个模型名称和BaseURL也作为环境变量存储;
![](https://i-blog.csdnimg.cn/img_convert/5372e9cd1a0fc096e8c34895d2b7c07a.png)
在当前环境中安装这个python-dotenv包,用于访问环境变量;
plain
pip install python-dotenv
![](https://i-blog.csdnimg.cn/img_convert/6bb406e507aa05cf9497136e807264f3.png)
修改代码,实现访问:
python
from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
from dotenv import load_dotenv
import os
load_dotenv()
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
model_type=os.getenv("MODEL_TYPE"),
url=os.getenv("OPENAI_API_BASE"),
api_key=os.getenv("OPENAI_API_KEY")
)
agent = ChatAgent(
model=model,
output_language='中文'
)
response = agent.step("你好,介绍一下AI Agent!")
print(response.msgs[0].content)
输出效果:
![](https://i-blog.csdnimg.cn/img_convert/e7937fc68c60f8e60ad3c207a840831c.png)
五、基于Camel框架开发股市交易Agent
1.代码实现
这里我们参考官方的脚本构建一个基于DeepSeek的股票交易Agent,先上代码:
python
from colorama import Fore # 导入colorama库,用于在控制台中输出彩色文本
from camel.societies import RolePlaying # 导入RolePlaying类,用于角色扮演会话
from camel.utils import print_text_animated # 导入print_text_animated函数,用于动画效果打印文本
from camel.models import ModelFactory # 导入ModelFactory类,用于创建模型实例
from camel.types import ModelPlatformType # 导入ModelPlatformType枚举,用于指定模型平台类型
from dotenv import load_dotenv # 导入load_dotenv函数,用于加载环境变量
import os # 导入os模块,用于操作系统相关功能
load_dotenv(dotenv_path='.env') # 从.env文件中加载环境变量
# 使用ModelFactory创建DeepSeek模型实例
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, # 指定模型平台类型为OpenAI兼容模型
model_type=os.getenv("MODEL_TYPE"),
url=os.getenv("OPENAI_API_BASE"),
api_key=os.getenv("OPENAI_API_KEY")
)
def main(model=model, chat_turn_limit=50) -> None:
task_prompt = "为股票市场开发一个交易机器人" # 设置任务目标
role_play_session = RolePlaying(
assistant_role_name="Python 程序员", # 设置AI助手角色名
assistant_agent_kwargs=dict(model=model), # 传入模型参数
user_role_name="股票交易员", # 设置用户角色名,在roleplay中,user用于指导AI助手完成任务
user_agent_kwargs=dict(model=model), # 传入模型参数
task_prompt=task_prompt, # 传入任务提示
with_task_specify=True, # 启用任务细化
task_specify_agent_kwargs=dict(model=model), # 传入模型参数
output_language='中文' # 设置输出语言为中文
)
# 打印AI助手的系统消息
print(
Fore.GREEN
+ f"AI 助手系统消息:\n{role_play_session.assistant_sys_msg}\n"
)
# 打印AI用户的系统消息
print(
Fore.BLUE + f"AI 用户系统消息:\n{role_play_session.user_sys_msg}\n"
)
# 打印原始任务提示
print(Fore.YELLOW + f"原始任务提示:\n{task_prompt}\n")
# 打印细化后的任务提示
print(
Fore.CYAN
+ "指定的任务提示:"
+ f"\n{role_play_session.specified_task_prompt}\n"
)
# 打印最终任务提示
print(Fore.RED + f"最终任务提示:\n{role_play_session.task_prompt}\n")
n = 0 # 初始化对话轮次计数器
input_msg = role_play_session.init_chat() # 初始化聊天会话
while n < chat_turn_limit: # 限制对话轮次
n += 1
# 执行一步对话,获取AI助手和AI用户的响应
assistant_response, user_response = role_play_session.step(input_msg)
# 如果AI助手终止对话,打印终止原因并退出循环
if assistant_response.terminated:
print(
Fore.GREEN
+ (
"AI 助手已终止。原因: "
f"{assistant_response.info['termination_reasons']}."
)
)
break
# 如果AI用户终止对话,打印终止原因并退出循环
if user_response.terminated:
print(
Fore.GREEN
+ (
"AI 用户已终止。"
f"原因: {user_response.info['termination_reasons']}."
)
)
break
# 动画效果打印AI用户的响应
print_text_animated(
Fore.BLUE + f"AI 用户:\n\n{user_response.msg.content}\n"
)
# 动画效果打印AI助手的响应
print_text_animated(
Fore.GREEN + "AI 助手:\n\n"
f"{assistant_response.msg.content}\n"
)
# 如果AI用户响应中包含任务完成标志,退出循环
if "CAMEL_TASK_DONE" in user_response.msg.content:
break
input_msg = assistant_response.msg # 更新输入消息为AI助手的响应
if __name__ == "__main__":
main() # 执行主函数
2.步骤简单分析
执行一下:
仔细分析不同的输出,可以看到这个框架Agent的思考逻辑,其内置一种多Agent默认框架,通过自我反思和协作完成任务,解决问题;
![](https://i-blog.csdnimg.cn/img_convert/7c07e6423bb24fbedba513d3be837263.png)
![](https://i-blog.csdnimg.cn/img_convert/754aa6f7d6e068f7d666dcd443701813.png)
这里也可以看出这个框架的某个Agent对任务进行了分解,然后分别执行每个模块的需求,保证各个模块生成内容的完整;
这里重复了两次?是因为每次执行完毕后都要运行一下代码来测试模块是否运行成功吗?
不得不说,这里是一个比较有趣的设计,最后用户可以得到一个可以运行的版本,就是消耗的token会不少😂;
在下一篇文章中,我们会详细了解这部分的原理!
注意事项:
如果读者使用的是原版的openai的接口,这里建议打开自己科学网络软件的同时,开启全局代理:
六、Arivx论文下载Agent
代码实现
各位读者也可以根据自己的需求修改task_prompt、assistant_role_name及user_role_name信息;下面是作者自定义的Arivx论文爬取下载的Agent代码:
python
from colorama import Fore # 导入colorama库,用于在控制台中输出彩色文本
from camel.societies import RolePlaying # 导入RolePlaying类,用于角色扮演会话
from camel.utils import print_text_animated # 导入print_text_animated函数,用于动画效果打印文本
from camel.models import ModelFactory # 导入ModelFactory类,用于创建模型实例
from camel.types import ModelPlatformType # 导入ModelPlatformType枚举,用于指定模型平台类型
from dotenv import load_dotenv # 导入load_dotenv函数,用于加载环境变量
import os # 导入os模块,用于操作系统相关功能
load_dotenv(dotenv_path='.env') # 从.env文件中加载环境变量
# 使用ModelFactory创建DeepSeek模型实例
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, # 指定模型平台类型为OpenAI兼容模型
model_type=os.getenv("MODEL_TYPE"), # 从环境变量中获取模型类型
url=os.getenv("OPENAI_API_BASE"), # 从环境变量中获取API基础URL
api_key=os.getenv("OPENAI_API_KEY") # 从环境变量中获取API密钥
)
def main(model=model, chat_turn_limit=50) -> None:
task_prompt = "开发一个Arxiv论文爬取和下载的Agent,能够根据用户提供的关键词或主题自动搜索、筛选并下载相关论文" # 设置任务目标
role_play_session = RolePlaying(
assistant_role_name="Python 爬虫开发工程师", # 设置AI助手角色名
assistant_agent_kwargs=dict(model=model), # 传入模型参数
user_role_name="学术研究员", # 设置用户角色名,在roleplay中,user用于指导AI助手完成任务
user_agent_kwargs=dict(model=model), # 传入模型参数
task_prompt=task_prompt, # 传入任务提示
with_task_specify=True, # 启用任务细化
task_specify_agent_kwargs=dict(model=model), # 传入模型参数
output_language='中文' # 设置输出语言为中文
)
# 打印AI助手的系统消息
print(
Fore.GREEN
+ f"AI 助手系统消息:\n{role_play_session.assistant_sys_msg}\n"
)
# 打印AI用户的系统消息
print(
Fore.BLUE + f"AI 用户系统消息:\n{role_play_session.user_sys_msg}\n"
)
# 打印原始任务提示
print(Fore.YELLOW + f"原始任务提示:\n{task_prompt}\n")
# 打印细化后的任务提示
print(
Fore.CYAN
+ "指定的任务提示:"
+ f"\n{role_play_session.specified_task_prompt}\n"
)
# 打印最终任务提示
print(Fore.RED + f"最终任务提示:\n{role_play_session.task_prompt}\n")
n = 0 # 初始化对话轮次计数器
input_msg = role_play_session.init_chat() # 初始化聊天会话
while n < chat_turn_limit: # 限制对话轮次
n += 1
# 执行一步对话,获取AI助手和AI用户的响应
assistant_response, user_response = role_play_session.step(input_msg)
# 如果AI助手终止对话,打印终止原因并退出循环
if assistant_response.terminated:
print(
Fore.GREEN
+ (
"AI 助手已终止。原因: "
f"{assistant_response.info['termination_reasons']}."
)
)
break
# 如果AI用户终止对话,打印终止原因并退出循环
if user_response.terminated:
print(
Fore.GREEN
+ (
"AI 用户已终止。"
f"原因: {user_response.info['termination_reasons']}."
)
)
break
# 动画效果打印AI用户的响应
print_text_animated(
Fore.BLUE + f"AI 用户:\n\n{user_response.msg.content}\n"
)
# 动画效果打印AI助手的响应
print_text_animated(
Fore.GREEN + "AI 助手:\n\n"
f"{assistant_response.msg.content}\n"
)
# 如果AI用户响应中包含任务完成标志,退出循环
if "CAMEL_TASK_DONE" in user_response.msg.content:
break
input_msg = assistant_response.msg # 更新输入消息为AI助手的响应
if __name__ == "__main__":
main() # 执行主函数
运行结果如下;
![](https://i-blog.csdnimg.cn/img_convert/7591cef2b16158532655159c0bc2b453.png)
一切正常!没有问题!各位学习者可以一起尝试一下!
文章参考
项目地址
![](https://img-blog.csdnimg.cn/direct/08076218e2324cd5ae84a1d6ade486c8.png)
如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.