Как разработчики, мы часто оказываемся на распутье: работать асинхронно или оставаться синхронизированным? В условиях растущей популярности приложений реального времени и требований пользователей к немедленному реагированию понимание последствий для производительности имеет решающее значение. На примере 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 для чат-ботов или подобных приложений, применение асинхронного подхода может значительно повысить производительность и удовлетворенность пользователей.
Заключительные мысли:
Хотя преимущества асинхронного программирования очевидны, очень важно учитывать потребности вашего конкретного приложения. В определенных сценариях простота и понятность синхронного кода могут быть предпочтительнее. Однако для востребованных приложений реального времени асинхронность, несомненно, лучше всего подходит.