Content Blocks 多模态
统一所有模型厂商的输出格式,解决"换模型就要重写解析代码"的痛点:
LangChain 1.0 引入了 provider-agnostic(厂商无关) 的 standard content blocks(标准化内容块),使得消息中的多模态数据(图片、音频、PDF、视频等)能以统一、类型化的方式被构造与阅读。
4.1 Content Blocks 核心概念
通过 content_blocks 属性实现多模态统一处理,封装 TextBlock、ToolCallBlock、ImageBlock 等结构,扩展 LLM 应用至图片理解、语音交互等场景。
支持类型
| 类型 | 说明 |
|---|---|
| text | 文本内容 |
| tool_call | 工具调用 |
| image | 图像 |
| audio | 音频 |
| video | 视频 |
应用场景
| 场景 | 内容块作用 |
|---|---|
| 📄 文档解析(PDF / 图片 / 表格) | 用 image block 把 Document OCR 图像传给模型 |
| 🔊 语音问答(ASR) | 用 audio block 发送语音样本 |
| 🎞 多模态 RAG | 将检索到的图片、图表、视频帧作为 input blocks 传给模型 |
| 🤖 多工具 Agent | 工具返回的媒体统一包装成 block 再传回模型 |
| 🧪 模型评估 | 进行 multimodal prompt 测试与 A/B,对 content blocks 标注与评估 |
4.2 输出提取 content_blocks
# 加载 DeepSeek 提供的推理模型 deepseek-reasoner
deepseek_model = load_chat_model(
model="deepseek-reasoner",
provider="deepseek",
base_url='https://api.deepseek.com',
api_key='sk-xxx'
)
# 调用模型
res = deepseek_model.invoke("请介绍一下你自己")
# 输出模型返回的结果
print(res)
# 从模型返回的结果中提取内容块
res.content_blocks
4.3 多模态输入 content_blocks
Base64 编码说明
将图片或音频转换为 Base64,主要是为了解决 "在纯文本协议(HTTP/JSON)中传输二进制数据(Binary Data)" 的兼容性问题。
- JSON 的本质:JSON 是一种纯文本格式,只能理解字符串、数字、布尔值等文本数据
- 图片/音频的本质:它们是二进制数据(Binary Bytes),包含大量不可见字符
- 冲突点:如果直接把这些二进制乱码塞进 JSON 的字符串字段里,会破坏 JSON 的语法结构
- 解决方案:Base64 编码可以将任意二进制数据,映射为 64 个标准的、可打印的 ASCII 字 符
多模态消息构造
from langchain_core.messages import HumanMessage, SystemMessage
# 创建系统提示
system_msg = SystemMessage("你是一个专业的问答专家。")
# 构造用户消息:文本+图像
human_msg = HumanMessage(content=[
{"type": "text", "text": "请描述图像:"},
{"type": "image_url",
"image_url": {
"url": "https://example.com/image.png",
"mime_type": "image/jpeg",
"metadata": "图像描述"
}
},
])
# 形成消息列表
messages = [system_msg, human_msg]
# 框架会懒解析 content -> content_blocks
for cb in human_msg.content_blocks:
print(cb) # content block 对象视图
使用多模态模型
# 使用具有多模态能力的模型
model = load_chat_model(
model="gpt-4o-mini",
provider="openai",
base_url="https://xiaoai.plus/v1",
api_key="sk-xxx"
)
res = model.invoke(messages)
print(res.content)
4.4 内容块创建标准格式
| 内容块类型 | 标准格式(LangChain 1.0) |
|---|---|
| 文本 | {"type": "text", "text": "..."} |
| 图像 | {"type": "image", "url": "...", "mime_type": "..."} |
| 音频 | {"type": "audio", "url": "...", "mime_type": "..."} |
| 视频 | {"type": "video", "url": "...", "mime_type": "..."} |
| 文件 | {"type": "file", "url": "...", "mime_type": "..."} |
| Base64 图像 | {"type": "image", "base64": "...", "mime_type": "..."} |
| Base64 音频 | {"type": "audio", "base64": "...", "mime_type": "..."} |
| OpenAI 图像 | {"type": "image_url", "image_url": {"url": "..."}} |
OpenAI 内容块支持对比表
| 内容块类型 | 支持情况 | 说明 |
|---|---|---|
| text | ✅ 支持 | 纯文本内容 |
| image_url | ✅ 支持 | 图像 URL(支持 jpg, png, gif, webp) |
| audio | ❌ 不支持 | 需要先用 Whisper 转录为文本 |
| video | ❌ 不支持 | 需要提取关键帧或转录音频 |
| file | ❌ 不支持 | 需要提取文本内容 |
注意:content_blocks 是 LangChain v1 的标准化多模态消息单元,你可以用 dict 结构把图片与音频纳入消息里,框架会把它们转换为各 provider 可识别的格式;在实际使用时务必确认目标模型/provider 对 multimodal 的支持和所需的 mime_type / metadata 字段。