Како направити цхат бота користећи Стреамлит и Ллама 2

Llama 2 predstavlja veliki jezički model otvorenog koda (LLM), razvijen od strane kompanije Meta. Radi se o izuzetno sposobnom modelu, koji po performansama nadmašuje čak i neke zatvorene modele, kao što su GPT-3.5 i PaLM 2. Ovaj model se sastoji od tri predtrenirana i fino podešena generativna modela teksta, sa kapacitetima od 7, 13 i 70 milijardi parametara.

U ovom tekstu, istražićemo konverzacijske mogućnosti Llama 2 modela, kreiranjem chatbot-a koristeći Streamlit i Llama 2.

Razumevanje Llama 2: Karakteristike i Prednosti

U čemu se Llama 2 razlikuje od svog prethodnika, velikog jezičkog modela Llama 1?

  • Veća veličina modela: Model poseduje veći broj parametara, čak do 70 milijardi. Ovo mu omogućava da usvoji kompleksnije veze između reči i rečenica.
  • Poboljšane konverzacijske sposobnosti: Učenje sa povratnim informacijama od strane ljudi (RLHF) unapređuje njegove konverzacijske mogućnosti. Ovo rezultira generisanjem sadržaja koji je veoma sličan ljudskom, čak i u složenim interakcijama.
  • Brže zaključivanje: Uveden je novi mehanizam koji se naziva grupisanje pažnje upita, što ubrzava proces zaključivanja. To dovodi do primene u mnogo korisnijim aplikacijama kao što su chatbot-ovi i virtuelni asistenti.
  • Efikasniji: Llama 2 je efikasniji u pogledu memorije i računarskih resursa u poređenju sa svojim prethodnikom.
  • Licenca otvorenog koda i nekomercijalna licenca: Llama 2 je model otvorenog koda. Istraživači i programeri mogu ga koristiti i modifikovati bez ograničenja.

Llama 2 značajno prevazilazi svog prethodnika u svakom pogledu. Ove karakteristike ga čine moćnim alatom za mnogobrojne aplikacije, uključujući chatbot-ove, virtuelne asistente i razumevanje prirodnog jezika.

Postavljanje Modernog Okruženja za Razvoj Četbot-a

Kako biste započeli izradu sopstvene aplikacije, neophodno je da pripremite razvojno okruženje. Ovo se radi kako bi se vaš projekat izolovao od drugih postojećih projekata na vašem računaru.

Prvo, kreirajte virtuelno okruženje koristeći Pipenv biblioteku, na sledeći način:

 pipenv shell 

Zatim instalirajte neophodne biblioteke za izradu chatbot-a.

 pipenv install streamlit replicate 

Streamlit: Predstavlja framework otvorenog koda za web aplikacije, koji omogućava brz prikaz aplikacija za mašinsko učenje i nauku o podacima.

Replicate: To je cloud platforma koja omogućava pristup velikim, otvorenim modelima mašinskog učenja za upotrebu.

Nabavite svoj Llama 2 API token sa Replicate platforme

Da biste dobili svoj Replicate token ključ, prvo je potrebno da se registrujete na Replicate platformi, koristeći svoj GitHub nalog.

Nakon što pristupite kontrolnoj tabli, idite na dugme „Explore“ i potražite „Llama 2 chat“ kako biste pronašli model „llama-2–70b-chat“.

Kliknite na model „llama-2–70b-chat“ kako biste videli Llama 2 API krajnje tačke. Potom kliknite na dugme „API“ na navigacionoj traci modela. Na desnoj strani stranice, izaberite dugme „Python“. Ovo će vam omogućiti pristup API tokenu za Python aplikacije.

Kopirajte REPLICATE_API_TOKEN i sačuvajte ga na sigurnom mestu za buduću upotrebu.

Izgradnja Četbot-a

Prvo, kreirajte Python fajl pod nazivom „llama_chatbot.py“ i .env fajl. Svoj kod ćete pisati u „llama_chatbot.py“, dok ćete svoje tajne ključeve i API tokene čuvati u .env fajlu.

U fajlu „llama_chatbot.py“, importujte biblioteke na sledeći način.

 import streamlit as st 
import os
import replicate

Zatim definišite globalne varijable za „llama-2–70b-chat“ model.

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

U .env fajlu, dodajte Replicate token i krajnje tačke modela u sledećem formatu:

 REPLICATE_API_TOKEN='Unesite_Vas_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'

Unesite vaš Replicate token i sačuvajte .env fajl.

Dizajniranje Konverzacijskog Toka Četbot-a

Kreirajte pre-prompt kako biste inicijalizovali Llama 2 model, u zavisnosti od zadatka koji želite da obavi. U ovom slučaju, želimo da se model ponaša kao pomoćnik.

 
PRE_PROMPT = "Ti si pomoćnik koji je uvek spreman da pomogne. Ne odgovaraš kao 'Korisnik' niti se pretvaraš da si 'Korisnik'." \
            "Odgovaraš samo jednom, kao Pomoćnik."

Podesite konfiguraciju stranice za vaš chatbot na sledeći način:

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

Napišite funkciju koja inicijalizuje i postavlja promenljive stanja sesije.

 
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(
       'Izaberite 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)

Ova funkcija postavlja osnovne varijable kao što su „chat_dialogue“, „pre_prompt“, „llm“, „top_p“, „max_seq_len“ i „temperature“ u stanje sesije. Takođe, upravlja izborom Llama 2 modela na osnovu korisničkog izbora.

Napišite funkciju za prikaz sadržaja bočne trake Streamlit aplikacije.

 def render_sidebar():
   st.sidebar.header("LLaMA2 Chatbot")
   st.session_state['temperature'] = st.sidebar.slider('Temperatura:',
         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('Maksimalna dužina sekvence:',
         min_value=64, max_value=4096, value=DEFAULT_MAX_SEQ_LEN, step=8)
   new_prompt = st.sidebar.text_area(
         'Prompt pre početka razgovora. Izmenite ovde ako želite:',
          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

Ova funkcija prikazuje zaglavlje i podešavanja Llama 2 chatbot-a za prilagođavanje.

Napišite funkciju koja prikazuje istoriju ćaskanja u glavnom delu sadržaja Streamlit aplikacije.

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

Funkcija se iterira kroz „chat_dialogue“ koji je sačuvan u stanju sesije, prikazujući svaku poruku sa odgovarajućom ulogom (korisnik ili pomoćnik).

Upravljajte korisničkim unosom koristeći funkciju ispod.

 def handle_user_input():
   user_input = st.chat_input(
"Unesite Vaše pitanje ovde kako biste razgovarali sa LLaMA2"
)
   if user_input:
       st.session_state.chat_dialogue.append(
{"role": "user", "content": user_input}
)
       with st.chat_message("user"):
           st.markdown(user_input)

Ova funkcija korisniku pruža polje za unos gde može uneti svoje poruke i pitanja. Poruka se dodaje u „chat_dialogue“ u stanju sesije sa ulogom korisnika kada korisnik pošalje poruku.

Napišite funkciju koja generiše odgovore iz Llama 2 modela i prikazuje ih u oblasti za ćaskanje.

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

Ova funkcija kreira niz istorije razgovora koji uključuje poruke korisnika i asistenta, pre nego što pozove funkciju „debounce_replicate_run“ kako bi dobila odgovor asistenta. Ona kontinuirano ažurira odgovor u korisničkom interfejsu, pružajući iskustvo ćaskanja u realnom vremenu.

Napišite glavnu funkciju koja je odgovorna za prikazivanje cele Streamlit aplikacije.

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

Ova funkcija poziva sve definisane funkcije za podešavanje stanja sesije, prikazivanje bočne trake, istoriju ćaskanja, obradu korisničkog unosa i generisanje odgovora asistenta u logičnom redosledu.

Napišite funkciju za pozivanje funkcije „render_app“ i pokretanje aplikacije kada se skripta izvrši.

 def main():
   render_app()

if __name__ == "__main__":
   main()

Sada bi vaša aplikacija trebala biti spremna za izvršavanje.

Upravljanje API Zahtevima

Kreirajte fajl „utils.py“ u direktorijumu vašeg projekta i dodajte funkciju ispod:

 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("Vreme poslednjeg poziva: ", last_call_time)

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

   if elapsed_time < debounce_interval:
       print("Uklanjanje odbijanja")
       return "Zdravo! Vaši zahtevi su previše česti. Molim sačekajte nekoliko" \
              " sekundi pre slanja novog zahteva."

   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

Ova funkcija implementira mehanizam za uklanjanje odbijanja kako bi se sprečili česti i prekomerni API zahtevi od strane korisnika.

Zatim importujte funkciju za uklanjanje odbijanja u vaš „llama_chatbot.py“ fajl na sledeći način:

 from utils import debounce_replicate_run 

Sada pokrenite aplikaciju:

 streamlit run llama_chatbot.py 

Očekivani izlaz:

Izlaz prikazuje razgovor između modela i korisnika.

Primena Streamlit i Llama 2 Četbotova u Stvarnom Svetu

Neki primeri primene Llama 2 u stvarnom svetu uključuju:

  • Četbotovi: Koristi se za kreiranje čet robota koji mogu voditi razgovore o raznim temama u realnom vremenu.
  • Virtuelni asistenti: Koristi se za kreiranje virtuelnih asistenata koji razumeju i reaguju na upite napisane ljudskim jezikom.
  • Prevođenje jezika: Koristi se za zadatke prevođenja jezika.
  • Sažimanje teksta: Koristi se za sažimanje obimnih tekstova u kraće verzije radi lakšeg razumevanja.
  • Istraživanje: Llama 2 se može primeniti u istraživačke svrhe, odgovarajući na pitanja u vezi sa različitim temama.

Budućnost Veštačke Inteligencije

Sa zatvorenim modelima poput GPT-3.5 i GPT-4, malim igračima je prilično teško da stvore nešto značajno koristeći LLM, jer pristup API-ju GPT modela može biti veoma skup.

Otvaranje naprednih velikih jezičkih modela kao što je Llama 2 zajednici programera predstavlja tek početak nove ere veštačke inteligencije. Ovo će dovesti do kreativnije i inovativnije primene modela u stvarnim aplikacijama, što će ubrzati put ka postizanju veštačke superinteligencije (ASI).