文章目录
- 前言
- 一、配置CAMEL
- 1.安装CAMEL
- 2.API获取和调用
- 3.Hello CAMEL!
- 二、多智能体背景知识
- 1.智能体概述
- 2.Agent设计原则与方法
前言
对多智能体框架 CAMEL-AI(NeruIPS’2023)的学习实现由单个Agent开发到复杂Multi Agent 应用开发的实现。
学习链接:Handy Multi Agent
一、配置CAMEL
1.安装CAMEL
- 基础要求:Python 3.10+
- 学习资料提供了PyPI 安装和通过源码安装,由于已经有conda环境,本次使用Conda和Pip从源码安装
代码如下(示例):
conda create --name camel python=3.10 #创建env并制定Python版本
conda activate camel #激活env
git clone -b v0.2.23a0 https://github.com/camel-ai/camel.git #克隆Github仓库
cd camel #切换项目目录
pip install -e .[all] #源代码安装
2.API获取和调用
- 该处学习指南中提到的API KEY 为ModelScope的SDK令牌,不是从各大模型平台申请的API
- 使用dotenv 来管理 API 密钥
pip install python-dotenv #PyPI安装python-dotenv 库
项目根目录下创建.env 的文件,并在其中添加 API 密钥,格式如下:
QWEN_API_KEY=你的api密钥 #上一步提到的SDK令牌
- 通过API调用模型(学习材料中给出的三个测试代码的架构逻辑相似:初始化模型→创建聊天代理ChatAgent→准备输入数据→获取响应。该过程中模型选择和输入不同,第一个例子只处理文本信息所以调用的为Qwen2.5,而第2-3例子涉及多模态,调用的为QVQ,笔记中只展示视频理解的API调用)
from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
from camel.messages import BaseMessagefrom dotenv import load_dotenv
import osload_dotenv() #从项目根目录下的 .env 文件中加载环境变量到系统的环境变量api_key = os.getenv('QWEN_API_KEY')model = ModelFactory.create(model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,model_type="Qwen/QVQ-72B-Preview",url='https://api-inference.modelscope.cn/v1/',api_key=api_key
) #指定模型获取的平台&URL,模型类型# 创建代理
agent = ChatAgent(model=model,output_language='中文'
)# 读取本地视频文件
video_path = "vedio_test.mp4"
with open(video_path, "rb") as video_file:video_bytes = video_file.read()# 创建包含视频的用户消息
user_msg = BaseMessage.make_user_message(role_name="User", content="请描述这段视频播放到一半的时候,截图的画面内容", video_bytes=video_bytes # 将视频字节作为参数传入
)# 获取模型响应
response = agent.step(user_msg)
print(response.msgs[0].content)
输出结果为:
所以这个视频看起来挺神奇的,有一只狗在雪地上跑,然后天空中有很漂亮的彩云和光线。我得好好描述一下这个场景。首先,这只狗是白色的,可能是一只哈士奇或者类似的雪地犬,它在一条被雪覆盖的路上奔跑。这条路看起来是被人或者车辆压过的,因为有很明显的痕迹。狗跑得挺快的,它的姿势和动作都很流畅,好像在追逐什么,或者只是在享受奔跑的乐趣。然后,周围的环境是雪原,两边都是雪堆,有些地方雪堆得很高,形成了小小的山丘。远处好像还有一些树木或者电线杆,但不是很清楚,可能是因为距离太远,或者被雪覆盖住了。最让我惊叹的是天空,天空中充满了绚丽的彩云,有粉色、紫色、蓝色和金色的混合,还有明亮的光线穿过云层,形成一种非常壮观的景象。这些光线可能是因为太阳的位置,或者是一些特殊的光学效应,总之非常美丽。整个场景给人一种梦幻般的感觉,好像不是在地球上,而是在某个神奇的地方。狗的奔跑给这个静谧的雪原带来了一丝生机和活力,让人感受到自然的美妙和生命的活力。我得说,这个视频真的太美了,每一帧都可以当作壁纸来用。如果我能身临其境,那该是多么美妙的体验啊。不过,我有点好奇,这样的天空是不是真实的,还是经过了后期处理或者特效制作?因为实在太过奇幻,有点不像平常我们看到的天空。也许是在极地地区出现的极光现象?不过极光通常是绿色和蓝色的,不太可能是这样的粉色和金色。或者,可能是日出或者日落时的光线,加上云层的反射和折射,形成了这样的色彩效果。不管怎样,都是非常罕见和美丽的自然现象。狗的出现让整个场景更加生动,它的动作和表情都充满了活力和喜悦,好像在告诉观众,这是一个快乐的地方,一个值得探索的地方。总的来说,这个视频给我带来了很大的震撼和感动,让我感受到了自然的伟大力量和生命的美好。我希望有一天能亲自见证这样的美景,或者至少能更多地了解这些自然现象的背后原理。也许,下次我应该去一些偏远的雪原地区,亲自体验一下这样的景色。不过,我得做好充分的准备,因为那样的环境可能非常严寒,需要特别的装备和技能。无论如何,这个视频已经在我心中留下了深刻的印象,我会一直记得这只在雪地上快乐奔跑的狗,以及那美得令人窒息的天空。**最终答案**\[ \boxed{\text{这是一只白色狗在雪地上奔跑,周围是壮丽的彩云和光线,构成了一个梦幻般的场景。}} \]
3.Hello CAMEL!
main函数解析
- task_prompt:任务提示设置
- role_play_session:使用RolePlaying类初始化了一个角色扮演会话对象role_play_session。设置了助手角色名为"Python 程序员",用户角色名为"股票交易员",并指定了助手和用户使用的模型、任务提示以及输出语言等参数。
- 打印出AI助手和用户的系统消息
- role_play_session.init_chat:初始化聊天会话并获得输入
- while: 处理对话循环,程序将不断处理来自AI助手和用户的响应直到达到设定的聊天轮次限制或任一方终止对话。每次循环迭代时,都会调用role_play_session.step(input_msg)来生成助手和用户的响应,如果助手或用户的响应指示会话已终止,则打印出终止原因并退出循环。使用print_text_animated函数以动画形式打印出用户和助手的消息内容,同时,更新input_msg为助手的最新响应,准备下一轮对话。
from colorama import Forefrom camel.societies import RolePlaying
from camel.utils import print_text_animated
from camel.models import ModelFactory
from camel.types import ModelPlatformTypefrom dotenv import load_dotenvimport osload_dotenv(dotenv_path='.env')api_key = os.getenv('QWEN_API_KEY')model = ModelFactory.create(model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,model_type="Qwen/Qwen2.5-72B-Instruct",url='https://api-inference.modelscope.cn/v1/',api_key=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='中文'#设置输出语言)print(Fore.GREEN+ f"AI 助手系统消息:\n{role_play_session.assistant_sys_msg}\n")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 = 0input_msg = role_play_session.init_chat()while n < chat_turn_limit:n += 1assistant_response, user_response = role_play_session.step(input_msg)if assistant_response.terminated:print(Fore.GREEN+ ("AI 助手已终止。原因: "f"{assistant_response.info['termination_reasons']}."))breakif user_response.terminated:print(Fore.GREEN+ ("AI 用户已终止。"f"原因: {user_response.info['termination_reasons']}."))breakprint_text_animated(Fore.BLUE + f"AI 用户:\n\n{user_response.msg.content}\n")print_text_animated(Fore.GREEN + "AI 助手:\n\n"f"{assistant_response.msg.content}\n")if "CAMEL_TASK_DONE" in user_response.msg.content:breakinput_msg = assistant_response.msgif __name__ == "__main__":main()