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



Вы научитесь писать небольшие, но мощные скрипты, которые «говорят» с нейросетевыми сервисами через их API. После урока сможете:
| Навык | Почему он важен |
|---|---|
| Получать токен доступа | Без него сервис откажет в обслуживании. |
| Отправлять запросы | Вы управляете тем, какие данные передаёте модели. |
| Обрабатывать ответы | Превращаем сырые JSON‑данные в удобные структуры. |
| Автоматизировать цикл | Один скрипт заменит десятки ручных действий. |
API (Application Programming Interface) — это набор правил, по которым ваш код может «разговаривать» с внешним сервисом. Представьте, что сервис — это ресторан, а API — меню: вы выбираете блюдо (метод), указываете ингредиенты (параметры) и получаете готовый заказ (ответ).
| Термин | Описание | Пример |
|---|---|---|
| Endpoint | URL‑адрес, к которому посылается запрос. | https://api.openai.com/v1/completions |
| Method | HTTP‑метод: GET, POST, PUT, DELETE. |
POST для отправки данных. |
| Headers | Метаданные запроса (ключи авторизации, тип контента). | Authorization: Bearer <TOKEN> |
| Payload | Тело запроса, обычно в формате JSON. | { "model": "gpt-4", "prompt": "Привет" } |
| Response | Ответ сервера, тоже JSON‑объект. | { "choices": [{ "text": "..." }] } |
pip install requests tqdm
tqdm — прогресс‑бар, который сделает ваш скрипт более дружелюбным.
Большинство провайдеров (OpenAI, Anthropic, Cohere) используют Bearer Token.
import os
# Сохраните токен в переменной окружения, чтобы не писать его в коде
API_KEY = os.getenv("OPENAI_API_KEY")
if not API_KEY:
raise RuntimeError("Установите переменную окружения OPENAI_API_KEY")
Совет: храните токены в файле
.envи подключайте их черезpython-dotenv.
import json, time
import requests
from tqdm import tqdm
BASE_URL = "https://api.openai.com/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def complete(prompt: str, model: str = "gpt-4o", max_tokens: int = 256) -> str:
payload = {
"model": model,
"prompt": prompt,
"max_tokens": max_tokens,
"temperature": 0.7
}
resp = requests.post(f"{BASE_URL}/completions", headers=HEADERS, json=payload)
resp.raise_for_status() # бросит исключение, если ошибка
data = resp.json()
return data["choices"][0]["text"].strip()
| Шаг | Действие | Почему важно |
|---|---|---|
| payload | Формируем JSON‑тело запроса. | Позволяет задать модель, текст и ограничения. |
| requests.post | Отправляем POST‑запрос. |
POST — все данные идут в теле, а не в URL. |
| raise_for_status | Проверяем HTTP‑код. | Автоматически поймаем 4xx/5xx ошибки. |
| resp.json() | Декодируем ответ в Python‑словарь. | Удобно работать дальше. |
| return | Возвращаем чистый текст. | Убираем лишние пробелы. |
Сети бывают непредсказуемыми: тайм‑ауты, перегрузка сервера, лимиты. Пример с экспоненциальным бэкоффом:
def safe_complete(prompt, retries=5, backoff=2):
for attempt in range(retries):
try:
return complete(prompt)
except requests.HTTPError as e:
if e.response.status_code in (429, 500, 502, 503, 504):
wait = backoff ** attempt
print(f"Ошибка {e.response.status_code}. Ждём {wait}s...")
time.sleep(wait)
continue
raise
raise RuntimeError("Не удалось получить ответ после нескольких попыток")
Если у вас есть список вопросов, лучше отправлять их параллельно (но не слишком быстро, иначе получим 429). С tqdm и concurrent.futures это просто:
from concurrent.futures import ThreadPoolExecutor, as_completed
def batch_process(prompts):
results = {}
with ThreadPoolExecutor(max_workers=5) as executor:
future_to_prompt = {executor.submit(safe_complete, p): p for p in prompts}
for future in tqdm(as_completed(future_to_prompt), total=len(prompts)):
prompt = future_to_prompt[future]
try:
results[prompt] = future.result()
except Exception as exc:
results[prompt] = f"Ошибка: {exc}"
return results
Храните ответы в JSON‑файле – удобно для дальнейшего анализа.
def save_results(results, filename="answers.json"):
with open(filename, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
#!/usr/bin/env python3
import os, json, time
import requests
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = "https://api.openai.com/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
def complete(prompt):
payload = {"model": "gpt-4o", "prompt": prompt, "max_tokens": 300, "temperature": 0.5}
resp = requests.post(f"{BASE_URL}/completions", headers=HEADERS, json=payload)
resp.raise_for_status()
return resp.json()["choices"][0]["text"].strip()
def safe_complete(prompt, retries=4, backoff=2):
for i in range(retries):
try:
return complete(prompt)
except requests.HTTPError as e:
if e.response.status_code == 429:
wait = backoff ** i
print(f"Rate limit, ждём {wait}s")
time.sleep(wait)
continue
raise
raise RuntimeError("Не удалось получить ответ")
def batch(prompts):
answers = {}
with ThreadPoolExecutor(max_workers=4) as pool:
futures = {pool.submit(safe_complete, p): p for p in prompts}
for f in tqdm(as_completed(futures), total=len(prompts)):
p = futures[f]
try:
answers[p] = f.result()
except Exception as exc:
answers[p] = f"Ошибка: {exc}"
return answers
if __name__ == "__main__":
questions = [
"Как объяснить принцип работы нейронных сетей школьнику?",
"Какие есть лучшие практики для обучения модели на небольшом наборе данных?",
"Что такое «переподгонка» и как её избежать?"
]
result = batch(questions)
with open("faq_answers.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print("Готово! Ответы сохранены в faq_answers.json")
Скрипт:
| Совет | Как реализовать |
|---|---|
| Кеширование | Сохраняйте уже полученные ответы в локальном словаре; при повторных запросах берите из кеша. |
| Ограничение скорости | time.sleep(0.2) между запросами, если лимит ≈ 5 req/s. |
| Секреты в коде | Никогда не хардкодите токен, используйте переменные окружения или менеджер секретов (Vault, AWS Secrets Manager). |
| Логирование | Записывайте запросы и ответы в отдельный лог‑файл, чтобы отследить ошибки. |
| Тестирование | Пишите юнит‑тесты с unittest.mock для имитации API‑ответов. |
stream=True). Позволяет получать токены «по кусочкам», что ускоряет интерактивные интерфейсы. OPENAI_API_KEY. generate_image(prompt), которая использует endpoint /images/generations (или аналогичный) для создания картинки по текстовому описанию. Сохраните полученный URL в файл images.json. Проверьте, что каждый пункт работает без ошибок, и проанализируйте, сколько времени занял каждый вариант (с кешем vs без).
Вы освоили фундаментальные навыки создания скриптов для автоматизации работы с нейросетевыми API. Теперь можете интегрировать модели в любые бизнес‑процессы, учебные материалы или исследовательские пайплайны. Удачной кодировки!