Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.
Ollama
- 1: Настройка запросов к моделям через Ollama
- 2: Пример с curl и полным набором параметров
- 3: Пример из командной строки с ollama run
- 4: Alias для zsh с конфигурационным файлом YAML
- 5: Запуск модели из Ollama с конфигурационным файлом JSON
- 6: Запуск модели из Ollama с конфигурационным файлом JSON и контекстом
- 7: Запуск модели Ollama с конфигурационным файлом JSON из NODE.JS
- 8: Запуск модели Ollama на языке Go
- 9: Запуск модели Ollama на языке программирования Python
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
}
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"
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
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"
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'
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
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"
}
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Контекст очищен")
}
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()