|
|
### Мастерская LLM: Работа с нейросетевыми API в Python
|
|
## Основы работы с LLM для разработчиков: инструменты и концепты
|
|
|
*Для разработчиков всех уровней: от первого запроса до тонкой настройки моделей*
|
|
|
|
|
|
|
|
|
|
---
|
|
### Введение
|
|
|
|
|
Large Language Models (LLM) революционизируют разработку ПО. Эта статья объяснит ключевые концепты и инструменты для работы с языковыми моделями. Материал систематизирован — начинающие получат фундаментальные понятия, а опытные разработчики найдут чёткие определения для интеграции в проекты.
|
|
|
#### **Введение**
|
|
|
|
|
Языковые модели (LLM) революционизируют разработку. В статье разберем:
|
|
|
|
|
- Как взаимодействовать с LLM через API.
|
|
|
|
|
- Ключевые концепты: токены, промпты, температура.
|
|
|
|
|
- Различия между веб-интерфейсами и API.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### **1. Инструменты: LLM API**
|
|
|
|
|
**Базовый стек**:
|
|
|
|
|
```bash
|
|
|
|
|
pip install openai python-dotenv # Для примеров используем OpenAI API
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Первый запрос к нейросети**:
|
|
|
|
|
```python
|
|
|
|
|
import os
|
|
|
|
|
from openai import OpenAI
|
|
|
|
|
|
|
|
|
|
# Безопасное хранение токена (никогда в коде!)
|
|
|
|
|
os.environ["OPENAI_API_KEY"] = "sk-...your-token..." # В реальных проектах используйте .env
|
|
|
|
|
|
|
|
|
|
client = OpenAI()
|
|
|
|
|
|
|
|
|
|
def get_ai_response(user_query: str) -> str:
|
|
|
|
|
"""Отправляет запрос к LLM, возвращает ответ"""
|
|
|
|
|
chat_completion = client.chat.completions.create(
|
|
|
|
|
model="gpt-4-turbo",
|
|
|
|
|
messages=[{"role": "user", "content": user_query}]
|
|
|
|
|
)
|
|
|
|
|
return chat_completion.choices[0].message.content
|
|
|
|
|
|
|
|
|
|
print(get_ai_response("Как объяснить квантовую запутанность пятилетнему ребёнку?"))
|
|
|
|
|
```
|
|
|
|
|
**Важно**:
|
|
|
|
|
- Токен API хранится в переменных окружения
|
|
|
|
|
- `model` указывает на версию нейросети
|
|
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
### **2. Концепты: Ключевые термины**
|
|
### 🔧 Инструменты: LLM API
|
|
|
|
|
**LLM API** — программный интерфейс для взаимодействия с языковой моделью напрямую из вашего кода. В отличие от веб-чатов, API позволяет:
|
|
|
#### **2.1 LLM (Large Language Model)**
|
|
- Интегрировать LLM в приложения (боты, аналитические системы)
|
|
|
*Что это*: Нейросеть, обученная предсказывать текст. Примеры:
|
|
- Автоматизировать массовую обработку текстов
|
|
|
- **Закрытые**: GPT-4, Claude (через API)
|
|
- Настраивать параметры генерации под конкретные задачи
|
|
|
- **Открытые**: Llama 3, Mixtral (можно самому развернуть)
|
|
- Обрабатывать ответы программно (парсинг, валидация)
|
|
|
|
|
|
|
|
```mermaid
|
|
```mermaid
|
|
|
graph LR
|
|
graph LR
|
|
|
A[Текст] --> B(Токенизатор)
|
|
A[Ваше приложение] --> B[LLM API]
|
|
|
B --> C[Вектора чисел]
|
|
B --> C[Серверы LLM]
|
|
|
C --> D{LLM}
|
|
C --> D[Обработанный текст]
|
|
|
D --> E[Новый текст]
|
|
D --> A
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
#### **2.2 Модель (Model)**
|
|
### 🧠 Ключевые концепты
|
|
|
*Определение*: Конкретная версия LLM. Принципы выбора:
|
|
|
|
|
```python
|
|
|
|
|
def select_model(task_type: str) -> str:
|
|
|
|
|
"""Выбирает модель по типу задачи"""
|
|
|
|
|
if task_type == "creative":
|
|
|
|
|
return "claude-3-sonnet" # Для креативных задач
|
|
|
|
|
elif task_type == "technical":
|
|
|
|
|
return "gpt-4-turbo" # Для точных ответов
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
#### 1. LLM (Large Language Model)
|
|
|
|
|
**LLM** — нейросеть, обученная предсказывать текст на основе статистических закономерностей в огромных массивах данных. Не «понимает» смысл, а вычисляет вероятности последовательностей токенов.
|
|
|
#### **2.3 Токены генерации**
|
|
|
|
|
*Что это*: Фрагменты текста, которые LLM обрабатывает за шаг.
|
|
|
|
|
|
|
|
|
|
**Как считать**:
|
|
#### 2. Модель
|
|
|
```python
|
|
Конкретная **версия LLM** с уникальными характеристиками:
|
|
|
from openai import OpenAI
|
|
- Размер (параметры от 7B до 70B+): 7B-модели *с оптимизацией* (GGUF, 4-бит квантование) могут работать на ноутбуках, 70B+ — для промышленных задач в облаке
|
|
|
|
- Дата обучения (знания «заморожены» на момент обучения)
|
|
|
|
- Архитектура (Transformer и др.)
|
|
|
|
- Специализация (код, мультиязычность, медицинские тексты)
|
|
|
|
|
|
|
|
client = OpenAI()
|
|
---
|
|
|
text = "Привет, мир! 🚀"
|
|
|
|
|
|
|
|
|
|
# Подсчёт токенов без отправки запроса
|
|
#### 3. Токены генерации
|
|
|
token_count = client.tokenizers.encode(text).tokens
|
|
**Токен** — минимальная единица текста для LLМ. Примеры:
|
|
|
print(f"Текст '{text}' содержит {len(token_count)} токенов")
|
|
- Слово: `"разработка"` → 2 токена (`"раз"`, `"работка"`)
|
|
|
# Вывод: 5 токенов (Привет - 1, , - 2, мир - 3, ! - 4, 🚀 - 5)
|
|
- Аббревиатура: `"API"` → 1 токен
|
|
|
```
|
|
- Пунктуация: `"."` → 1 токен
|
|
|
|
|
|
|
|
**Использование в ответе**:
|
|
**Почему это важно:**
|
|
|
```python
|
|
- Лимиты контекста (например, 4K-128K токенов)
|
|
|
response = client.chat.completions.create(...)
|
|
- Расчет стоимости запросов
|
|
|
print(f"Использовано токенов: {response.usage.total_tokens}")
|
|
- Оптимизация промптов
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
#### **2.4 Токен нейросети vs Токен авторизации**
|
|
#### 4. Токен нейросети vs Токен авторизации
|
|
|
**Критическое различие**:
|
|
| **Токен нейросети** | **Токен авторизации** |
|
|
|
| | Токен авторизации | Токен нейросети |
|
|
|-----------------------------|-----------------------------|
|
|
|
|--------------------------|----------------------------|--------------------------|
|
|
| Единица обработки текста | Ключ доступа к API |
|
|
|
| **Что представляет** | Ключ доступа к API | Единица текста |
|
|
| Пример: `"Python"` = 1 токен | Пример: `"sk-9F...z3"` |
|
|
|
| **Где используется** | Заголовки HTTP-запросов | Внутри LLM |
|
|
| Влияет на качество генерации | Требуется для аутентификации|
|
|
|
| **Пример** | `sk-...aBcDeFg123...` | Слово "привет" = 1 токен |
|
|
| Управляется разработчиком | **Секретный ключ! Храните в переменных окружения или vault-решениях** |
|
|
|
|
|
|
|
|
**Безопасное использование**:
|
|
|
|
|
```python
|
|
|
|
|
# Правильно: через переменные окружения
|
|
|
|
|
api_key = os.getenv("OPENAI_API_KEY") # Никогда не храните в коде!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
#### **2.5 Системный промпт vs Пользовательский промпт**
|
|
#### 5. Системный промпт vs Пользовательский промпт
|
|
|
**Роли в диалоге**:
|
|
Разделение ролей промптов визуализировано ниже. Системный промпт задаёт контекст работы модели, пользовательский — конкретную задачу:
|
|
|
```mermaid
|
|
|
|
|
graph TD
|
|
|
|
|
A[System Prompt] --> B[LLM]
|
|
|
|
|
C[User Prompt] --> B
|
|
|
|
|
B --> D[Response]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Пример**:
|
|
```mermaid
|
|
|
```python
|
|
graph TB
|
|
|
messages = [
|
|
Системный_промпт[Системный промпт] --> LLM
|
|
|
{
|
|
Пользовательский_промпт[Пользовательский промпт] --> LLM
|
|
|
"role": "system",
|
|
LLM --> Ответ
|
|
|
"content": "Ты эксперт по Python. Отвечай кратко."
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"role": "user",
|
|
|
|
|
"content": "Как отладить рекурсивную функцию?"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
#### **2.6 Температура (Temperature)**
|
|
classDef system fill:#e6f7ff,stroke:#1890ff
|
|
|
*Что это*: Параметр случайности ответов.
|
|
classDef user fill:#f6ffed,stroke:#52c41a
|
|
|
|
|
|
|
|
**Визуализация**:
|
|
class Системный_промпт system
|
|
|
```mermaid
|
|
class Пользовательский_промпт user
|
|
|
flowchart LR
|
|
|
|
|
A[T=0.0] --> B[Детерминированный]
|
|
|
|
|
C[T=0.5] --> D[Сбалансированный]
|
|
|
|
|
E[T=1.0] --> F[Креативный]
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
**Пример**:
|
|
| **Системный промпт** | **Пользовательский промпт** |
|
|
|
```python
|
|
|------------------------------|------------------------------|
|
|
|
# Для технических объяснений
|
|
| Задает роль модели | Содержит конкретный запрос |
|
|
|
response = client.chat.completions.create(
|
|
| Пример: "Ты код-ассистент" | Пример: "Напиши функцию на Python" |
|
|
|
...,
|
|
| Невидим для пользователя | Формируется пользователем |
|
|
|
temperature=0.3 # Минимальная случайность
|
|
| Управляет поведением LLM | Передается явно в каждом запросе |
|
|
|
)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
#### **2.7 LLM API vs Сайт-чат**
|
|
#### 6. Температура
|
|
|
**Сравнение**:
|
|
**Температура** — параметр, управляющий случайностью ответов:
|
|
|
```mermaid
|
|
- `0.0–0.3`: Детерминированные ответы (рекомендуется для генерации кода — снижает риск синтаксических ошибок)
|
|
|
flowchart TD
|
|
- `0.4–0.7`: Баланс креативности/точности
|
|
|
A[Выбор инструмента] --> B{LLM API}
|
|
- `0.8–1.0`: Максимальная креативность (риск нерелевантности)
|
|
|
A --> C{Веб-интерфейс}
|
|
|
|
|
B --> D[Автоматизация]
|
|
Пример:
|
|
|
B --> E[Интеграция]
|
|
Запрос `"Напиши приветствие для SaaS-сервиса"`
|
|
|
C --> F[Быстрое тестирование]
|
|
- `t=0.2` → `"Добро пожаловать в [название]! Чем можем помочь?"`
|
|
|
```
|
|
- `t=0.8` → `"Привет, ниндзя кода! ✨ Готов к битве с багами?"`
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
### **3. Полный пример: Погодный ассистент**
|
|
#### 7. LLM API vs Сайт с LLM-чатом
|
|
|
```python
|
|
Сайт-чат ограничивает ручным вводом, а API даёт полный контроль через код:
|
|
|
from openai import OpenAI
|
|
|
|
|
import requests
|
|
```mermaid
|
|
|
import os
|
|
graph TD
|
|
|
|
|
API[LLM API] --> Программный_доступ[Программный доступ]
|
|
|
def get_weather_advice(city: str) -> str:
|
|
API --> Пакетная_обработка[Пакетная обработка]
|
|
|
"""Запрашивает погоду и генерирует совет с помощью LLM"""
|
|
API --> Кастомизация[Кастомизация параметров]
|
|
|
WEATHER_API_KEY = os.getenv("WEATHER_API_KEY") # Безопасное хранение
|
|
|
|
|
weather_data = requests.get(
|
|
|
|
|
f"https://api.weatherapi.com/v1/current.json?key={WEATHER_API_KEY}&q={city}"
|
|
|
|
|
).json()
|
|
|
|
|
|
|
|
|
|
client = OpenAI()
|
|
Веб[Сайт-чат] --> Ручной_ввод[Ручной ввод]
|
|
|
response = client.chat.completions.create(
|
|
Веб --> UI[Графический интерфейс]
|
|
|
model="gpt-4-turbo",
|
|
Веб --> Ограниченные_настройки[Ограниченные настройки]
|
|
|
messages=[
|
|
|
|
|
{"role": "system", "content": "Ты метеоролог. Давай чёткие советы."},
|
|
|
|
|
{"role": "user", "content": f"Погода в {city}: {weather_data['current']['temp_c']}°C"}
|
|
|
|
|
],
|
|
|
|
|
temperature=0.5
|
|
|
|
|
)
|
|
|
|
|
return response.choices[0].message.content
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
| **Критерий** | **LLM API** | **Сайт с чатом** |
|
|
|
|
|----------------------|------------------------------|------------------------------|
|
|
|
|
| Интеграция | В любые приложения | Только через браузер |
|
|
|
|
| Автоматизация | Полная | Ручной ввод |
|
|
|
|
| Кастомизация | Тонкая настройка параметров | Базовые настройки |
|
|
|
|
| Масштабирование | Параллельные запросы | Последовательные запросы |
|
|
|
|
| Использование данных | Прямая работа с API-ответами | Копирование из интерфейса |
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
#### **Итоги**
|
|
### Заключение
|
|
|
1. **Токены** — валюта взаимодействия с LLM.
|
|
Понимание этих концептов — основа для эффективного использования LLM в разработке. Помните:
|
|
|
2. **Системный промпт** — мощный инструмент управления поведением.
|
|
1. Выбирайте **модель** под задачу (код, текст, перевод)
|
|
|
3. **Температура** — регулятор креативности.
|
|
2. Контролируйте **токенизацию** для экономии ресурсов
|
|
|
4. **API** даёт контроль, недоступный в веб-интерфейсах.
|
|
3. Разделяйте **системный** и **пользовательский** промпты
|
|
|
|
4. Настраивайте **температуру** в зависимости от требуемой креативности
|
|
|
|
5. Используйте **API** для автоматизации вместо ручных чатов
|
|
|
|
|
|
|
|
> **Проверь себя**: Создай чат-бота, который:
|
|
Описанные принципы универсальны и применимы к большинству современных LLM. Для углубленного изучения рекомендую экспериментировать с open-source моделями (Llama, Mistral) через их API. |
|
|
> - Использует системный промпт для задания роли
|
|
\ No newline at end of file |
|
|
> - Считает токены в диалоге
|
|
|
|
|
> - Регулирует температуру через параметры функции |
|
|
|
\ No newline at end of file |
|
|