当前位置: 首页 > 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.jsqmd.com/news/925895/

相关文章:

  • Harness 持续交付平台深度评测:从参数解析到实战边界
  • 3分钟掌握Windows激活!KMS_VL_ALL_AIO智能激活工具完全指南
  • 2026年佛山洋酒回收权威机构排行:佛山名酒回收电话、佛山茅台酒回收、佛山茅台酒回收电话、佛山附近上门回收名酒选择指南 - 优质品牌商家
  • 电动抽沙船哪家靠谱 - 舒雯文化
  • Day40
  • 污泥脱水机价格多少钱?旺佳环保的收费标准 - myqiye
  • 2026年5月开源数字员工方案
  • 2026成都堆积门安装厂家评测:成都工业堆积门/成都工业快速门/成都快速卷帘门/成都快速提升门/成都提升门/成都智能堆积门/选择指南 - 优质品牌商家
  • 【Gemini舆情分析黄金标准】:基于172家头部客户数据验证的4类误判模式及修正公式
  • 用雨云5分钟搭建属于你的MC服务器,联机流畅不卡顿
  • 3步找回遗忘的压缩包密码:ArchivePasswordTestTool快速解密指南
  • 今日算法(回溯子集)
  • 别再问SW卡不卡了!2024年SolidWorks配置清单(附避坑指南)
  • 开源数字员工在企业中的应用案例:2026年5月全景解析
  • 2026年哈氏合金N生产商排名,哪家交货期快? - myqiye
  • 2026年5月更新:哈尔滨香坊区专业可靠的驾校选择指南与实力解析 - 2026年企业资讯
  • 剖析2026现阶段温州评价高的民办小学联系方式背后的择校逻辑与决策参考 - 2026年企业资讯
  • Gemini舆情预警系统私有化部署全链路(含金融/政务场景合规审计 checklist + 国密SM4加密落地方案)
  • 告别License焦虑:一套脚本自动监控你的Tasking for TriCore v6.3r1许可是否健康
  • 从繁琐到极简,从幻象到本质:Spring AOP 架构演进与实战避坑指南
  • 选购薄壁不锈钢毛细管有哪些要点? - mypinpai
  • NLP预处理失效?Gemini评论情感极性误判率高达43.7%,这4个校准动作必须立刻执行
  • 【独家首发】Gemini会员活动合规红线清单(GDPR+国内数安法双标对照),9月30日前未更新将面临下架风险
  • 基于Arduino与行为心理学的智能闹钟:硬件设计与状态机实现
  • 如何评估数字员工的效果:系统化评估框架与实践指南
  • 口碑好的弹花机,售后如何? - mypinpai
  • 小爱音箱Xiaomusic语音指令终极指南:解锁智能音乐播放的正确姿势
  • final 类,底层逻辑
  • 重塑 Java 世界的两根支柱:穿透 Spring IoC 与 AOP 的架构哲学
  • 谷歌Gemini 2.5 Pro最新能力解析(未公开API调用技巧首次披露)