Използвайте Llama 2 LLM с отворен код, за да създадете персонализиран чатбот с Python.

Llama 2 е голям езиков модел (LLM) с отворен код, разработен от Meta. Това е компетентен голям езиков модел с отворен код, може би по-добър от някои затворени модели като GPT-3.5 и PaLM 2. Състои се от три предварително обучени и фино настроени размера на генериращ текстов модел, включително моделите със 7 милиарда, 13 милиарда и 70 милиарда параметри.

Ще изследвате възможностите за разговор на Llama 2, като изградите чатбот с помощта на Streamlit и Llama 2.

Разбиране на Llama 2: Характеристики и предимства

Колко различна е Llama 2 от своя предшественик голям езиков модел, Лама 1?

  • По-голям размер на модела: Моделът е по-голям, с до 70 милиарда параметри. Това му позволява да научи по-сложни асоциации между думи и изречения.
  • Подобрени способности за разговор: Reinforcement Learning from Human Feedback (RLHF) подобрява способностите за разговорно приложение. Това позволява на модела да генерира човешко съдържание дори при сложни взаимодействия.
  • instagram viewer
  • По-бърз извод: Той въвежда нов метод, наречен внимание на групирана заявка, за да ускори извода. Това води до способността му да създава по-полезни приложения като чатботове и виртуални асистенти.
  • По-ефикасно: Той е с по-голяма ефективност на паметта и изчислителните ресурси от своя предшественик.
  • Лиценз с отворен код и с нетърговска цел: Той е с отворен код. Изследователите и разработчиците могат да използват и модифицират Llama 2 без ограничения.

Llama 2 значително превъзхожда своя предшественик във всички отношения. Тези характеристики го правят мощен инструмент за много приложения, като чатботове, виртуални асистенти и разбиране на естествен език.

Създаване на осветена среда за разработка на чатбот

За да започнете да създавате вашето приложение, трябва да настроите среда за разработка. Това е, за да изолирате вашия проект от съществуващите проекти на вашата машина.

Първо, започнете с създаване на виртуална среда използвайки Pipenv библиотека, както следва:

pipenv shell

След това инсталирайте необходимите библиотеки за изграждане на чатбота.

pipenv install streamlit replicate

Осветен от поток: Това е рамка за уеб приложения с отворен код, която изобразява бързо приложения за машинно обучение и наука за данни.

Репликиране: Това е облачна платформа, която предоставя достъп до големи модели за машинно обучение с отворен код за внедряване.

Вземете вашия Llama 2 API токен от реплика

За да получите ключ за копиране на токен, първо трябва да регистрирате акаунт в Репликиране като използвате акаунта си в GitHub.

Репликацията позволява влизане само чрез a GitHub акаунт.

След като осъществите достъп до таблото за управление, навигирайте до Разгледайте и потърсете Llama 2 chat, за да видите лама-2–70b-чат модел.

Кликнете върху лама-2–70b-чат модел за преглед на крайните точки на API на Llama 2. Щракнете върху API бутон на лама-2–70b-чат навигационната лента на модела. От дясната страна на страницата щракнете върху Python бутон. Това ще ви осигури достъп до API токена за Python приложения.

Копирайте REPLICATE_API_TOKEN и го съхранявайте безопасно за бъдеща употреба.

Пълният изходен код е достъпен в това GitHub хранилище.

Изграждане на чатбота

Първо създайте Python файл, наречен llama_chatbot.py и env файл (.env). Ще напишете своя код в llama_chatbot.py и ще съхраните вашите секретни ключове и API токени във файла .env.

Във файла llama_chatbot.py импортирайте библиотеките, както следва.

import streamlit as st 
import os
import replicate

След това задайте глобалните променливи на лама-2–70b-чат модел.

# 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='')

Във файла .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 в зависимост от това каква задача искате да изпълнява. В този случай искате моделът да действа като помощник.

# 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."

Настройте конфигурацията на страницата за вашия чатбот, както следва:

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

Напишете функция, която инициализира и настройва променливи на състоянието на сесията.

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

Функцията задава основните променливи като чат_диалог, pre_prompt, llm, top_p, max_seq_len, и температура в състояние на сесия. Той също така управлява избора на модел Llama 2 въз основа на избора на потребителя.

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

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

Функцията показва заглавката и променливите за настройка на чатбота Llama 2 за корекции.

Напишете функцията, която изобразява хронологията на чата в областта на основното съдържание на приложението Streamlit.

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

Функцията преминава през chat_dialogue, записан в състоянието на сесията, показвайки всяко съобщение със съответната роля (потребител или асистент).

Обработвайте въвеждането на потребителя, като използвате функцията по-долу.

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)

Тази функция представя потребител с поле за въвеждане, където могат да въвеждат своите съобщения и въпроси. Съобщението се добавя към чат_диалог в състояние на сесия с потребител роля, след като потребителят изпрати съобщението.

Напишете функция, която генерира отговори от модела Llama 2 и ги показва в зоната за чат.

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

Функцията създава низ от хронологията на разговорите, който включва както потребителски, така и асистентски съобщения, преди да извика debounce_replicate_run функция за получаване на отговора на асистента. Той непрекъснато променя отговора в потребителския интерфейс, за да даде изживяване в чат в реално време.

Напишете основната функция, отговорна за изобразяването на цялото приложение Streamlit.

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

Той извиква всички дефинирани функции, за да настрои състоянието на сесията, да изобрази страничната лента, хронологията на чатовете, да обработва въведеното от потребителя и да генерира отговори на асистента в логичен ред.

Напишете функция за извикване на render_app функция и стартирайте приложението, когато скриптът се изпълни.

defmain():
render_app()

if __name__ == "__main__":
main()

Сега вашето приложение трябва да е готово за изпълнение.

Обработка на API заявки

Създавам utils.py файл в директорията на вашия проект и добавете функцията по-долу:

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

Функцията изпълнява механизъм за отблъскване, за да предотврати честите и прекомерни API заявки от въвеждането на потребителя.

След това импортирайте функцията за отговор на debounce във вашия llama_chatbot.py файл, както следва:

from utils import debounce_replicate_run

Сега стартирайте приложението:

streamlit run llama_chatbot.py

Очакван резултат:

Резултатът показва разговор между модела и човек.

Реални приложения на Streamlit и Llama 2 Chatbots

Някои реални примери за приложения на Llama 2 включват:

  • Чатботове: Използването му се отнася за създаване човешки отговор чатботове който може да поддържа разговори в реално време по няколко теми.
  • Виртуални асистенти: Използването му се прилага за създаване на виртуални асистенти, които разбират и отговарят на заявки на човешки език.
  • Езиков превод: Използването му се отнася за задачи за езиков превод.
  • Резюмиране на текст: Използването му е приложимо при обобщаване на големи текстове в кратки текстове за лесно разбиране.
  • Проучване: Можете да приложите Llama 2 за изследователски цели, като отговаряте на въпроси в редица теми.

Бъдещето на AI

При затворени модели като GPT-3.5 и GPT-4 е доста трудно за малките играчи да създадат нещо по същество с помощта на LLM, тъй като достъпът до API на GPT модела може да бъде доста скъп.

Отварянето на усъвършенствани големи езикови модели като Llama 2 за общността на разработчиците е само началото на нова ера на AI. Това ще доведе до по-креативно и иновативно внедряване на моделите в приложения от реалния свят, което ще доведе до ускорена надпревара към постигане на изкуствен супер интелект (ASI).