Ollama API 使用指南
简介
Ollama 提供了强大的 REST API,使开发者能够方便地与大语言模型进行交互。通过 Ollama API,用户可以发送请求并接收模型生成的响应,应用于自然语言处理、文本生成等任务。本文将详细介绍生成补全、对话生成的基本操作,并对创建模型、复制模型、删除模型等常见操作也进行了说明。
端点
- 回答补全
- 对话补全
- 创建模型
- 复制模型
- 删除模型
- 列出运行模型
- 列出本地模型
- 显示模型信息
- 拉取模型
- 推送模型
- 生成嵌入
一、回答补全
POST /api/generate
使用指定的模型生成给定提示的响应。这是一个流式端点,因此会有一系列响应。最终的响应对象将包括来自请求的统计信息和其他数据。
参数
model
: (必需)模型名称prompt
: 要生成响应的提示suffix
: 模型响应后的文本images
: (可选)一个base64编码的图像列表(用于多模态模型,如llava
)
高级参数(可选):
format
: 返回响应的格式。目前唯一接受的值是json
options
: 其他模型参数,如temperature
、seed
等system
: 系统消息template
: 要使用的提示模板context
: 从先前对/generate
的请求中返回的上下文参数,可以用于保持简短的对话记忆stream
: 如果设置为false
,响应将作为单个响应对象返回,而不是一系列对象流raw
: 如果设置为true
,将不会对提示进行任何格式化。如果您在请求API时指定了完整的模板提示,可以选择使用raw
参数keep_alive
: 控制模型在请求后保留在内存中的时间(默认:5m
)
示例请求(流式)
curl http://localhost:11434/api/generate -d '{"model": "llama3.1","prompt": "为什么草是绿的?"
}'
在 Python 中使用 Ollama API
导入Ollama模块
使用方法
from ollama import chat
from ollama import ChatResponseresponse: ChatResponse = chat(model='deepseek-r1:14b', messages=[{'role': 'user','content': '为什么天空是蓝色的?',},
])
print(response['message']['content'])
<think>
嗯,为什么天空是蓝色的呢?这个问题听起来好像很简单,但其实要解释清楚可能需要一些思考。首先,我知道阳光看起来是白色的,但它其实包含了各种颜色的光,对吧?就像雨后出现的彩虹一样,白光被分解成了红、橙、黄、绿、蓝、靛、紫这些颜色。那为什么天空会呈现蓝色呢?是不是因为太阳发出的光中有更多的蓝色光线?或者说,空气中的某些成分影响了阳光的颜色?我记得以前学过一个叫“散射”的现象,可能和这个有关。散射是指光线被空气中的分子或颗粒散开的现象,而不同颜色的光在散射时的表现可能不同。根据我模糊的记忆,有一个叫做瑞利散射的理论,可能是解释天空颜色的关键。瑞利散射说的是当光穿过大气层时,较短波长的光更容易被散射。蓝色和紫色的光波长比红色和橙色的要短,所以它们应该更易被散射到各个方向。但是我们看到的天空是蓝色而不是紫色,这可能是因为人眼对紫色的敏感度较低,或者大气中的某些因素削弱了紫色光的影响。另外,我想到日出和日落时,太阳的位置很低,阳光需要穿过更厚的大气层,这时较长波长的红光更容易穿透,而蓝光大部分被散射掉了,所以天空在日出日落时会变成红色或橙色。这也支持了瑞利散击理论。不过,我还记得有时候天空看起来会有不同的颜色变化,比如在污染较重的时候可能会有灰蒙蒙的颜色,或者在某些天气条件下出现其他色调,这可能是因为大气中的颗粒物或者其他因素影响了光线的散射方式。所以,不仅仅是瑞利散射,还可能有其他因素在起作用。总的来说,天空呈现蓝色主要是因为阳光中的蓝色光被空气分子大量散射到各个方向,而人眼对蓝光更敏感,所以我们看到天空是蓝色的。但在日出和日落时,由于光线经过更厚的大气层,蓝色光大部分被散射掉了,剩下红色的光穿透过来,使天空呈现红色或橙色。当然,这只是我的初步理解,可能还有其他因素需要考虑,比如大气中的气体成分、颗粒物的影响,以及不同波长的光在大气中的传播路径等。为了更准确地回答这个问题,我应该查阅一些相关的物理和光学知识,或者看看权威的科学解释来验证我的想法是否正确。通过这个思考过程,我对为什么天空是蓝色有了一个基本的理解,但为了确保准确性,可能还需要进一步学习相关理论和实验结果。
</think>天空呈现蓝色主要是因为阳光中的蓝色光波在大气中被散射的结果。具体来说,这是由于瑞利散射现象:较短波长的蓝光比红光更容易被大气分子散射到各个方向,导致我们在抬头望向天空时看到的是被散射后的蓝光。
流式响应
可以通过设置 stream=True
启用响应流,使函数调用返回一个 Python 生成器,其中每个部分都是流中的一个对象。
from ollama import chatstream = chat(model='deepseek-r1:8b',messages=[{'role': 'user', 'content': '为什么天空是蓝色的?'}],stream=True,
)for chunk in stream:print(chunk['message']['content'], end='', flush=True)
<think>
嗯,为什么天空是蓝色的呢?这个问题好像从小的我就有了。小时候在院子里玩耍的时候,我总是好奇地看着蓝天白云,觉得它很美,但同时也有点疑惑,既然地球是圆的,阳光照射到这里,为什么不是其他颜色呢?首先,我想可能和地球的大气层有关。地球大气层由不同的气体组成,比如氧气、氮气、水蒸气等。我听说过空气折射,可以让我们看到地平线。但是,这能解释蓝天吗?是不是这些气体在阳光下发生了什么变化?然后,我想到了散射。太阳发出的光有很多颜色,像红橙黄这些颜色被大气层中的某些分子吸收了,而蓝光可能没有被完全吸收,所以我们才会看到蓝天。但是具体是什么样的过程呢?我好像记得听说过“蓝光”的问题,大气层对蓝光特别敏感,导致太阳看起来像一个圆盘,这就是日食现象的原因。再想想,白云是因为大气中悬浮着的小水滴折射和反射阳光,形成不同的颜色。这些小水滴可能在不同高度有不同的温度,所以云彩呈现出各种颜色,比如红、黄、紫等,这就是彩云的原因。但蓝天到底是怎么回事呢?我还记得有人说过,地球大气层中的分子对光的吸收和散射有一定的规律,不同波长的光线被处理 differently。比如,太阳辐射主要包含可见光和一些无可见光,比如紫外线和红外线。蓝色的大多数光在大气层中被散射了,所以我们才能看到天空的颜色。不过,我不太确定这些解释是否完全正确。我是不是漏掉了什么?比如,是否还有其他因素影响天空的颜色,比如污染或者海市蜃楼等现象?也许我应该查阅一下相关资料,看看科学家是怎么解释这个问题的。通过了解光线在大气中的传播和吸收过程,或许能更清楚地理解为什么天空是蓝色的。总之,我的初步结论是:天空呈现蓝色主要是因为大气层对不同颜色的光线散射处理的结果,尤其是蓝光被大量散射,所以我们才会看到蓝天。不过,我还需要进一步确认这些细节,以确保理解的正确性。
</think>天空呈现蓝色主要由于地球的大气层对光的折射和散射作用,特别是对蓝色光线的高效散射。具体来说:1. **光的传播与大气层**:太阳发出的光包括多种颜色,但大气中的分子(如氧气、氮气等)会对这些光线进行折射和吸收。2. **蓝光的散射**:蓝色光波长较短,大气层中的小颗粒物特别敏感,导致大量蓝光被散射出去,使得我们看到的天空呈现蓝色。这也解释了为什么太阳看起来是一个圆盘,而不是真正的球体,这就是日食现象。3. **其他颜色的吸收**:红橙黄等颜色的光线在大气中被更多地吸收,因此它们无法到达我们的眼睛,导致我们看到的天空相对而言较为明亮。4. **云彩的形成**:白云是由于大气中的水蒸气凝结成小水滴,并因折射和反射阳光而呈现出各种颜色,如红、黄、紫等。不同高度的温度差异也导致云彩呈现不同的颜色。综上所述,天空呈蓝色是由于大气层对光线进行了特定的散射作用,尤其是对蓝光的高效处理,使得我们能够看到明亮而美丽的天空。
结构化输出
from pydantic import BaseModel, Field
from ollama import chat
import jsonclass CountryInfo(BaseModel):capital: str = Field(..., alias="首都")population: str = Field(..., alias="人口") # 修正字段名从number到populationarea: str = Field(..., alias="占地面积") response = chat(model='deepseek-r1:1.5b',messages=[{'role': 'user','content': "请介绍美国的首都、人口、占地面积信息,并以 JSON 格式返回。要求JSON的键必须使用中文名称:'首都'、'人口'、'占地面积'。"}],format="json", options={'temperature': 0},
)response_content = response["message"]["content"]if not response_content:raise ValueError("Ollama 返回的 JSON 为空")json_response = json.loads(response_content)
print("原始JSON响应:", json_response)# 验证数据是否符合CountryInfo模型
try:country_info = CountryInfo.model_validate(json_response) print("解析后的模型:", country_info)
except Exception as e:print("验证错误:", e)
原始JSON响应: {'首都': '纽约', '人口': '2.4 亿', '占地面积': '109 万平方公里'}
解析后的模型: capital='纽约' population='2.4 亿' area='109 万平方公里'
如何使用Pydantic
from pydantic import BaseModel, Field, field_validator
from typing import Optionalclass Person(BaseModel):name: strage: int = Field(frozen=True, lt=200)address: Optional[str] = Nonephones: list[str] = Field(default_factory=list)@field_validator("phones")@classmethoddef validate_phones(cls, v:list[str]) -> list[str]:for n in v:if len(n) != 11 or n[0] != '1':raise ValueError("Phone number must be 11 digits")return v
p = Person(name="Alice", age=20,phones=["12345678901"])
p2 = Person(name="Bob", age=25, address="New York")# dict to pydantic
import json
info = {"name": "Petter", "age": 24, "phones": ["13242878818"]}
print(info)info_json = json.dumps(info)
print(info_json)
p = Person(**info)
p2 = Person.model_validate_json(info_json)
print(p)
print(p2)
{'name': 'Petter', 'age': 24, 'phones': ['13242878818']}
{"name": "Petter", "age": 24, "phones": ["13242878818"]}
name='Petter' age=24 address=None phones=['13242878818']
name='Petter' age=24 address=None phones=['13242878818']