Як створити чат-бота за допомогою Streamlit і Llama 2

Llama 2 – це потужна мовна модель з відкритим вихідним кодом, розроблена компанією Meta. Вона є високоефективною мовною моделлю, яка у певних аспектах може перевершувати деякі закриті моделі, наприклад GPT-3.5 та PaLM 2. Llama 2 представлена в трьох варіантах з різною кількістю параметрів: 7 мільярдів, 13 мільярдів та 70 мільярдів. В даній статті розглянемо, як використати її для створення інтерактивного чат-бота.

В цій статті ви дізнаєтесь, як розкрити розмовний потенціал Llama 2, розробивши чат-бота за допомогою Streamlit та самої Llama 2.

Знайомство з Llama 2: Характеристики та Переваги

Чим саме Llama 2 відрізняється від попередньої мовної моделі Llama 1?

  • Масштабована архітектура: модель використовує до 70 мільярдів параметрів. Завдяки цьому вона здатна глибше аналізувати та встановлювати зв’язки між словами та реченнями.
  • Покращені можливості діалогу: завдяки використанню Reinforcement Learning from Human Feedback (RLHF), модель демонструє покращені розмовні навички. Це дозволяє генерувати природний та зрозумілий контент навіть у складних діалогах.
  • Прискорений процес висновування: впровадження нової методики, групового запиту уваги, прискорює процес висновування. Це робить її більш пристосованою до створення таких інструментів, як чат-боти та віртуальні асистенти.
  • Ресурсоефективність: Llama 2 є більш ефективною в плані використання пам’яті та обчислювальних ресурсів, порівняно з попередньою версією.
  • Відкритий вихідний код та некомерційна ліцензія: модель доступна для використання та модифікацій дослідниками та розробниками без обмежень, що сприяє її широкому застосуванню.

Llama 2 значно перевершує свого попередника за всіма показниками. Ці вдосконалення роблять її потужним інструментом для широкого спектру застосувань, включаючи чат-боти, віртуальних асистентів та обробку природної мови.

Налаштування середовища Streamlit для розробки чат-бота

Перед початком розробки, необхідно налаштувати ізольоване середовище, щоб уникнути конфліктів між різними проєктами.

Спершу, створіть віртуальне середовище за допомогою бібліотеки Pipenv:

 pipenv shell 

Далі, встановіть необхідні бібліотеки для розробки чат-бота:

 pipenv install streamlit replicate 

Streamlit – це відкритий фреймворк, який спрощує створення веб-додатків для машинного навчання та обробки даних.

Replicate – це хмарна платформа, яка надає доступ до великих моделей машинного навчання з відкритим вихідним кодом для їх розгортання.

Отримання API токена Llama 2 від Replicate

Для отримання токена API від Replicate, вам потрібно спочатку зареєструватися на Replicate, використовуючи ваш GitHub акаунт.

Після входу в особистий кабінет, перейдіть до розділу «Дослідити» та знайдіть чат Llama 2, зокрема модель llama-2–70b.

Клікніть на модель llama-2–70b-chat, щоб переглянути кінцеві точки API. Перейдіть у вкладку API на панелі навігації. З правого боку виберіть Python, щоб отримати доступ до токена API для розробки на Python.

Скопіюйте `REPLICATE_API_TOKEN` та збережіть його для подальшого використання.

Розробка Чат-бота

Створіть файл Python з назвою `llama_chatbot.py` та файл `.env`. Код буде розміщено у `llama_chatbot.py`, а секретні ключі та API токени у `.env`.

У файлі `llama_chatbot.py`, імпортуйте необхідні бібліотеки, як показано нижче:

 import streamlit as st 
import os
import replicate

Далі, встановіть глобальні змінні для моделі llama-2–70b-chat.

 
REPLICATE_API_TOKEN = os.environ.get('REPLICATE_API_TOKEN', default="")


LLaMA2_7B_ENDPOINT = os.environ.get('MODEL_ENDPOINT7B', default="")
LLaMA2_13B_ENDPOINT = os.environ.get('MODEL_ENDPOINT13B', default="")
LLaMA2_70B_ENDPOINT = os.environ.get('MODEL_ENDPOINT70B', default="")

У файлі `.env`, додайте ваш Replicate токен та кінцеві точки моделей у наступному форматі:

 REPLICATE_API_TOKEN='Ваш_Replicate_Токен' 
MODEL_ENDPOINT7B='a16z-infra/llama7b-v2-chat:4f0a4744c7295c024a1de15e1a63c880d3da035fa1f49bfd344fe076074c8eea'
MODEL_ENDPOINT13B='a16z-infra/llama13b-v2-chat:df7690f1994d94e96ad9d568eac121aecf50684a0b0963b25a41cc40061269e5'
MODEL_ENDPOINT70B='replicate/llama70b-v2-chat:e951f18578850b652510200860fc4ea62b3b16fac280f83ff32282f87bbd2e48'

Вставте токен реплікації та збережіть файл `.env`.

Проектування Логіки Діалогу Чат-бота

Створіть початковий промпт для моделі Llama 2, залежно від задачі, яку необхідно виконати. У даному випадку, модель повинна виступати в ролі асистента.

 
PRE_PROMPT = "Ти – корисний асистент. Твої відповіді ніколи не починаються як 'Користувач', і ти не імітуєш 'Користувача'." \
            " Ти завжди відповідаєш лише один раз, як Асистент."

Налаштуйте конфігурацію сторінки вашого чат-бота:

 
st.set_page_config(
   page_title="LLaMA2Chat",
   page_icon=":volleyball:",
   layout="wide"
)

Створіть функцію, яка ініціалізує та встановлює змінні стану сесії.

 
LLaMA2_MODELS = {
   'LLaMA2-7B': LLaMA2_7B_ENDPOINT,
   'LLaMA2-13B': LLaMA2_13B_ENDPOINT,
   'LLaMA2-70B': LLaMA2_70B_ENDPOINT,
}


DEFAULT_TEMPERATURE = 0.1
DEFAULT_TOP_P = 0.9
DEFAULT_MAX_SEQ_LEN = 512
DEFAULT_PRE_PROMPT = PRE_PROMPT

def setup_session_state():
   st.session_state.setdefault('chat_dialogue', [])
   selected_model = st.sidebar.selectbox(
       'Виберіть модель LLaMA2:', list(LLaMA2_MODELS.keys()), key='model')
   st.session_state.setdefault(
       'llm', LLaMA2_MODELS.get(selected_model, LLaMA2_70B_ENDPOINT))
   st.session_state.setdefault('temperature', DEFAULT_TEMPERATURE)
   st.session_state.setdefault('top_p', DEFAULT_TOP_P)
   st.session_state.setdefault('max_seq_len', DEFAULT_MAX_SEQ_LEN)
   st.session_state.setdefault('pre_prompt', DEFAULT_PRE_PROMPT)

Ця функція ініціалізує такі важливі змінні як `chat_dialogue`, `pre_prompt`, `llm`, `top_p`, `max_seq_len` і `temperature` у стані сесії. Вона також обробляє вибір моделі Llama 2 на основі користувацького вибору.

Напишіть функцію для відображення вмісту бічної панелі застосунку Streamlit.

 def render_sidebar():
   st.sidebar.header("Чат-бот LLaMA2")
   st.session_state['temperature'] = st.sidebar.slider('Температура:',
         min_value=0.01, max_value=5.0, value=DEFAULT_TEMPERATURE, step=0.01)
   st.session_state['top_p'] = st.sidebar.slider('Top P:', min_value=0.01,
         max_value=1.0, value=DEFAULT_TOP_P, step=0.01)
   st.session_state['max_seq_len'] = st.sidebar.slider('Максимальна довжина послідовності:',
         min_value=64, max_value=4096, value=DEFAULT_MAX_SEQ_LEN, step=8)
   new_prompt = st.sidebar.text_area(
         'Промпт перед початком чату. Змініть, якщо необхідно:',
          DEFAULT_PRE_PROMPT,height=60)
   if new_prompt != DEFAULT_PRE_PROMPT and new_prompt != "" and
new_prompt is not None:
       st.session_state['pre_prompt'] = new_prompt + "\n"
   else:
       st.session_state['pre_prompt'] = DEFAULT_PRE_PROMPT

Ця функція відображає заголовок та змінні налаштування чат-бота Llama 2 для коригування.

Напишіть функцію, що відображає історію чату в головній області вмісту застосунку Streamlit.

 def render_chat_history():
   response_container = st.container()
   for message in st.session_state.chat_dialogue:
       with st.chat_message(message["role"]):
           st.markdown(message["content"])

Функція перебирає `chat_dialogue`, збережений у стані сесії, відображаючи кожне повідомлення з відповідною роллю (користувач або помічник).

Обробляйте користувацьке введення за допомогою наступної функції:

 def handle_user_input():
   user_input = st.chat_input(
"Введіть ваше запитання для спілкування з LLaMA2"
)
   if user_input:
       st.session_state.chat_dialogue.append(
{"role": "user", "content": user_input}
)
       with st.chat_message("user"):
           st.markdown(user_input)

Ця функція надає поле введення для користувачів, куди вони можуть вводити свої повідомлення та запитання. Повідомлення додається до `chat_dialogue` у стані сесії, з роллю “користувач”, після того як користувач надішле повідомлення.

Створіть функцію, яка генерує відповіді від моделі Llama 2 та відображає їх у зоні чату.

 def generate_assistant_response():
   message_placeholder = st.empty()
   full_response = ""
   string_dialogue = st.session_state['pre_prompt']
  
   for dict_message in st.session_state.chat_dialogue:
       speaker = "Користувач" if dict_message["role"] == "user" else "Асистент"
       string_dialogue += f"{speaker}: {dict_message['content']}\n"
  
   output = debounce_replicate_run(
       st.session_state['llm'],
       string_dialogue + "Асистент: ",
       st.session_state['max_seq_len'],
       st.session_state['temperature'],
       st.session_state['top_p'],
       REPLICATE_API_TOKEN
   )
  
   for item in output:
       full_response += item
       message_placeholder.markdown(full_response + "▌")
  
   message_placeholder.markdown(full_response)
   st.session_state.chat_dialogue.append({"role": "assistant",
"content": full_response})

Ця функція створює рядок історії розмови, що містить повідомлення користувача та помічника, перед тим як викликати функцію `debounce_replicate_run` для отримання відповіді помічника. Вона постійно оновлює відповідь в інтерфейсі користувача для забезпечення чату в реальному часі.

Напишіть основну функцію, яка відповідає за відтворення всього застосунку Streamlit.

 def render_app():
   setup_session_state()
   render_sidebar()
   render_chat_history()
   handle_user_input()
   generate_assistant_response()

Вона викликає усі визначені функції для налаштування стану сесії, візуалізації бічної панелі, історії чату, обробки введених користувачем даних та створення відповідей помічника у логічному порядку.

Створіть функцію для виклику `render_app` і запуску застосунку під час виконання скрипту.

 def main():
   render_app()

if __name__ == "__main__":
   main()

Наразі ваш застосунок має бути готовим до запуску.

Обробка API Запитів

Створіть файл `utils.py` у каталозі проєкту та додайте наступну функцію:

 import replicate
import time


last_call_time = 0
debounce_interval = 2

def debounce_replicate_run(llm, prompt, max_len, temperature, top_p,
                          API_TOKEN):
   global last_call_time
   print("Час останнього виклику: ", last_call_time)

   current_time = time.time()
   elapsed_time = current_time - last_call_time

   if elapsed_time < debounce_interval:
       print("Затримка запиту")
       return "Привіт! Ваші запити надто швидкі. Будь ласка, зачекайте декілька " \
              "секунд перед відправленням ще одного запиту."

   last_call_time = time.time()

   output = replicate.run(llm, input={"prompt": prompt + "Асистент: ",
                                      "max_length": max_len, "temperature":
                                          temperature, "top_p": top_p,
                                      "repetition_penalty": 1}, api_token=API_TOKEN)
   return output

Ця функція реалізує механізм зменшення дребезгу для запобігання надмірно частим API запитам від користувача.

Далі, імпортуйте функцію `debounce_replicate_run` у файл `llama_chatbot.py` наступним чином:

 from utils import debounce_replicate_run 

Тепер запустіть застосунок:

 streamlit run llama_chatbot.py 

Очікуваний результат:

Результат показує діалог між моделлю та людиною.

Реальні Застосування Чат-ботів на Streamlit та Llama 2

Деякі приклади застосування Llama 2 у реальному світі:

  • Чат-боти: створення чат-ботів для інтерактивної комунікації з користувачами на різноманітні теми.
  • Віртуальні помічники: розробка віртуальних асистентів, які розуміють запити природною мовою та надають відповідну допомогу.
  • Мовний переклад: виконання задач мовного перекладу з високою точністю.
  • Зведення тексту: створення коротких резюме з великих текстових масивів для швидкого сприйняття.
  • Дослідження: використання Llama 2 для дослідницьких цілей, отримуючи відповіді на питання з різних областей знань.

Майбутнє Штучного Інтелекту

В умовах, коли існують такі закриті моделі як GPT-3.5 та GPT-4, невеликим розробникам стає важко створювати значущі проєкти з використанням LLM через високу вартість доступу до API моделей GPT.

Відкриття таких передових великих мовних моделей, як Llama 2, для спільноти розробників є початком нової ери в ШІ. Це стимулюватиме більш креативне та інноваційне впровадження моделей у реальні застосунки, сприяючи прискореному розвитку до штучного суперінтелекту (ASI).