主题
多模态模型入门:从文本到视觉
前五章我们讨论的所有内容——模型调用、提示词模板、输出解析、RAG 检索、对话记忆——都围绕着一个共同的假设:输入和输出都是纯文本。用户打字进来,模型打字出去。这确实是 LLM 最经典的使用方式,但它远不是全部。
2023 年以来,AI 领域最激动人心的突破之一就是 多模态(Multimodal) 能力的爆发——模型不再只能处理文字,还能"看"图片、"听"声音,甚至同时理解多种类型的输入并给出综合回应。这一章我们将系统地学习如何在 LangChain 中利用这些能力,让你的 AI 助手从"只会聊天"进化为"能看能听"。
什么是多模态
模态(Modality) 这个词来源于拉丁语 modus,意为"方式"或"形式"。在 AI 的语境中,一种数据类型就是一种模态:文本是一种模态,图像是另一种模态,音频又是第三种。
所谓 多模态 AI,就是能够同时处理和理解多种不同类型数据的智能系统。它不是简单地把多个单模态模型拼在一起,而是在统一的架构中学习不同模态之间的关联和语义对应关系:
传统单模态:
文本 → [文本模型] → 文本输出
图像 → [图像模型] → 分类标签
音频 → [音频模型] → 转录文本
多模态:
文本 + 图像 + 音频 → [多模态模型] → 综合理解与输出举个例子让你直观感受区别:
python
# 单模态 — 只能用文字描述
response = chat.invoke("这张照片里有一只橘猫坐在窗台上晒太阳")
# 模型只能基于文字描述来想象,无法验证真实性
# 多模态 — 直接把照片给模型看
response = multimodal_chat.invoke([
HumanMessage(content=[
{"type": "text", "text": "描述一下这张图片"},
{"type": "image_url", "image_url": {"url": "cat_photo.jpg"}}
])
])
# 模型真正"看到"了图片内容,能给出准确的描述从 GPT-4V 到 GPT-4o:多模态的进化
OpenAI 在多模态领域的探索经历了几个重要阶段:
GPT-4V(Vision)(2023 年 9 月):这是 OpenAI 第一个正式支持图像输入的大模型。你可以把一张图片连同文字一起发给它,它能识别图中的物体、阅读图片里的文字、分析图表数据等。但它的图像处理能力是通过额外的视觉模块"拼接"到语言模型上的,本质上还是两个系统的协作。
GPT-4o(2024 年 5 月):其中的 "o" 代表 omni(全能/全模态)。这是一个原生多模态模型——文本、图像、音频在同一个神经网络中统一处理,不需要额外的拼接模块。它的响应速度比 GPT-4V 快得多,成本更低,而且在图像理解和语音交互方面都有显著提升。
对 LangChain 开发者来说,GPT-4o 带来的最大变化是:你不需要换框架或学新 API——只需要在现有的 ChatOpenAI 接口中传入稍微不同的消息格式就能实现多模态交互。
LangChain 对多模态的支持
LangChain 从 v0.2 开始逐步完善了对多模态的支持。核心的接口变化非常小——你仍然使用 ChatOpenAI,仍然用 invoke() 调用,只是消息的内容格式从纯字符串变成了结构化的多部分内容(multipart content):
python
# 传统文本消息
message = HumanMessage(content="你好")
# 多模态消息 — 包含文本 + 图片
message = HumanMessage(content=[
{"type": "text", "text": "这张图片里是什么?"},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
])注意看 content 字段的变化:从单个字符串变成了一个列表,列表中的每个元素是一个字典,通过 "type" 字段标识该部分的类型("text" 或 "image_url")。这种格式叫做 多部分消息(Multimodal Message) 或 内容块列表(Content Block List),它是 LangChain 中表达多模态输入的标准方式。
本章覆盖的能力范围
本章将围绕三个核心能力展开:
| 能力 | 说明 | 典型场景 |
|---|---|---|
| 视觉理解 | 让模型"看"图片并回答相关问题 | 图片描述、OCR、图表分析、截图诊断 |
| 语音输入 | 把用户的语音自动转为文本再发给模型 | 语音助手、车载交互、无障碍访问 |
| 语音输出 | 把模型的文字回复转为语音播放 | 有声读物、导航播报、电话客服 |
这三个能力可以单独使用,也可以组合在一起形成完整的"能看能听"的多模态助手。最后一节的实战项目将展示如何把它们整合到一个应用中。
为什么多模态很重要
在实际应用中,多模态能力解决了很多纯文本无法解决的问题:
场景一:用户直接发了一张截图而不是打字描述
python
# 用户发了张报错截图
user_message = HumanMessage(content=[
{"type": "image_url", "image_url": {"url": "screenshot.png"}},
{"type": "text", "text": "我的代码报错了,怎么修?"}
])
# 模型能直接看到错误信息,精准定位问题这在编程助手中极其常见——用户不会把整段报错信息手动敲出来,他们更倾向于截个图发过来。没有视觉能力的模型对此束手无策。
场景二:处理包含图表和表格的文档
python
# 用户上传了一份销售报表图片
message = HumanMessage(content=[
{"type": "image_url", "image_url": {"url": "sales_report.png"}},
{"type": "text", "text": "Q3 哪个产品线增长最快?"}
])
# 模型能读取图表中的数据和趋势传统的 RAG 系统依赖 OCR 把图片转为文字,但 OCR 经常出错(尤其是复杂表格和多栏布局)。多模态模型可以直接理解图片的视觉结构和语义。
场景三:语音优先的交互场景
python
# 用户对着麦克风说话
audio_text = speech_to_text(audio_input) # 语音→文字
response = chat.invoke(audio_text) # 文字→模型
speech_output = text_to_speech(response) # 文字→语音对于驾驶中的司机、正在做饭的人、或者视力障碍用户来说,语音是最自然的交互方式。
准备工作
在开始写代码之前,确认你的环境已经就绪:
bash
# 核心依赖(前几章应该已经装好了)
pip install langchain langchain-openai langchain-core python-dotenv
# 第六章新增的依赖
pip install openai>=1.20 # 需要 1.20+ 才支持多模态 API环境变量 .env 文件确保包含:
OPENAI_API_KEY=sk-xxxGPT-4o 是默认支持多模态的,不需要额外配置。但要注意:发送图片给 GPT-4o 的 API 调用费用比纯文本高一些(因为需要额外的计算资源处理图像),而且有尺寸限制——建议图片不超过 20MB,分辨率控制在 2048×2048 以内以获得最佳性价比。
接下来的一节,我们首先深入最重要的多模态能力——视觉理解,学习如何让 LangChain 应用真正地"看见"世界。