Skip to content

零基础入门AI:如何通过API的方式调用ollama

这是我的第一篇AI领域的文章,本文将整合ollama所有的API相关接口。

一般我们使用ollama的原生命令可能会比较少,大多数用在基础的测试,更多的是通过API接口的方式使用,ollama官网也提供相应的API文档,但都是纯英文,很多人使用不习惯,于是我这里将其翻译为中文。

这里强烈推荐Chatbox AI,Chatbox AI 是一款 AI 客户端应用和智能助手,支持众多先进的 AI 模型和 API,可在 Windows、MacOS、Android、iOS、Linux 和网页版上使用。

目录

模型名称

模型名称遵循 模型:标签 的格式,其中 模型 可以有一个可选的命名空间,例如 example/model。一些示例包括 orca-mini:3b-q4_1llama3:70b。标签是可选的,如果未提供,将默认为 latest。标签用于标识特定版本。

持续时间

所有持续时间均以纳秒为单位返回。

流式响应

某些端点以 JSON 对象的形式流式传输响应。对于这些端点,可以通过提供 {"stream": false} 来禁用流式传输。

生成补全内容

shell
POST /api/generate

使用提供的模型为给定的提示生成响应。这是一个流式端点,因此会有一系列响应。最终的响应对象将包含统计信息和来自请求的其他数据。

参数

  • model:(必填)模型名称
  • prompt:要为其生成响应的提示
  • suffix:模型响应之后的文本
  • images:(可选)一个 base64 编码的图像列表(用于多模态模型,如 llava

高级参数(可选):

  • format:返回响应的格式。格式可以是 json 或 JSON 模式
  • options:在 Modelfile 文档 中列出的其他模型参数,例如 temperature
  • system:系统消息(覆盖在 Modelfile 中定义的内容)
  • template:要使用的提示模板(覆盖在 Modelfile 中定义的内容)
  • stream:如果为 false,响应将作为单个响应对象返回,而不是一系列对象
  • raw:如果为 true,将不对提示应用任何格式。如果在向 API 发出的请求中指定了完整的模板化提示,则可以选择使用 raw 参数
  • keep_alive:控制在请求之后模型将在内存中保持加载的时长(默认:5m
  • context(已弃用):从之前对 /generate 的请求中返回的上下文参数,可用于保持简短的对话记忆

结构化输出

通过在 format 参数中提供 JSON 模式来支持结构化输出。模型将生成与该模式匹配的响应。请参阅下面的请求结构化输出示例。

JSON 模式

通过将 format 参数设置为 json 来启用 JSON 模式。这将把响应结构化为有效的 JSON 对象。请参阅下面的JSON模式。

[!重要提示] 重要的是要在 prompt 中指示模型使用 JSON。否则,模型可能会生成大量空白字符。

示例

生成请求(流式)

请求
shell
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "为什么天空是蓝色的?"
}'
响应

返回一系列 JSON 对象:

json
{
  "model": "llama3.2",
  "created_at": "2023-08-04T08:52:19.385406455-07:00",
  "response": "The",
  "done": false
}

流中的最终响应还包括有关生成的其他数据:

  • total_duration:生成响应所花费的时间
  • load_duration:加载模型所花费的纳秒数
  • prompt_eval_count:提示中的令牌数
  • prompt_eval_duration:评估提示所花费的纳秒数
  • eval_count:响应中的令牌数
  • eval_duration:生成响应所花费的纳秒数
  • context:此响应中使用的对话的编码,可以在下一个请求中发送以保持对话记忆
  • response:如果响应是流式的,则为空;如果不是流式的,则将包含完整响应

要计算响应生成的速度(令牌/秒),请计算 eval_count / eval_duration * 10^9

json
{
  "model": "llama3.2",
  "created_at": "2023-08-04T19:22:45.499127Z",
  "response": "",
  "done": true,
  "context": [1, 2, 3],
  "total_duration": 10706818083,
  "load_duration": 6338219291,
  "prompt_eval_count": 26,
  "prompt_eval_duration": 130079000,
  "eval_count": 259,
  "eval_duration": 4232710000
}

请求(非流式)

请求

当流式传输关闭时,可以在一个回复中接收响应。

shell
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "为什么天空是蓝色的?",
  "stream": false
}'
响应

如果 stream 设置为 false,响应将是一个单独的 JSON 对象:

json
{
  "model": "llama3.2",
  "created_at": "2023-08-04T19:22:45.499127Z",
  "response": "天空是蓝色的,因为这是天空的颜色。",
  "done": true,
  "context": [1, 2, 3],
  "total_duration": 5043500667,
  "load_duration": 5025959,
  "prompt_eval_count": 26,
  "prompt_eval_duration": 325953000,
  "eval_count": 290,
  "eval_duration": 4709213000
}

请求(带后缀)

请求
shell
curl http://localhost:11434/api/generate -d '{
  "model": "codellama:code",
  "prompt": "def compute_gcd(a, b):",
  "suffix": "    return result",
  "options": {
    "temperature": 0
  },
  "stream": false
}'
响应
json
{
  "model": "codellama:code",
  "created_at": "2024-07-22T20:47:51.147561Z",
  "response": "\n  if a == 0:\n    return b\n  else:\n    return compute_gcd(b % a, a)\n\ndef compute_lcm(a, b):\n  result = (a * b) / compute_gcd(a, b)\n",
  "done": true,
  "done_reason": "stop",
  "context": [...],
  "total_duration": 1162761250,
  "load_duration": 6683708,
  "prompt_eval_count": 17,
  "prompt_eval_duration": 201222000,
  "eval_count": 63,
  "eval_duration": 953997000
}

请求(结构化输出)

请求
shell
curl -X POST http://localhost:11434/api/generate -H "Content-Type: application/json" -d '{
  "model": "llama3.1:8b",
  "prompt": "Ollama 22 岁了,正在忙着拯救世界。请用 JSON 格式回复",
  "stream": false,
  "format": {
    "type": "object",
    "properties": {
      "age": {
        "type": "integer"
      },
      "available": {
        "type": "boolean"
      }
    },
    "required": [
      "age",
      "available"
    ]
  }
}'
响应
json
{
  "model": "llama3.1:8b",
  "created_at": "2024-12-06T00:48:09.983619Z",
  "response": "{\n  \"age\": 22,\n  \"available\": true\n}",
  "done": true,
  "done_reason": "stop",
  "context": [1, 2, 3],
  "total_duration": 1075509083,
  "load_duration": 567678166,
  "prompt_eval_count": 28,
  "prompt_eval_duration": 236000000,
  "eval_count": 16,
  "eval_duration": 269000000
}

请求(JSON 模式)

[!重要提示] 当 format 设置为 json 时,输出将始终是格式良好的 JSON 对象。同样重要的是要指示模型以 JSON 格式回复。

请求
shell
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "一天中不同时间天空是什么颜色?请用 JSON 格式回复",
  "format": "json",
  "stream": false
}'
响应
json
{
  "model": "llama3.2",
  "created_at": "2023-11-09T21:07:55.186497Z",
  "response": "{\n\"morning\": {\n\"color\": \"blue\"\n},\n\"noon\": {\n\"color\": \"blue-gray\"\n},\n\"afternoon\": {\n\"color\": \"warm gray\"\n},\n\"evening\": {\n\"color\": \"orange\"\n}\n}\n",
  "done": true,
  "context": [1, 2, 3],
  "total_duration": 4648158584,
  "load_duration": 4071084,
  "prompt_eval_count": 36,
  "prompt_eval_duration": 439038000,
  "eval_count": 180,
  "eval_duration": 4196918000
}

response 的值将是一个包含类似以下 JSON 的字符串:

json
{
  "morning": {
    "color": "blue"
  },
  "noon": {
    "color": "blue-gray"
  },
  "afternoon": {
    "color": "warm gray"
  },
  "evening": {
    "color": "orange"
  }
}

请求(带图像)

要向多模态模型(如 llavabakllava)提交图像,请提供一个 base64 编码的 images 列表:

请求

shell
curl http://localhost:11434/api/generate -d '{
  "model": "llava",
  "prompt":"这张图片里有什么?",
  "stream": false,
shell
curl http://localhost:11434/api/embeddings -d '{
  "model": "all-minilm",
  "prompt": "Here is an article about llamas..."
}'

响应

json
{
  "embedding": [
    0.5670403838157654, 0.009260174818336964, 0.23178744316101074, -0.2916173040866852, -0.8924556970596313,
    0.8785552978515625, -0.34576427936553955, 0.5742510557174683, -0.04222835972905159, -0.137906014919281
  ]
}

版本信息

shell
GET /api/version

获取Ollama的版本信息。

示例

请求

shell
curl http://localhost:11434/api/version

响应

json
{
  "version": "0.5.1"
}