Использование API Ollama в Python

В этой статье мы кратко объясним, как использовать Оллама Хотите ли вы просто общаться в чате, работать с большими данными, используя потоковые ответы, или создавать, копировать, удалять и т. д. модели локально - эта статья поможет вам. Кроме того, мы покажем, как использовать пользовательские клиенты и асинхронное программирование для оптимизации производительности вашего приложения. Независимо от того, новичок вы в Ollama или опытный разработчик, эта статья поможет вам более эффективно использовать Ollama API на Python.

В этом учебном пособии также представлен Блокнот Jupyter Примеры, чтобы стать лучше.

 

Подготовка к защите окружающей среды

Прежде чем начать использовать Python для взаимодействия с API Ollama, убедитесь, что ваша среда разработки соответствует следующим условиям:

  • Python: установите Python 3.8 или более позднюю версию.
  • pip: Убедитесь, что у вас установлен pip, инструмент управления пакетами Python.
  • Библиотека ollama: используется для облегчения взаимодействия с API Ollama. Команда установки выглядит следующим образом:
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)

 

Структурированный вывод

  • Нормальный вывод (неструктурированный вывод)
    • Прямая генерация текста на естественном языке.
    • Подходит для чтения человеком, но не для программного разбора или автоматизированной обработки.
    • Пример:
      这是一只黑色的小猫,它正在草地上玩耍。
      
  • Структурированный вывод
    • Возвращает данные в форматах JSON, YAML, XML или других, чтобы машинам было проще их анализировать и использовать.
    • Идеально подходит для API, автоматизированных рабочих процессов и хранения данных.
    • Пример:
      {
      "description": "这是一只黑色的小猫",
      "activity": "正在草地上玩耍"
      }
      

Преимущества структурированного вывода

(1) Простота в обращении

  • Машина легко извлекает такие специфические поля, как description возможно activity НЛП - это новый способ разбора обычного текста, не требующий использования НЛП.

(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 мы рекомендуем Руководство пользователя API Ollama.

чаты

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.

Клиент синхронизации

Используется клиент синхронизации (Client) означает, что когда вы вызываете client.chat() программа будет ждать завершения запроса и возвращать результат, прежде чем продолжить выполнение последующего кода. Этот подход более интуитивен и прост и подходит для написания приложений, которые имеют более линейный поток и не нуждаются в обработке большого количества параллельных задач.

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)

Асинхронный клиент

Этот код использует асинхронный клиент (AsyncClient) и определяет асинхронную функцию chat() . С помощью ключевого слова await можно приостановить выполнение функции до тех пор, пока не будет выполнено условие AsyncClient().chat() запрос завершается, но при этом не блокирует другие операции. Это полезно для эффективной обработки I/O операций (например, сетевых запросов) или для приложений, которые хотят выполнять несколько задач одновременно. Кроме того, использование asyncio.run(chat()) чтобы запустить эту асинхронную функцию.

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())

Сравнительный тест потребления времени синхронным и асинхронным клиентом при разном количестве вызовов

Следующий фрагмент кода вызывает синхронный и асинхронный повторы клиента соответственно test_num Пользователь может изменить следующие параметры теста, чтобы сравнить общее время, необходимое для прохождения теста, и время, необходимое для одного сеанса:

  • test_messages: тестовые данные
  • test_num: количество тестов
  • имя_модели: тестовая модель
import time
import asyncio
from ollama import Client, AsyncClient
import nest_asyncio
# 应用nest_asyncio以支持Jupyter中的异步操作
nest_asyncio.apply()
# 初始化客户端
client = Client(host='http://localhost:11434')
async_client = AsyncClient(host='http://localhost:11434')
# 同步请求处理函数
def request_example(client, model_name, messages):
start_time = time.time()
try:
# 同步请求返回
response = client.chat(model=model_name, messages=messages)
except Exception as e:
print(f"同步请求失败: {e}")
response = None
end_time = time.time()
duration = end_time - start_time
print(f"同步请求时间: {duration}")
return response, duration
# 异步请求处理函数
async def async_request_example(client, model_name, messages):
start_time = time.time()
try:
# 异步请求返回
response = await client.chat(model=model_name, messages=messages)
except Exception as e:
print(f"异步请求失败: {e}")
response = None
end_time = time.time()
duration = end_time - start_time
print(f"异步请求时间: {duration}")
return response, duration
# 异步请求测试函数
async def async_client_test(test_num, model_name, messages):
tasks = [asyncio.create_task(async_request_example(async_client, model_name, messages)) 
for _ in range(test_num)]
results= await asyncio.gather(*tasks)
return results
# 运行同步测试
def sync_test(model_name, messages, test_num):
total_time = 0
for i in range(test_num):
_, duration = request_example(client, model_name, messages)
total_time += duration
return total_time / test_num
# 运行异步测试
async def async_test(model_name, messages, test_num):
start_time = time.time()
await async_client_test(test_num, model_name, messages)
end_time = time.time()
return (end_time - start_time) / test_num
# 准备测试数据
test_messages = [{'role': 'user', 'content': '为什么天空是蓝色的?'}]
test_num = 10
model_name = 'llama3.1'
# 运行同步测试并输出结果
print("运行同步测试")
sync_avg_time = sync_test(model_name, test_messages, test_num)
print(f"同步测试平均时间: {sync_avg_time:.2f} 秒")
# 运行异步测试并输出结果
print("运行异步测试")
async_avg_time = asyncio.run(async_test(model_name, test_messages, test_num))
print(f"异步测试平均时间: {async_avg_time:.2f} 秒")

 

неправильный

Ошибка возникает, если запрос возвращает статус ошибки или ошибка обнаружена во время потоковой передачи.

import ollama
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)

 

Обратитесь к документации:Олламский питон

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...