Ollama 视觉(Vision)
视觉模型(Vision Model)能同时接收图片和文字,然后像聊天一样描述画面、回答关于画面的问题、或者把图片归类。对开发者来说最实用的场景是:把一堆截图、票据、产品图丢进去,让模型先做一轮粗筛,省掉人工逐张看的时间。
用起来比想象中简单——就是在消息里多加一个 images 数组而已。
版本基线 v0.40.12。视觉模型清单见
ollama.com/search?c=vision,官方文档docs.ollama.com/capabilities/vision。
一、命令行:一行命令就能识图
最省事的方式是 ollama run,把图片路径写在模型名后面,再接问题:
## 先拉一个视觉模型(gemma4 支持图像输入)
ollama pull gemma4
## 图片路径 + 问题,一句话问完
ollama run gemma4 ./image.png what is in this image?
适合临时验证。真正要接入流程,还是得走 API。
二、API 的关键差异:REST 必须 base64
这里有个必须记住的区别,写错了会直接报错:
| 调用方式 | images 里放什么 |
|---|---|
REST /api/chat(curl、HTTP 客户端) |
base64 编码的图片数据(不接受文件路径) |
| Python SDK | 文件路径、原始字节、base64 字符串都行 |
| JavaScript SDK | 文件路径,或图片 URL |
也就是说,用 curl 时必须自己先编码。完整三步走:
## ① 先下载一张测试图
curl -L -o test.jpg "https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg"
## ② 转成 base64,并去掉换行(否则 JSON 里的字符串会被截断)
IMG=$(base64 < test.jpg | tr -d '\n')
## ③ 把编码结果塞进 images 数组
curl -X POST http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{
"model": "gemma4",
"messages": [{
"role": "user",
"content": "What is in this image?",
"images": ["'"$IMG"'"]
}],
"stream": false
}'
tr -d '\n' 这步别省。base64 命令默认每 76 字符换行,直接把带换行的结果拼进 JSON 字符串里,整个请求体就坏了。这是用 curl 发图片最常见的失败原因。
三、SDK 里可以直接传路径
Python 和 JavaScript 的 SDK 会替你做编码,传路径就行,代码干净很多:
## pip install ollama
from ollama import chat
## 传文件路径即可,SDK 内部会转 base64
path = input('请输入图片路径:')
response = chat(
model='gemma4',
messages=[
{
'role': 'user',
'content': '这张图里有什么?请简洁回答。',
'images': [path],
}
],
)
print(response.message.content)
如果图片来源不是本地文件,SDK 还支持另外两种形式,按需替换:
from pathlib import Path
import base64
path = 'image.jpg'
## 形式一:传 base64 字符串(与 REST 等价)
img = base64.b64encode(Path(path).read_bytes()).decode()
## 形式二:传原始字节,省掉编码这一步
img = Path(path).read_bytes()
## 之后把 img 放进 images 数组即可
JavaScript 版本更简单,直接给绝对路径,或者给图片 URL:
// npm install ollama
import ollama from 'ollama'
const imagePath = '/absolute/path/to/image.jpg' // 也可以是 https:// 开头的图片 URL
const response = await ollama.chat({
model: 'gemma4',
messages: [
{ role: 'user', content: '这张图里有什么?', images: [imagePath] }
],
stream: false,
})
console.log(response.message.content)
四、实际用起来要注意的四点
一次可以传多张。 images 是数组,多图对比("这两张图有什么不同")直接都放进去。但要注意上下文长度会快速膨胀——图片本身占的 token 不少,两三张之后留给文字的空间就很有限了。
图片路径不要用相对路径猜。 Python SDK 相对路径基于当前工作目录,脚本换目录跑就会失败。生产环境统一用绝对路径或直接传字节。
识别精度取决于模型和图片质量。 低分辨率截图里的细小文字经常认错。需要精确读取图中文字(票据金额、表格数字)时,建议先裁剪放大关键区域再送进去,或者用 3.3 Ollama 结构化输出 里讲的"视觉 + Schema"组合,让模型明确告诉你哪些字段没把握。
只想做分类判断时,别用生成式视觉模型。 如果你只是想知道"这张图里有没有 Ollama",用 3.4 Ollama 决策(Decision) 里的 clef 更省——它直接返回概率,不生成文字,也不消耗输出 token。
五、常见组合:视觉 + 结构化输出
视觉能力最值钱的用法不是"描述一下这张图",而是把图片变成可入库的字段。视觉模型接受同一个 format 参数,配一份 JSON Schema,出来的就是程序能直接吃的结构:
官方示例是用 gemma4 读一张照片,输出固定包含 summary、objects、scene、colors、time_of_day 等字段的 JSON,其中 time_of_day 用枚举锁死在四个选项内。完整代码在 3.3 Ollama 结构化输出 第四节,可直接复用。
图片输入配上结构化约束,才算真正打通"图片 → 数据"的链路。只靠对话式描述,你拿到的永远是一段需要再解析的文字。

TRAE-AI编程


更多建议: