Запуск модели Ollama на языке программирования Python

Полноценный пример создания запроса к модели ИИ на языке Python

Python пример с полными параметрами

Установите зависимости:

pip install requests python-dotenv

ollama_client.py:

import requests
import json
import os
from typing import Dict, Any, List, Optional

class OllamaClient:
    def __init__(self, base_url: str = "http://localhost:11434"):
        self.base_url = base_url
        self.context = None
    
    def generate(
        self,
        prompt: str,
        model: str = "qwen3:4b",
        stream: bool = False,
        format: str = "text",
        temperature: float = 0.7,
        top_p: float = 0.9,
        top_k: int = 40,
        num_predict: int = 256,
        stop: List[str] = None,
        repeat_penalty: float = 1.1,
        presence_penalty: float = 0.0,
        frequency_penalty: float = 0.0,
        seed: int = None,
        mirostat: int = 0,
        mirostat_tau: float = 5.0,
        mirostat_eta: float = 0.1,
        num_ctx: int = 2048,
        num_thread: int = 8,
        template: str = None,
        use_context: bool = True
    ) -> Dict[str, Any]:
        """
        Генерация текста с полным набором параметров
        """
        if stop is None:
            stop = ["\n", "###"]
        
        payload = {
            "model": model,
            "prompt": prompt,
            "stream": stream,
            "format": format,
            "options": {
                "temperature": temperature,
                "top_p": top_p,
                "top_k": top_k,
                "num_predict": num_predict,
                "stop": stop,
                "repeat_penalty": repeat_penalty,
                "presence_penalty": presence_penalty,
                "frequency_penalty": frequency_penalty,
                "mirostat": mirostat,
                "mirostat_tau": mirostat_tau,
                "mirostat_eta": mirostat_eta,
                "num_ctx": num_ctx,
                "num_thread": num_thread
            }
        }
        
        # Добавляем опциональные параметры
        if seed is not None:
            payload["options"]["seed"] = seed
        
        if template:
            payload["template"] = template
        
        if use_context and self.context:
            payload["context"] = self.context
        
        try:
            response = requests.post(
                f"{self.base_url}/api/generate",
                json=payload,
                timeout=30
            )
            response.raise_for_status()
            result = response.json()
            
            # Сохраняем контекст для следующего запроса
            if use_context and "context" in result:
                self.context = result["context"]
            
            return result
            
        except requests.exceptions.RequestException as e:
            print(f"Ошибка запроса: {e}")
            return {"error": str(e)}
    
    def chat(
        self,
        messages: List[Dict[str, str]],
        model: str = "qwen3:4b",
        **kwargs
    ) -> Dict[str, Any]:
        """
        Чат-интерфейс с поддержкой истории сообщений
        """
        payload = {
            "model": model,
            "messages": messages,
            "stream": False,
            "options": kwargs.get("options", {})
        }
        
        try:
            response = requests.post(
                f"{self.base_url}/api/chat",
                json=payload,
                timeout=30
            )
            response.raise_for_status()
            return response.json()
            
        except requests.exceptions.RequestException as e:
            print(f"Ошибка чата: {e}")
            return {"error": str(e)}
    
    def clear_context(self):
        """Очистить контекст"""
        self.context = None

# Пример использования
def main():
    client = OllamaClient()
    
    # Пример 1: Простая генерация
    print("=== Пример 1: Простая генерация ===")
    result1 = client.generate(
        prompt="Расскажи о преимуществах Python для data science",
        model="qwen3:4b",
        temperature=0.7,
        top_p=0.9,
        num_predict=150,
        seed=42,
        format="text"
    )
    print("Ответ:", result1.get("response", "Ошибка"))
    
    # Пример 2: Продолжение с контекстом
    print("\n=== Пример 2: Продолжение с контекстом ===")
    result2 = client.generate(
        prompt="А какие недостатки у Python?",
        temperature=0.5,
        top_p=0.8
    )
    print("Ответ:", result2.get("response", "Ошибка"))
    
    # Пример 3: Чат с историей
    print("\n=== Пример 3: Чат-интерфейс ===")
    chat_result = client.chat(
        messages=[
            {"role": "user", "content": "Привет! Как тебя зовут?"},
            {"role": "assistant", "content": "Привет! Я помощник на основе AI."},
            {"role": "user", "content": "Расскажи о машинном обучении"}
        ],
        model="qwen3:4b",
        options={
            "temperature": 0.7,
            "top_p": 0.9
        }
    )
    print("Чат ответ:", chat_result.get("message", {}).get("content", "Ошибка"))
    
    # Пример 4: Сброс контекста
    client.clear_context()
    print("\nКонтекст очищен")

if __name__ == "__main__":
    main()

advanced_example.py - продвинутый пример:

import json
from ollama_client import OllamaClient

def advanced_example():
    client = OllamaClient()
    
    # Многошаговый диалог с сохранением контекста
    steps = [
        "Расскажи о языке программирования Go",
        "Какие у него преимущества перед Python?",
        "А недостатки какие?",
        "Напиши простой HTTP сервер на Go"
    ]
    
    for i, prompt in enumerate(steps, 1):
        print(f"\n--- Шаг {i}: {prompt} ---")
        
        result = client.generate(
            prompt=prompt,
            model="qwen3:4b",
            temperature=0.7 if i > 1 else 0.5,
            top_p=0.9,
            num_predict=200 if i < 4 else 300,
            seed=12345,
            format="text" if i < 4 else "code"
        )
        
        if "response" in result:
            print(f"Ответ: {result['response']}")
        else:
            print(f"Ошибка: {result.get('error', 'Неизвестная ошибка')}")
    
    # Сохраняем контекст в файл
    if client.context:
        with open("context.json", "w") as f:
            json.dump(client.context, f)
        print("\nКонтекст сохранен в context.json")

if __name__ == "__main__":
    advanced_example()