当前位置: 首页 > news >正文

langchain的消息类型有哪些?如何发送消息?我们可以发送图片给大模型吗?多模态是什么?一文详解

目录

一.先看平时是怎么给大模型发送消息的?有什么缺点?

二.解决上述问题:使用BaseMessage的子类,发送消息

1.消息类型

2.更优雅的发消息方式

3.如果感觉上述输出很混乱,可以按照如下方法,更加优雅地打印结果

注意

三.如何发送多模态消息(此处针对“图片”)

1.首先,你需要看看哪些大模型是支持多模态的

2.去阿里百炼平台,弄一个ApiKey,并获取baseUrl

3.将上述阿里百炼的BaseUrl和个人的ApiKey,配置到.env中

4.找一张网上的图片,获取该图片的url

5.编写多模态代码

6.我们也可以不用网图,而是选择本机上传图片,发送给多模态

①安装一个组件ipywidgets,用于模拟前端上传一张本机图片

②创建一个上传组件,用于模拟图片上传

③编写代码,将上传的图片转为Base64字符串

④组装消息时,我们要修改成下面这种“本地上传图片”时的格式(其他代码完全和【5】一致)

⑤测试


一.先看平时是怎么给大模型发送消息的?有什么缺点?

在调用模型时,发送给LLM的消息、LLM返回的消息都包含以下几部分内容:

  • role:消息所属角色,可以是system、user、assistant

  • content:消息的内容

  • metadata(可选):消息的元数据,例如:消息的ID、消耗的token等

我们每次给大模型发送消息时,格式都按如下的来:

response = agent.invoke({ "messages": [{"role": "user", "content": "月亮的首都是哪里?"}] })

缺点:每次都要写role这种角色、还得严格遵守字典的格式,就很麻烦。

二.解决上述问题:使用BaseMessage的子类,发送消息

1.消息类型

在LangChain中,我们并不需要自己创建BaseMessage对象,LangChain已经把常见消息根据角色(Role)创建了对应的BaseMessage的子类

  • SystemMessage:role是system,代表系统消息,用于设定模型角色和交互背景

  • HumanMessage:role是user,代表用户输入的消息

  • AIMessage:role是assistant,代表LLM生成的响应,包含:文本、工具调用、元数据

  • ToolMessage:role是tool,代表工具调用时产生的结果

2.更优雅的发消息方式

from langchain.messages import HumanMessage, AIMessage from langchain.agents import create_agent from dotenv import load_dotenv # 1. 加载项目根目录下的 .env 文件,这样就可以让Langchain自动获取.env文件中的apikey了 load_dotenv() # 2. 创建Agent agent = create_agent(model="deepseek-chat") # 3.调用Agent,发送消息 response = agent.invoke({ "messages": [ HumanMessage(content="你好,我是鸿剑"), AIMessage(content="你好,剑哥,很高兴认识你。"), HumanMessage(content="你刚刚叫我什么?") ] }) print(response)

查看结果:

{'messages': [HumanMessage(content='你好,我是鸿剑', additional_kwargs={}, response_metadata={}, id='a2367241-7365-4318-9154-e03d036162b6'),AIMessage(content='你好,剑哥,很高兴认识你。', additional_kwargs={}, response_metadata={}, id='be86024a-b1c8-4cb8-b40b-53fea9dfcdd1', tool_calls=[], invalid_tool_calls=[]),HumanMessage(content='你刚刚叫我什么?', additional_kwargs={}, response_metadata={}, id='b71cc717-e6da-4732-b8c8-b8a2359d93fa'),AIMessage(content='哎呀,看来我嘴快了!刚刚是觉得“剑哥”听起来挺亲切的,像个可以随时唠嗑的兄弟。不过要是您更习惯被称呼为“鸿剑”或者别的,您说一声,我立马改口!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 52, 'prompt_tokens': 27, 'total_tokens': 79, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 27}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_8b330d02d0_prod0820_fp8_kvcache_20260402', 'id': '390eae9e-4d5e-4a7b-b4eb-81ce1c384775', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019e7df3-57fd-7a22-a217-1833f65f6afb-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 27, 'output_tokens': 52, 'total_tokens': 79, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})]}

3.如果感觉上述输出很混乱,可以按照如下方法,更加优雅地打印结果

for message in response['messages']: message.pretty_print()

查看结果

================================ Human Message ================================= 你好,我是鸿剑 ================================== Ai Message ================================== 你好,剑哥,很高兴认识你。 ================================ Human Message ================================= 你刚刚叫我什么? ================================== Ai Message ================================== 哎呀,看来我嘴快了!刚刚是觉得“剑哥”听起来挺亲切的,像个可以随时唠嗑的兄弟。不过要是您更习惯被称呼为“鸿剑”或者别的,您说一声,我立马改口!

注意

通过刚才的实现可以发现,拼接message列表可以让AI记住会话历史,产生记忆。不过手动拼接Message太麻烦了,后面我们学习如何实现自动的会话记忆功能。

三.如何发送多模态消息(此处针对“图片”)

1.首先,你需要看看哪些大模型是支持多模态的

  • 我们之前常用的DeepSeek不支持多模态,因此此时肯定无法用DeepSeek进行练习了
  • 我们发现阿里百炼的大模型支持多模态,可以拿来练习

2.去阿里百炼平台,弄一个ApiKey,并获取baseUrl

3.将上述阿里百炼的BaseUrl和个人的ApiKey,配置到.env中

4.找一张网上的图片,获取该图片的url

https://casually-bucket01.oss-cn-beijing.aliyuncs.com/da1d3f78-de66-40ea-83a0-7d19efc4107d.jpg

上面这个图,是我家乡的一个塔,我们下面让阿里百炼的多模态给我们介绍一下这张图片。

5.编写多模态代码

下面的几个重要的东西,我们都准备好了

  • 阿里百炼平台的BaseUrl
  • 我们个人在阿里百炼的ApiKey
  • 一张网图的url
from langchain.messages import HumanMessage, AIMessage from langchain.agents import create_agent from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os # 👇 这一行非常关键!它会让 Python 自动读取并加载项目根目录下的 .env 文件 load_dotenv() # 1.初始化模型 model = init_chat_model( model="qwen3.5-plus", model_provider="openai", # 👈 加上这一行,告诉 LangChain 使用 OpenAI 兼容的接口逻辑 base_url=os.getenv("DASHSCOPE_BASE_URL"), api_key=os.getenv("DASHSCOPE_API_KEY") # 建议直接传入密钥,或者确保环境变量已正确设置 ) # 2.创建智能体 agent = create_agent(model=model) # 3.组织多模态消息 multimodal_message = HumanMessage( content=[ {"type": "image", "url": "https://casually-bucket01.oss-cn-beijing.aliyuncs.com/da1d3f78-de66-40ea-83a0-7d19efc4107d.jpg"}, {"type": "text", "text": "这些图描绘了什么内容?"} ]) # 4.调用Agent,发送多模态消息(流式调用) stream = agent.stream( {"messages": [multimodal_message]}, stream_mode="messages" ) # 5.打印流式结果 for chunk, metadata in stream: if chunk.content: print(chunk.content, end="", flush=True)

查看运行效果

这张图片描绘了一个**现代与传统交织的场景**,主要包含以下几个部分: 1. **主体建筑(传统古建筑)**: * 图片的核心是一座具有典型中国古典风格的建筑,看起来像是一座**塔**或**阁楼**。 * 它拥有深灰色的瓦片屋顶,屋檐微微上翘(飞檐)。 * 建筑的上层是木质结构,可以看到红色的柱子和栏杆,梁枋上有精美的彩绘。 * 建筑的下层是灰色的砖石墙体,中间有一个红色的拱形窗户。 * 塔顶有一个细长的塔刹(宝顶)。 2. **自然环境**: * 背景是万里无云的**湛蓝天空**,光线明亮,看起来天气非常好。 * 建筑周围有一些**光秃秃的树木**,树枝上没有叶子,暗示季节可能是深秋或冬季。 3. **前景(现代元素)**: * 图片的最下方是一些现代交通工具,与上方的古建筑形成对比。 * 可以看到一辆卡车的车头(上面隐约写着“解放”字样)以及覆盖着**蓝色篷布**的车厢。 * 最底部还能看到一辆白色轿车的车顶部分。 总的来说,这是一张在晴朗的冬日(或深秋)拍摄的照片,捕捉了一座古朴的中式塔楼,而前景的车辆表明拍摄地点可能位于街道旁或停车场附近。

6.我们也可以不用网图,而是选择本机上传图片,发送给多模态

①安装一个组件ipywidgets,用于模拟前端上传一张本机图片

uv add ipywidgets

②创建一个上传组件,用于模拟图片上传

from ipywidgets import FileUpload from IPython.display import display uploader = FileUpload(accept='*', multipart=False) display(uploader)

运行效果

③编写代码,将上传的图片转为Base64字符串

# 读取图片,将其转为base64字符串 import base64 # 获取第一个(也是唯一一个)上传的文件 uploaded_file = uploader.value[0] # 获取其内存视图 content_mv = uploaded_file["content"] # 转换内存视图->字节 img_bytes = bytes(content_mv) # base64编码 img_base64 = base64.b64encode(img_bytes).decode("utf-8")

④组装消息时,我们要修改成下面这种“本地上传图片”时的格式(其他代码完全和【5】一致)

# 3.组织多模态消息 multimodal_message = HumanMessage( content=[ {"type": "image", "base64": img_base64, "mime_type": "image/png", }, {"type": "text", "text": "这些图描绘了什么内容?"} ])

⑤测试

我们先上传如下图片

这张图片描绘了一个充满艺术感和氛围感的场景,主要包含以下几个关键元素: 1. **人物动作**:画面右侧有一位穿着长裙的女性。她正处于舞动或旋转的状态,姿态舒展优雅。她的一只手臂向后伸展,另一只手似乎轻轻提着裙摆,长发和裙角随着动作飞扬,给人一种自由、灵动的感觉。 2. **光影效果**:画面左侧有一个明亮的拱形窗户,强烈的白光从窗外射入。这是画面的主要光源。光线在充满雾气或尘埃的空气中形成了清晰的光束(丁达尔效应),营造出一种神圣或梦幻的视觉效果。由于是逆光拍摄,人物呈现出半剪影的状态,轮廓被光线勾勒出来。 3. **环境氛围**:场景看起来像是一个空旷、昏暗的室内空间(如旧仓库或空房间),墙壁显得有些粗糙。空气中弥漫着烟雾或灰尘,使得整个画面显得朦胧、神秘且宁静。 总的来说,这是一张通过光影和肢体语言来表达情绪的艺术摄影,传达出一种孤独、自由或沉思的美感。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

http://www.zskr.cn/news/1437227.html

相关文章:

  • 2026年佛山洋酒回收权威机构排行:佛山名酒回收电话、佛山茅台酒回收、佛山茅台酒回收电话、佛山附近上门回收名酒选择指南 - 优质品牌商家
  • Harness 持续交付平台深度评测:从参数解析到实战边界
  • 电动抽沙船哪家靠谱 - 舒雯文化
  • 【Gemini舆情分析黄金标准】:基于172家头部客户数据验证的4类误判模式及修正公式
  • 2026年哈氏合金N生产商排名,哪家交货期快? - myqiye
  • NLP预处理失效?Gemini评论情感极性误判率高达43.7%,这4个校准动作必须立刻执行
  • 基于Arduino与行为心理学的智能闹钟:硬件设计与状态机实现
  • 如何评估数字员工的效果:系统化评估框架与实践指南
  • 谷歌Gemini 2.5 Pro最新能力解析(未公开API调用技巧首次披露)
  • 2026年适配知网降AIGC工具横评:亲测8款工具,将AIGC特征彻底弱化淡化
  • 口碑好的玉兰灯厂家排名 - mypinpai
  • 基于联邦卡尔曼滤波Federated、集中式滤波、分布式卡尔曼滤波DKF研究附Matlab代码
  • 如何用抖音批量下载工具轻松收集无水印视频:完整指南
  • 绩效评估
  • 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测
  • 架构师的书单:从小白到大神的进阶之路
  • 洛雪音乐音源完全指南:5分钟解锁全网无损音乐资源
  • 工厂规模怎么分?大厂小厂的界限在哪里
  • 【图像融合】改进脉冲耦合神经网络医学图像融合【含Matlab源码 15581期】
  • 深圳福田园岭老小区搬家公司推荐 经验足师傅高效搬运攻略 - 从来都是英雄出少年
  • E-E-A-T 成第一权重:2027 年无经验内容将被彻底淘汰
  • YOLOv11涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇| 引入CMGF 引导特征融合机制,实现对不同模态特征的自适应增强与高效融合,助力多模态目标检测,小目标检测或分割有效涨点
  • Rust测试CI/CD集成:自动化测试与部署
  • 鸣潮自动化工具:5个关键技术解析如何实现智能后台运行
  • YOLOv11涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇| 引入BiCAM双时序协同注意力模块,同时利用前后帧的上下文信息增强特征,助力视频目标检测、小目标检测、小目标分割有效涨点
  • ssm物流管理系统(10140)
  • 终极指南:如何解锁Windows家庭版远程桌面限制 - RDP Wrapper完全解决方案
  • TVA小样本高阶进阶(二):TVA负样本制衡策略:解决工业全良品、缺陷极少的极端场景
  • AI游戏叙事革命已至(Gemini剧情架构深度解密):全球仅12家工作室掌握的上下文连贯性建模技术
  • Go语言反射机制深度解析