> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# Ollama视觉模型实测
- URL: https://www.hubwiz.com/blog/ollama-vision-models-test/
- Published: 2026-02-25T03:00:54.000Z
- Updated: 2026-02-25T03:00:54.000Z
- Description: 我简单地拍了几张营养标签的照片，并使用提示转换为 JSON。然后我针对一堆自托管模型和 Mistral Open API 进行了测试。它们都表现得相当好，但 Mistral API 是最好的。
- Author: admin
- Tags: MODEL-ZOO, OLLAMA, #Import 2026-10-14 14:41

我简单地拍了几张营养标签的照片，并使用提示转换为 JSON。然后我针对一堆自托管模型和 Mistral Open API 进行了测试。它们都表现得相当好，但 Mistral API 是最好的。

你知道，击败基准测试是一回事。但基准测试通常是自我报告的随机变量，就像驾照考试和驾驶并不完全一样，它们不能保证给定的现实生活问题会以可行的方式解决。这就是为什么我想给它一个真实的测试用例。

测试很简单：我拍了一堆营养标签的照片，就像下面这张：

![无](https://www.hubwiz.com/blog/content/images/2026/02/1-iQsbkyxMZDuHn0p8HehCjw-1.jpeg)

视觉模型在将其转换为 JPEG 方面有多好？

我尝试提取以下格式的 JSON：

```
{
  "calories": 180,
  "serving_size": 28.0,
  "unit": "g"
}

```

我使用的提示：

```
The image is the label of a packaged food product.

Extract the following information from the nutrition facts label and return ONLY a JSON object with no additional text:

- calories: total calories per serving (integer)
- serving_size: numeric serving size value (float)
- unit: unit of measurement for serving size (string, e.g., "g", "ml", "oz", "cup")

Use this exact format:
```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "calories": {
      "type": "integer",
      "description": "Total calories per serving"
    },
    "serving_size": {
      "type": "number",
      "description": "Numeric serving size"
    },
    "unit": {
      "type": "string",
      "description": "Unit of measurement (e.g., g, ml, oz, cups)"
    }
  },
  "required": ["calories", "serving_size", "unit"]
}
```

Example:
```json
{
  "calories": 180,
  "serving_size": 28.0,
  "unit": "g"
}
```

If any value cannot be determined from the label, use null for that field.
```

我运行同样的东西 50 次，看看是否能得到期望的结果。

我使用的评估标准：

```
prompt_path: "../prompts/calories_and_serving_size.md"
repeat: 50
threshold: 0
cases:
  - id: calories-label-180
    steps:
      - input:
          image_path: "images/IMG_B768CE83-9FEC-461A-BE63-CDDF64EBEB58.jpeg"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 180
              serving_size: 40.0
              unit: g

  - id: calories-label-harvest-trail-mix-1
    steps:
      - input:
          image_path: "images/IMG_3236.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 220
                serving_size: 50.0
                unit: g
              - calories: 220
                serving_size: 0.5
                unit: cup
              - calories: 220
                serving_size: 50.0
                unit: grams

  - id: calories-label-chunky-supreme-granola-exact
    steps:
      - input:
          image_path: "images/IMG_3228.HEIC"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 630
              serving_size: 140.0
              unit: g

  - id: calories-label-maple-eh-granola-exact
    steps:
      - input:
          image_path: "images/IMG_3231.HEIC"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 570
              serving_size: 130.0
              unit: g

  - id: calories-label-harvest-trail-mix-2
    steps:
      - input:
          image_path: "images/IMG_3232.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 220
                serving_size: 50.0
                unit: g
              - calories: 220
                serving_size: 0.5
                unit: cup
              - calories: 220
                serving_size: 50.0
                unit: grams

  - id: calories-label-harvest-trail-mix-3
    steps:
      - input:
          image_path: "images/IMG_3237.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 220
                serving_size: 50.0
                unit: g
              - calories: 220
                serving_size: 0.5
                unit: cup
              - calories: 220
                serving_size: 50.0
                unit: grams

  - id: calories-label-hersheys-christmas-cookies-exact
    steps:
      - input:
          image_path: "images/IMG_3276.HEIC"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 200
              serving_size: 41.0
              unit: g

  - id: calories-label-mnm-mint-chocolate-candy-1
    steps:
      - input:
          image_path: "images/IMG_3279.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 190
                serving_size: 40.0
                unit: g
              - calories: 220
                serving_size: 0.25
                unit: cup

  - id: calories-label-hersheys-candy-cane-kisses
    steps:
      - input:
          image_path: "images/IMG_3280.HEIC"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 220
              serving_size: 42.0
              unit: g

  - id: calories-label-milk-chocolate-christmas-balls
    steps:
      - input:
          image_path: "images/IMG_3282.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 200
                serving_size: 40.0
                unit: g
              - calories: 200
                serving_size: 6.0
                unit: pcs
              - calories: 200
                serving_size: 6.0
                unit: pieces

  - id: calories-label-mnm-mint-chocolate-candy-2
    steps:
      - input:
          image_path: "images/IMG_3284.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 190
                serving_size: 40.0
                unit: g
              - calories: 220
                serving_size: 0.25
                unit: cup

  - id: calories-label-jumbo-sour-sukkers
    steps:
      - input:
          image_path: "images/IMG_3286.HEIC"
          max_tokens: 64
        expectations:
          - type: equals
            value:
              calories: 150
              serving_size: 40.0
              unit: g
          - type: oneOf
            values:
              - calories: 150
                serving_size: 40.0
                unit: g
              - calories: 150
                serving_size: 2.0
                unit: pcs
              - calories: 150
                serving_size: 2.0
                unit: pieces

  - id: calories-label-quality-street
    steps:
      - input:
          image_path: "images/IMG_3288.HEIC"
          max_tokens: 64
        expectations:
          - type: oneOf
            values:
              - calories: 200
                serving_size: 42.0
                unit: g
              - calories: 200
                serving_size: 5.0
                unit: pcs
              - calories: 200
                serving_size: 5.0
                unit: pieces
```

不再废话，以下是结果：

![无](https://www.hubwiz.com/blog/content/images/2026/02/1-NPlFgwSrmcSZbr3ljzmvZA.png)

测试用例的平均模型准确度

让我们分解一下：我认为 Llava 失败了。我认为 Llava 是一个 OCR 模型，旨在像 DeepSeek-OCR 一样使用。这些模型不属于这里，它们不遵循像"以 JSON 格式输出"这样的具体指令。

第二个学习是：Qwen3，8B 参数，在 16GB-VRAM 机器上工作得很好。但是，在现实设置中，它们可能并没有比在更小机器上也能工作的 Qwen3:2B 带来太多 —— 它们可能即使在 6GB VRAM 上也能正常工作。使用 8B 来实现与统计噪音无法区分的性能提升可能是不可行的。

另一个观点是，Qwen3:2B 似乎比 Qwen3:4B 更好。我不知道这是否真的是改进，或者只是统计波动。我目前的想法是：如果应用程序实际上需要一个小窗口，那么增加上下文窗口确实没有意义。不仅会增加成本，实际上可能还会降低性能。

最后一个学习：托管 Ollama 时，打开流式传输！否则，当请求超过 60 秒时，请求会被丢弃。我听说这是可定制的，但默认为流式传输可能更容易，尽管需要额外的代码。

---

原文链接: [Vision Models in the Wild: A Test Case](https://medium.com/@sinan.ozel%5F23433/vision-models-in-the-wild-a-test-case-13b865c3b155?ref=hubwiz.com)

汇智网翻译整理，转载请标明出处