|
CAMEL介绍
🐫 CAMEL 是一个开源社区,致力于探索代理的扩展规律。相信,在大规模研究这些代理可以提供对其行为、能力和潜在风险的宝贵见解。为了促进这一领域的研究,实现了并支持各种类型的代理、任务、提示、模型和模拟环境。
GitHub地址:https://github.com/camel-ai/camel
创建第一个代理社会
Society模块是 CAMEL 的核心模块之一。通过模拟信息交换过程,该模块研究代理之间的社会行为。
RolePlaying是 CAMEL 的一个独特的协作代理框架。通过这个框架,CAMEL 中的代理克服了诸如角色转换、助手重复指令、敷衍的回答、消息无限循环以及对话终止条件等众多挑战。
现在就来使用CAMEL 创建一个Agent Society。
编写.env如下所示:
Silicon_Model_ID="Qwen/Qwen2.5-72B-Instruct"ZHIPU_Model_ID="THUDM/GLM-4-32B-0414"SiliconCloud_API_KEY="你的api key"SiliconCloud_Base_URL="https://api.siliconflow.cn/v1"想要使用两个不同的模型:
from camel.societies import RolePlayingfrom camel.agents import ChatAgentfrom camel.models import ModelFactoryfrom camel.types import ModelPlatformTypeimport pathlibimport osfrom dotenv import load_dotenvsys_msg = 'You are a curious stone wondering about the universe.'base_dir = pathlib.Path(__file__).parent.parentenv_path = base_dir / ".env"load_dotenv(dotenv_path=str(env_path))modeltype = os.getenv("Silicon_Model_ID")modeltype2= os.getenv("ZHIPU_Model_ID")api_key = os.getenv("SiliconCloud_API_KEY")base_url = os.getenv("SiliconCloud_Base_URL")siliconcloud_model = ModelFactory.create( model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, model_type=modeltype, api_key=api_key, url=base_url, model_config_dict={"temperature": 0.4, "max_tokens": 4096},)siliconcloud_model2 = ModelFactory.create( model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, model_type=modeltype2, api_key=api_key, url=base_url, model_config_dict={"temperature": 0.4, "max_tokens": 4096},)设置任务、AI用户、AI助手参数:
task_kwargs = { 'task_prompt': '制定一个新人小白学习esp32的教程,使用中文回答。', 'with_task_specify': True, 'task_specify_agent_kwargs': {'model': siliconcloud_model}}user_role_kwargs = { 'user_role_name': '一个esp32小白', 'user_agent_kwargs': {'model': siliconcloud_model}}assistant_role_kwargs = { 'assistant_role_name': '一个esp32专家', 'assistant_agent_kwargs': {'model': siliconcloud_model2}}构建社会:
society = RolePlaying( **task_kwargs, # The task arguments **user_role_kwargs, # The instruction sender's arguments **assistant_role_kwargs, # The instruction receiver's arguments)让这个社会最多运行10轮:
def is_terminated(response): """ Give alerts when the session should be terminated. """ if response.terminated: role = response.msg.role_type.name reason = response.info['termination_reasons'] print(f'AI {role} terminated due to {reason}') return response.terminateddef run(society, round_limit: int=10): # Get the initial message from the ai assistant to the ai user input_msg = society.init_chat() # Starting the interactive session for _ in range(round_limit): # Get the both responses for this round assistant_response, user_response = society.step(input_msg) # Check the termination condition if is_terminated(assistant_response) or is_terminated(user_response): break # Get the results print(f'[AI User] {user_response.msg.content}.\n') # Check if the task is end if 'CAMEL_TASK_DONE' in user_response.msg.content: break print(f'[AI Assistant] {assistant_response.msg.content}.\n') # Get the input message for the next round input_msg = assistant_response.msg return Noneif __name__ == "__main__": run(society, round_limit=10)查看效果。
第一轮:
第二轮:
AI用户会重新问一个与解决任务相关的问题。
第三轮:
第四轮:
第五轮:
第六轮:
第7轮:
当达到令牌限制时,为了满足限制,将从记忆中删除部分消息。
如果10轮还没完成的话会直接结束:
构建这个Agent Society有什么用呢?
我觉得一个很有用的点就是适合头脑风暴场景,有一个问题或者方案需要详细讨论,那就丢给两个或更多的AI,让它们进行详细讨论,我们先看一下它们的讨论情况,看看是否有一些有效的建议,看看能不能找到一些灵感。
如果觉得在控制台中不好看,可以将结果写入文件中:
def run(society, round_limit: int=10): # Get the initial message from the ai assistant to the ai user input_msg = society.init_chat() # Starting the interactive session for _ in range(round_limit): # Get the both responses for this round assistant_response, user_response = society.step(input_msg) # Check the termination condition if is_terminated(assistant_response) or is_terminated(user_response): break # Get the results print(f'[AI User] {user_response.msg.content}.\n') # 写入一个md文件 with open('output.md', 'a', encoding='utf-8') as f: f.write(f'[AI User] {user_response.msg.content}.\n') # Check if the task is end if 'CAMEL_TASK_DONE' in user_response.msg.content: break print(f'[AI Assistant] {assistant_response.msg.content}.\n') # 写入一个md文件 with open('output.md', 'a', encoding='utf-8') as f: f.write(f'[AI Assistant] {assistant_response.msg.content}.\n') # Get the input message for the next round input_msg = assistant_response.msg return None对于这个任务、AI用户、AI助手参数:
task_kwargs = { 'task_prompt': '制定一个新人小白学习C#的教程,使用中文回答。', 'with_task_specify': True, 'task_specify_agent_kwargs': {'model': siliconcloud_model}}user_role_kwargs = { 'user_role_name': '一个想要学习C#小白', 'user_agent_kwargs': {'model': siliconcloud_model}}assistant_role_kwargs = { 'assistant_role_name': '一个C#专家', 'assistant_agent_kwargs': {'model': siliconcloud_model2}}写入到output.md文件的内容如下所示:
相对于自己一次一次与AI交互,有些时候自己定义一些角色,让它们自己去交互,我们只看它们的结果,还是更高效一些的。
相关推荐
Camel多智能体框架初探 |
|