/
Вопросы и ответы
/
Промт-инжиниринг
/

Как обрабатывать десятки запросов к модели параллельно?

Как обрабатывать десятки запросов к модели параллельно?

17 дней назад

Никита Вихров

Ответы

0

Как обрабатывать десятки запросов к модели параллельно

Если нужно обработать список задач — проверить 50 резюме, перевести 30 абзацев, классифицировать 100 отзывов — делать это последовательно слишком медленно.

Языковые модели принимают запросы параллельно, и это нужно использовать.

Последовательно — медленно

from openai import OpenAI
import time

client = OpenAI()

отзывы = [
    "Доставка быстрая, товар отличный",
    "Курьер опоздал на два часа",
    "Упаковка сломана, товар цел",
    "Всё пришло вовремя и в порядке",
    "Не то что заказывал, верните деньги",
]

def classify(text: str) -> str:
    resp = client.chat.completions.create(
        model="gpt-4.1",
        temperature=0.0,
        max_tokens=10,
        messages=[{"role": "user", "content": f"Классифицируй отзыв: позитивный, нейтральный или негативный.\n\n{text}"}]
    )
    return resp.choices[0].message.content.strip()

# Медленно: каждый запрос ждёт предыдущего
начало = time.monotonic()
результаты = [classify(o) for o in отзывы]
print(f"Последовательно: {time.monotonic() - начало:.1f}с")

Параллельно — быстро

import asyncio
from openai import AsyncOpenAI

async_client = AsyncOpenAI()

async def classify_async(text: str) -> str:
    resp = await async_client.chat.completions.create(
        model="gpt-4.1",
        temperature=0.0,
        max_tokens=10,
        messages=[{"role": "user", "content": f"Классифицируй отзыв: позитивный, нейтральный или негативный.\n\n{text}"}]
    )
    return resp.choices[0].message.content.strip()

async def classify_all(тексты: list[str]) -> list[str]:
    задачи = [classify_async(t) for t in тексты]
    return await asyncio.gather(*задачи)

начало = time.monotonic()
результаты = asyncio.run(classify_all(отзывы))
print(f"Параллельно: {time.monotonic() - начало:.1f}с")
print(list(zip(отзывы, результаты)))

Если запросов очень много — батчи с ограничением

async def classify_batched(тексты: list[str], batch_size: int = 10) -> list[str]:
    все_результаты = []
    for i in range(0, len(тексты), batch_size):
        батч = тексты[i:i + batch_size]
        результаты = await asyncio.gather(*[classify_async(t) for t in батч])
        все_результаты.extend(результаты)
        await asyncio.sleep(0.5)  # пауза между батчами, чтобы не упереться в лимиты
    return все_результаты

Правила

  • Параллельные запросы упираются в лимиты API (запросов в минуту, токенов в минуту).
  • Делите большой список на батчи и добавляйте паузу между ними.
  • Не запускайте более 20–50 параллельных запросов без проверки лимитов вашего тарифа.

17 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845