LLM Чат-приложения с использованием Declarai, FastAPI и Streamlit — Часть 2 🚀
LLM Chat Application using Declarai, FastAPI, and Streamlit - Part 2 🚀

В ответ на популярность нашей предыдущей статьи о VoAGI (ссылка 🔗), в которой были рассмотрены возможности развертывания LLM Chat-приложений, мы приняли ваши отзывы во внимание. В этой второй части мы представляем более продвинутые функции, с особым упором на потоковую передачу для чат-приложений.
Многие наши читатели выразили желание увидеть функцию потоковой передачи для чатов. Потоковая передача становится важной при работе с обширными ответами. Вместо ожидания полного ответа, потоковая передача позволяет отправлять ответ по мере его генерации 🔄. Это гарантирует, что пользователи смогут получить к нему мгновенный доступ сразу после отправки с веб-сервера.
Благодаря последним улучшениям в Declarai, мы рады использовать потоковую передачу, которая теперь доступна начиная с версии 0.1.10 🎉.
Потоковая передача в действии 📹
Потоковое видео | Записано автором | Все права защищены
- Реакция, мышление и действие дополняют LLM с инструментами!
- Революционизация компьютерного зрения прогресс, вызовы и перспективы будущего
- Внутри DSPy новый язык программирования моделей, о котором вам следует знать
Как показано, потоковая передача обеспечивает более высокую отзывчивость и стала стандартом в современных чат-приложениях на основе искусственного интеллекта. Хотите узнать, как мы это достигли? Давайте разберемся в коде:
Declarai 💻
Для использования потоковой передачи убедитесь, что чат-бот объявлен с включенной функцией потоковой передачи, передав streaming=True
.
import declaraigpt_35 = declarai.openai(model="gpt-3.5-turbo")@gpt_35.experimental.chat(streaming=True)class StreamingSQLChat: """ Вы являетесь помощником по SQL. Вы помогаете пользователю написать SQL-запрос. Вам следует сначала узнать, какой синтаксис SQL хочет использовать пользователь. Это может быть mysql, postgresql, sqllite и т.д. Если пользователь говорит что-то, что совершенно не связано с SQL, вы должны сказать: "Я не понимаю. Я здесь, чтобы помочь вам написать SQL-запрос." После того, как вы предоставите пользователю запрос, вы должны спросить, нужно ли ему что-то еще. """ greeting = "Привет, уважаемый пользователь SQL. Надеюсь, у вас хороший день. Я здесь, чтобы помочь вам написать SQL-запрос. Давайте начнем! Какой синтаксис SQL вы хотите использовать? Это может быть mysql, postgresql, sqllite и т.д."
При взаимодействии с чат-ботом с использованием потоковой передачи:
chat = StreamingSQLChat()res = chat.send("Я хочу использовать mysql")for chunk in res: print(chunk.response)>>> Отлично>>> Отлично!>>> Отлично! MySQL>>> Отлично! MySQL ->>> Отлично! MySQL - популярный>>> Отлично! MySQL - популярный выбор>>> Отлично! MySQL - популярный выбор для>>> Отлично! MySQL - популярный выбор для синтаксиса SQL>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с вашим>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с вашим MySQL>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с вашим MySQL запросом>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с вашим MySQL запросом?>>> Отлично! MySQL - популярный выбор для синтаксиса SQL. Как я могу помочь вам с вашим MySQL запросом?
Что происходит за кулисами? Включение потокового режима позволяет OpenAI возвращать генератор, который производит элементы по одному и только по требованию. Таким образом, как только новый фрагмент становится доступным от OpenAI, он сразу же обрабатывается.
FastAPI 🛠️
Для возможности потоковой передачи мы представили отдельный REST-конечную точку. Эта конечная точка отправляет StreamingResponse
– по сути, генератор, в котором каждый фрагмент представляет собой JSON, содержащий детали фрагмента. Важно указать media_type как media_type="text/event-stream"
, что указывает тип ответа как потоковой передачи.
@router.post("/chat/submit/{chat_id}/streaming")def submit_chat_streaming(chat_id: str, request: str): chat = StreamingSQLChat(chat_history=FileMessageHistory(file_path=chat_id)) response = chat.send(request) def stream(): for llm_response in response: # Преобразование LLMResponse в строку JSON data = json.dumps(jsonable_encoder(llm_response)) yield data + "\n" # Возвращение строк JSON, разделенных символом новой строки return StreamingResponse(stream(), media_type="text/event-stream")
Приложение Streamlit
На стороне фронтэнда нашей целью является отображение каждого нового фрагмента ответа пользователю по мере его получения. Для этого требуется получение разницы в ответе между каждым фрагментом ответа.
Вот как это выполняется:
- Начните с HTTP POST-запроса с
stream=True
. - Итерируйтесь по каждому фрагменту и декодируйте его JSON.
- Извлеките значение
delta
и добавьте его к полному ответу. Это фактически новые сгенерированные значения. - Обновите пользовательский интерфейс с накопленным ответом.
res = requests.post(f"{BACKEND_URL}/api/v1/chat/submit/{session_name}/streaming", params={"request": prompt}, stream=True)with st.chat_message("assistant"): message_placeholder = st.empty() full_response = "" buffer = "" for chunk in res: decoded_chunk = chunk.decode('utf-8') buffer += decoded_chunk while "\n" in buffer: line, buffer = buffer.split("\n", 1) parsed_chunk = json.loads(line.strip()) try: full_response += parsed_chunk["raw_response"]["choices"][0]["delta"]["content"] message_placeholder.markdown(full_response + "▌") except KeyError: pass message_placeholder.markdown(full_response)
Готовы развернуть своего чат-бота в потоковом режиме 🤖? Изучите полный код в этом репозитории —
GitHub – matankley/declarai-chat-fastapi-streamlit: Пример того, как создать чат-бота с использованием Declarai…
Пример того, как создать чат-бота с использованием Declarai для взаимодействия с языковой моделью, FastAPI в качестве сервера и…
github.com
Оставайтесь на связи с разработкой Declarai 💌. Подключайтесь к нам на странице Linkedin и поставьте нам звезду ⭐️ на GitHub, если наши инструменты пригодились вам!
Вы также можете более подробно изучить возможности Declarai, изучив нашу документацию 📖
Потоковая передача — Declarai
Некоторые провайдеры LLM поддерживают потоковую передачу ответов LLM. Это очень полезно, когда вы хотите получить результаты как можно скорее…
declarai.com