API

端点

  • 生成补全
    • [参数]
    • 示例
      • [生成补全 (流式)]
      • [生成补全 (非流式)]
      • [生成补全 (JSON 模式)]
      • [生成补全 (带图片)]
      • [生成补全 (原始模式)]
      • [生成补全 (可复现输出)]
      • [生成补全 (带选项)]
      • [加载模型]
  • 对话补全
    • [参数]
    • 示例
      • [对话补全 (流式)]
      • [对话补全 (非流式)]
      • [对话补全 (带历史消息)]
      • [对话补全 (带图片)]
      • [对话补全 (可复现输出)]
  • 创建模型
    • [参数]
    • 示例
      • [创建新模型]
    • [检查 Blob 是否存在]
    • [创建 Blob]
  • 列出本地模型
    • [示例]
  • 显示模型信息
    • [参数]
    • [示例]
  • 复制模型
    • [示例]
  • 删除模型
    • [参数]
    • [示例]
  • 拉取模型
    • [参数]
    • [示例]
  • 推送模型
    • [参数]
    • [示例]
  • 生成嵌入
    • [参数]
    • [示例]

规约

模型名称

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

持续时间

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

流式响应

某些端点以 JSON 对象形式流式传输响应,并可以选择返回非流式响应。

生成补全

1
POST /api/generate

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

参数

  • model:(必填)[模型名称]
  • prompt:生成响应的提示
  • images:(可选)base64编码的图像列表(适用于多模态模型,如llava

高级参数(可选):

  • format:返回响应的格式。目前唯一接受的值是json
  • options:文档中列出的额外模型参数 [Modelfile],如temperature
  • system:系统消息(覆盖在Modelfile中定义的内容)
  • template:使用的提示模板(覆盖在Modelfile中定义的内容)
  • context:来自先前/generate请求的context参数,可以用来保持短暂的会话记忆
  • stream:如果为false,则响应将作为单个响应对象返回,而不是对象流
  • raw:如果为true,则不会对提示应用格式。如果在请求中指定了完整的模板提示,您可以选择使用raw参数
  • keep_alive:控制模型在请求后保持在内存中的时间(默认:5m

JSON 模式

通过设置format参数为json启用JSON模式。这将把响应结构化为一个有效的JSON对象。参见下面的JSON模式[示例]。

注意:如果不在prompt中指导模型使用JSON,则模型可能会生成大量的空白。

示例

生成补全(流式)

请求
1
2
3
4
curl http://localhost:11434/api/generate -d '{
"model": "llama2",
"prompt": "Why is the sky blue?"
}'
响应

返回一系列JSON对象:

1
2
3
4
5
6
{
"model": "llama2",
"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:如果响应是流式的,则为空;如果不是流式的,则会包含完整响应

要计算每秒生成的令牌速度(token/s),请将eval_count / eval_duration

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"model": "llama2",
"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
}

生成补全 (非流式)

请求

当流关闭时,可以一次性收到响应。

1
2
3
4
5
curl http://localhost:11434/api/generate -d '{
"model": "llama2",
"prompt": "Why is the sky blue?",
"stream": false
}'
响应

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

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"model": "llama2",
"created_at": "2023-08-04T19:22:45.499127Z",
"response": "The sky is blue because it is the color of the sky.",
"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
}

生成补全 (JSON 模式)

当设置formatjson时,输出总是一个格式良好的JSON对象。在提示模型响应时也很重要。

请求
1
2
3
4
5
6
curl http://localhost:11434/api/generate -d '{
"model": "llama2",
"prompt": "What color is the sky at different times of the day? Respond using JSON",
"format": "json",
"stream": false
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"model": "llama2",
"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字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"morning": {
"color": "blue"
},
"noon": {
"color": "blue-gray"
},
"afternoon": {
"color": "warm gray"
},
"evening": {
"color": "orange"
}
}

生成补全 (含图片)

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

请求
1
2
3
4
5
6
curl http://localhost:11434/api/generate -d '{
"model": "llava",
"prompt":"What is in this picture?",
"stream": false,
"images": ["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"]
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"model": "llava",
"created_at": "2023-11-03T15:36:02.583064Z",
"response": "A happy cartoon character, which is cute and cheerful.",
"done": true,
"context": [1, 2, 3],
"total_duration": 2938432250,
"load_duration": 2559292,
"prompt_eval_count": 1,
"prompt_eval_duration": 2195557000,
"eval_count": 44,
"eval_duration": 736432000
}

生成补全 (原始模式)

在某些情况下,您可能希望绕过模板系统并提供完整的提示。在这种情况下,您可以使用raw参数禁用模板。另请注意,原始模式将不返回上下文。

Request
1
2
3
4
5
6
curl http://localhost:11434/api/generate -d '{
"model": "mistral",
"prompt": "[INST] why is the sky blue? [/INST]",
"raw": true,
"stream": false
}'

生成补全 (可复现输出)

对于可复制的输出,将temperature设置为0并且seed设置为一个数字:

请求
1
2
3
4
5
6
7
8
curl http://localhost:11434/api/generate -d '{
"model": "mistral",
"prompt": "Why is the sky blue?",
"options": {
"seed": 123,
"temperature": 0
}
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
{
"model": "mistral",
"created_at": "2023-11-03T15:36:02.583064Z",
"response": " The sky appears blue because of a phenomenon called Rayleigh scattering.",
"done": true,
"total_duration": 8493852375,
"load_duration": 6589624375,
"prompt_eval_count": 14,
"prompt_eval_duration": 119039000,
"eval_count": 110,
"eval_duration": 1779061000
}

生成补全 (带选项)

如果您希望在运行时为模型设置自定义选项,而不是在Modelfile中,您可以使用options参数。这个示例设置了所有可用选项,但您可以单独设置任何一个并省略您不想覆盖的选项。

请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
curl http://localhost:11434/api/generate -d '{
"model": "llama2",
"prompt": "Why is the sky blue?",
"stream": false,
"options": {
"num_keep": 5,
"seed": 42,
"num_predict": 100,
"top_k": 20,
"top_p": 0.9,
"tfs_z": 0.5,
"typical_p": 0.7,
"repeat_last_n": 33,
"temperature": 0.8,
"repeat_penalty": 1.2,
"presence_penalty": 1.5,
"frequency_penalty": 1.0,
"mirostat": 1,
"mirostat_tau": 0.8,
"mirostat_eta": 0.6,
"penalize_newline": true,
"stop": ["\n", "user:"],
"numa": false,
"num_ctx": 1024,
"num_batch": 2,
"num_gqa": 1,
"num_gpu": 1,
"main_gpu": 0,
"low_vram": false,
"f16_kv": true,
"vocab_only": false,
"use_mmap": true,
"use_mlock": false,
"rope_frequency_base": 1.1,
"rope_frequency_scale": 0.8,
"num_thread": 8
}
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"model": "llama2",
"created_at": "2023-08-04T19:22:45.499127Z",
"response": "The sky is blue because it is the color of the sky.",
"done": true,
"context": [1, 2, 3],
"total_duration": 4935886791,
"load_duration": 534986708,
"prompt_eval_count": 26,
"prompt_eval_duration": 107345000,
"eval_count": 237,
"eval_duration": 4289432000
}

加载模型

如果提供了空的提示,模型将被加载到内存中。

请求
1
2
3
curl http://localhost:11434/api/generate -d '{
"model": "llama2"
}'
响应

返回一个单一的JSON对象:

1
2
3
4
5
6
{
"model": "llama2",
"created_at": "2023-12-18T19:52:07.071755Z",
"response": "",
"done": true
}

对话补全

1
POST /api/chat

使用所提供的模型生成聊天中的下一条消息。这是一个流式端点,因此会有一系列响应。可以使用"stream": false禁用流式传输。最终响应对象将包括来自请求的统计数据和额外数据。

参数

  • model:(必填)[模型名称]
  • messages:聊天的消息,这可以用来保持聊天记忆

message对象具有以下字段:

  • role:消息的角色,可以是systemuserassistant
  • content:消息的内容
  • images(可选):要包含在消息中的图像列表(适用于多模态模型,如llava

高级参数(可选):

  • format:返回响应的格式。目前唯一接受的值是json
  • options:文档中列出的额外模型参数 [Modelfile],如temperature
  • stream:如果为false,则响应将作为单个响应对象返回,而不是对象流
  • keep_alive:控制模型在请求后保持在内存中的时间(默认:5m

示例

对话补全 (流式)

请求

Send a chat message with a streaming response.

1
2
3
4
5
6
7
8
9
curl http://localhost:11434/api/chat -d '{
"model": "llama2",
"messages": [
{
"role": "user",
"content": "why is the sky blue?"
}
]
}'
响应

返回一个 JSON 流式对象:

1
2
3
4
5
6
7
8
9
10
{
"model": "llama2",
"created_at": "2023-08-04T08:52:19.385406455-07:00",
"message": {
"role": "assistant",
"content": "The",
"images": null
},
"done": false
}

最终响应:

1
2
3
4
5
6
7
8
9
10
11
{
"model": "llama2",
"created_at": "2023-08-04T19:22:45.499127Z",
"done": true,
"total_duration": 4883583458,
"load_duration": 1334875,
"prompt_eval_count": 26,
"prompt_eval_duration": 342546000,
"eval_count": 282,
"eval_duration": 4535599000
}

对话补全 (非流式)

请求
1
2
3
4
5
6
7
8
9
10
curl http://localhost:11434/api/chat -d '{
"model": "llama2",
"messages": [
{
"role": "user",
"content": "why is the sky blue?"
}
],
"stream": false
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"model": "registry.ollama.ai/library/llama2:latest",
"created_at": "2023-12-12T14:13:43.416799Z",
"message": {
"role": "assistant",
"content": "Hello! How are you today?"
},
"done": true,
"total_duration": 5191566416,
"load_duration": 2154458,
"prompt_eval_count": 26,
"prompt_eval_duration": 383809000,
"eval_count": 298,
"eval_duration": 4799921000
}

对话补全 (带历史消息)

发送带有对话历史的聊天消息。您可以使用相同的方法使用多次发送或思维链提示来启动对话。

请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl http://localhost:11434/api/chat -d '{
"model": "llama2",
"messages": [
{
"role": "user",
"content": "why is the sky blue?"
},
{
"role": "assistant",
"content": "due to rayleigh scattering."
},
{
"role": "user",
"content": "how is that different than mie scattering?"
}
]
}'
响应

返回一个 JSON 流式对象:

1
2
3
4
5
6
7
8
9
{
"model": "llama2",
"created_at": "2023-08-04T08:52:19.385406455-07:00",
"message": {
"role": "assistant",
"content": "The"
},
"done": false
}

最终响应:

1
2
3
4
5
6
7
8
9
10
11
{
"model": "llama2",
"created_at": "2023-08-04T19:22:45.499127Z",
"done": true,
"total_duration": 8113331500,
"load_duration": 6396458,
"prompt_eval_count": 61,
"prompt_eval_duration": 398801000,
"eval_count": 468,
"eval_duration": 7701267000
}

对话补全 (带历史消息)

请求

发送带有图片的聊天消息。

1
2
3
4
5
6
7
8
9
10
curl http://localhost:11434/api/chat -d '{
"model": "llava",
"messages": [
{
"role": "user",
"content": "what is in this image?",
"images": ["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"]
}
]
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"model": "llava",
"created_at": "2023-12-13T22:42:50.203334Z",
"message": {
"role": "assistant",
"content": " The image features a cute, little pig with an angry facial expression. It's wearing a heart on its shirt and is waving in the air. This scene appears to be part of a drawing or sketching project.",
"images": null
},
"done": true,
"total_duration": 1668506709,
"load_duration": 1986209,
"prompt_eval_count": 26,
"prompt_eval_duration": 359682000,
"eval_count": 83,
"eval_duration": 1303285000
}

对话补全 (可复现输出)

请求
1
2
3
4
5
6
7
8
9
10
11
12
13
curl http://localhost:11434/api/chat -d '{
"model": "llama2",
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"options": {
"seed": 101,
"temperature": 0
}
}'
响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"model": "registry.ollama.ai/library/llama2:latest",
"created_at": "2023-12-12T14:13:43.416799Z",
"message": {
"role": "assistant",
"content": "Hello! How are you today?"
},
"done": true,
"total_duration": 5191566416,
"load_duration": 2154458,
"prompt_eval_count": 26,
"prompt_eval_duration": 383809000,
"eval_count": 298,
"eval_duration": 4799921000
}

创建模型

1
POST /api/create

从[Modelfile]创建模型。建议将modelfile设置为Modelfile的内容,而不仅仅是设置path。这是远程创建所必需的。远程模型创建还必须使用[创建 Blob]显式地在服务器上创建任何文件blobs,字段如FROMADAPTER,并将值设置为响应中指示的路径。

参数

  • name:要创建的模型的名称
  • modelfile(可选):Modelfile的内容
  • stream(可选):如果为false,则响应将作为单个响应对象返回,而不是对象流
  • path(可选):Modelfile的路径

示例

创建新模型

Modelfile创建新模型。

请求
1
2
3
4
curl http://localhost:11434/api/create -d '{
"name": "mario",
"modelfile": "FROM llama2\nSYSTEM You are mario from Super Mario Bros."
}'
响应

返回一个 JSON 流式对象。注意,最终的JSON对象显示"status": "success"

1
2
3
4
5
6
7
8
9
10
11
{"status":"reading model metadata"}
{"status":"creating system layer"}
{"status":"using already created layer sha256:22f7f8ef5f4c791c1b03d7eb414399294764d7cc82c7e94aa81a1feb80a983a2"}
{"status":"using already created layer sha256:8c17c2ebb0ea011be9981cc3922db8ca8fa61e828c5d3f44cb6ae342bf80460b"}
{"status":"using already created layer sha256:7c23fb36d80141c4ab8cdbb61ee4790102ebd2bf7aeff414453177d4f2110e5d"}
{"status":"using already created layer sha256:2e0493f67d0c8c9c68a8aeacdf6a38a2151cb3c4c1d42accf296e19810527988"}
{"status":"using already created layer sha256:2759286baa875dc22de5394b4a925701b1896a7e3f8e53275c36f75a877a82c9"}
{"status":"writing layer sha256:df30045fe90f0d750db82a058109cecd6d4de9c90a3d75b19c09e5f64580bb42"}
{"status":"writing layer sha256:f18a68eb09bf925bb1b669490407c1b1251c5db98dc4d3d81f3088498ea55690"}
{"status":"writing manifest"}
{"status":"success"}

检查 Blob 是否存在

1
HEAD /api/blobs/:digest

确保用于FROM或ADAPTER字段的文件blob在服务器上存在。这是检查您的Ollama服务器,而不是Ollama.ai。

查询参数

  • digest:blob的SHA256摘要

示例

请求
1
curl -I http://localhost:11434/api/blobs/sha256:29fdb92e57cf0827ded04ae6461b5931d01fa595843f55d36f5b275a52087dd2
响应

如果blob存在,则返回200 OK,如果不存在,则返回404 Not Found。

创建 Blob

1
POST /api/blobs/:digest

在服务器上从文件创建blob。返回服务器文件路径。

查询参数

  • digest:文件预期的SHA256摘要

示例

请求
1
curl -T model.bin -X POST http://localhost:11434/api/blobs/sha256:29fdb92e57cf0827ded04ae6461b5931d01fa595843f55d36f5b275a52087dd2
响应

如果blob成功创建,则返回201 Created;如果使用的摘要不符合预期,则返回400 Bad Request。

列出本地模型

1
GET /api/tags

列出可在本地获取的模型。

示例

请求

1
curl http://localhost:11434/api/tags

响应

将返回一个JSON对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"models": [
{
"name": "codellama:13b",
"modified_at": "2023-11-04T14:56:49.277302595-07:00",
"size": 7365960935,
"digest": "9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697",
"details": {
"format": "gguf",
"family": "llama",
"families": null,
"parameter_size": "13B",
"quantization_level": "Q4_0"
}
},
{
"name": "llama2:latest",
"modified_at": "2023-12-07T09:32:18.757212583-08:00",
"size": 3825819519,
"digest": "fe938a131f40e6f6d40083c9f0f430a515233eb2edaa6d72eb85c50d64f2300e",
"details": {
"format": "gguf",
"family": "llama",
"families": null,
"parameter_size": "7B",
"quantization_level": "Q4_0"
}
}
]
}

显示模型信息

1
POST /api/show

显示有关模型的信息,包括详细信息、Modelfile、模板、参数、许可证和系统提示。

参数

  • name:要显示的模型的名称

示例

请求

1
2
3
curl http://localhost:11434/api/show -d '{
"name": "llama2"
}'

响应

1
2
3
4
5
6
7
8
9
10
11
12
{
"modelfile": "# Modelfile generated by \"ollama show\"\n# To build a new Modelfile based on this one, replace the FROM line with:\n# FROM llava:latest\n\nFROM /Users/matt/.ollama/models/blobs/sha256:200765e1283640ffbd013184bf496e261032fa75b99498a9613be4e94d63ad52\nTEMPLATE \"\"\"{{ .System }}\nUSER: {{ .Prompt }}\nASSSISTANT: \"\"\"\nPARAMETER num_ctx 4096\nPARAMETER stop \"\u003c/s\u003e\"\nPARAMETER stop \"USER:\"\nPARAMETER stop \"ASSSISTANT:\"",
"parameters": "num_ctx 4096\nstop \u003c/s\u003e\nstop USER:\nstop ASSSISTANT:",
"template": "{{ .System }}\nUSER: {{ .Prompt }}\nASSSISTANT: ",
"details": {
"format": "gguf",
"family": "llama",
"families": ["llama", "clip"],
"parameter_size": "7B",
"quantization_level": "Q4_0"
}
}

复制模型

1
POST /api/copy

复制一个模型。从现有模型创建一个新名称的模型。

示例

请求

1
2
3
4
curl http://localhost:11434/api/copy -d '{
"source": "llama2",
"destination": "llama2-backup"
}'

响应

如果成功,返回 200 OK;如果源模型不存在,则返回 404 Not Found。

删除模型

1
DELETE /api/delete

删除一个模型及其数据。

参数

  • name:要删除的模型名称

示例

请求

1
2
3
curl -X DELETE http://localhost:11434/api/delete -d '{
"name": "llama2:13b"
}'

响应

如果删除成功,返回 200 OK;如果要删除的模型不存在,则返回 404 Not Found。

拉取模型

1
POST /api/pull

从ollama库下载模型。被取消的拉取将从中断的地方恢复,多次调用将共享相同的下载进度。

参数

  • name:要拉取的模型的名称
  • insecure:(可选)允许与库建立不安全的连接。只有在开发过程中从您自己的库拉取时才使用此选项。
  • stream:(可选)如果为false,则响应将作为单个响应对象返回,而不是对象流

示例

请求

1
2
3
curl http://localhost:11434/api/pull -d '{
"name": "llama2"
}'

响应

如果没有指定stream,或者设置为true,将返回一系列JSON对象:

第一个对象是模型的清单:

1
2
3
{
"status": "pulling manifest"
}

然后是一系列下载响应。在任何下载完成之前,可能不包括completed键。要下载的文件数量取决于清单中指定的层数。

1
2
3
4
5
6
{
"status": "downloading digestname",
"digest": "digestname",
"total": 2142590208,
"completed": 241970
}

在所有文件下载完毕后,最终响应为:

1
2
3
4
5
6
7
8
9
10
11
12
{
"status": "verifying sha256 digest"
}
{
"status": "writing manifest"
}
{
"status": "removing any unused layers"
}
{
"status": "success"
}

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

1
2
3
{
"status": "success"
}

推送模型

1
POST /api/push

将模型上传到模型库。需要先在ollama.ai注册并添加公钥。

参数

  • name:要推送的模型的名称,格式为<namespace>/<model>:<tag>
  • insecure:(可选)允许与库建立不安全的连接。只有在开发过程中向您的库推送时才使用此选项。
  • stream:(可选)如果为false,则响应将作为单个响应对象返回,而不是对象流

示例

请求

1
2
3
curl http://localhost:11434/api/push -d '{
"name": "mattw/pygmalion:latest"
}'

响应

如果没有指定stream或设置为true,将返回一系列JSON对象:

1
{ "status": "retrieving manifest" }

然后是:

1
2
3
4
5
{
"status": "starting upload",
"digest": "sha256:bc07c81de745696fdf5afca05e065818a8149fb0c77266fb584d9b2cba3711ab",
"total": 1928429856
}

接下来是一系列上传响应:

1
2
3
4
5
{
"status": "starting upload",
"digest": "sha256:bc07c81de745696fdf5afca05e065818a8149fb0c77266fb584d9b2cba3711ab",
"total": 1928429856
}

最后,当上传完成时:

1
2
{"status":"pushing manifest"}
{"status":"success"}

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

1
{ "status": "success" }

生成嵌入

1
POST /api/embeddings

从模型生成嵌入

参数

  • model:生成嵌入的模型名称
  • prompt:生成嵌入的文本

高级参数:

  • options:文档中列出的额外模型参数 [Modelfile],如temperature
  • keep_alive:控制模型在请求后保持在内存中的时间(默认:5m

示例

请求

1
2
3
4
curl http://localhost:11434/api/embeddings -d '{
"model": "all-minilm",
"prompt": "Here is an article about llamas..."
}'

响应

1
2
3
4
5
6
{
"embedding": [
0.5670403838157654, 0.009260174818336964, 0.23178744316101074, -0.2916173040866852, -0.8924556970596313,
0.8785552978515625, -0.34576427936553955, 0.5742510557174683, -0.04222835972905159, -0.137906014919281
]
}

Ollama 模型文件

注意:Modelfile语法仍在开发中

模型文件是创建和共享模型的蓝图。

目录

  • [格式]
  • [示例]
  • [指令]
  • FROM (必需)
    • [从 llama2 构建]
    • [从二进制文件构建]
  • PARAMETER (参数)
    • [有效参数及其值]
  • TEMPLATE (模板)
    • [模板变量]
  • [SYSTEM (系统)]
  • [ADAPTER (适配器)]
  • [LICENSE (许可证)]
  • [MESSAGE (消息)]
  • [备注]

格式

Modelfile的格式如下:

1
2
# comment
INSTRUCTION arguments
指令 描述
[FROM](必需) 定义使用的基础模型。
[PARAMETER] 设置模型运行时的参数。
[TEMPLATE] 要发送到模型的完整提示模板。
[SYSTEM] 指定在模板中设置的系统消息。
[ADAPTER] 定义要应用于模型的(Q)LoRA适配器。
[LICENSE] 指定法律许可证。
[MESSAGE] 指定消息历史记录。

示例

基本Modelfile

一个创建mario蓝图的Modelfile示例:

1
2
3
4
5
6
7
8
FROM llama2
# sets the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1
# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token
PARAMETER num_ctx 4096

# sets a custom system message to specify the behavior of the chat assistant
SYSTEM You are Mario from super mario bros, acting as an assistant.

使用方法:

  1. 将其保存为文件(例如Modelfile
  2. ollama create choose-a-model-name -f <文件位置例如./Modelfile>
  3. ollama run choose-a-model-name
  4. 开始使用模型!

更多示例可在[示例目录]中找到。

在[ollama.com/library]中的Modelfile

有两种方法查看[ollama.com/library]中模型的Modelfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> ollama show --modelfile llama2:13b
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama2:13b

FROM /root/.ollama/models/blobs/sha256:123abc
TEMPLATE """[INST] {{ if .System }}<<SYS>>{{ .System }}<</SYS>>

{{ end }}{{ .Prompt }} [/INST] """
SYSTEM """"""
PARAMETER stop [INST]
PARAMETER stop [/INST]
PARAMETER stop <<SYS>>
PARAMETER stop <</SYS>>

指令

FROM (必需)

FROM指令定义创建模型时使用的基础模型。

1
FROM <model name>:<tag>

从llama2构建

1
FROM llama2

可用的基础模型列表: https://github.com/ollama/ollama#model-library

从二进制文件构建

1
FROM ./ollama-model.bin

应指定二进制文件的位置,位置应为绝对路径或相对于Modelfile的路径。

参数

PARAMETER指令定义运行模型时可以设置的参数。

1
PARAMETER <parameter> <parametervalue>

有效参数及其值

参数 描述 值类型 示例使用
mirostat 启用 Mirostat 采样以控制复杂度。(默认:0,0=禁用,1=Mirostat,2=Mirostat 2.0) int mirostat 0
mirostat_eta 影响算法响应生成文本反馈的速度。较低的学习率将导致调整速度较慢,而较高的学习率将使算法更具响应性。(默认:0.1) float mirostat_eta 0.1
mirostat_tau 控制输出的一致性与多样性之间的平衡。较低的值将导致文本更加集中和一致。(默认:5.0) float mirostat_tau 5.0
num_ctx 设置用于生成下一个令牌的上下文窗口大小。(默认:2048) int num_ctx 4096
repeat_last_n 设置模型向后查看的距离,以防止重复。(默认:64,0=禁用,-1=num_ctx) int repeat_last_n 64
repeat_penalty 设置对重复的惩罚强度。较高的值(例如 1.5)将更强烈地惩罚重复,而较低的值(例如 0.9)将更宽容。(默认:1.1) float repeat_penalty 1.1
temperature 模型的温度。增加温度将使模型回答更具创造性。(默认:0.8) float temperature 0.7
seed 设置用于生成的随机数种子。将此设置为特定数字将使模型对同一提示生成相同的文本。(默认:0) int seed 42
stop 设置用于停止的序列。当遇到此模式时,LLM 将停止生成文本并返回。可以通过在 modelfile 中指定多个单独的 stop 参数来设置多个停止模式。 string stop “AI assistant:”
tfs_z 尾部自由采样用于减少输出中不太可能的令牌的影响。较高的值(例如 2.0)将更多地减少影响,而值为 1.0 时禁用此设置。(默认:1) float tfs_z 1
num_predict 生成文本时预测的最大令牌数。(默认:128,-1=无限生成,-2=填充上下文) int num_predict 42
top_k 降低生成无意义文本的概率。较高的值(例如 100)将提供更多样的回答,而较低的值(例如 10)将更为保守。(默认:40) int top_k 40
top_p 与 top-k 一起工作。较高的值(例如 0.95)将导致文本更多样化,而较低的值(例如 0.5)将生成更集中和保守的文本。(默认:0.9) float top_p 0.9

TEMPLATE

TEMPLATE是传递给模型的完整提示模板。它可能包括(可选的)系统消息、用户的消息和模型的响应。注意:语法可能是模型特定的。模板使用 Go [模板语法]。

模板变量

变量 描述
{{ .System }} 用于指定自定义行为的系统消息。
{{ .Prompt }} 用户提示消息。
{{ .Response }} 模型的响应。生成响应时,此变量之后的文本将被省略。
1
2
3
4
5
6
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
"""

SYSTEM

SYSTEM指令指定要在模板中使用的系统消息(如果适用)。

1
SYSTEM """<system message>"""

ADAPTER

ADAPTER指令是一个可选指令,指定应用于基础模型的任何 LoRA 适配器。此指令的值应为绝对路径或相对于 Modelfile 的路径,且文件必须是 GGML 文件格式。适配器应该从基础模型调整,否则行为是未定义的。

1
ADAPTER ./ollama-lora.bin

LICENSE

LICENSE指令允许您指定与此 Modelfile 一起使用的模型共享或分发的法律许可证。

1
2
3
LICENSE """
<license text>
"""

MESSAGE

MESSAGE指令允许您指定模型在响应时使用的消息历史记录。使用 MESSAGE 命令的多次迭代来构建对话,这将引导模型以类似的方式回答。

1
MESSAGE <role> <message>

有效角色

角色 描述
system 为模型提供 SYSTEM 消息的另一种方式。
user 用户可能询问的示例消息。
assistant 模型应如何响应的示例消息。

示例对话

1
2
3
4
5
6
MESSAGE user Is Toronto in Canada?
MESSAGE assistant yes
MESSAGE user Is Sacramento in Canada?
MESSAGE assistant no
MESSAGE user Is Ontario in Canada?
MESSAGE assistant yes

Notes

  • Modelfile 不区分大小写。在示例中,使用大写指令是为了便于将其与参数区分开来。
  • 指令可以按任意顺序排列。在示例中,首先是 FROM 指令,以保持易读性。

OpenAI 兼容性

注意: OpenAI 兼容性是实验性的,可能会有重大调整,包括破坏性更改。要完全访问 Ollama API,请查看 Ollama [Python 库]、[JavaScript 库] 和 [REST API]。

Ollama 提供与 [OpenAI API] 的部分兼容性,以帮助将现有应用程序连接到 Ollama。

使用方式

OpenAI Python 库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from openai import OpenAI

client = OpenAI(
base_url='http://localhost:11434/v1/',

# required but ignored
api_key='ollama',
)

chat_completion = client.chat.completions.create(
messages=[
{
'role': 'user',
'content': 'Say this is a test',
}
],
model='llama2',
)

OpenAI JavaScript 库

1
2
3
4
5
6
7
8
9
10
11
12
13
import OpenAI from 'openai'

const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1/',

// required but ignored
apiKey: 'ollama',
})

const chatCompletion = await openai.chat.completions.create({
messages: [{ role: 'user', content: 'Say this is a test' }],
model: 'llama2',
})

curl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'

端点

/v1/chat/completions

支持的功能

  • 对话补全
  • 流式传输
  • JSON 模式
  • 可重现输出
  • 视觉
  • 函数调用
  • Logprobs

支持的请求字段

  • model
  • messages
  • 文本 content
  • content 部分的数组
  • frequency_penalty
  • presence_penalty
  • response_format
  • seed
  • stop
  • stream
  • temperature
  • top_p
  • max_tokens
  • logit_bias
  • tools
  • tool_choice
  • user
  • n

备注

  • 设置 seed 将始终将 temperature 设置为 0
  • finish_reason 将始终是 stop
  • 对于提示评估被缓存的完成,usage.prompt_tokens 将为 0

模型

在使用模型之前,本地拉取 ollama pull

1
ollama pull llama2

默认模型名称

对于依赖于默认 OpenAI 模型名称(如 gpt-3.5-turbo)的工具,请使用 ollama cp 将现有模型名称复制到一个临时名称:

1
ollama cp llama2 gpt-3.5-turbo

之后,可以在 model 字段中指定这个新的模型名称:

1
2
3
4
5
6
7
8
9
10
11
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "Hello!"
}
]
}'

# GPU 支持

Nvidia

Ollama 支持具有计算能力 5.0+ 的 Nvidia GPU。

检查您的计算兼容性以查看您的卡是否受支持: https://developer.nvidia.com/cuda-gpus

计算能力 系列 卡片
9.0 NVIDIA H100
8.9 GeForce RTX 40xx RTX 4090 RTX 4080 RTX 4070 Ti RTX 4060 Ti
NVIDIA 专业版 L4 L40 RTX 6000
8.6 GeForce RTX 30xx RTX 3090 Ti RTX 3090 RTX 3080 Ti RTX 3080 RTX 3070 Ti RTX 3070 RTX 3060 Ti RTX 3060
NVIDIA 专业版 A40 RTX A6000 RTX A5000 RTX A4000 RTX A3000 RTX A2000 A10 A16 A2
8.0 NVIDIA A100 A30
7.5 GeForce GTX/RTX GTX 1650 Ti TITAN RTX RTX 2080 Ti RTX 2080 RTX 2070 RTX 2060
NVIDIA 专业版 T4 RTX 5000 RTX 4000 RTX 3000 T2000 T1200 T1000 T600 T500
Quadro RTX 8000 RTX 6000 RTX 5000 RTX 4000
7.0 NVIDIA TITAN V V100 Quadro GV100
6.1 NVIDIA TITAN TITAN Xp TITAN X
GeForce GTX GTX 1080 Ti GTX 1080 GTX 1070 Ti GTX 1070 GTX 1060 GTX 1050
Quadro P6000 P5200 P4200 P3200 P5000 P4000 P3000 P2200 P2000 P1000 P620 P600 P500 P520
Tesla P40 P4
6.0 NVIDIA Tesla P100 Quadro GP100
5.2 GeForce GTX GTX TITAN X GTX 980 Ti GTX 980 GTX 970 GTX 960 GTX 950
Quadro M6000 24GB M6000 M5000 M5500M M4000 M2200 M2000 M620
Tesla M60 M40
5.0 GeForce GTX GTX 750 Ti GTX 750 NVS 810
Quadro K2200 K1200 K620 M1200 M520 M5000M M4000M M3000M M2000M M1000M K620M M600M M500M

GPU 选择

如果您的系统中有多个 NVIDIA GPU 并且希望限制 Ollama 使用的子集,您可以将 CUDA_VISIBLE_DEVICES 设置为 GPU 的逗号分隔列表。可以使用数字 ID,但顺序可能会变化,因此 UUID 更可靠。您可以通过运行 nvidia-smi -L 来发现您的 GPU 的 UUID。如果您想忽略 GPU 并强制使用 CPU,请使用无效的 GPU ID(例如,“-1”)

笔记本电脑挂起/恢复

在 Linux 上,挂起/恢复周期后,有时 Ollama 无法发现您的 NVIDIA GPU,并回退到 CPU 上运行。您可以通过重新加载 NVIDIA UVM 驱动程序来解决这个驱动程序错误:sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm

AMD Radeon

Ollama 支持以下 AMD GPU:

系列 卡片及加速器
AMD Radeon RX 7900 XTX 7900 XT 7900 GRE 7800 XT 7700 XT 7600 XT 7600 6950 XT 6900 XTX 6900XT 6800 XT 6800 Vega 64 Vega 56
AMD Radeon PRO W7900 W7800 W7700 W7600 W7500 W6900X W6800X Duo W6800X W6800 V620 V420 V340 V320 Vega II Duo Vega II VII SSG
AMD Instinct MI300X MI300A MI300 MI250X MI250 MI210 MI200 MI100 MI60 MI50

概览

Ollama 利用 AMD ROCm 库,该库不支持所有 AMD GPU。在某些情况下,您可以强制系统尝试使用类似的 LLVM 目标。例如,Radeon RX 5400 是 gfx1034(也称为 10.3.4),但 ROCm 当前不支持此目标。最接近的支持是 gfx1030。您可以使用环境变量 HSA_OVERRIDE_GFX_VERSIONx.y.z 语法。例如,要强制系统在 RX 5400 上运行,您应设置环境变量 HSA_OVERRIDE_GFX_VERSION="10.3.0"。如果您有不受支持的 AMD GPU,可以尝试使用下面列出的受支持类型。

目前已知的受支持 GPU 类型为以下 LLVM 目标。此表显示了映射到这些 LLVM 目标的一些示例 GPU:

LLVM 目标 示例 GPU
gfx900 Radeon RX Vega 56
gfx906 Radeon Instinct MI50
gfx908 Radeon Instinct MI100
gfx90a Radeon Instinct MI210
gfx940 Radeon Instinct MI300
gfx941
gfx942
gfx1030 Radeon PRO V620
gfx1100 Radeon PRO W7900
gfx1101 Radeon PRO W7700
gfx1102 Radeon RX 7600

AMD 正在努力增强 ROCm v6,以在未来版本中扩大对 GPU 系列的支持,从而增加对更多 GPU 的支持。

通过 [Discord] 或提交 [问题] 获得更多帮助。

GPU 选择

如果您的系统中有多个 AMD GPU 并且希望限制 Ollama 使用的子集,您可以将 HIP_VISIBLE_DEVICES 设置为 GPU 的逗号分隔列表。您可以使用 rocminfo 查看设备列表。如果您想忽略 GPU 并强制使用 CPU,请使用无效的 GPU ID(例如,“-1”)

容器权限

在某些 Linux 发行版中,SELinux 可能阻止容器访问 AMD GPU 设备。在主机系统上,您可以运行 sudo setsebool container_use_devices=1,以允许容器使用设备。

Metal (Apple GPUs)

Ollama 通过 Metal API 支持在 Apple 设备上的 GPU 加速。