Skip to content

LangChain 中如何处理多模态数据? ​

  • 标签:LangChain、多模态

🏛 业务架构师 ​

LangChain 处理多模态数据(图像、音频、文档)的能力与打法:

1. 模型接入层:ChatModel 抽象支持多模态消息——LangChain 的消息结构里 content 可以是内容块数组(文本+图片 URL/base64),传给 GPT-4o、Claude、Qwen-VL 等多模态模型。音频部分模型(Gemini 等)原生支持,否则走 ASR 转文字。

2. 图像的两种业务用法:

  • 理解型:图片直接进上下文(票据识别、质检图片判断、UI 截图分析)——HumanMessage(content=[{"type":"text",...},{"type":"image_url",...}]);
  • 检索型:用多模态 Embedding 模型(CLIP 系)把图片和文本映射到同一向量空间——"以图搜图""文字搜图"(电商商品检索、素材库),写入支持多模态的向量库(Milvus 等)。

3. 文档处理:DocumentLoader 支持 PDF(含表格解析)、Office、HTML;复杂版面用解析服务或多模态模型抽取——文档里的图表转成"图片理解"或"表格 Markdown"再入库。

4. 多模态 Agent:工具封装图像能力(OCR 工具、图片生成工具如 DALL-E/SD 接口),Agent 按需调用。

业务视角的选型提醒:多模态调用成本远高于纯文本(一张图的 token 相当于几百字),要设计分级策略——低分辨率快筛、关键图精算;合规上图片含 PII(人脸、证件)要先脱敏。2026 年的务实路线:理解型任务直接用多模态 API(能力开箱即用),检索型任务建多模态向量索引——两者都已成为标准组件,难点从"能不能做"变成"成本怎么控"。

🏗 系统架构师 ​

LangChain 多模态处理我按输入输出通路讲(以 1.x 为准):

多模态输入(主流场景):

  • 消息级多模态:HumanMessage(content=[{"type": "text", "text": "这张图说了什么"}, {"type": "image_url", "image_url": {"url": "https://... 或 base64"}}])——多模态模型(GPT-4o、Claude、Qwen-VL)直接接收图文混合内容;
  • 模型抽象统一:BaseChatModel 的多模态消息接口屏蔽供应商差异(细节方言如 base64 前缀、分辨率限制在集成层适配——注意各家的尺寸/token 计费差异要做成本核算:一张图几百~上千 token);
  • 文档解析:非文本文档走多模态解析管道(Unstructured、VLM 整页解析 PDF/表格/图表)→ 转文本/结构化 → 进 RAG 链路。

多模态输出:支持图像生成的模型(如 GPT-image 类)经相同抽象暴露;结构化输出约束多模态生成参数。

典型架构组合:

  • 图文问答:多模态消息 + RAG(图像描述预先嵌入检索);
  • 文档智能:VLM 解析 → Markdown → 分块 → RAG——"解析层多模态、检索层文本化"是当前生产主流(视觉理解前置成文本,检索链路复用成熟文本栈);
  • 工具化专家模型:Agent 把 OCR、图像分类器当工具调("编排 + 专家模型"架构,成本与精度比端到端多模态更可控)。

工程提醒:图像 token 成本是文本的数十倍/千字等价——高频场景评估缓存(图像 base64 稳定可命中前缀缓存);失败降级路径(VLM 挂了转 OCR 管道)要有。

💻 全栈开发专家 ​

LangChain 处理多模态主要三个环节:输入消息、向量化、文档解析。

1. 多模态消息输入(图片+文本提问):新版用 content blocks:

python
from langchain_core.messages import HumanMessage
msg = HumanMessage(content=[
    {"type": "text", "text": "这张报错截图的原因是什么?"},
    {"type": "image_url",
     "image_url": {"url": "data:image/png;base64,...."}}
])
llm.invoke([msg])   # 模型需支持 vision(GPT-4o/Qwen-VL等)

本地文件转 base64 或上传到 OSS 拿 URL(省 token 时可先压缩分辨率——视觉 token 按 tile 计费)。

2. 多模态 Embedding(图文统一检索):CLIP/SigLIP 类模型把图和文编码到同一空间,做「以文搜图」「以图搜图」:

python
from langchain_experimental.open_clip import OpenCLIPEmbeddings
vs = Chroma(embedding_function=OpenCLIPEmbeddings())
vs.add_images([img_paths])            # 图入库
vs.similarity_search("红色运动鞋")     # 文搜图

3. 文档中的图片处理(RAG 场景):PDF 解析时图片抽取:图表配 caption 入库(图片描述+原文引用);关键截图用 VLM 转文字描述再 Embedding——纯图不看内容等于没入库。

音频:ASR(Whisper)转文本后再走文本管道,LangChain 直接当文本处理。

工程提醒:多模态 token 成本远高于文本(一张 1024×1024 图几百到上千 token),链路里加「图片必要性判断」(能文本说清的别上图);不同模型对 image_url 格式(base64 vs URL)、尺寸限制有差异,适配层要做归一化;批量场景用 batch API 异步处理图片。