Как разработчики, мы часто оказываемся на распутье: работать асинхронно или оставаться синхронизированным? В условиях растущей популярности приложений реального времени и требований пользователей к немедленному реагированию понимание последствий для производительности имеет решающее значение. На примере GPT API OpenAI мы рассмотрим различия между асинхронным и синхронным временем ответа.

Представьте, что вам поручено создать чат-бота с использованием API GPT OpenAI. У вас все настроено, но возникает вопрос: синхронно или асинхронно это реализовать? Ответ на этот вопрос может существенно повлиять на взаимодействие с пользователем, особенно если ожидается несколько одновременных взаимодействий с пользователем.

Чтобы увидеть разницу в производительности, мы смоделируем несколько пользователей, одновременно отправляющих запросы нашему чат-боту. Затем мы измерим время ответа как синхронизированных, так и асинхронных конечных точек.

Обзор кода:

Используя FastAPI, я разработал две версии конечной точки нашего чата: традиционный синхронный маршрут и его асинхронный аналог.

Синхронная конечная точка:

@app.post(“/chat-sync/”)
def chat_sync(request_data: RequestModel):
 # Process the request and obtain a response from OpenAI
 message_history_as_dicts = […]
 llm_output = openai.ChatCompletion.create(
 model=llm.model,
 messages=[…]
 )
 response = llm_output.get(‘choices’)[0].get(‘message’).get(‘content’)
 return {“response”: response}

Асинхронная конечная точка:

@app.post(“/chat/”)
async def chat(request_data: RequestModel):
 # Process the request and obtain a response from OpenAI
 message_history_as_dicts = […]
 llm_output = await openai.ChatCompletion.acreate(
 model=llm.model,
 messages=[…]
 )
 response = llm_output.get(‘choices’)[0].get(‘message’).get(‘content’)
 return {“response”: response}

Скрипт для отправки параллельных запросов:

import aiohttp
import asyncio
import time

API_URL = "http://127.0.0.1:8080"

SAMPLE_DATA = {
 “user_input”: “Hello”,
 “system_message”: “You are a helpful assistant.”,
 “message_history”: []
}

async def fetch(session, url, data):
   async with session.post(url, json=data) as response:
   return await response.text()

async def main(endpoint):
   async with aiohttp.ClientSession() as session:
   tasks = [fetch(session, f”{API_URL}{endpoint}”, SAMPLE_DATA) for _ in range(5)]
   return await asyncio.gather(*tasks)

Результаты:

После выполнения результаты нарисовали четкую картину:

Async endpoint took: 1.08 seconds
Sync endpoint took: 4.10 seconds

Асинхронный дизайн с его неблокирующей природой продемонстрировал свое мастерство, обработав 5 запросов чуть более чем за секунду. Напротив, синхронная версия заняла более чем в четыре раза больше времени, что подчеркивает эффективность асинхронного программирования, особенно для задач, связанных с вводом-выводом, таких как вызовы API.

Если вы используете такие сервисы, как GPT API OpenAI для чат-ботов или подобных приложений, применение асинхронного подхода может значительно повысить производительность и удовлетворенность пользователей.

Заключительные мысли:

Хотя преимущества асинхронного программирования очевидны, очень важно учитывать потребности вашего конкретного приложения. В определенных сценариях простота и понятность синхронного кода могут быть предпочтительнее. Однако для востребованных приложений реального времени асинхронность, несомненно, лучше всего подходит.