Pasinaudokite atvirojo kodo Llama 2 LLM, kad sukurtumėte pasirinktinį pokalbių robotą su Python.

„Llama 2“ yra atvirojo kodo didelės kalbos modelis (LLM), kurį sukūrė „Meta“. Tai kompetentingas atvirojo kodo didelės kalbos modelis, be abejonės, geresnis nei kai kurie uždari modeliai, tokie kaip GPT-3.5 ir PaLM 2. Jį sudaro trys iš anksto parengti ir tiksliai suderinti generuojamojo teksto modelių dydžiai, įskaitant 7 milijardų, 13 milijardų ir 70 milijardų parametrų modelius.

Išnagrinėsite „Llama 2“ pokalbio galimybes kurdami pokalbių robotą naudodami „Streamlit“ ir „Llama 2“.

Lamos 2 supratimas: savybės ir pranašumai

Kuo „Llama 2“ skiriasi nuo savo pirmtako didelis kalbos modelis, Lama 1?

  • Didesnis modelio dydis: Modelis yra didesnis, su iki 70 milijardų parametrų. Tai leidžia išmokti sudėtingesnių žodžių ir sakinių asociacijų.
  • Patobulinti pokalbio gebėjimai: Stiprinamasis mokymasis iš žmonių atsiliepimų (RLHF) pagerina pokalbio taikymo galimybes. Tai leidžia modeliui generuoti žmogišką turinį net sudėtingoje sąveikoje.
  • instagram viewer
  • Greitesnė išvada: Jame pristatomas naujas metodas, vadinamas grupinės užklausos dėmesiu, siekiant paspartinti išvadas. Dėl to jis gali kurti daugiau naudingų programų, tokių kaip pokalbių robotai ir virtualūs asistentai.
  • Efektyvesnis: Tai yra efektyvesnis atminties ir skaičiavimo išteklių efektyvumas nei jo pirmtakas.
  • Atvirojo kodo ir nekomercinė licencija: Tai atvirojo kodo. Tyrėjai ir kūrėjai gali naudoti ir modifikuoti „Llama 2“ be apribojimų.

„Llama 2“ visais atžvilgiais gerokai lenkia savo pirmtaką. Dėl šių savybių jis yra galingas įrankis daugeliui programų, tokių kaip pokalbių robotai, virtualūs asistentai ir natūralios kalbos supratimas.

Srautinės aplinkos nustatymas pokalbių roboto kūrimui

Norėdami pradėti kurti programą, turite nustatyti kūrimo aplinką. Tai skirta atskirti jūsų projektą nuo jūsų kompiuteryje esančių projektų.

Pirma, pradėkite nuo sukurti virtualią aplinką naudojant Pipenv biblioteka taip:

pipenv shell

Tada įdiekite reikiamas bibliotekas, kad sukurtumėte pokalbių robotą.

pipenv install streamlit replicate

Srautas: Tai atvirojo kodo žiniatinklio programų sistema, kuri greitai pateikia mašininio mokymosi ir duomenų mokslo programas.

Atkartoti: Tai debesų platforma, suteikianti prieigą prie didelių atvirojo kodo mašininio mokymosi modelių diegimui.

Gaukite „Llama 2“ API prieigos raktą iš „Replicate“.

Norėdami gauti replikacijos prieigos raktą, pirmiausia turite užregistruoti paskyrą Atkartoti naudodami savo GitHub paskyrą.

Replikuoti galima tik prisijungti per a GitHub paskyra.

Kai pasieksite prietaisų skydelį, eikite į Naršyti mygtuką ir ieškokite Llama 2 pokalbio, kad pamatytumėte lama-2–70b-chat modelis.

Spustelėkite ant lama-2–70b-chat modelį, kad peržiūrėtumėte Llama 2 API galinius taškus. Spustelėkite API mygtuką ant lama-2–70b-chat modelio naršymo juosta. Dešinėje puslapio pusėje spustelėkite Python mygtuką. Tai suteiks jums prieigą prie „Python“ programų API prieigos rakto.

Nukopijuokite REPLICATE_API_TOKEN ir saugokite jį, kad galėtumėte naudoti ateityje.

Visas šaltinio kodas yra čia GitHub saugykla.

„Chatbot“ kūrimas

Pirmiausia sukurkite Python failą, vadinamą llama_chatbot.py ir env failą (.env). Kodą parašysite llama_chatbot.py, o slaptuosius raktus ir API prieigos raktus išsaugosite .env faile.

Į failą llama_chatbot.py importuokite bibliotekas taip.

import streamlit as st 
import os
import replicate

Tada nustatykite globalius kintamuosius lama-2–70b-chat modelis.

# Global variables
REPLICATE_API_TOKEN = os.environ.get('REPLICATE_API_TOKEN', default='')

# Define model endpoints as independent variables
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='')

Prie .env failo pridėkite replikacijos prieigos raktą ir modelio galinius taškus tokiu formatu:

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'

Įklijuokite replikacijos prieigos raktą ir išsaugokite .env failą.

„Chatbot“ pokalbių srauto kūrimas

Atsižvelgdami į tai, kokią užduotį norite atlikti, sukurkite išankstinį raginimą paleisti Llama 2 modelį. Tokiu atveju norite, kad modelis veiktų kaip asistentas.

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

Nustatykite savo pokalbių roboto puslapio konfigūraciją taip:

# Set initial page configuration
st.set_page_config(
page_title="LLaMA2Chat",
page_icon=":volleyball:",
layout="wide"
)

Parašykite funkciją, kuri inicijuoja ir nustato seanso būsenos kintamuosius.

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

# Session State Variables
DEFAULT_TEMPERATURE = 0.1
DEFAULT_TOP_P = 0.9
DEFAULT_MAX_SEQ_LEN = 512
DEFAULT_PRE_PROMPT = PRE_PROMPT

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

Funkcija nustato esminius kintamuosius, pvz chat_dialogue, pre_prompt, llm, top_p, max_seq_len, ir temperatūros sesijos būsenoje. Ji taip pat tvarko „Llama 2“ modelio pasirinkimą pagal vartotojo pasirinkimą.

Parašykite funkciją, skirtą „Streamlit“ programos šoninės juostos turiniui pateikti.

defrender_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 isnotNone:
st.session_state['pre_prompt'] = new_prompt + "\n"
else:
st.session_state['pre_prompt'] = DEFAULT_PRE_PROMPT

Funkcija rodo antraštę ir „Llama 2“ pokalbių roboto nustatymų kintamuosius koregavimui.

Parašykite funkciją, kuri pateikia pokalbių istoriją pagrindinėje „Streamlit“ programos turinio srityje.

defrender_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 kartojasi per chat_dialogue, išsaugotą seanso būsenoje, rodydama kiekvieną pranešimą su atitinkamu vaidmeniu (vartotojas arba asistentas).

Tvarkykite vartotojo įvestį naudodami toliau pateiktą funkciją.

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

Ši funkcija pateikia Vartotojas su įvesties lauku, kuriame jie gali įvesti savo pranešimus ir klausimus. Pranešimas pridedamas prie chat_dialogue sesijos būsenoje su Vartotojas vaidmenį, kai vartotojas pateikia pranešimą.

Parašykite funkciją, kuri generuoja atsakymus iš modelio Llama 2 ir rodo juos pokalbių srityje.

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

Funkcija sukuria pokalbių istorijos eilutę, į kurią įtraukiami ir vartotojo, ir asistento pranešimai prieš skambinant debounce_replicate_run funkcija gauti asistento atsakymą. Jis nuolat keičia atsakymą vartotojo sąsajoje, kad pokalbiai būtų teikiami realiuoju laiku.

Parašykite pagrindinę funkciją, atsakingą už visos „Streamlit“ programos pateikimą.

defrender_app():
setup_session_state()
render_sidebar()
render_chat_history()
handle_user_input()
generate_assistant_response()

Jis iškviečia visas apibrėžtas funkcijas, kad nustatytų seanso būseną, atvaizduotų šoninę juostą, pokalbių istoriją, tvarkytų vartotojo įvestį ir generuotų asistento atsakymus logiška tvarka.

Parašykite funkciją, kad iškviestumėte render_app funkciją ir paleiskite programą, kai vykdomas scenarijus.

defmain():
render_app()

if __name__ == "__main__":
main()

Dabar jūsų programa turėtų būti paruošta vykdyti.

API užklausų tvarkymas

Sukurti utils.py failą savo projekto kataloge ir pridėkite šią funkciją:

import replicate
import time

# Initialize debounce variables
last_call_time = 0
debounce_interval = 2# Set the debounce interval (in seconds)

defdebounce_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

Funkcija atlieka atmetimo mechanizmą, kad būtų išvengta dažnų ir pernelyg didelių API užklausų iš vartotojo įvesties.

Tada importuokite debounce atsako funkciją į savo llama_chatbot.py failą taip:

from utils import debounce_replicate_run

Dabar paleiskite programą:

streamlit run llama_chatbot.py

Numatoma produkcija:

Išvestis rodo pokalbį tarp modelio ir žmogaus.

Realaus pasaulio „Streamlit“ ir „Llama 2“ pokalbių robotų programos

Kai kurie realūs Llama 2 programų pavyzdžiai:

  • Pokalbių robotai: Jo naudojimas taikomas kuriant žmonių atsako pokalbių robotai kuri gali palaikyti pokalbius realiuoju laiku keliomis temomis.
  • Virtualūs asistentai: Jis naudojamas kuriant virtualius padėjėjus, kurie supranta ir atsako į žmonių kalbos užklausas.
  • Kalbos vertimas: jo naudojimas taikomas kalbos vertimo užduotims.
  • Teksto apibendrinimas: Jis naudojamas apibendrinant didelius tekstus į trumpus tekstus, kad būtų lengviau suprasti.
  • Tyrimas: galite taikyti Llama 2 tyrimų tikslais atsakydami į klausimus įvairiomis temomis.

AI ateitis

Naudojant uždarus modelius, tokius kaip GPT-3.5 ir GPT-4, mažiems žaidėjams gana sunku sukurti ką nors reikšmingo naudojant LLM, nes prieiga prie GPT modelio API gali būti gana brangi.

Pažangių didelių kalbų modelių, tokių kaip „Llama 2“, atvėrimas kūrėjų bendruomenei yra tik naujos AI eros pradžia. Tai paskatins kūrybiškesnį ir novatoriškesnį modelių įgyvendinimą realiose programose, o tai paskatins pagreitinti lenktynes ​​siekiant dirbtinio super intelekto (ASI).