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

LLM Chat Application using Declarai, FastAPI, and Streamlit - Part 2 🚀

Скриншот чата | Сделано автором | Все права защищены

В ответ на популярность нашей предыдущей статьи о VoAGI (ссылка 🔗), в которой были рассмотрены возможности развертывания LLM Chat-приложений, мы приняли ваши отзывы во внимание. В этой второй части мы представляем более продвинутые функции, с особым упором на потоковую передачу для чат-приложений.

Многие наши читатели выразили желание увидеть функцию потоковой передачи для чатов. Потоковая передача становится важной при работе с обширными ответами. Вместо ожидания полного ответа, потоковая передача позволяет отправлять ответ по мере его генерации 🔄. Это гарантирует, что пользователи смогут получить к нему мгновенный доступ сразу после отправки с веб-сервера.

Благодаря последним улучшениям в Declarai, мы рады использовать потоковую передачу, которая теперь доступна начиная с версии 0.1.10 🎉.

Потоковая передача в действии 📹

Потоковое видео | Записано автором | Все права защищены

Как показано, потоковая передача обеспечивает более высокую отзывчивость и стала стандартом в современных чат-приложениях на основе искусственного интеллекта. Хотите узнать, как мы это достигли? Давайте разберемся в коде:

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

На стороне фронтэнда нашей целью является отображение каждого нового фрагмента ответа пользователю по мере его получения. Для этого требуется получение разницы в ответе между каждым фрагментом ответа.

Вот как это выполняется:

  1. Начните с HTTP POST-запроса с stream=True.
  2. Итерируйтесь по каждому фрагменту и декодируйте его JSON.
  3. Извлеките значение delta и добавьте его к полному ответу. Это фактически новые сгенерированные значения.
  4. Обновите пользовательский интерфейс с накопленным ответом.
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