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

Llama 2 — це велика мовна модель (LLM) із відкритим кодом, розроблена Meta. Це компетентна модель великої мови з відкритим вихідним кодом, можливо, краща за деякі закриті моделі, такі як GPT-3.5 і PaLM 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 значно перевершує свого попередника за всіма показниками. Ці характеристики роблять його потужним інструментом для багатьох програм, таких як чат-боти, віртуальні помічники та розуміння природної мови.

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

Щоб розпочати створення програми, вам потрібно налаштувати середовище розробки. Це робиться для того, щоб ізолювати ваш проект від існуючих проектів на вашій машині.

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

 pipenv shell 

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

 pipenv install streamlit replicate 

Streamlit: це фреймворк веб-програми з відкритим вихідним кодом, який швидко відображає програми машинного навчання та обробки даних.

  Новий спосіб отримати роботу на конкурентному ринку

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

Отримайте свій маркер API Llama 2 із копії

Щоб отримати ключ токена Replicate, ви повинні спочатку зареєструвати обліковий запис на Тиражувати за допомогою свого облікового запису GitHub.

Отримавши доступ до інформаційної панелі, перейдіть до кнопки «Дослідити» та знайдіть чат Llama 2, щоб побачити модель чату llama-2–70b.

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

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

Створення чат-бота

Спочатку створіть файл Python під назвою llama_chatbot.py і файл env (.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_API_TOKEN='Paste_Your_Replicate_Token' 
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 = "You are a helpful assistant. You do not respond as " \
            "'User' or pretend to be 'User'." \
            " You only respond once as Assistant."

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

 
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(
       'Choose a LLaMA2 model:', 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 і температура в стані сеансу. Він також обробляє вибір моделі Llama 2 на основі вибору користувача.

  Безкоштовно опублікувати Covid' Special Online

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

 def render_sidebar():
   st.sidebar.header("LLaMA2 Chatbot")
   st.session_state['temperature'] = st.sidebar.slider('Temperature:',
         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('Max Sequence Length:',
         min_value=64, max_value=4096, value=DEFAULT_MAX_SEQ_LEN, step=8)
   new_prompt = st.sidebar.text_area(
         'Prompt before the chat starts. Edit here if desired:',
          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(
"Type your question here to talk to 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 = "User" if dict_message["role"] == "user" else "Assistant"
       string_dialogue += f"{speaker}: {dict_message['content']}\n"
  
   output = debounce_replicate_run(
       st.session_state['llm'],
       string_dialogue + "Assistant: ",
       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()

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

  Як відстежувати акції за допомогою Google Таблиць

Напишіть функцію для виклику функції 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: ", last_call_time)

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

   if elapsed_time < debounce_interval:
       print("Debouncing")
       return "Hello! Your requests are too fast. Please wait a few" \
              " seconds before sending another request."

   last_call_time = time.time()

   output = replicate.run(llm, input={"prompt": prompt + "Assistant: ",
                                      "max_length": max_len, "temperature":
                                          temperature, "top_p": top_p,
                                      "repetition_penalty": 1}, api_token=API_TOKEN)
   return output

Функція виконує механізм усунення дребезгу, щоб запобігти частим і надмірним запитам API від введення користувача.

Потім імпортуйте функцію усунення дребезгу у ваш файл 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).