Cách xây dựng Chatbot bằng Streamlit và Llama 2

Spread the love

Llama 2 là một mô hình ngôn ngữ lớn (LLM) mã nguồn mở được phát triển bởi Meta. Đây là một mô hình ngôn ngữ lớn nguồn mở có thẩm quyền, được cho là tốt hơn một số mô hình đóng như GPT-3.5 và PaLM 2. Nó bao gồm ba kích thước mô hình văn bản tổng hợp được đào tạo trước và được tinh chỉnh, bao gồm 7 tỷ, 13 tỷ và 70 tỷ mô hình tham số.

Bạn sẽ khám phá khả năng đàm thoại của Llama 2 bằng cách xây dựng chatbot bằng Streamlit và Llama 2.

Tìm hiểu Llama 2: Tính năng và lợi ích

Llama 2 khác với mô hình ngôn ngữ lớn tiền thân của nó là Llama 1 như thế nào?

  • Kích thước mô hình lớn hơn: Mô hình lớn hơn, có tới 70 tỷ tham số. Điều này cho phép nó tìm hiểu các mối liên hệ phức tạp hơn giữa các từ và câu.
  • Cải thiện khả năng hội thoại: Học tăng cường từ phản hồi của con người (RLHF) cải thiện khả năng ứng dụng đàm thoại. Điều này cho phép mô hình tạo ra nội dung giống con người ngay cả trong các tương tác phức tạp.
  • Suy luận nhanh hơn: Nó giới thiệu một phương pháp mới gọi là chú ý truy vấn theo nhóm để tăng tốc độ suy luận. Điều này dẫn đến khả năng xây dựng các ứng dụng hữu ích hơn như chatbot và trợ lý ảo.
  • Hiệu quả hơn: Nó sử dụng nhiều bộ nhớ và tài nguyên tính toán hơn so với phiên bản trước.
  • Giấy phép nguồn mở và phi thương mại: Đây là nguồn mở. Các nhà nghiên cứu và phát triển có thể sử dụng và sửa đổi Llama 2 mà không bị hạn chế.

Llama 2 vượt trội đáng kể so với người tiền nhiệm về mọi mặt. Những đặc điểm này làm cho nó trở thành một công cụ mạnh mẽ cho nhiều ứng dụng, chẳng hạn như chatbot, trợ lý ảo và khả năng hiểu ngôn ngữ tự nhiên.

Thiết lập môi trường hợp lý để phát triển Chatbot

Để bắt đầu xây dựng ứng dụng của mình, bạn phải thiết lập môi trường phát triển. Điều này nhằm tách biệt dự án của bạn khỏi các dự án hiện có trên máy của bạn.

  [Resolved] Bàn phím máy tính xách tay không hoạt động: 9 cách khắc phục dễ dàng

Đầu tiên, hãy bắt đầu bằng cách tạo môi trường ảo bằng thư viện Pipenv như sau:

 pipenv shell 

Tiếp theo cài đặt các thư viện cần thiết để xây dựng chatbot.

 pipenv install streamlit replicate 

Streamlit: Đây là một khung ứng dụng web nguồn mở giúp kết xuất các ứng dụng khoa học dữ liệu và học máy một cách nhanh chóng.

Tái tạo: Đây là một nền tảng đám mây cung cấp quyền truy cập vào các mô hình học máy nguồn mở lớn để triển khai.

Nhận mã thông báo API Llama 2 của bạn từ bản sao

Để nhận được khóa mã thông báo Sao chép, trước tiên bạn phải đăng ký tài khoản trên nhân rộng sử dụng tài khoản GitHub của bạn.

Khi bạn đã truy cập trang tổng quan, hãy điều hướng đến nút Khám phá và tìm kiếm trò chuyện Llama 2 để xem mô hình llama-2–70b-chat.

Nhấp vào mô hình llama-2–70b-chat để xem điểm cuối API Llama 2. Nhấp vào nút API trên thanh điều hướng của mô hình llama-2–70b-chat. Ở bên phải của trang, nhấp vào nút Python. Điều này sẽ cung cấp cho bạn quyền truy cập vào mã thông báo API cho Ứng dụng Python.

Sao chép REPLICATE_API_TOKEN và lưu trữ an toàn để sử dụng trong tương lai.

Xây dựng Chatbot

Đầu tiên, tạo một tệp Python có tên llama_chatbot.py và tệp env (.env). Bạn sẽ viết mã của mình vào llama_chatbot.py và lưu trữ khóa bí mật cũng như mã thông báo API trong tệp .env.

Trên tệp llama_chatbot.py, nhập các thư viện như sau.

 import streamlit as st 
import os
import replicate

Tiếp theo, đặt các biến toàn cục của mô hình llama-2–70b-chat.

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

Trên tệp .env, thêm mã thông báo Sao chép và điểm cuối mô hình theo định dạng sau:

 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'

Dán mã thông báo Sao chép của bạn và lưu tệp .env.

Thiết kế luồng hội thoại của Chatbot

Tạo lời nhắc trước để khởi động mô hình Llama 2 tùy thuộc vào nhiệm vụ bạn muốn nó thực hiện. Trong trường hợp này, bạn muốn người mẫu đóng vai trò là trợ lý.

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

Thiết lập cấu hình trang cho chatbot của bạn như sau:

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

Viết hàm khởi tạo và thiết lập các biến trạng thái phiên.

 
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)

Hàm đặt các biến thiết yếu như chat_dialogue, pre_prompt, llm, top_p, max_seq_len và nhiệt độ ở trạng thái phiên. Nó cũng xử lý việc lựa chọn mô hình Llama 2 dựa trên sự lựa chọn của người dùng.

  10 khóa học tốt nhất để học Tableau trong một tháng

Viết hàm hiển thị nội dung thanh bên của ứng dụng 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

Hàm hiển thị tiêu đề và các biến cài đặt của chatbot Llama 2 để điều chỉnh.

Viết hàm hiển thị lịch sử trò chuyện trong vùng nội dung chính của ứng dụng 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"])

Hàm lặp lại qua chat_dialogue được lưu ở trạng thái phiên, hiển thị từng tin nhắn với vai trò tương ứng (người dùng hoặc trợ lý).

Xử lý thông tin đầu vào của người dùng bằng chức năng bên dưới.

 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)

Chức năng này cung cấp cho người dùng một trường nhập liệu để họ có thể nhập tin nhắn và câu hỏi của mình. Tin nhắn được thêm vào chat_dialogue ở trạng thái phiên với vai trò người dùng sau khi người dùng gửi tin nhắn.

Viết hàm tạo phản hồi từ mô hình Llama 2 và hiển thị chúng trong khu vực trò chuyện.

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

Hàm này tạo một chuỗi lịch sử hội thoại bao gồm cả tin nhắn của người dùng và trợ lý trước khi gọi hàm debounce_replicate_run để nhận được phản hồi của trợ lý. Nó liên tục sửa đổi phản hồi trong giao diện người dùng để mang lại trải nghiệm trò chuyện theo thời gian thực.

Viết hàm chính chịu trách nhiệm hiển thị toàn bộ ứng dụng Streamlit.

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

Nó gọi tất cả các hàm đã xác định để thiết lập trạng thái phiên, hiển thị thanh bên, lịch sử trò chuyện, xử lý thông tin nhập của người dùng và tạo phản hồi của trợ lý theo thứ tự hợp lý.

  Cách định giá tiền điện tử đúng cách [2023]

Viết hàm để gọi hàm render_app và khởi động ứng dụng khi tập lệnh được thực thi.

 def main():
   render_app()

if __name__ == "__main__":
   main()

Bây giờ ứng dụng của bạn đã sẵn sàng để thực thi.

Xử lý các yêu cầu API

Tạo tệp utils.py trong thư mục dự án của bạn và thêm chức năng bên dưới:

 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

Hàm này thực hiện cơ chế gỡ lỗi để ngăn các truy vấn API thường xuyên và quá mức từ thông tin đầu vào của người dùng.

Tiếp theo, nhập hàm phản hồi gỡ lỗi vào tệp llama_chatbot.py của bạn như sau:

 from utils import debounce_replicate_run 

Bây giờ hãy chạy ứng dụng:

 streamlit run llama_chatbot.py 

Sản lượng dự kiến:

Đầu ra hiển thị cuộc trò chuyện giữa mô hình và con người.

Các ứng dụng trong thế giới thực của Chatbots Streamlit và Llama 2

Một số ví dụ thực tế về ứng dụng Llama 2 bao gồm:

  • Chatbots: Công dụng của nó áp dụng để tạo các chatbot phản hồi của con người có thể tổ chức các cuộc trò chuyện theo thời gian thực về một số chủ đề.
  • Trợ lý ảo: Công dụng của nó áp dụng để tạo trợ lý ảo hiểu và trả lời các truy vấn bằng ngôn ngữ của con người.
  • Dịch ngôn ngữ: Công dụng của nó áp dụng cho các tác vụ dịch ngôn ngữ.
  • Tóm tắt văn bản: Công dụng của nó được áp dụng trong việc tóm tắt các văn bản lớn thành các văn bản ngắn để dễ hiểu.
  • Nghiên cứu: Bạn có thể áp dụng Llama 2 cho mục đích nghiên cứu bằng cách trả lời các câu hỏi về nhiều chủ đề.

Tương lai của AI

Với các mô hình đóng như GPT-3.5 và GPT-4, những người chơi nhỏ khá khó xây dựng bất kỳ nội dung nào bằng cách sử dụng LLM vì việc truy cập API mô hình GPT có thể khá tốn kém.

Việc mở ra các mô hình ngôn ngữ lớn tiên tiến như Llama 2 cho cộng đồng nhà phát triển chỉ là khởi đầu cho một kỷ nguyên mới của AI. Nó sẽ dẫn đến việc triển khai các mô hình một cách sáng tạo và đổi mới hơn trong các ứng dụng trong thế giới thực, dẫn đến một cuộc đua tăng tốc hướng tới việc đạt được Trí tuệ siêu nhân nhân tạo (ASI).

x