零基础入门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_1
和 llama3:70b
。标签是可选的,如果未提供,将默认为 latest
。标签用于标识特定版本。
持续时间
所有持续时间均以纳秒为单位返回。
流式响应
某些端点以 JSON 对象的形式流式传输响应。对于这些端点,可以通过提供 {"stream": false}
来禁用流式传输。
生成补全内容
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。否则,模型可能会生成大量空白字符。
示例
生成请求(流式)
请求
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "为什么天空是蓝色的?"
}'
响应
返回一系列 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
。
{
"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
}
请求(非流式)
请求
当流式传输关闭时,可以在一个回复中接收响应。
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "为什么天空是蓝色的?",
"stream": false
}'
响应
如果 stream
设置为 false
,响应将是一个单独的 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
}
请求(带后缀)
请求
curl http://localhost:11434/api/generate -d '{
"model": "codellama:code",
"prompt": "def compute_gcd(a, b):",
"suffix": " return result",
"options": {
"temperature": 0
},
"stream": false
}'
响应
{
"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
}
请求(结构化输出)
请求
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"
]
}
}'
响应
{
"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 格式回复。
请求
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "一天中不同时间天空是什么颜色?请用 JSON 格式回复",
"format": "json",
"stream": false
}'
响应
{
"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 的字符串:
{
"morning": {
"color": "blue"
},
"noon": {
"color": "blue-gray"
},
"afternoon": {
"color": "warm gray"
},
"evening": {
"color": "orange"
}
}
请求(带图像)
要向多模态模型(如 llava
或 bakllava
)提交图像,请提供一个 base64 编码的 images
列表:
请求
curl http://localhost:11434/api/generate -d '{
"model": "llava",
"prompt":"这张图片里有什么?",
"stream": false,
curl http://localhost:11434/api/embeddings -d '{
"model": "all-minilm",
"prompt": "Here is an article about llamas..."
}'
响应
{
"embedding": [
0.5670403838157654, 0.009260174818336964, 0.23178744316101074, -0.2916173040866852, -0.8924556970596313,
0.8785552978515625, -0.34576427936553955, 0.5742510557174683, -0.04222835972905159, -0.137906014919281
]
}
版本信息
GET /api/version
获取Ollama的版本信息。
示例
请求
curl http://localhost:11434/api/version
响应
{
"version": "0.5.1"
}