1 - Ollama

Описание различных инструментов по использованию оболочки ollama на сервере и локальном компьютере

1.1 - Настройка запросов к моделям через Ollama

Построение различных запросов к моделям используя оболочку Ollama

Структура JSON модели для передачи на сервер OLLAMA

{
  "model": "qwen3:4b",
  "prompt": "Ваш запрос",
  "stream": false,
  "format": "json",
  "options": {
    "temperature": 0.8,
    "top_p": 0.9,
    "top_k": 40,
    "num_predict": 512,
    "stop": ["\n", "###"],
    "repeat_penalty": 1.1,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0,
    "seed": 42,
    "mirostat": 0,
    "num_ctx": 2048,
    "num_thread": 8
  },
  "template": "{{ .Prompt }}",
  "context": [1, 2, 3]
}

Описание и назначение основных параметров для управления моделями в Ollama:

1. "model": "qwen3:4b"

  • Что делает: Указывает, какую модель использовать
  • Применение: Замените на нужную модель: "llama3:8b", "mistral:7b", etc
  • Пример: "model": "llama3:8b"

2. "prompt": "Ваш запрос"

  • Что делает: Текст запроса к модели
  • Применение: Можно использовать многострочные промпты
  • Пример: "prompt": "Напиши рецепт пасты карбонара:\n"

3. "stream": false

  • Что делает: Возвращать ответ потоком или целиком
  • Применение:
    • false - весь ответ сразу (для скриптов)
    • true - потоковая передача (для UI)
  • Пример: "stream": true

4. "format": "json"

  • Что делает: Заставляет модель возвращать ответ в JSON формате
  • Применение: Полезно для структурированных данных
  • Пример: "format": "json" + "prompt": "Верни JSON с именем и возрастом"

В Ollama параметр format поддерживает несколько значений:


Параметры в options:

5. "temperature": 0.8

  • Что делает: Контролирует случайность ответов (0.0-1.0)
  • Применение:
    • 0.1 - детерминированные, повторяемые ответы
    • 0.8 - креативные, разнообразные ответы
    • 1.0 - максимальная случайность
  • Пример: "temperature": 0.3 для фактологических ответов

6. "top_p": 0.9

  • Что делает: nucleus sampling - учитывает только топ-N% вероятных слов
  • Применение:
    • 0.1 - только самые вероятные слова
    • 0.9 - более разнообразный выбор
  • Пример: "top_p": 0.7

7. "top_k": 40

  • Что делает: Ограничивает выбор только топ-K слов
  • Применение:
    • 10 - только 10 самых вероятных слов
    • 40 - хороший баланс
  • Пример: "top_k": 20

8. "num_predict": 512

  • Что делает: Максимальное количество генерируемых токенов
  • Применение:
    • 64 - короткие ответы
    • 512 - средние ответы
    • 2048 - длинные тексты
  • Пример: "num_predict": 256

9. "stop": ["\n", "###"]

  • Что делает: Символы/слова, при которых генерация останавливается
  • Применение:
    • ["\n"] - остановиться в конце строки
    • ["###", "Конец"] - кастомные стоп-слова
  • Пример: "stop": ["\n\n", "Ответ:"]

10. "repeat_penalty": 1.1

  • Что делает: Штраф за повторения (>1.0 уменьшает повторения)
  • Применение:
    • 1.0 - без штрафа
    • 1.2 - сильный штраф за повторения
  • Пример: "repeat_penalty": 1.15

11. "presence_penalty": 0.0

  • Что делает: Штраф за новые темы (положительные значения поощряют новизну)
  • Применение: -2.0 до 2.0

12. "frequency_penalty": 0.0

  • Что делает: Штраф за частые слова
  • Применение: -2.0 до 2.0

13. "seed": 42

  • Что делает: Seed для детерминированной генерации
  • Применение: Одинаковый seed = одинаковые ответы
  • Пример: "seed": 12345

14. "mirostat": 0

  • Что делает: Алгоритм контроля перплексии (0, 1, 2)
  • Применение:
    • 0 - выключено
    • 1 или 2 - для контроля качества

15. "num_ctx": 2048

  • Что делает: Размер контекстного окна
  • Применение: Зависит от модели

16. "num_thread": 8

  • Что делает: Количество потоков для вычислений
  • Применение: Обычно равно количеству ядер CPU

Дополнительные параметры:

17. "template": "{{ .Prompt }}"

  • Что делает: Шаблон для форматирования промпта
  • Применение:
    "template": "Ответь как эксперт: {{ .Prompt }}\nОтвет:"
    

18. "context": [1, 2, 3]

  • Что делает: Контекст предыдущего взаимодействия
  • Применение: Для продолжения диалога

Практические примеры настроек:

Для точных фактологических ответов:

{
  "temperature": 0.1,
  "top_p": 0.3,
  "top_k": 20,
  "repeat_penalty": 1.2
}

Для креативных текстов:

{
  "temperature": 0.9,
  "top_p": 0.95,
  "top_k": 60,
  "num_predict": 1024
}

Для детерминированных результатов:

{
  "temperature": 0.1,
  "seed": 42,
  "top_p": 0.1
}

1.2 - Пример с curl и полным набором параметров

Полноценный пример запроса с curl и полным набором параметров с учетом контекста

#!/bin/bash

# Первый запрос - получаем контекст
echo "=== Первый запрос ==="
response1=$(curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Расскажи о преимуществах языка Python",
  "stream": false,
  "format": "json",
  "options": {
    "temperature": 0.7,
    "top_p": 0.9,
    "top_k": 40,
    "num_predict": 256,
    "stop": ["\n", "###"],
    "repeat_penalty": 1.1,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0,
    "seed": 42,
    "mirostat": 2,
    "mirostat_tau": 5.0,
    "mirostat_eta": 0.1,
    "num_ctx": 2048,
    "num_thread": 8
  },
  "template": "Ответь как эксперт: {{ .Prompt }}\n\nОтвет:"
}')

# Извлекаем ответ и контекст
answer1=$(echo $response1 | jq -r '.response')
context=$(echo $response1 | jq '.context')
echo "Ответ: $answer1"
echo "Контекст получен"

# Второй запрос с контекстом
echo -e "\n=== Второй запрос с контекстом ==="
response2=$(curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "А какие у Python недостатки?",
  "context": '"$context"',
  "stream": false,
  "format": "text",
  "options": {
    "temperature": 0.5,
    "top_p": 0.8,
    "top_k": 30,
    "num_predict": 200,
    "stop": ["\n\n"],
    "repeat_penalty": 1.2,
    "seed": 123
  }
}')

answer2=$(echo $response2 | jq -r '.response')
echo "Ответ: $answer2"

1.3 - Пример из командной строки с ollama run

Полноценный пример запроса из командной строки и полным набором параметров с учетом контекста
# Создаем конфигурационный файл для первого запроса
cat > first_request.txt << 'EOF'
Расскажи о преимуществах языка Python для data science
EOF

# Первый запрос с полными параметрами через stdin
echo "=== Первый запрос ==="
response1=$(ollama run qwen3:4b --temperature 0.7 --top-p 0.9 --top-k 40 \
--num-predict 256 --seed 42 --mirostat 2 --mirostat-tau 5.0 --mirostat-eta 0.1 \
--repeat-penalty 1.1 --stop "\n" --stop "###" < first_request.txt)

echo "$response1"

# Сохраняем промпт для второго запроса
cat > second_request.txt << 'EOF'
А какие недостатки у Python для data science по сравнению с R?
EOF

# Второй запрос (Ollama run не поддерживает context напрямую, 
# поэтому используем альтернативный подход)
echo -e "\n=== Второй запрос ==="
ollama run qwen3:4b --temperature 0.5 --top-p 0.8 --top-k 30 \
--num-predict 200 --seed 123 --repeat-penalty 1.2 < second_request.txt

1.4 - Alias для zsh с конфигурационным файлом YAML

Полноценный пример создания рабочего alias для командной оболочки zsh с запросом из командной строки и полным набором параметров с подключением внешнего файла настроек yaml

Добавить настройку в ~/.zshrc:

# Alias для работы с конфигурационным файлом
alias ollama-config='func() {
    local config_file="$1"
    local prompt="$2"
    
    if [ ! -f "$config_file" ]; then
        echo "Config file $config_file not found!"
        return 1
    fi
    
    # Читаем конфигурацию из файла
    local model=$(yq eval ".model" "$config_file")
    local temperature=$(yq eval ".options.temperature" "$config_file")
    local top_p=$(yq eval ".options.top_p" "$config_file")
    local top_k=$(yq eval ".options.top_k" "$config_file")
    local num_predict=$(yq eval ".options.num_predict" "$config_file")
    local seed=$(yq eval ".options.seed" "$config_file")
    
    # Выполняем запрос
    ollama run "$model" --temperature "$temperature" --top-p "$top_p" \
    --top-k "$top_k" --num-predict "$num_predict" --seed "$seed" "$prompt"
}; func'

# Alias для JSON конфигурации
alias ollama-json='func() {
    local config_file="$1"
    local prompt="$2"
    
    if [ ! -f "$config_file" ]; then
        echo "Config file $config_file not found!"
        return 1
    fi
    
    # Используем jq для извлечения параметров
    local model=$(jq -r ".model" "$config_file")
    local temperature=$(jq -r ".options.temperature" "$config_file")
    local top_p=$(jq -r ".options.top_p" "$config_file")
    
    ollama run "$model" --temperature "$temperature" --top-p "$top_p" "$prompt"
}; func'

Конфигурационный файл ollama_config.yaml:

model: qwen3:4b
options:
  temperature: 0.7
  top_p: 0.9
  top_k: 40
  num_predict: 256
  seed: 42
  repeat_penalty: 1.1
  mirostat: 2
  mirostat_tau: 5.0
  mirostat_eta: 0.1
format: text

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

# Установите yq для работы с YAML: brew install yq
ollama-config ollama_config.yaml "Расскажи о machine learning"

# Или с JSON конфигом
ollama-json config.json "Напиши код на Python"

1.5 - Запуск модели из Ollama с конфигурационным файлом JSON

Полноценный пример создания запроса из командной строки и полным набором параметров с подключением внешнего файла настроек JSON

Командная строка с передачей JSON файла

Создаем конфигурационный файл request_config.json:

{
  "model": "qwen3:4b",
  "prompt": "Объясни концепцию искусственного интеллекта",
  "stream": false,
  "format": "markdown",
  "options": {
    "temperature": 0.7,
    "top_p": 0.9,
    "top_k": 40,
    "num_predict": 300,
    "stop": ["\n", "##"],
    "repeat_penalty": 1.1,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0,
    "seed": 424242,
    "mirostat": 2,
    "mirostat_tau": 5.0,
    "mirostat_eta": 0.1,
    "num_ctx": 2048,
    "num_thread": 8
  },
  "template": "Ответь как эксперт по AI: {{ .Prompt }}\n\n"
}

Скрипт для обработки JSON конфига:

#!/bin/bash

process_ollama_config() {
    local config_file="$1"
    
    if [ ! -f "$config_file" ]; then
        echo "Config file $config_file not found!"
        return 1
    fi
    
    # Извлекаем параметры из JSON
    local model=$(jq -r '.model' "$config_file")
    local prompt=$(jq -r '.prompt' "$config_file")
    local temperature=$(jq -r '.options.temperature' "$config_file")
    local top_p=$(jq -r '.options.top_p' "$config_file")
    local top_k=$(jq -r '.options.top_k' "$config_file")
    local num_predict=$(jq -r '.options.num_predict' "$config_file")
    local seed=$(jq -r '.options.seed' "$config_file")
    local repeat_penalty=$(jq -r '.options.repeat_penalty' "$config_file")
    
    # Строим команду ollama run
    local command="ollama run '$model' --temperature $temperature --top-p $top_p --top-k $top_k --num-predict $num_predict --seed $seed --repeat-penalty $repeat_penalty"
    
    # Добавляем stop слова если они есть
    local stop_words=$(jq -r '.options.stop[]?' "$config_file" 2>/dev/null)
    if [ -n "$stop_words" ]; then
        while IFS= read -r word; do
            command+=" --stop \"$word\""
        done <<< "$stop_words"
    fi
    
    # Добавляем промпт
    command+=" \"$prompt\""
    
    echo "Выполняем команду: $command"
    eval "$command"
}

# Использование
process_ollama_config "request_config.json"

Альтернативный вариант с прямым использованием curl:

#!/bin/bash

# Прямое использование JSON конфига с curl
curl -s http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d "$(cat request_config.json)" \
  | jq -r '.response'

1.6 - Запуск модели из Ollama с конфигурационным файлом JSON и контекстом

Полноценный пример создания запроса из командной строки и полным набором параметров с подключением внешнего файла настроек JSON с контекстом

Продвинутый пример с контекстом и многошаговым диалогом

Создаем скрипт advanced_dialog.sh:

#!/bin/bash

CONFIG_FILE="dialog_config.json"
CONTEXT_FILE="context.json"

# Функция для отправки запроса
send_request() {
    local prompt="$1"
    local context="${2:-null}"
    
    local request_data=$(jq --arg prompt "$prompt" --argjson context "$context" '
    {
        model: .model,
        prompt: $prompt,
        stream: false,
        format: .format,
        options: .options,
        template: .template,
        context: $context
    }' "$CONFIG_FILE")
    
    curl -s http://localhost:11434/api/generate \
        -H "Content-Type: application/json" \
        -d "$request_data"
}

# Основной диалог
echo "🤖 Начинаем диалог с AI"

# Шаг 1
echo "👤: Расскажи о Python"
response1=$(send_request "Расскажи о Python")
answer1=$(echo $response1 | jq -r '.response')
context=$(echo $response1 | jq '.context')
echo "🤖: $answer1"

# Сохраняем контекст
echo "$context" > "$CONTEXT_FILE"

# Шаг 2 с контекстом
echo -e "\n👤: А какие у него недостатки?"
response2=$(send_request "А какие у него недостатки?" "$(cat $CONTEXT_FILE)")
answer2=$(echo $response2 | jq -r '.response')
echo "🤖: $answer2"

# Обновляем контекст
echo "$(echo $response2 | jq '.context')" > "$CONTEXT_FILE"

# Шаг 3
echo -e "\n👤: Что посоветуешь для изучения?"
response3=$(send_request "Что посоветуешь для изучения?" "$(cat $CONTEXT_FILE)")
answer3=$(echo $response3 | jq -r '.response')
echo "🤖: $answer3"

Конфигурационный файл dialog_config.json:

{
  "model": "qwen3:4b",
  "format": "text",
  "template": "Ответь дружелюбно и подробно: {{ .Prompt }}\n\n",
  "options": {
    "temperature": 0.7,
    "top_p": 0.9,
    "top_k": 40,
    "num_predict": 200,
    "stop": ["\n\n", "###"],
    "repeat_penalty": 1.1,
    "seed": 12345,
    "mirostat": 1,
    "mirostat_tau": 5.0,
    "mirostat_eta": 0.1
  }
}

Запуск:

chmod +x advanced_dialog.sh
./advanced_dialog.sh

1.7 - Запуск модели Ollama с конфигурационным файлом JSON из NODE.JS

Полноценный пример создания запроса из NODE.JS с подключением внешнего файла настроек JSON

JavaScript/Node.js пример с полными параметрами

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

npm init -y
npm install axios

ollama-client.js:

const axios = require('axios');

class OllamaClient {
    constructor(baseURL = 'http://localhost:11434') {
        this.baseURL = baseURL;
        this.context = null;
    }

    /**
     * Генерация текста с полным набором параметров
     */
    async generate({
        prompt,
        model = 'qwen3:4b',
        stream = false,
        format = 'text',
        temperature = 0.7,
        top_p = 0.9,
        top_k = 40,
        num_predict = 256,
        stop = ['\n', '###'],
        repeat_penalty = 1.1,
        presence_penalty = 0.0,
        frequency_penalty = 0.0,
        seed = null,
        mirostat = 0,
        mirostat_tau = 5.0,
        mirostat_eta = 0.1,
        num_ctx = 2048,
        num_thread = 8,
        template = null,
        useContext = true
    }) {
        const payload = {
            model,
            prompt,
            stream,
            format,
            options: {
                temperature,
                top_p,
                top_k,
                num_predict,
                stop,
                repeat_penalty,
                presence_penalty,
                frequency_penalty,
                mirostat,
                mirostat_tau,
                mirostat_eta,
                num_ctx,
                num_thread
            }
        };

        // Добавляем опциональные параметры
        if (seed !== null) {
            payload.options.seed = seed;
        }

        if (template) {
            payload.template = template;
        }

        if (useContext && this.context) {
            payload.context = this.context;
        }

        try {
            const response = await axios.post(`${this.baseURL}/api/generate`, payload, {
                timeout: 30000
            });

            // Сохраняем контекст для следующего запроса
            if (useContext && response.data.context) {
                this.context = response.data.context;
            }

            return response.data;

        } catch (error) {
            console.error('Ошибка запроса:', error.message);
            return { error: error.message };
        }
    }

    /**
     * Чат-интерфейс с поддержкой истории
     */
    async chat(messages, model = 'qwen3:4b', options = {}) {
        try {
            const response = await axios.post(`${this.baseURL}/api/chat`, {
                model,
                messages,
                stream: false,
                options
            }, {
                timeout: 30000
            });

            return response.data;

        } catch (error) {
            console.error('Ошибка чата:', error.message);
            return { error: error.message };
        }
    }

    /**
     * Очистить контекст
     */
    clearContext() {
        this.context = null;
    }

    /**
     * Сохранить контекст в файл
     */
    async saveContext(filename) {
        const fs = require('fs').promises;
        try {
            await fs.writeFile(filename, JSON.stringify(this.context, null, 2));
            console.log(`Контекст сохранен в ${filename}`);
        } catch (error) {
            console.error('Ошибка сохранения контекста:', error.message);
        }
    }

    /**
     * Загрузить контекст из файла
     */
    async loadContext(filename) {
        const fs = require('fs').promises;
        try {
            const data = await fs.readFile(filename, 'utf8');
            this.context = JSON.parse(data);
            console.log(`Контекст загружен из ${filename}`);
        } catch (error) {
            console.error('Ошибка загрузки контекста:', error.message);
        }
    }
}

// Пример использования
async function main() {
    const client = new OllamaClient();

    // Пример 1: Простая генерация
    console.log('=== Пример 1: Простая генерация ===');
    const result1 = await client.generate({
        prompt: 'Расскажи о JavaScript и его особенностях',
        model: 'qwen3:4b',
        temperature: 0.7,
        top_p: 0.9,
        num_predict: 200,
        seed: 42,
        format: 'text'
    });

    console.log('Ответ:', result1.response || result1.error);

    // Пример 2: Продолжение с контекстом
    console.log('\n=== Пример 2: Продолжение с контекстом ===');
    const result2 = await client.generate({
        prompt: 'А какие современные фреймворки используются?',
        temperature: 0.5,
        top_p: 0.8
    });

    console.log('Ответ:', result2.response || result2.error);

    // Пример 3: Чат с историей
    console.log('\n=== Пример 3: Чат-интерфейс ===');
    const chatResult = await client.chat([
        { role: 'user', content: 'Привет! Расскажи о Node.js' },
        { role: 'assistant', content: 'Node.js - это JavaScript runtime...' },
        { role: 'user', content: 'Какие пакеты самые популярные?' }
    ], 'qwen3:4b', {
        temperature: 0.6,
        top_p: 0.85
    });

    console.log('Чат ответ:', chatResult.message?.content || chatResult.error);

    // Пример 4: Сохранение и загрузка контекста
    await client.saveContext('context.json');
    client.clearContext();
    await client.loadContext('context.json');

    // Пример 5: Генерация кода с специфическими параметрами
    console.log('\n=== Пример 5: Генерация кода ===');
    const codeResult = await client.generate({
        prompt: 'Напиши простой HTTP сервер на Node.js',
        temperature: 0.3,
        top_p: 0.7,
        num_predict: 300,
        seed: 12345,
        format: 'code',
        stop: ['```']
    });

    console.log('Сгенерированный код:');
    console.log(codeResult.response || codeResult.error);
}

// Запуск примера
main().catch(console.error);

package.json для JavaScript:

{
  "name": "ollama-client",
  "version": "1.0.0",
  "description": "Ollama client with full parameters support",
  "main": "ollama-client.js",
  "scripts": {
    "start": "node ollama-client.js",
    "dev": "node ollama-client.js"
  },
  "dependencies": {
    "axios": "^1.6.0"
  },
  "keywords": ["ollama", "ai", "llm", "javascript"],
  "author": "Your Name",
  "license": "MIT"
}

1.8 - Запуск модели Ollama на языке Go

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

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

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

go mod init ollama-client
go get github.com/valyala/fasthttp

main.go:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"strings"
	"time"
	
	"github.com/valyala/fasthttp"
)

type OllamaOptions struct {
	Temperature      float32  `json:"temperature"`
	TopP             float32  `json:"top_p"`
	TopK             int      `json:"top_k"`
	NumPredict       int      `json:"num_predict"`
	Stop             []string `json:"stop"`
	RepeatPenalty    float32  `json:"repeat_penalty"`
	PresencePenalty  float32  `json:"presence_penalty"`
	FrequencyPenalty float32  `json:"frequency_penalty"`
	Seed             int64    `json:"seed,omitempty"`
	Mirostat         int      `json:"mirostat"`
	MirostatTau      float32  `json:"mirostat_tau"`
	MirostatEta      float32  `json:"mirostat_eta"`
	NumCtx           int      `json:"num_ctx"`
	NumThread        int      `json:"num_thread"`
}

type OllamaRequest struct {
	Model    string       `json:"model"`
	Prompt   string       `json:"prompt"`
	Stream   bool         `json:"stream"`
	Format   string       `json:"format,omitempty"`
	Options  OllamaOptions `json:"options"`
	Template string       `json:"template,omitempty"`
	Context  []int        `json:"context,omitempty"`
}

type OllamaResponse struct {
	Model     string `json:"model"`
	Response  string `json:"response"`
	Context   []int  `json:"context,omitempty"`
	Done      bool   `json:"done"`
	Error     string `json:"error,omitempty"`
}

type OllamaClient struct {
	BaseURL string
	Context []int
}

func NewOllamaClient(baseURL string) *OllamaClient {
	if baseURL == "" {
		baseURL = "http://localhost:11434"
	}
	return &OllamaClient{BaseURL: baseURL}
}

func (c *OllamaClient) Generate(prompt string, options OllamaOptions) (OllamaResponse, error) {
	request := OllamaRequest{
		Model:   "qwen3:4b",
		Prompt:  prompt,
		Stream:  false,
		Format:  "text",
		Options: options,
	}
	
	if len(c.Context) > 0 {
		request.Context = c.Context
	}
	
	requestBody, err := json.Marshal(request)
	if err != nil {
		return OllamaResponse{}, err
	}
	
	req := fasthttp.AcquireRequest()
	defer fasthttp.ReleaseRequest(req)
	
	req.SetRequestURI(c.BaseURL + "/api/generate")
	req.Header.SetMethod("POST")
	req.Header.SetContentType("application/json")
	req.SetBody(requestBody)
	
	resp := fasthttp.AcquireResponse()
	defer fasthttp.ReleaseResponse(resp)
	
	client := &fasthttp.Client{
		ReadTimeout: 30 * time.Second,
	}
	
	if err := client.Do(req, resp); err != nil {
		return OllamaResponse{}, err
	}
	
	var response OllamaResponse
	if err := json.Unmarshal(resp.Body(), &response); err != nil {
		return OllamaResponse{}, err
	}
	
	// Сохраняем контекст для следующих запросов
	if response.Context != nil {
		c.Context = response.Context
	}
	
	return response, nil
}

func (c *OllamaClient) ClearContext() {
	c.Context = nil
}

func main() {
	client := NewOllamaClient("")
	
	// Пример 1: Простая генерация
	options1 := OllamaOptions{
		Temperature:    0.7,
		TopP:           0.9,
		TopK:           40,
		NumPredict:     200,
		Stop:           []string{"\n", "###"},
		RepeatPenalty:  1.1,
		Seed:           42,
		Mirostat:       2,
		MirostatTau:    5.0,
		MirostatEta:    0.1,
	}
	
	fmt.Println("=== Пример 1: Простая генерация ===")
	response1, err := client.Generate("Расскажи о Go языке программирования", options1)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Ответ: %s\n", response1.Response)
	
	// Пример 2: Продолжение с контекстом
	options2 := OllamaOptions{
		Temperature:   0.5,
		TopP:          0.8,
		TopK:          30,
		NumPredict:    150,
		RepeatPenalty: 1.2,
	}
	
	fmt.Println("\n=== Пример 2: Продолжение с контекстом ===")
	response2, err := client.Generate("Какие у него преимущества?", options2)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Ответ: %s\n", response2.Response)
	
	// Пример 3: Генерация кода
	options3 := OllamaOptions{
		Temperature:  0.3,
		TopP:         0.7,
		NumPredict:   300,
		Seed:         12345,
	}
	
	fmt.Println("\n=== Пример 3: Генерация кода ===")
	response3, err := client.Generate("Напиши HTTP сервер на Go", options3)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Код: %s\n", response3.Response)
	
	// Очищаем контекст
	client.ClearContext()
	fmt.Println("\nКонтекст очищен")
}

1.9 - Запуск модели 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()