多模态(Multimodal)
什么是多模态?
传统 LLM 只能处理文本,多模态模型(Multimodal / Vision Language Model,VLM)能同时理解多种输入类型:
| 类型 | 说明 | 代表模型 |
|---|---|---|
| 文本 + 图像 | 看图说话、图像分析 | LLaVA、Qwen-VL、GPT-4o |
| 文本 + 音频 | 语音识别 + 对话 | Whisper + LLM |
| 文本 + 视频 | 视频理解 | Gemini 1.5 |
图像如何传给模型?
模型 API 不能直接收文件,图像有两种传递方式:
方式一:URL(模型从网上拉取图像)
https://example.com/image.jpg
方式二:Base64(把图片编码成字符串,嵌进请求体)
data:image/jpeg;base64,/9j/4AAQSkZJRgABA...
base64 编码
py
import base64
with open("image.jpg", "rb") as f:
data = base64.b64encode(f.read()).decode("utf-8")
url = f"data:image/jpeg;base64,{data}"
LangChain 封装了这两种方式,通过 HumanMessage 的 content 字段传入结构化列表:
py
from langchain_core.messages import HumanMessage
message = HumanMessage(content=[
{"type": "image_url", "image_url": {"url": "https://..."}},
{"type": "text", "text": "这张图里有什么?"},
])
示例代码
py
def ask_vision(llm: ChatOpenAI | ChatOllama, image_url: str, question: str):
messages = [
HumanMessage(
content=[
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": question},
]
)
]
result = llm.invoke(messages)
return result.content
def main():
env = validate_env()
if not env:
return
_, _, _, embedding_api_key, embedding_base_url, _ = env
local_llm = ChatOllama(model="llava:7b")
cloud_llm = ChatOpenAI(
model="Qwen/Qwen3-VL-8B-Instruct",
api_key=embedding_api_key,
base_url=embedding_base_url,
)
q_arr = ["有什么颜色?", "有几个物体?"]
for q in q_arr:
image_url = describe_image(image_path)
print(ask_vision(cloud_llm, image_url, q))