Ollama 视觉(Vision)

2026-10-29 18:29 更新

视觉模型(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 结构化输出 第四节,可直接复用。

图片输入配上结构化约束,才算真正打通"图片 → 数据"的链路。只靠对话式描述,你拿到的永远是一段需要再解析的文字。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号