|
|
|
### Мастерская LLM: Работа с нейросетевыми API в Python
|
|
|
|
*Для разработчиков всех уровней: от первого запроса до тонкой настройки моделей*
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **Введение**
|
|
|
|
Языковые модели (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. Концепты: Ключевые термины**
|
|
|
|
|
|
|
|
#### **2.1 LLM (Large Language Model)**
|
|
|
|
*Что это*: Нейросеть, обученная предсказывать текст. Примеры:
|
|
|
|
- **Закрытые**: GPT-4, Claude (через API)
|
|
|
|
- **Открытые**: Llama 3, Mixtral (можно самому развернуть)
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
graph LR
|
|
|
|
A[Текст] --> B(Токенизатор)
|
|
|
|
B --> C[Вектора чисел]
|
|
|
|
C --> D{LLM}
|
|
|
|
D --> E[Новый текст]
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **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" # Для точных ответов
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **2.3 Токены генерации**
|
|
|
|
*Что это*: Фрагменты текста, которые LLM обрабатывает за шаг.
|
|
|
|
|
|
|
|
**Как считать**:
|
|
|
|
```python
|
|
|
|
from openai import OpenAI
|
|
|
|
|
|
|
|
client = OpenAI()
|
|
|
|
text = "Привет, мир! 🚀"
|
|
|
|
|
|
|
|
# Подсчёт токенов без отправки запроса
|
|
|
|
token_count = client.tokenizers.encode(text).tokens
|
|
|
|
print(f"Текст '{text}' содержит {len(token_count)} токенов")
|
|
|
|
# Вывод: 5 токенов (Привет - 1, , - 2, мир - 3, ! - 4, 🚀 - 5)
|
|
|
|
```
|
|
|
|
|
|
|
|
**Использование в ответе**:
|
|
|
|
```python
|
|
|
|
response = client.chat.completions.create(...)
|
|
|
|
print(f"Использовано токенов: {response.usage.total_tokens}")
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **2.4 Токен нейросети vs Токен авторизации**
|
|
|
|
**Критическое различие**:
|
|
|
|
| | Токен авторизации | Токен нейросети |
|
|
|
|
|--------------------------|----------------------------|--------------------------|
|
|
|
|
| **Что представляет** | Ключ доступа к API | Единица текста |
|
|
|
|
| **Где используется** | Заголовки HTTP-запросов | Внутри LLM |
|
|
|
|
| **Пример** | `sk-...aBcDeFg123...` | Слово "привет" = 1 токен |
|
|
|
|
|
|
|
|
**Безопасное использование**:
|
|
|
|
```python
|
|
|
|
# Правильно: через переменные окружения
|
|
|
|
api_key = os.getenv("OPENAI_API_KEY") # Никогда не храните в коде!
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **2.5 Системный промпт vs Пользовательский промпт**
|
|
|
|
**Роли в диалоге**:
|
|
|
|
```mermaid
|
|
|
|
graph TD
|
|
|
|
A[System Prompt] --> B[LLM]
|
|
|
|
C[User Prompt] --> B
|
|
|
|
B --> D[Response]
|
|
|
|
```
|
|
|
|
|
|
|
|
**Пример**:
|
|
|
|
```python
|
|
|
|
messages = [
|
|
|
|
{
|
|
|
|
"role": "system",
|
|
|
|
"content": "Ты эксперт по Python. Отвечай кратко."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"role": "user",
|
|
|
|
"content": "Как отладить рекурсивную функцию?"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **2.6 Температура (Temperature)**
|
|
|
|
*Что это*: Параметр случайности ответов.
|
|
|
|
|
|
|
|
**Визуализация**:
|
|
|
|
```mermaid
|
|
|
|
flowchart LR
|
|
|
|
A[T=0.0] --> B[Детерминированный]
|
|
|
|
C[T=0.5] --> D[Сбалансированный]
|
|
|
|
E[T=1.0] --> F[Креативный]
|
|
|
|
```
|
|
|
|
|
|
|
|
**Пример**:
|
|
|
|
```python
|
|
|
|
# Для технических объяснений
|
|
|
|
response = client.chat.completions.create(
|
|
|
|
...,
|
|
|
|
temperature=0.3 # Минимальная случайность
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **2.7 LLM API vs Сайт-чат**
|
|
|
|
**Сравнение**:
|
|
|
|
```mermaid
|
|
|
|
flowchart TD
|
|
|
|
A[Выбор инструмента] --> B{LLM API}
|
|
|
|
A --> C{Веб-интерфейс}
|
|
|
|
B --> D[Автоматизация]
|
|
|
|
B --> E[Интеграция]
|
|
|
|
C --> F[Быстрое тестирование]
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
### **3. Полный пример: Погодный ассистент**
|
|
|
|
```python
|
|
|
|
from openai import OpenAI
|
|
|
|
import requests
|
|
|
|
import os
|
|
|
|
|
|
|
|
def get_weather_advice(city: str) -> str:
|
|
|
|
"""Запрашивает погоду и генерирует совет с помощью LLM"""
|
|
|
|
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(
|
|
|
|
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
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
#### **Итоги**
|
|
|
|
1. **Токены** — валюта взаимодействия с LLM.
|
|
|
|
2. **Системный промпт** — мощный инструмент управления поведением.
|
|
|
|
3. **Температура** — регулятор креативности.
|
|
|
|
4. **API** даёт контроль, недоступный в веб-интерфейсах.
|
|
|
|
|
|
|
|
> **Проверь себя**: Создай чат-бота, который:
|
|
|
|
> - Использует системный промпт для задания роли
|
|
|
|
> - Считает токены в диалоге
|
|
|
|
> - Регулирует температуру через параметры функции |
|
|
\ No newline at end of file |