Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.
Искусственный интеллект
- 1: Ollama
 - 1.1: Настройка запросов к моделям через Ollama
 - 1.2: Пример с curl и полным набором параметров
 - 1.3: Пример из командной строки с ollama run
 - 1.4: Alias для zsh с конфигурационным файлом YAML
 - 1.5: Запуск модели из Ollama с конфигурационным файлом JSON
 - 1.6: Запуск модели из Ollama с конфигурационным файлом JSON и контекстом
 - 1.7: Запуск модели Ollama с конфигурационным файлом JSON из NODE.JS
 - 1.8: Запуск модели Ollama на языке Go
 - 1.9: Запуск модели Ollama на языке программирования Python
 
1 - Ollama
1.1 - Настройка запросов к моделям через 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 поддерживает несколько значений:
Толкование
Поддерживаемые форматы
1. "format": "json"
- Описание: Заставляет модель возвращать ответ в валидном JSON формате
 - Пример промпта: 
"Верни JSON: {\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}" - Пример вывода: 
{"name": "John", "age": 30} 
2. "format": "text" (по умолчанию)
- Описание: Обычный текстовый ответ без специального форматирования
 - Пример промпта: 
"Расскажи о космосе" - Пример вывода: 
"Космос - это бескрайнее пространство..." 
3. "format": "markdown"
- Описание: Ответ в формате Markdown
 - Пример промпта: 
"Напиши документацию в markdown" - Пример вывода:
# Заголовок - Список **Жирный текст** 
4. "format": "html"
- Описание: Ответ в HTML формате
 - Пример промпта: 
"Создай HTML страницу" - Пример вывода: 
<html><body><h1>Заголовок</h1></body></html> 
5. "format": "xml"
- Описание: Ответ в XML формате
 - Пример промпта: 
"Верни данные в XML" - Пример вывода: 
<data><name>John</name><age>30</age></data> 
6. "format": "yaml"
- Описание: Ответ в YAML формате
 - Пример промпта: 
"Верни конфигурацию в YAML" - Пример вывода:
name: John age: 30 
7. "format": "csv"
- Описание: Ответ в CSV формате
 - Пример промпта: 
"Верни данные в CSV" - Пример вывода: 
name,age\nJohn,30\nJane,25 
8. "format": "code"
- Описание: Для генерации кода (поддерживает подсветку синтаксиса)
 - Пример промпта: 
"Напиши функцию на Python" - Пример вывода:
def hello(): return "Hello World" 
Практические примеры:
JSON запрос:
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Верни JSON с информацией о пользователе: имя, возраст, город",
  "format": "json",
  "stream": false
}'
Markdown запрос:
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b", 
  "prompt": "Напиши руководство по Git в markdown",
  "format": "markdown",
  "stream": false
}'
HTML запрос:
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Создай простую HTML страницу с заголовком и параграфом",
  "format": "html", 
  "stream": false
}'
Важные замечания:
- Не все модели одинаково хорошо поддерживают все форматы
 - Формат - это указание модели, а не гарантия
 - Лучше всего работают JSON и text
 - Для сложных форматов лучше явно указывать в промпте
 
Комбинирование с промптом:
# Более надежный способ
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Верни ответ в формате JSON: {\"name\": \"string\", \"age\": number}",
  "format": "json",
  "stream": false
}'
Большинство моделей лучше всего работают с json и text форматами.
Параметры в 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 
Толкование
Подробное объяснение top_p и top_k
top_p (также known as nucleus sampling) - это алгоритм выборки, который ограничивает генерацию только теми словами, кумулятивная вероятность которых попадает в верхние P% распределения.
Как это работает:
- Сортировка вероятностей: Модель ранжирует все возможные следующие слова по вероятности
 - Кумулятивная сумма: Складывает вероятности от самой высокой к самой низкой
 - Выбор ядра: Берет только те слова, чья кумулятивная сумма ≤ 
top_p - Перераспределение вероятностей: Нормализует вероятности выбранных слов
 
Математическая формула:
Выбрать множество V таких что: ∑(p(x) для x в V) ≥ p
где p = значение top_p (0.0-1.0)
Практические примеры:
Пример 1: top_p = 0.3 (очень строгий)
Возможные слова: 
- "кот" (p=0.25)
- "собака" (p=0.20) 
- "птица" (p=0.15)
- "рыба" (p=0.10)
- ... остальные (сумма p=0.30)
Выбор: только "кот" (0.25 ≤ 0.3)
Пример 2: top_p = 0.6 (умеренный)
Выбор: "кот" + "собака" + "птица" (0.25+0.20+0.15=0.6)
Пример 3: top_p = 0.9 (либеральный)
Выбор: почти все вероятные слова кроме самых маловероятных
Сравнение с top_k:
| Параметр | Что делает | Преимущества | Недостатки | 
|---|---|---|---|
top_p | 
          Динамический выбор вероятностей | Автоматически адаптируется к распределению | Может быть непредсказуемым | 
top_k | 
          Фиксированное количество слов | Предсказуемость | Не учитывает распределение вероятностей | 
Рекомендации по использованию:
Для точных ответов:
{
  "top_p": 0.3,
  "temperature": 0.1,
  "top_k": 20
}
- Фактологические ответы
 - Техническая документация
 - Код генерация
 
Для творческих текстов:
{
  "top_p": 0.9, 
  "temperature": 0.8,
  "top_k": 60
}
- Поэзия
 - Художественные тексты
 - Креативные идеи
 
Для баланса:
{
  "top_p": 0.7,
  "temperature": 0.5,
  "top_k": 40
}
- Диалоги
 - Общие вопросы
 - Аналитические тексты
 
Практические примеры запросов:
1. Строгий режим (top_p = 0.3)
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Столица Франции это",
  "top_p": 0.3,
  "temperature": 0.1,
  "stream": false
}'
Результат: “Париж” (максимально точный ответ)
2. Творческий режим (top_p = 0.9)
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b", 
  "prompt": "Опиши закат на море",
  "top_p": 0.9,
  "temperature": 0.8,
  "stream": false
}'
Результат: Развернутое художественное описание
3. Комбинирование с другими параметрами
{
  "top_p": 0.7,
  "top_k": 50,
  "temperature": 0.6,
  "repeat_penalty": 1.1
}
Частые ошибки:
Слишком низкий top_p:
{"top_p": 0.1}  # Может приводить к зацикливанию
Слишком высокий top_p:
{"top_p": 0.99}  # Почти не фильтрует, может включать nonsense
Конфликт с temperature:
{"top_p": 0.3, "temperature": 0.9}  # Противоречивые настройки
Золотые правила:
top_pиtemperatureдолжны быть согласованы- Низкий top_p + низкая temperature = точность
 - Высокий top_p + высокая temperature = креативность
 - Тестируйте разные значения для вашей задачи
 
Оптимальные значения для большинства задач: top_p: 0.7-0.9
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 
Толкование
Подробное объяснение SEED
Seed (сид) - это начальное значение для генератора псевдослучайных чисел. В контексте LLM это означает, что при одинаковых:
- Модели
 - Промпте
 - Параметрах
 - И одинаковом seed
 
Вы получите идентичный результат каждый раз.
Как это работает технически:
- Инициализация: 
seed = 42 - Детерминированность: Генератор случайных чисел начинает с одинаковой точки
 - Воспроизводимость: Все “случайные” выборы становятся предсказуемыми
 - Идентичный результат: Токен за токеном одинаковый вывод
 
Практические примеры:
Пример 1: Детерминированная генерация
# Первый запуск
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Напиши короткое стихотворение о весне",
  "seed": 42,
  "stream": false
}'
# Второй запуск (ТОЧНО такой же результат)
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Напиши короткое стихотворение о весне", 
  "seed": 42,
  "stream": false
}'
Пример 2: Разные seed = разные результаты
# Seed 42
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Придумай название для кофе",
  "seed": 42,
  "stream": false
}'
# Результат: "Утренняя свежесть"
# Seed 43 (немного другой)
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Придумай название для кофе",
  "seed": 43, 
  "stream": false
}'
# Результат: "Золотой эспрессо"
Ключевые особенности:
1. Полная детерминированность
{
  "seed": 123,
  "temperature": 0.1,  // Должен быть низким!
  "top_p": 0.3        // Должен быть низким!
}
- ✅ Работает с низкой temperature
 - ✅ Работает с низким top_p
 - ❌ Не работает с высокой temperature
 
2. Зависимость от всех параметров
# Изменится ЛЮБОЙ параметр → изменится результат
seed=42 + prompt="A" ≠ seed=42 + prompt="A "
3. Постоянство между запусками
# Сегодня
seed=42 → "Ответ А"
# Завтра  
seed=42 → "Ответ А" (тот же самый)
# После перезагрузки
seed=42 → "Ответ А" (все равно тот же)
Практическое применение:
1. Тестирование и отладка
# Тестирование изменений промпта
seed=42 + prompt="Версия 1" → Результат А
seed=42 + prompt="Версия 2" → Результат Б
# Можно точно сравнить улучшения
2. Воспроизведение результатов
# Найден хороший результат → сохраняем seed
curl ... -d '{
  "prompt": "Креативное название",
  "seed": 78901,  # ← ЗАПОМНИТЬ ЭТОТ SEED
  "temperature": 0.3
}'
# Результат: "Небесный аромат" (сохраняем для производства)
3. A/B тестирование моделей
# Сравнение моделей на одинаковых данных
seed=42 + model="qwen3:4b" → Результат А
seed=42 + model="llama3:8b" → Результат Б
# Честное сравнение без случайности
4. Обучение и демонстрации
# Демо для клиента - всегда одинаковый результат
seed=12345 → "Ваш идеальный бизнес-план..."
Важные ограничения:
1. Temperature должен быть низким
{
  "seed": 42,
  "temperature": 0.9,  // ❌ Высокая randomness
  "top_p": 0.9         // ❌ Высокая randomness
}
// Результат НЕ будет детерминированным!
2. Оптимальные настройки для детерминированности
{
  "seed": 42,
  "temperature": 0.1,      // ✅ Низкая случайность
  "top_p": 0.3,           // ✅ Строгая выборка
  "top_k": 20,            // ✅ Ограниченный выбор
  "repeat_penalty": 1.1   // ✅ Предсказуемость
}
3. Зависит от версии модели
# Модель обновилась → результаты могут измениться
seed=42 + model=v1.0 → Результат А
seed=42 + model=v1.1 → Результат Б (может отличаться)
Практические примеры настроек:
Для детерминированного кода:
{
  "seed": 12345,
  "temperature": 0.1,
  "top_p": 0.2,
  "top_k": 10,
  "prompt": "Напиши функцию на Python для сложения чисел"
}
Для воспроизводимых аналитических ответов:
{
  "seed": 67890,
  "temperature": 0.2, 
  "top_p": 0.4,
  "prompt": "Проанализируй преимущества технологии блокчейн"
}
Для тестирования промптов:
{
  "seed": 11111,
  "temperature": 0.1,
  "prompt": "Версия 1 промпта..."
}
// Меняем только промпт, сохраняем seed
Как выбрать хороший seed?
# Любое целое число
"seed": 42
"seed": 1234567890
"seed": 999888777
# Но лучше избегать:
"seed": 0          # Иногда особый случай
"seed": 1          # Слишком простой
"seed": 123456     # Нормально
Пример полного workflow:
- Экспериментируем без seed, находим хорошие параметры
 - Фиксируем параметры и промпт
 - Добавляем 
"seed": 12345для воспроизводимости - Сохраняем конфигурацию для production
 
{
  "model": "qwen3:4b",
  "prompt": "Генерируй креативные названия для кофе",
  "seed": 424242,
  "temperature": 0.3,
  "top_p": 0.6,
  "top_k": 30,
  "num_predict": 50
}
Seed - это мощный инструмент для обеспечения воспроизводимости и отладки LLM приложений!
14. "mirostat": 0
- Что делает: Алгоритм контроля перплексии (0, 1, 2)
 - Применение:
0- выключено1или2- для контроля качества
 
Толкование
Подробное объяснение MIROSTAT
Mirostat - это алгоритм контроля качества текста, который динамически регулирует параметры генерации чтобы поддерживать заданный уровень перплексии (сложности/предсказуемости текста).
Как это работает:
Mirostat постоянно измеряет перплексию генерируемого текста и подстраивает параметры в реальном времени чтобы достичь целевого значения.
Аналогия:
Представьте круиз-контроль в автомобиле:
- Без mirostat: Вы сами управляете газом/тормозом
 - С mirostat: Автоматически поддерживает заданную скорость
 
Режимы работы:
"mirostat": 0 - Выключено
{"mirostat": 0}
- Обычная генерация
 - Без контроля качества
 - По умолчанию
 
"mirostat": 1 - Mirostat 1.0
{
  "mirostat": 1,
  "mirostat_tau": 5.0,
  "mirostat_eta": 0.1
}
- Более простой алгоритм
 - Меньше вычислительных затрат
 
"mirostat": 2 - Mirostat 2.0
{
  "mirostat": 2,
  "mirostat_tau": 5.0,
  "mirostat_eta": 0.1
}
- Улучшенная версия
 - Более точный контроль
 - Лучшее качество текста
 
Дополнительные параметры:
mirostat_tau - Целевая перплексия
{"mirostat_tau": 5.0}
- Низкие значения (2.0-4.0): Более предсказуемый, простой текст
 - Средние значения (4.0-6.0): Баланс сложности и читаемости
 - Высокие значения (6.0-8.0): Более сложный, креативный текст
 
mirostat_eta - Скорость обучения
{"mirostat_eta": 0.1}
- Низкие значения (0.01-0.1): Медленная адаптация, стабильность
 - Высокие значения (0.1-0.3): Быстрая адаптация, агрессивные изменения
 
Практические примеры:
Пример 1: Техническая документация
{
  "mirostat": 2,
  "mirostat_tau": 3.0,  // Низкая перплексия = простота
  "mirostat_eta": 0.05,
  "prompt": "Объясни концепцию API REST"
}
Результат: Четкий, структурированный текст без излишней сложности
Пример 2: Художественный текст
{
  "mirostat": 2,
  "mirostat_tau": 7.0,  // Высокая перплексия = сложность
  "mirostat_eta": 0.2,
  "prompt": "Напиши поэтическое описание заката"
}
Результат: Богатый, образный язык с сложными конструкциями
Пример 3: Сбалансированный режим
{
  "mirostat": 1,
  "mirostat_tau": 5.0,  // Баланс
  "mirostat_eta": 0.1,
  "prompt": "Напиши статью о искусственном интеллекте"
}
Сравнение с традиционными параметрами:
Без Mirostat:
{
  "temperature": 0.7,
  "top_p": 0.9,
  "top_k": 40
}
// Качество может "плавать" в течение генерации
С Mirostat:
{
  "mirostat": 2,
  "mirostat_tau": 5.0,
  "mirostat_eta": 0.1
}
// Постоянное качество throughout текста
Преимущества Mirostat:
- Стабильное качество: Избегает деградации в длинных текстах
 - Автоматическая адаптация: Не нужно manually настраивать temperature
 - Контроль сложности: Точная настройка уровня сложности текста
 - Воспроизводимость: Предсказуемые результаты
 
Недостатки:
- Вычислительная стоимость: Дополнительные расчеты
 - Сложность настройки: Нужно понимать перплексию
 - Не для всех задач: Иногда проще использовать temperature
 
Рекомендации по настройке:
Для разных задач:
| Задача | mirostat_tau | mirostat_eta | 
|---|---|---|
| Техническая документация | 2.0-4.0 | 0.05-0.1 | 
| Новостные статьи | 4.0-6.0 | 0.1-0.2 | 
| Художественная литература | 6.0-8.0 | 0.2-0.3 | 
| Научные тексты | 5.0-7.0 | 0.1-0.15 | 
Примеры полных конфигураций:
Высокое качество, стабильность:
{
  "mirostat": 2,
  "mirostat_tau": 5.0,
  "mirostat_eta": 0.1,
  "temperature": 0.3,
  "top_p": 0.8
}
Креативность с контролем:
{
  "mirostat": 2,
  "mirostat_tau": 7.0,
  "mirostat_eta": 0.25,
  "temperature": 0.7
}
Практический пример запроса:
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Напиши подробное руководство по использованию Docker",
  "mirostat": 2,
  "mirostat_tau": 4.0,
  "mirostat_eta": 0.08,
  "temperature": 0.2,
  "stream": false
}' | jq -r '.response'
Когда использовать Mirostat:
✅ Длинные тексты (избегает деградации качества)
✅ Консистентность (техдокументация, руководства)
✅ Точный контроль сложности текста
✅ Автоматизация генерации контента
Когда НЕ использовать:
❌ Короткие ответы (излишне сложно)
❌ Максимальная скорость (дополнительные вычисления)
❌ Эксперименты (проще использовать temperature)
❌ Очень креативные задачи (может ограничивать)
Отладка Mirostat:
Если текст слишком простой:
{"mirostat_tau": 6.0}  // Увеличить перплексию
Если текст слишком сложный:
{"mirostat_tau": 3.0}  // Уменьшить перплексию
Если качество нестабильное:
{"mirostat_eta": 0.05}  // Уменьшить скорость обучения
15. "num_ctx": 2048
- Что делает: Размер контекстного окна
 - Применение: Зависит от модели
 
16. "num_thread": 8
- Что делает: Количество потоков для вычислений
 - Применение: Обычно равно количеству ядер CPU
 
Дополнительные параметры:
17. "template": "{{ .Prompt }}"
- Что делает: Шаблон для форматирования промпта
 - Применение:
"template": "Ответь как эксперт: {{ .Prompt }}\nОтвет:" 
18. "context": [1, 2, 3]
- Что делает: Контекст предыдущего взаимодействия
 - Применение: Для продолжения диалога
 
Толкование
Подробное объяснение CONTEXT
Context - это массив чисел, который представляет собой “память” предыдущего взаимодействия с моделью. Это позволяет продолжить диалог или текст точно с того места, где остановились.
Как это работает технически:
Контекст содержит эмбеддинги (векторные представления) предыдущего взаимодействия:
- Кодирование: Текст → числовой вектор
 - Сохранение: Вектор сохраняется в 
context - Восстановление: При следующем запросе вектор передается обратно
 - Продолжение: Модель “помнит” предыдущий разговор
 
Практический пример workflow:
Шаг 1: Первый запрос
response=$(curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Расскажи о преимуществах Python",
  "stream": false
}')
# Извлекаем ответ И контекст
answer=$(echo $response | jq -r '.response')
context=$(echo $response | jq '.context')
Шаг 2: Продолжение с контекстом
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "А какие недостатки?",
  "context": '"$context"',
  "stream": false
}'
Полный пример скрипта:
#!/bin/bash
# Первый запрос
echo "Шаг 1: Первый запрос"
response1=$(curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Расскажи о Python для начинающих",
  "stream": false
}')
answer1=$(echo $response1 | jq -r '.response')
context=$(echo $response1 | jq '.context')
echo "Ответ: $answer1"
echo "Контекст сохранен"
# Второй запрос с контекстом
echo -e "\nШаг 2: Продолжение диалога"
response2=$(curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:4b",
  "prompt": "Какие книги посоветуешь для изучения?",
  "context": '"$context"',
  "stream": false
}')
answer2=$(echo $response2 | jq -r '.response')
echo "Ответ: $answer2"
Формат контекста:
Контекст возвращается и принимается как массив чисел:
{
  "context": [123, 456, 789, 12, 34, 56, 78, 90, ...]
}
Практические применения:
1. Многошаговые диалоги
# Пользователь: Привет
# Модель: Привет! Как дела?
# Пользователь: Хорошо, расскажи о погоде
# Модель: Помнит предыдущие реплики
2. Продолжение длинных текстов
# Начало: "В далекой галактике..."
# Продолжение: "где мы остановились..."
3. Технические консультации
# Шаг 1: Обсуждение проблемы
# Шаг 2: Уточняющие вопросы  
# Шаг 3: Решение с учетом всей истории
4. Написание кода по частям
# Сначала: архитектура проекта
# Затем: реализация конкретных функций
# В конце: тестирование
Преимущества использования context:
По сравнению с передачей всей истории в prompt:
# Без context (громоздко):
"prompt": "Предыдущий разговор: Привет - Привет! Как дела? - Хорошо. Текущий вопрос: Что нового?"
# С context (эффективно):
"prompt": "Что нового?",
"context": [123, 456, 789]
Экономия токенов:
- ❌ Без context: Каждый раз передается вся история
 - ✅ С context: Передаются только компактные эмбеддинги
 
Сохраняется состояние:
- Переменные
 - Контекст разговора
 - Стиль и тон
 - Технические детали
 
Ограничения и важные моменты:
1. Совместимость моделей
# Контекст от одной модели может не работать с другой
context от "qwen3:4b" ≠ context для "llama3:8b"
2. Временные ограничения
# Контекст может "устаревать" после долгого времени
# Или после обновления модели
3. Размер контекста
# Слишком длинный контекст может быть обрезан
# Зависит от ограничений модели
4. Не для всех задач
# Для совершенно новых тем лучше не использовать context
# Чтобы избежать влияния предыдущего разговора
Пример с обработкой ошибок:
#!/bin/bash
ask_question() {
    local prompt="$1"
    local context="$2"
    
    local data='{
        "model": "qwen3:4b",
        "prompt": "'"$prompt"'",
        "stream": false'
    
    if [ -n "$context" ] && [ "$context" != "null" ]; then
        data+=', "context": '"$context"
    fi
    
    data+='}'
    
    curl -s http://localhost:11434/api/generate -d "$data"
}
# Диалог
response1=$(ask_question "Привет! Как тебя зовут?")
answer1=$(echo $response1 | jq -r '.response')
context1=$(echo $response1 | jq '.context')
echo "Модель: $answer1"
response2=$(ask_question "А чем ты занимаешься?" "$context1")
answer2=$(echo $response2 | jq -r '.response')
echo "Модель: $answer2"
Использование в API чата:
Для чат-интерфейсов лучше использовать /api/chat:
curl http://localhost:11434/api/chat -d '{
  "model": "qwen3:4b",
  "messages": [
    {"role": "user", "content": "Привет"},
    {"role": "assistant", "content": "Привет! Как дела?"},
    {"role": "user", "content": "Хорошо, а у тебя?"}
  ],
  "stream": false
}'
Лучшие практики:
1. Сохраняйте контекст между запросами
# В приложении сохраняйте context в:
# - Базе данных
# - Файле  
# - Памятии сессии
2. Очищайте контекст для новых тем
# Если тема полностью меняется:
context=null
3. Проверяйте валидность контекста
if [ "$context" != "null" ] && [ -n "$context" ]; then
    # Используем контекст
else
    # Новый разговор
fi
4. Ограничивайте длину диалога
# После N реплик начинайте новый контекст
# Чтобы избежать накопления ошибок
Продвинутое использование:
Сохранение контекста в файл:
# Сохраняем
echo $context > context.json
# Загружаем  
context=$(cat context.json)
Многоуровневые диалоги:
# Разные контексты для разных тем
context_python=$(cat python_context.json)
context_js=$(cat js_context.json)
Воспроизведение диалогов:
# Для тестирования можно сохранить и воспроизвести
# exact диалог с одинаковым context
Пример для продакшена:
# Псевдокод для веб-приложения
sessions = {}
def handle_message(user_id, message):
    if user_id not in sessions:
        # Новый диалог
        response = ollama.generate(prompt=message)
        sessions[user_id] = {
            'context': response['context'],
            'history': [message, response['response']]
        }
    else:
        # Продолжение диалога
        response = ollama.generate(
            prompt=message,
            context=sessions[user_id]['context']
        )
        sessions[user_id]['context'] = response['context']
        sessions[user_id]['history'].extend([message, response['response']])
    
    return response['response']
Практические примеры настроек:
Для точных фактологических ответов:
{
  "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 и полным набором параметров
#!/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
Установите дополнительные зависимости
# Для Ubuntu/Debian
sudo apt-get install yq jq
#Для Arch
sudo pacman -S yq jq 
Добавить настройку в ~/.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 файла
Создаем конфигурационный файл 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 и контекстом
Продвинутый пример с контекстом и многошаговым диалогом
Создаем скрипт 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
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 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 пример с полными параметрами
Установите зависимости:
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()