这次task来自datawhale的camel项目
1.配置步骤
1.1 创建python
我这里是直接用anaconda创建虚拟环境,然后git命令拉取came-ai的源码来安装camel
- 环境配置
conda create--name camel python=3.10 -y
conda activate camel
- 拉取camel源码安装
git clone -b v0.2.23a0 https://github.com/camel-ai/camel.git
cd camel
pip install -e .[all]
1.2 配置远程大模型的API
目前先按照这个来做,以后再调用本地大模型。
这里选取的ModelScope社区来使用API,每天有2000次调用,足够调试使用了。申请是挺简单的。但有一点要注意的是,依照其社区目前特点,这里网页左边那一栏有个叫模型服务,需要先绑定阿里巴巴账号,不然后面API调用不成功的。
当申请成功,社区会给你一个KEY,一般我们不会明文写在代码里,这里可以用python的dotenv库来管理API密钥。
pip install python-dotenv
然后在项目根目录文件夹下创建一个名为 .env 的文件,在里面填写你的密钥,格式如下
API_KEY=你的api密钥
1.3 写一个简单示例:开发一个交易机器人
这里代码核心是RolePlaying
整篇代码关键流程如下:
-
通过ModelFactory创建支持中文的Qwen大模型
-
构建股票交易员(用户)与Python程序员(助手)的角色场景
-
自动细化初始任务提示词
-
进行多轮角色对话:
-
用户提出需求
-
助手给出方案
-
持续交互直到任务完成或达到50轮限制
-
-
彩色终端输出增强可读性
from colorama import Fore # 终端颜色输出
from camel.societies import RolePlaying # 角色扮演核心类
from camel.utils import print_text_animated # 动画效果打印
from camel.models import ModelFactory # 模型工厂
from camel.types import ModelPlatformType # 模型平台类型
from dotenv import load_dotenv
import os
load_dotenv(dotenv_path='.env')
api_key = os.getenv('QWEN_API_KEY')
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, # 平台类型,OPENAI适配的模型
model_type="Qwen/Qwen2.5-72B-Instruct", # 指定模型名称
url='https://api-inference.modelscope.cn/v1/', # API地址
api_key=api_key
)
def main(model=model, chat_turn_limit=50) -> None:
# 1.设置任务目标
task_prompt = "为股票市场开发一个交易机器人"
# 2.初始化角色扮演场景 (这里就设置两种角色:用户与助手)
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='中文'#设置输出语言
)
# 3.使用不同颜色打印各类系统信息
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") # 最终确定的任务
# 4. 对话循环
n = 0
input_msg = role_play_session.init_chat() # 初始化对话
while n < chat_turn_limit: # 默认最多50轮对话
n += 1
# 4.1 执行一步对话
assistant_response, user_response = role_play_session.step(input_msg)
# 4.2 检查终止条件
if assistant_response.terminated:# 助手终止
print(Fore.GREEN+ ( "AI 助手已终止。原因: " f"{assistant_response.info['termination_reasons']}."))
break
if user_response.terminated: # 用户终止
print(Fore.GREEN + ("AI 用户已终止。"f"原因: {user_response.info['termination_reasons']}."))
break
# 4.3 动画效果打印对话内容
print_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: # 任务完成
break
input_msg = assistant_response.msg # 更新输入消息
if __name__ == "__main__":
main()
1.4 改用deepseek模型
本来想用deepseek-reasoner,但是报错:'The last message of deepseek-reasoner must be a user message, or an assistant message with prefix mode。可惜我对camel还没那么深入了解,怎么加这个message 或者 prefix mode。等后面再回过头来再看看,这里先用deepseek-chat
api_key = os.getenv('DS_API_KEY')
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, # 平台类型,OPENAI适配的模型
# model_type="Qwen/Qwen2.5-72B-Instruct", # 指定模型名称
model_type="deepseek-chat", # 指定模型名称
# url='https://api-inference.modelscope.cn/v1/', # API地址
url='https://api.deepseek.com', # API地址
api_key=api_key
)
智能体终于完成任务,如下图