Jak vytvořit chatbota pomocí Streamlit a Llama 2

Llama 2 je open-source velký jazykový model (LLM) vyvinutý společností Meta. Jedná se o kompetentní open-source velký jazykový model, pravděpodobně lepší než některé uzavřené modely jako GPT-3.5 a PaLM 2. Skládá se ze tří předem trénovaných a vyladěných velikostí generativních textových modelů, včetně 7 miliard, 13 miliard a 70 miliard modelů parametrů.

Konverzační schopnosti Llamy 2 prozkoumáte vytvořením chatbota pomocí Streamlit a Llama 2.

Pochopení lamy 2: Vlastnosti a výhody

Jak se liší Llama 2 od svého předchůdce velkého jazykového modelu Llama 1?

  • Větší velikost modelu: Model je větší, má až 70 miliard parametrů. To mu umožňuje naučit se složitější asociace mezi slovy a větami.
  • Vylepšené konverzační schopnosti: Posílení učení z lidské zpětné vazby (RLHF) zlepšuje konverzační aplikační schopnosti. To umožňuje modelu generovat lidský obsah i ve spletitých interakcích.
  • Rychlejší vyvozování: Představuje novou metodu nazvanou pozornost seskupeného dotazu pro urychlení vyvozování. Výsledkem je jeho schopnost vytvářet užitečnější aplikace, jako jsou chatboti a virtuální asistenti.
  • Efektivnější: Je efektivnější z hlediska paměti a výpočetních zdrojů než jeho předchůdce.
  • Open-source a nekomerční licence: Jedná se o open-source. Výzkumníci a vývojáři mohou Llamu 2 používat a upravovat bez omezení.

Llama 2 výrazně překonává svého předchůdce ve všech ohledech. Tyto vlastnosti z něj činí účinný nástroj pro mnoho aplikací, jako jsou chatboti, virtuální asistenti a porozumění přirozenému jazyku.

Nastavení prostředí Streamlit pro vývoj chatbotů

Chcete-li začít s vytvářením aplikace, musíte nastavit vývojové prostředí. Toto slouží k izolaci vašeho projektu od existujících projektů na vašem počítači.

Nejprve začněte vytvořením virtuálního prostředí pomocí knihovny Pipenv takto:

 pipenv shell 

Dále nainstalujte potřebné knihovny k sestavení chatbota.

 pipenv install streamlit replicate 

Streamlit: Jedná se o open-source webovou aplikaci, která rychle vykresluje aplikace strojového učení a datové vědy.

  Jak obnovit Ubuntu na výchozí nastavení

Replikovat: Jedná se o cloudovou platformu, která poskytuje přístup k velkým open source modelům strojového učení pro nasazení.

Získejte svůj token Llama 2 API z Replicate

Chcete-li získat tokenový klíč Replicate, musíte si nejprve zaregistrovat účet Replikovat pomocí svého účtu GitHub.

Jakmile se dostanete na řídicí panel, přejděte na tlačítko Prozkoumat a vyhledejte chat Llama 2, abyste viděli model chatu lama-2–70b.

Kliknutím na model chatu lama-2–70b zobrazíte koncové body rozhraní Llama 2 API. Klikněte na tlačítko API na navigační liště modelu chatu lama-2–70b. Na pravé straně stránky klikněte na tlačítko Python. To vám poskytne přístup k tokenu API pro aplikace Python.

Zkopírujte REPLICATE_API_TOKEN a bezpečně jej uložte pro budoucí použití.

Stavba Chatbota

Nejprve vytvořte soubor Python s názvem llama_chatbot.py a soubor env (.env). Svůj kód napíšete na llama_chatbot.py a své tajné klíče a tokeny API uložíte do souboru .env.

Do souboru llama_chatbot.py importujte knihovny následovně.

 import streamlit as st 
import os
import replicate

Dále nastavte globální proměnné chatovacího modelu lama-2–70b.

 
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="")

Do souboru .env přidejte token replikace a koncové body modelu v následujícím formátu:

 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'

Vložte svůj replikační token a uložte soubor .env.

Navrhování konverzačního toku chatbota

Vytvořte předběžnou výzvu ke spuštění modelu Llama 2 podle toho, jaký úkol chcete, aby dělal. V tomto případě chcete, aby model fungoval jako asistent.

 
PRE_PROMPT = "You are a helpful assistant. You do not respond as " \
            "'User' or pretend to be 'User'." \
            " You only respond once as Assistant."

Nastavte konfiguraci stránky pro svého chatbota následovně:

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

Napište funkci, která inicializuje a nastavuje proměnné stavu relace.

 
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)

Funkce nastavuje základní proměnné jako chat_dialogue, pre_prompt, llm, top_p, max_seq_len a teplotu ve stavu relace. Zvládá i výběr modelu Llama 2 na základě volby uživatele.

  8 Návrh softwaru na rychlejší uzavírání obchodů etechblog.cz

Napište funkci pro vykreslení obsahu postranního panelu aplikace 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

Funkce zobrazí záhlaví a proměnné nastavení chatbota Llama 2 pro úpravy.

Napište funkci, která vykreslí historii chatu, do oblasti hlavního obsahu aplikace 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"])

Tato funkce prochází dialogem chat_dialogue uloženým ve stavu relace a zobrazuje každou zprávu s odpovídající rolí (uživatel nebo asistent).

Zpracujte zadání uživatele pomocí níže uvedené funkce.

 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)

Tato funkce nabízí uživateli vstupní pole, do kterého může zadávat své zprávy a dotazy. Zpráva je přidána do chat_dialogue ve stavu relace s uživatelskou rolí, jakmile uživatel zprávu odešle.

Napište funkci, která generuje odpovědi z modelu Llama 2 a zobrazuje je v oblasti chatu.

 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})

Funkce vytvoří řetězec historie konverzace, který obsahuje zprávy uživatele i asistenta, než zavolá funkci debounce_replicate_run, aby získala odpověď asistenta. Neustále upravuje odezvu v uživatelském rozhraní, aby poskytla zážitek z chatu v reálném čase.

Napište hlavní funkci zodpovědnou za vykreslení celé aplikace Streamlit.

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

Volá všechny definované funkce k nastavení stavu relace, vykreslování postranního panelu, historie chatu, zpracování uživatelských vstupů a generování odpovědí asistenta v logickém pořadí.

  Jak změnit velikost obrázku na tapetu pracovní plochy

Napište funkci, která vyvolá funkci render_app a spustí aplikaci při spuštění skriptu.

 def main():
   render_app()

if __name__ == "__main__":
   main()

Nyní by měla být vaše aplikace připravena k provedení.

Zpracování požadavků API

Vytvořte soubor utils.py v adresáři projektu a přidejte funkci níže:

 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

Funkce provádí mechanismus debounce, aby zabránil častým a nadměrným dotazům API ze vstupu uživatele.

Dále importujte funkci debounce response do svého souboru llama_chatbot.py následovně:

 from utils import debounce_replicate_run 

Nyní spusťte aplikaci:

 streamlit run llama_chatbot.py 

Očekávaný výstup:

Výstup ukazuje rozhovor mezi modelem a člověkem.

Aplikace chatbotů Streamlit a Llama 2 v reálném světě

Některé reálné příklady aplikací Llama 2 zahrnují:

  • Chatboti: Jeho použití se vztahuje na vytváření chatbotů s lidskou odezvou, kteří mohou vést konverzace v reálném čase na několik témat.
  • Virtuální asistenti: Jeho použití se vztahuje na vytváření virtuálních asistentů, kteří rozumí lidským jazykovým dotazům a odpovídají na ně.
  • Jazykový překlad: Jeho použití se vztahuje na úlohy jazykového překladu.
  • Sumarizace textu: Její použití je použitelné při shrnutí velkých textů do krátkých textů pro snadné porozumění.
  • Výzkum: Llamu 2 můžete použít pro výzkumné účely zodpovězením otázek z celé řady témat.

Budoucnost AI

S uzavřenými modely, jako jsou GPT-3.5 a GPT-4, je pro malé hráče docela obtížné postavit cokoli podstatného pomocí LLM, protože přístup k API modelu GPT může být poměrně drahý.

Otevření pokročilých velkých jazykových modelů, jako je Llama 2, vývojářské komunitě je jen začátkem nové éry umělé inteligence. Povede to ke kreativnější a inovativnější implementaci modelů v aplikacích v reálném světě, což povede k urychlenému závodu o dosažení umělé super inteligence (ASI).