在 LangChain 的演进历程中,多模态(Multimodal)处理已经从早期的“锦上添花”变成了如今构建智能应用的“必修课”。过去,我们只能让大模型处理冷冰冰的文本,而现在,随着 GPT-4o、Claude 3.5 Sonnet 等模型的爆发,让 AI“看懂”产品截图、“听懂”会议纪要录音、“阅读”复杂的 PDF 财报已经成为常态。在 LangChain 中处理这些非文本数据,核心难点不在于调用 API,而在于如何将这些二进制数据标准化地“喂”给模型,以及在传输效率与处理便捷性之间找到最佳平衡点。
LangChain 通过引入标准化的 Content Blocks(内容块)机制,极大地简化了这一过程。无论你是使用 OpenAI、Anthropic 还是 Google Gemini,LangChain 都试图抹平底层 API 的差异,让你用统一的格式处理图片、音频和视频。本文将深入剖析 LangChain 处理多模态数据的底层逻辑,重点讲解 URL 与 Base64 两种主流传输方式的实战应用及选型策略。

核心机制:标准化的 Content Blocks
在 LangChain 1.0 及更高版本中,多模态数据的处理不再依赖各厂商零散的格式,而是统一封装在 HumanMessage 的 content 列表中。这种设计模式被称为“内容块”。
简单来说,你不再只发送一个字符串,而是发送一个包含多种类型元素的列表。这个列表中可以同时包含文本块(TextBlock)、图片块(ImageBlock)、音频块(AudioBlock)甚至工具调用块。
代码层面的直观变化:
以前你可能只传 "请描述这张图片",现在你需要构建如下的结构化数据:
content=[
{"type": "text", "text": "请分析这张图片中的天气状况"},
{"type": "image_url", "image_url": {"url": "图片地址或Base64数据"}}
]
这种结构化的方式让 LangChain 能够清晰地识别哪些是文本指令,哪些是视觉素材,从而准确地映射到不同大模型厂商的 API 格式上。
图片处理实战:URL 与 Base64 的博弈
图片是目前多模态应用中最常见的数据类型。在 LangChain 中,输入图片主要有两种流派:直接传 URL 和 Base64 编码内联。
1. URL 形式:轻量级的首选
如果你的图片已经托管在公网(如 AWS S3、阿里云 OSS 或公开图床),直接使用 URL 是最优雅的方案。
优势:
- 节省 Token 和带宽:请求体中只包含一个链接字符串,不会显著增加 Payload 的大小。
- 代码简洁:无需进行繁琐的文件读取和编码转换。
- 缓存友好:模型服务商可能对热门图片 URL 有缓存。
实战代码:
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
message = HumanMessage(
content=[
{"type": "text", "text": "这张图片里有什么?"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]
)
response = llm.invoke([message])
2. Base64 形式:本地文件的必由之路
当处理本地上传的文件(如用户上传的发票截图、本地存储的产品图)时,模型 API 无法直接访问你的硬盘,必须将文件转换为 Base64 字符串,“内联”在请求体中发送。
优势:
- 无访问限制:不依赖图片是否公网可访问,适合处理私有、临时或本地生成的数据。
- 安全性:对于敏感数据,Base64 传输避免了生成临时公开链接的风险。
劣势:
- 体积膨胀:Base64 编码会使文件体积增大约 33%,对于大图片会显著增加传输耗时。
实战代码:
import base64
import httpx
from langchain_core.messages import HumanMessage
# 模拟读取本地文件或网络流
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
message = HumanMessage(
content=[
{"type": "text", "text": "请详细描述这张图片"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"}
}
]
)
进阶处理:文档、音频与视频
除了静态图片,LangChain 对 PDF 文档和音频的处理也遵循类似的逻辑,但有特定的细节需要注意。
PDF 文档处理
像 Claude 3 和 GPT-4o 这样的模型已经支持直接“阅读” PDF。在 LangChain 中,这通常被视为一种特殊的文件块。你需要将 PDF 文件读取为二进制,转换为 Base64,并指定正确的 MIME 类型(如 application/pdf)。
- 注意:不要将 PDF 解析为图片再传给多模态模型(除非是扫描件),直接传 PDF 二进制数据能保留文本层,效果更好且更省 Token。
音频与视频
对于音频(如 .mp3, .wav),LangChain 支持通过 audio_url 类型传递。
- URL 模式:直接传入音频文件的公网链接。
- Base64 模式:传入
data:audio/mp3;base64,...格式的字符串。 - 视频处理:目前的模型通常不支持直接处理长视频文件。最佳实践是提取关键帧(将视频转为图片序列)或提取音频(转为语音转文字),然后分别通过图片块或音频块传入 LangChain。
选型决策:URL vs Base64 最佳实践
在实际工程中,到底该用哪种方式?我们可以根据文件大小、存储位置和隐私需求做一个决策矩阵。
| 维度 | URL 模式 | Base64 模式 |
|---|---|---|
| 适用场景 | 图片已托管在云端、公开数据集 | 本地上传文件、动态生成图片、隐私数据 |
| 文件大小 | 适合大文件 (>1MB) | 适合小文件 (<1MB),避免请求体过大 |
| 网络耗时 | 低(仅传输链接) | 高(传输完整编码数据) |
| 隐私安全 | 低(需确保链接不泄露) | 高(数据在传输通道内加密) |
| 推荐指数 | ⭐⭐⭐⭐⭐ (优先) | ⭐⭐⭐ (备选) |
性能优化小贴士:
- 图片压缩:在转为 Base64 之前,务必对图片进行压缩。对于大模型视觉分析,通常将长边调整为 1024px 或 2048px 就足够了,无需发送原图。
- 格式转换:尽量使用 JPEG 或 WebP 格式,避免使用体积巨大的 PNG 或 BMP。
- 异步处理:多模态数据的编码和 API 调用都是 I/O 密集型操作,建议在 LangChain 中使用
ainvoke进行异步调用,避免阻塞主线程。
掌握多模态数据的处理,本质上是掌握数据在“二进制”与“文本协议”之间的转换艺术。通过合理选择 URL 或 Base64 策略,并配合 LangChain 的标准化 Content Blocks,你就能轻松构建出能看、能听、能读的全能型 AI 应用。