נצל את הקוד הפתוח Llama 2 LLM כדי לבנות צ'אט בוט מותאם אישית עם Python.

Llama 2 הוא מודל שפה גדול בקוד פתוח (LLM) שפותח על ידי Meta. זהו מודל שפה גדול עם קוד פתוח מוכשר, ללא ספק טוב יותר מכמה דגמים סגורים כמו GPT-3.5 ו-PaLM 2. הוא מורכב משלושה גדלי מודלים של טקסט יצירתי מאומנים מראש, כולל דגמי 7 מיליארד, 13 מיליארד ו-70 מיליארד פרמטרים.

תוכלו לחקור את יכולות השיחה של Llama 2 על ידי בניית צ'אטבוט באמצעות Streamlit ו-Llama 2.

הבנת לאמה 2: תכונות ויתרונות

כמה שונה Lama 2 מקודמו מודל שפה גדול, לאמה 1?

  • גודל דגם גדול יותר: הדגם גדול יותר, עם עד 70 מיליארד פרמטרים. זה מאפשר לו ללמוד אסוציאציות מורכבות יותר בין מילים ומשפטים.
  • שיפור יכולות השיחה: חיזוק למידה ממשוב אנושי (RLHF) משפר את יכולות היישום בשיחה. זה מאפשר למודל ליצור תוכן כמו אנושי גם באינטראקציות מפותלות.
  • הסקה מהירה יותר: הוא מציג שיטה חדשה הנקראת תשומת לב שאילתה מקובצת כדי להאיץ מסקנות. זה מביא ליכולת שלו לבנות יישומים שימושיים יותר כמו צ'טבוטים ועוזרים וירטואליים.
  • יותר יעיל: זה יעיל יותר בזיכרון ובמשאב חישובי מקודמו.
  • רישיון קוד פתוח ולא מסחרי: זה קוד פתוח. חוקרים ומפתחים יכולים להשתמש ולשנות את Llama 2 ללא הגבלות.
instagram viewer

Llama 2 עולה משמעותית על קודמו בכל המובנים. מאפיינים אלו הופכים אותו לכלי רב עוצמה עבור יישומים רבים, כגון צ'אטבוטים, עוזרים וירטואליים והבנת שפה טבעית.

הגדרת סביבה יעילה לפיתוח צ'טבוט

כדי להתחיל לבנות את האפליקציה שלך, עליך להגדיר סביבת פיתוח. זה נועד לבודד את הפרויקט שלך מהפרויקטים הקיימים במחשב שלך.

ראשית, תתחיל יצירת סביבה וירטואלית משתמש ב Pipenv הספרייה כדלקמן:

pipenv shell

לאחר מכן, התקן את הספריות הדרושות לבניית הצ'אטבוט.

pipenv install streamlit replicate

מואר: זוהי מסגרת של אפליקציית אינטרנט בקוד פתוח שמציגה יישומי למידת מכונה ומדעי נתונים במהירות.

שכפל: זוהי פלטפורמת ענן המספקת גישה למודלים גדולים של למידה חישובית בקוד פתוח לצורך פריסה.

קבל את אסימון ה-API של Llama 2 שלך משכפל

כדי לקבל מפתח לשכפל אסימון, תחילה עליך לרשום חשבון ב- שכפל באמצעות חשבון GitHub שלך.

שכפול מאפשר כניסה דרך a חשבון GitHub.

לאחר שניגשת ללוח המחוונים, נווט אל לַחקוֹר כפתור וחפש צ'אט Llama 2 כדי לראות את llama-2–70b-chat דֶגֶם.

הקלק על ה llama-2–70b-chat מודל לצפייה בנקודות הקצה של Llama 2 API. לחץ על ממשק API כפתור על llama-2–70b-chat סרגל הניווט של הדגם. בצד ימין של הדף, לחץ על פִּיתוֹן לַחְצָן. זה יספק לך גישה לאסימון ה-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

לאחר מכן, הגדר את המשתנים הגלובליים של llama-2–70b-chat דֶגֶם.

# 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 תכופות ומוגזמות מהקלט של משתמש.

לאחר מכן, ייבא את פונקציית תגובת הדחיקה אל שלך llama_chatbot.py קובץ באופן הבא:

from utils import debounce_replicate_run

כעת הפעל את האפליקציה:

streamlit run llama_chatbot.py

פלט צפוי:

הפלט מציג שיחה בין הדוגמנית לאדם.

יישומים מהעולם האמיתי של צ'אטבוטים של Streamlit ו-Llama 2

כמה דוגמאות מהעולם האמיתי של יישומי Llama 2 כוללות:

  • צ'אטבוטים: השימוש בו חל על יצירה צ'אטבוטים לתגובה אנושית שיכול לקיים שיחות בזמן אמת בכמה נושאים.
  • עוזרים וירטואליים: השימוש בו חל על יצירת עוזרים וירטואליים שמבינים ומגיבים לשאילתות בשפה אנושית.
  • תרגום שפה: השימוש בו חל על משימות תרגום שפה.
  • סיכום טקסט: השימוש בו ישים לסיכום טקסטים גדולים לטקסטים קצרים להבנה קלה.
  • מחקר: אתה יכול ליישם את לאמה 2 למטרות מחקר על ידי מענה על שאלות במגוון נושאים.

העתיד של AI

עם דגמים סגורים כמו GPT-3.5 ו-GPT-4, די קשה לשחקנים קטנים לבנות משהו מהותי באמצעות LLMs מכיוון שהגישה ל-API של מודל GPT יכולה להיות די יקרה.

פתיחת מודלים מתקדמים של שפות גדולות כמו Llama 2 לקהילת המפתחים היא רק ההתחלה של עידן חדש של AI. זה יוביל ליישום יצירתי וחדשני יותר של המודלים ביישומים בעולם האמיתי, שיוביל למירוץ מואץ להשגת בינה על מלאכותית (ASI).