1、多轮对话场景: 使用 BaseMessage
连续发送多条用户消息,模拟多轮对话。比如,先询问 CAMEL 的用途,然后再根据回复提出后续问题,看看 ChatAgent
是否能保持上下文连贯
from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import ModelPlatformType import os from dotenv import load_dotenv from camel.messages import BaseMessage load_dotenv() 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 ) # 创建系统消息,告诉ChatAgent自己的角色定位 system_msg = "You are a helpful assistant that responds to user queries." # 实例化一个ChatAgent chat_agent = ChatAgent(model=model, system_message=system_msg, output_language='Chinese') # 创建用户消息 user_msg = BaseMessage.make_user_message( role_name="User_1", content="I ate peanuts yesterday and today I'm allergic. What should I do?", #昨天我吃了花生,今天我过敏了,我该怎么办呀? meta_dict= {"context_info:": "Users want a clear rejection"} ) #更新用户消息1 updata_user_msg = user_msg.create_new_instance( "Tomorrow I want peanuts. " "What do you think, give your reasons?")#明天我还想吃花生,你觉得怎么样,给出你的理由? # print("Undated User Message:", updata_user_msg) #更新用户消息2 updata_user_msg_again = updata_user_msg.create_new_instance( "如果我打算后天吃炸花生,你觉得怎么样?" ) # 创建助手消息 assistant_msg = BaseMessage.make_assistant_message( role_name="Assistant_1", content="I can help you with various tasks." ) # print("User Message:", user_msg) # print("Assistant Message:", assistant_msg) # 将用户消息传给ChatAgent,并获取回复 response = chat_agent.step(user_msg) response2 = chat_agent.step(updata_user_msg) response3 = chat_agent.step(updata_user_msg_again) print("User Response:", response.msgs[0].content) print("Updated User Response:", response2.msgs[0].content) print("Updated User Response again:", response3.msgs[0].content)
根据结果可以看出,Agent是能够理解之前的对话,并根据之前的聊天内容给出建议。
2、多模态信息尝试: 尝试传入不同图片或使用 image_detail
等参数,观察 ChatAgent
的回答变化。可以试试让 ChatAgent
对比两张不同的图片,并描述区别
from camel.agents import ChatAgent from camel.messages import BaseMessage from camel.models import ModelFactory from camel.types import ModelPlatformType,RoleType from io import BytesIO import requests from PIL import Image import os from dotenv import load_dotenv load_dotenv() 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 ) # 创建系统消息,告诉ChatAgent自己的角色定位 # system_msg = "You are a helpful assistant that responds to user queries." system_msg = "你是一位观察细致的写作专家" # 实例化ChatAgent chat_agent = ChatAgent(model=model,output_language='中文') # 图片URL url1= "https://www.petitfute.com/medias/mag/35142/originale/24877-10-animaux-magnifiques-en.jpg" response1 = requests.get(url1) img1 = Image.open(BytesIO(response1.content)) url2 = "https://img0.baidu.com/it/u=2205376118,3235587920&fm=253&fmt=auto&app=120&f=JPEG?w=846&h=800" response2 = requests.get(url2) img2 = Image.open(BytesIO(response2.content)) user_image_msg = BaseMessage.make_user_message( role_name="User", content="请描述这两张图片的内容的区别", image_list=[img1, img2] # 将图片放入列表中 ) # 将包含图片的消息传给ChatAgent response_with_image = chat_agent.step(user_image_msg) print("Assistant's description of the image:", response_with_image.msgs[0].content)
通过实验,设置不同的角色,Agent给出的回答是不一样的,例如:
system_msg = "You are a helpful assistant that responds to user queries." system_msg = "你是一位观察细致的写作专家"
这两种角色定位,给出的答案是不一样的。如果设置的角色差距不大或不设置角色定位,或者胡乱设置角色,就会给出跟模板回答一样的结果。例如:
system_msg = "你是一只猫" #system_msg = "You are a helpful assistant that responds to user queries."
角色扮演任务Agent:使用 AISocietyPromptTemplateDict
,创建一个角色扮演任务Agent。假设你想让 AI 扮演一个“健康顾问”,为一个“患者”提供饮食和锻炼建议。请用思维链方式分解整个建议过程,逐步提供健康方案
from camel.agents import TaskSpecifyAgent from camel.models import ModelFactory from camel.types import ModelPlatformType, TaskType from camel.prompts import AISocietyPromptTemplateDict from camel.prompts import TextPrompt import os from dotenv import load_dotenv load_dotenv() 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 ) #生成prompt模板 # my_prompt_template = TextPrompt( # 'Here is a task: you are a {occupation} and you need do {task} for patient. Help me to make this task more specific.' # ) assistant_role = "health counselor" user_role = "patient" task_prompt = "Diet and exercise advice for a patient" #生成prompt模板,跟前面左右差不多 assistant_prompt = AISocietyPromptTemplateDict.TASK_SPECIFY_PROMPT.format( assistant_role=assistant_role, task=task_prompt, meta_dict=dict( assistant_role=assistant_role, user_role=user_role, word_limit=500 ), ) # print(f"Assistant Prompt (健康顾问):\n{assistant_prompt}\n") task_specify_agent = TaskSpecifyAgent( model=model, # task_type=TaskType.AI_SOCIETY, task_specify_prompt=assistant_prompt, # 这里assisttant_prompt作用跟上面 my_prompt_template,差不多 output_language='中文' ) #根据前面assistant_prompt通过task_specify_agent进行回答,注意区分一个是生成prompt,一个是通过agent进行回答 specified_task_prompt = task_specify_agent.run( task_prompt=task_prompt, meta_dict=dict( assistant_role=assistant_role, user_role=user_role, word_limit=500 ), ) print("specified_task_prompt:", specified_task_prompt)
利用 CodePromptTemplateDict
,创建一个任务Agent,帮助用户学习一门新的编程语言(例如 Python)。要求 AI 逐步生成学习计划,包括基本概念、代码示例和练习题目
from camel.agents import TaskSpecifyAgent from camel.models import ModelFactory from camel.types import ModelPlatformType, TaskType from camel.prompts import AISocietyPromptTemplateDict, CodePromptTemplateDict from camel.prompts import TextPrompt import os from dotenv import load_dotenv load_dotenv() 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 ) assistant_role = "Algorithm Engineer" user_role = "mathematicians" task_prompt = "Helps users learn a new programming language, Step-by-step learning program generation with code samples and practice questions" generate_language = CodePromptTemplateDict.GENERATE_LANGUAGES.format(num_language="python") task_specify_prompt = CodePromptTemplateDict.TASK_SPECIFY_PROMPT.format( domain="Provide code sample questions and answers") generate_domains = CodePromptTemplateDict.GENERATE_DOMAINS.format(num_domains="Mathematics") assistant_prompt = CodePromptTemplateDict.TASK_SPECIFY_PROMPT.format( assistant_role=assistant_role, task=task_prompt, meta_dict=dict( assistant_role=assistant_role, user_role=user_role, word_limit=500, generate_language=generate_language, task_specify_prompt=task_specify_prompt, generate_domains=generate_domains ), ) task_specify_agent = TaskSpecifyAgent( model=model, # task_type=TaskType.AI_SOCIETY, task_specify_prompt=assistant_prompt, output_language='中文' ) specified_task_prompt = task_specify_agent.run( task_prompt=task_prompt, meta_dict=dict( assistant_role=assistant_role, user_role=user_role, word_limit=500 ), ) print("specified_task_prompt:", specified_task_prompt)