Python中使用Ollama API
在 Python 中使用 Ollama API
本文介绍如何在 Python 中使用 Ollama API。无论你是想进行简单的聊天对话、使用流式响应处理大数据、还是希望在本地进行模型的创建、复制、删除等操作,本文都可以为你提供指导。此外,我们还展示了如何使用自定义客户端和异步编程来优化你的应用程序性能,无论你是 Ollama 的新手还是经验丰富的开发者,本文都能帮助你在 Python 中更高效地使用 Ollama API。
环境准备
在开始使用 Python 与 Ollama API 交互之前,请确保您的开发环境满足以下条件:
pip install ollama
使用方法
from ollama import chat
from ollama import ChatResponse
response: ChatResponse = chat(model='llama3.1', messages=[
{
'role': 'user',
'content': '为什么天空是蓝色的?',
},
])
print(response['message']['content'])
print(response.message.content)
流式响应
可以通过设置 stream=True
启用响应流,使函数调用返回一个 Python 生成器,其中每个部分都是流中的一个对象。
from ollama import chat
stream = chat(
model='llama3.1',
messages=[{'role': 'user', 'content': '为什么天空是蓝色的?'}],
stream=True,
)
for chunk in stream:
print(chunk['message']['content'], end='', flush=True)
结构化输出
普通输出(Unstructured Output)
这是一只黑色的小猫,它正在草地上玩耍。
结构化输出(Structured Output)
{
"description": "这是一只黑色的小猫",
"activity": "正在草地上玩耍"
}
结构化输出的优势
(1)便于处理
description
或 activity
,而无需 NLP 解析普通文本。(2)提高可控性
{
"language": "Python",
"code": "print('Hello, World!')"
}
(3)便于存储与分析
{
"date": "2025-01-20",
"summary": "今天的销售额增长了10%。"
}
from pydantic import BaseModel, Field
from ollama import chat
import json
class CountryInfo(BaseModel):
capital: str = Field(..., alias="首都")
number: str = Field(..., alias="人口")
area: str = Field(..., alias="占地面积")
response = chat(
model='llama3.1',
messages=[{
'role': 'user',
'content': "请介绍美国的首都、人口、占地面积信息,并以 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_response)
friends_response = CountryInfo.model_validate(json_response)
print(friends_response)
API
Ollama Python 库提供了丰富的接口,简化了与 Ollama 的交互。这些接口设计直观,易于集成,旨在帮助开发者更便捷地调用和管理模型。如果你想了解更详细的底层实现和完整的 API 端点信息。
聊天
ollama.chat(model='llama3.1', messages=[{'role': 'user', 'content': '为什么天空是蓝色的?'}])
生成
ollama.generate(model='llama3.1', prompt='为什么天空是蓝色的?')
本地模型列表
ollama.list()
显示模型信息
ollama.show('llama3.1')
创建模型
modelfile='''
FROM llama3.1
SYSTEM 你是大语言模型专家小蜜蜂。
'''
ollama.create(model='example', modelfile=modelfile)
复制模型
ollama.copy('llama3.1', 'user/llama3.1')
删除模型
ollama.delete('llama3.1')
拉取模型
ollama.pull('llama3.1')
推送模型
ollama.push('user/llama3.1')
生成嵌入
ollama.embeddings(model='llama3.1', prompt='天空是蓝色的因为瑞利散射')
# 批量生成embedding
ollama.embed(model='llama3.1', input=['天空是蓝色的', '草是绿色的'])
进程
ollama.ps()
自定义客户端
可以通过通过 ollama
实例化 Client
或 AsyncClient
来创建自定义客户端。
可以使用以下字段创建自定义客户端:
host
: 要连接的 Ollama 主机timeout
: 请求超时时间所有关键字参数参见httpx.Client
.
from ollama import Client
client = Client(
host='http://localhost:11434',
headers={'x-some-header': 'some-value'}
)
response = client.chat(model='llama3.1', messages=[
{
'role': 'user',
'content': '为什么天空是蓝色的?',
},
])
print(response)
异步客户端
import asyncio
from ollama import AsyncClient
import nest_asyncio
nest_asyncio.apply()
async def chat():
message = {'role': 'user', 'content': '为什么天空是蓝色的?'}
response = await AsyncClient().chat(model='llama3.1', messages=[message])
print(response)
asyncio.run(chat())
设置 stream=True
修改函数以返回 Python 异步生成器:
import asyncio
from ollama import AsyncClient
import nest_asyncio
nest_asyncio.apply()
async def chat():
message = {'role': 'user', 'content': '为什么天空是蓝色的?'}
async for part in await AsyncClient().chat(model='llama3.1', messages=[message], stream=True):
print(part['message']['content'], end='', flush=True)
asyncio.run(chat())
错误
如果请求返回错误状态或在流式传输时检测到错误,则会引发错误。
model = 'does-not-yet-exist'
try:
ollama.chat(model)
except ollama.ResponseError as e:
print('错误:', e.error)
if e.status_code == 404:
ollama.pull(model)
作者:goomind