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']