跳到主要内容

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 字段。