5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)
嗨,朋友们!👋 是不是感觉AI浪潮铺天盖地,身边的人都在谈论AI Agent、大模型,而你看着那些密密麻麻的代码,感觉像在读天书?🤯
别焦虑!你不是一个人。很多人都想抓住AI的风口,提升自己,却被技术门槛拦在门外。特别是那些想快速上手、做出点东西的朋友,看到复杂的框架和概念就头大。😥
但今天,我要给你一把钥匙🔑,一把能让你快速解锁AI Agent核心沟通机制的钥匙。我们将聚焦一个强大而友好的框架——CAMEL AI,特别是它的“消息(Message)”系统。这可是构建智能体的“神经网络”!
为什么是CAMEL AI?为什么是“消息”?
想象一下,AI Agent就像一个超级智能的员工。你要让它工作,总得跟它说话吧?“消息”就是你和AI Agent,以及AI Agent之间沟通的语言。搞懂了消息,你就掌握了指挥AI干活的核心!而CAMEL AI在消息处理上设计得非常巧妙和强大。
更重要的是,这篇文章会带你用5天(甚至更短!)的时间,从零开始,通过看得懂的语言和可运行的代码,彻底搞明白CAMEL AI的消息机制。别怕,即使你是编程小白,跟着步骤也能上手!🚀
先安装依赖:pip install "camel-ai[all]==0.2.38"
第一天:初识“砖块” - 万能的`BaseMessage`
所有复杂的对话,都是由一条条基本的消息组成的。在CAMEL AI里,这个最基本的“砖块”就是`BaseMessage`。它就像一个标准的信封,里面装着你要传递的信息。
这个“信封”上必须有几个要素:
* `role_name`: 发件人是谁?(比如:“用户小明”、“智能助手”)
* `role_type`: 发件人的角色类型?(是`USER`用户,还是`ASSISTANT`助手?)
* `content`: 信的内容是啥?(比如:“你好啊!”)
听起来很简单?别急,`BaseMessage`的厉害之处在于,它不仅能装文字,还能装图片!📸
看看这段代码:
from PIL import Image
from io import BytesIO
import requests
from camel.messages import BaseMessage
from camel.types import RoleType
# 1. 从网上下载一张图片
url = "https://raw.githubusercontent.com/camel-ai/camel/master/misc/logo_light.png"
response = requests.get(url) # 发送请求,把图片数据拿回来
img = Image.open(BytesIO(response.content)) # 用PIL库打开图片数据,变成一个图片对象
# 2. 创建一个包含图片的消息
image_message = BaseMessage(
role_name="User_with_image", # 发件人名字
role_type=RoleType.USER, # 角色是用户
content="你看这张图怎么样?", # 文字内容
meta_dict={}, # 元数据,暂时不用管
image_list=[img] # 关键!把图片对象放进列表里传进去
)
print(image_message) # 打印看看这个带图片的消息长啥样

看明白了吗?我们用`requests`库从网上抓了张图,用`PIL`和`BytesIO`把它处理成程序认识的图片格式,然后把它塞进了`BaseMessage`的`image_list`参数里。
划重点:`BaseMessage`是基石,它定义了通信的基本单元,并且天生支持多模态(文字+图片)!这一下就让你的AI Agent拥有了“看图说话”的潜力!是不是有点小激动?🤩
第二天:偷个小懒 - 便捷的“快捷方式”
每次都写那么多参数创建`BaseMessage`有点烦?CAMEL AI早就替你想好了!对于最常用的用户消息和助手消息,它提供了“快捷方式”:
from camel.messages import BaseMessage
# 创建一条用户消息,超简单!
user_msg = BaseMessage.make_user_message(
role_name="User_1", # 用户名
content="Hi, what can you do?" # 用户说的话
)
# 创建一条助手消息,同样简单!
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)
# 你还可以把消息转换成字典格式,方便查看或传输
msg_dict = image_message.to_dict() # 把前面带图片的消息转成字典
print("Message as dict:", msg_dict)

`make_user_message`和`make_assistant_message`这两个函数,是不是让代码清爽多了?它们本质上还是创建`BaseMessage`,但帮你预设了`role_type`等信息。
同时,`.to_dict()`方法也很有用,它可以把消息对象变成Python字典,方便你检查里面的具体内容,或者序列化(比如存成JSON文件)。
第三天:走向世界 - 与OpenAI“接轨”
现在很多强大的AI模型(比如GPT系列,或者国内很多兼容其API的模型)都遵循OpenAI的API格式。你的CAMEL AI Agent要想和这些模型对话,就需要把自己的消息“翻译”成它们能听懂的格式。
CAMEL AI又提供了贴心工具:
from camel.types import OpenAIBackendRole
# 把我们之前创建的用户消息,转换成OpenAI API认识的用户消息格式
openai_user_msg = user_msg.to_openai_message(role_at_backend=OpenAIBackendRole.USER)
print("OpenAI-compatible user message:", openai_user_msg)
# 把助手消息,也转换成OpenAI API认识的助手消息格式
openai_assistant_msg = assistant_msg.to_openai_assistant_message()
print("OpenAI-compatible assistant message:", openai_assistant_msg)

`to_openai_message`和`to_openai_assistant_message`就是这个“翻译官”。它们接收CAMEL AI的`BaseMessage`,输出符合OpenAI规范的字典。`role_at_backend`参数指定了在对方系统里这条消息应该扮演什么角色(比如`USER`或`ASSISTANT`)。
为什么这很重要? 因为这意味着用CAMEL AI构建的Agent,可以轻松地接入各种不同的大模型后端!无论是OpenAI的GPT,还是国内支持OpenAI API格式的各种模型(比如代码示例里的Qwen通义千问),都能无缝切换。灵活性大大提升!💪
第四天:实战演练 - 让Agent看图说话!
理论学得差不多了,是时候让我们的Agent动起来了!这次,我们来个真刀真枪的演练:让Agent接收一张图片,并描述图片内容。
import os
from dotenv import load_dotenv # 用于加载环境变量中的API Key
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
# 1. 准备工作:加载你的API Key (需要先设置好)
load_dotenv() # 从 .env 文件加载环境变量
api_key = os.getenv('QWEN_API_KEY') # 读取你的通义千问API Key
# 2. 选择“大脑”:创建模型实例
# 这里用了通义千问Qwen的多模态模型,通过兼容OpenAI的接口访问
model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, # 平台类型
model_type="qwen-vl-max", # 模型名称 (注意:这里用了更新的、更常用的模型名)
url='https://dashscope.aliyuncs.com/compatible-mode/v1', # 阿里云DashScope的兼容接口地址
api_key=api_key, # 传入你的API Key
model_kwargs = {"temperature": 0.0} # 可以加一些模型参数,比如温度设为0让输出更稳定
)
# 3. 创建“执行者”:实例化ChatAgent
chat_agent = ChatAgent(model=model, output_language='中文') # 把模型传给Agent,并指定输出中文
# 4. 准备“任务”:下载图片并创建带图片的用户消息
url = "https://img0.baidu.com/it/u=2205376118,3235587920&fm=253&fmt=auto&app=120&f=JPEG?w=846&h=800" # 一张网络图片
response = requests.get(url)
img = Image.open(BytesIO(response.content))
user_image_msg = BaseMessage.make_user_message(
role_name="User",
content="请描述这张图片的内容", # 指令
image_list=[img] # 把图片加进去!
)
# 5. “开工!”:将消息发送给Agent,等待回复
print("正在请求AI描述图片,请稍候...")
response_with_image = chat_agent.step(user_image_msg) # 最关键的一步!
# 6. 查看“成果”:打印Agent的回复
if response_with_image and response_with_image.msgs:
print("AI助手对图片的描述:", response_with_image.msgs[0].content)
else:
print("未能获取到有效的回复。")
if response_with_image and response_with_image.info:
print("附带信息:", response_with_image.info)


这段代码做了什么?
1. 配置环境:加载API Key(你需要先申请并在`.env`文件里配置好)。这是调用大模型服务的“通行证”。
2. 选定模型:通过`ModelFactory`指定我们要用的模型(这里是Qwen的多模态模型),并传入API地址和Key。这就是Agent的“大脑”。
3. 创建Agent:实例化`ChatAgent`,把选好的模型装进去。这是具体干活的“人”。
4. 准备输入:下载一张图片,用我们学过的`make_user_message`创建一个包含文字指令和图片的消息。
5. 执行任务:调用`chat_agent.step(user_image_msg)`。这是核心!Agent接收到包含图片的消息,会调用模型进行处理。
6. 获取结果:`step`方法返回一个响应对象,我们从中提取Agent回复的消息内容并打印出来。
看到AI真的能“看懂”图片并用中文描述出来,是不是成就感爆棚?!🥳 这就是掌握CAMEL AI消息机制的威力!
第五天:解剖回信 - 理解Agent的反馈`ChatAgentResponse`
Agent干完活,会给你一个“工作报告”,这就是`ChatAgentResponse`对象。它里面包含了什么呢?
from camel.responses import ChatAgentResponse
from camel.messages import BaseMessage
from camel.types import RoleType
# 假设这是Agent执行完step后返回的响应对象 (我们模拟一个)
response = ChatAgentResponse(
msgs=[ # 这里是一个列表,可能包含多条消息
BaseMessage(
role_name="Assistant", # 回复者的名字
role_type=RoleType.ASSISTANT, # 角色是助手
content="你好,这张图片描绘了一只可爱的卡通小动物...", # 助手的回复内容
meta_dict={} # 元数据
)
],
terminated=False, # 会话是否结束?(False表示还可以继续聊)
info={"usage": {"prompt_tokens": 120, "completion_tokens": 85, "total_tokens": 205}} # 附加信息,比如token消耗量
)
# 如何从Response对象里获取信息?
messages = response.msgs # 获取Agent生成的消息列表 (通常只有一条)
is_terminated = response.terminated # 获取会话是否终止的状态
additional_info = response.info # 获取附加信息 (比如token统计)
# 打印出来看看
if messages:
print("消息内容:", messages[0].content)
print("会话是否终止:", is_terminated)
print("附加信息:", additional_info)

`ChatAgentResponse`主要包含三部分:
* `msgs`: 一个列表,包含了Agent生成的`BaseMessage`对象。通常情况下,调用一次`step`,这里面会有一条助手的回复消息。
* `terminated`: 一个布尔值(True/False),表示当前的对话流程是否应该结束。比如Agent判断任务已完成,或者达到了某个终止条件。
* `info`: 一个字典,包含一些额外信息。最常见的就是`usage`,记录了这次交互消耗了多少token(这通常关系到你的API调用成本)。
理解了`ChatAgentResponse`,你就能准确地拿到Agent的输出,判断对话状态,还能监控资源消耗。这对于开发复杂的、连续的Agent应用至关重要!
总结:你已经掌握了AI Agent的“沟通密码”!
恭喜你!🎉 通过这篇文章的阅读,你已经:
1. 理解了CAMEL AI消息系统的核心`BaseMessage`,以及它处理文本和图片的能力。
2. 学会了使用便捷方法创建用户和助手消息。
3. 知道了如何让CAMEL AI的消息与主流OpenAI API格式兼容,对接各种大模型。
4. 亲手实践了一个让AI Agent看图说话的完整例子!
5. 掌握了如何解析Agent的回复`ChatAgentResponse`,获取结果和状态。
这不仅仅是学会了几行代码,你掌握的是与未来智能体沟通的基础逻辑!这套消息机制,就是构建更复杂、更强大AI Agent的起点。
现在,轮到你了! 👇
* 你觉得CAMEL AI的消息机制设计得怎么样?简单吗?强大吗?
* 你最想用这个技术来构建一个什么样的AI Agent?帮P图?自动写报告?还是...?
* 在学习过程中遇到了什么困难?或者有什么更有趣的想法?
在评论区留下你的想法和问题吧!让我们一起交流,一起进步!
如果你觉得这篇文章对你有帮助,别忘了点赞👍、在看👀、转发↗️给更多需要的朋友!你的支持是我继续分享的动力!💖
如果不会安装python,请看这一篇
零基础打造AI agent智能体!Windows从安装Python到调用顶级API,10分钟速成攻略!
#AI #人工智能 #Agent #CAMELAI #Python #编程 #AI绘画 #多模态 #教程 #大模型 #通义千问 #技术干货 #职场提升
相关文章:
5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)
嗨,朋友们!👋 是不是感觉AI浪潮铺天盖地,身边的人都在谈论AI Agent、大模型,而你看着那些密密麻麻的代码,感觉像在读天书?🤯 别焦虑!你不是一个人。很多人都想抓住AI的风…...
FPGA——FPGA状态机实现流水灯
一、引言 在FPGA开发中,状态机是一种重要的设计工具,用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。 二、状态机概述 状态机(FSM)是一种行为模型,用于表示系统在不同状态下的…...
晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包
晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包 线刷方法:(新手参考借鉴一下) 刷机工具版本请用2.2.0以上,导入固件后,刷机工具右侧两个擦除打勾,然后点开始。插上刷机神器…...
构建第一个ArkTS应用:Hello World之旅
# 构建第一个ArkTS应用:Hello World之旅 在鸿蒙应用开发的领域中,ArkTS语言为我们提供了强大而便捷的开发方式。今天,就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先,我们要使用…...
第十五届单片机模拟考试III
题目 题目不长 ,功能也不难,一道水题 按键功能 S4界面切换,S5 功能切换,在不同界面转换不同的功能,定义两个标志位记录即可。 S9复位,回到初始状态,记得界面也得回到初始的信号界面࿰…...
测试:正交法设计测试用例
目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量,让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3),含意如下: “L”代表正…...
生成 SSH Key 并配置 GitHub/GitLab 详细教程
🔑 生成 SSH Key 并配置 GitHub/GitLab 详细教程 🟢 第 1 步:检查是否已有 SSH Key 在 Git Bash (Windows)、终端 (Linux/macOS) 运行以下命令: ls -al ~/.ssh🔹 可能的输出: 如果已有 SSH Key…...
[ctfshow web入门] web5
前置知识 引用博客:phps的利用 当服务器配置了 .phps 文件类型时,访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码,而不是执行它。.phps被作为辅助开发者的一种功能,开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …...
Qt基本框架(2)
本篇主要介绍如何设置窗口,以及在窗口中添加按钮 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类,通过合理设计…...
基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
用HTML.CSS.JavaScript实现一个贪吃蛇小游戏
目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目,…...
[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
在 Pandas 中,许多操作可以直接使用 Python 的比较运算符(如 、!、>、< 等),而不需要调用 Pandas 的专门函数(如 eq()、ne()、gt() 等)。这些运算符在 Pandas 中已经被重载,代码更简洁。以…...
Java 实现插入排序:[通俗易懂的排序算法系列之三]
引言 大家好!欢迎继续关注我的排序算法系列。今天,我们要学习的是另一种非常基础且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常贴近我们日常整理扑克牌的方式,理解起来相对自然。虽然它在最坏情况下的效率不高,但在某些特定场景下,它的表现甚至优…...
使用MATIO库写入MATLAB结构体(struct)数据的示例程序
使用MATIO库写入MATLAB结构体(struct)数据的示例程序 MATIO是一个用于读写MATLAB数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库创建一个包含结构体数据的MAT文件。 示例程序 #include <stdio.h> #include <stdlib.h> #inc…...
JVM——模型分析、回收机制
方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…...
7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”
引言:当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份,每次对话都要求重复验证,引发大量投诉。引入LangChain 记忆系统后,客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储,教你构建符合…...
前后端分离下,Spring Boot 请求从发起到响应的完整执行流程
以下是前后端分离架构下,Spring Boot 请求从发起到响应的完整执行流程,结合你提出的所有问题,按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例: 一、前端发起请求(步骤1-2&…...
【文献阅读】Vision-Language Models for Vision Tasks: A Survey
发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络(DNN)训练中严重依赖标注数据,并且通常为每个单一视觉识别任务训练一个DNN,这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战,视觉语言模型&am…...
【BFS最小步数】魔板题解
魔板题解 题目传送门 题目传送门 一、题目描述 Rubik先生发明了魔板的二维版本,这是一个有8个格子的板子,初始状态为: 1 2 3 4 8 7 6 5我们可以用三种操作来改变魔板状态: A:交换上下两行B:将最右边一…...
搭建K8S-1.23
0、简介 这里只用3台服务器来做一个简单的集群 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、关闭三个服务 (1)防火墙 systemctl stop firewalld (2)Selinux setenf…...
AOP在SpringBoot项目中的简单使用场景
SpringBoot AOP的简单使用 添加DTO添加controller(同包不同类)控制器1控制器2 AOP场景演示1. 对某package下的所有接口进行方法执行前逻辑校验新增切面,编写处理逻辑 2. 对某controller类下的所有接口进行方法执行前逻辑校验新增切面,编写处理逻辑 3. 对…...
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
windows如何安装wkhtmltoimage 给PHP使用 在Windows系统上安装wkhtmltoimage以便在PHP中使用,通常涉及到以下几个步骤: 下载wkhtmltoimage 首先,你需要从wkhtmltopdf的官方网站( https://wkhtmltopdf.org/downloads.html …...
代码仓库使用git lfs上传模型文件
一 Git LFS是什么 它主要是用来处理大文件的,比如模型文件通常都很大,超过100MB的话,用普通的Git上传可能会出问题,所以必须用LFS。 二 具体步骤 Windows环境下使用Git LFS上传大模型文件到代码仓库: 2.1ÿ…...
AI比人脑更强,因为被植入思维模型【42】思维投影思维模型
giszz的理解:本质和外在。我们的行为举止,都是我们的内心的表现。从外边可以看内心,从内心可以判断外在。曾国藩有7个识人的方法,大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪,我认为有四点&…...
Git 从入门到精通(开源协作特别版)
🧠 Git 从入门到精通(开源协作特别版) ✅ 基础命令 🧰 高级用法 🛠️ 开源实战技巧 🌍 GitHub 社区协作 适合:从0开始 → 熟练开发者 → 参与/维护开源项目 🔰 第1章:…...
spring-cloud-alibaba-nacos-config使用说明
一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一,专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能,替代传统的 Spring Cloud Config,提供更高效的配置集中化管理…...
C# Winform 入门(9)之如何封装并调用dll
封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…...
vue3中ref、reactive的使用示例
ref 1、导入 import { ref } from "vue"; 2、定义 // 报告表格数据 const reportTableData ref<Report[]>([]); 3、赋值 // 获取报告信息 let result await reportDataByOuterApplyIdService(tableSelectedRow.value?.outerApplyId); reportTable…...
【嵌入式系统设计师】知识点:第2章 嵌入式系统硬件基础知识
提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...
Vue2_Vue.js教程
目录 一、Vue.js安装 1、独立版本 2、CDN 方法 3、npm 方法 二、Vue Al编程助手 三、Vue.js目录结构 目录解析 四、Vue.js 起步 1.如何定义数据对象和方法并渲染进页面 五、Vue.js 模板语法 插值 文本_{{}} Html_v-html 指令 属性_v-bind (数据传输工具)指令 表…...
