Cách xây dựng Chatbot bằng Streamlit và Llama 2
Llama 2 là một mô hình ngôn ngữ lớn mã nguồn mở được phát triển bởi Meta. Mẫu đặc biệt này có những khả năng ấn tượng, khiến nó trở thành một đối thủ đáng gờm so với các mẫu đóng khác như GPT-3.5 và PaLM. Trên thực tế, nhiều chuyên gia cho rằng Llama 2 vượt trội hơn những lựa chọn thay thế này về mặt hiệu năng. Kiến trúc của mô hình này bao gồm ba mô hình văn bản tổng hợp được đào tạo trước và tinh chỉnh riêng biệt, mỗi mô hình có mức độ phức tạp khác nhau. Các model này bao gồm các phiên bản có thông số lần lượt là 7 tỷ, 13 tỷ và 70 tỷ.
Đi sâu vào tiềm năng đối thoại của Llama 2 bằng cách xây dựng một chatbot sử dụng các khả năng của Streamlit và Llama 2 để tương tác với người dùng trong thời gian thực.
Tìm hiểu Llama 2: Tính năng và lợi ích
Llama 2, phiên bản mới nhất của mô hình ngôn ngữ lớn, khác biệt như thế nào so với phiên bản trước đó, Llama 1?
Mô hình tăng cường tự hào có kiến trúc được mở rộng đáng kể, bao gồm tới 70 tỷ tham số. Số lượng tham số mở rộng như vậy tạo điều kiện thuận lợi cho việc thu được các mối quan hệ ngày càng phức tạp vốn có trong chuỗi từ.
Học tăng cường từ phản hồi của con người (RLHF) đã chứng minh tính hiệu quả của nó trong việc nâng cao khả năng của các ứng dụng đàm thoại, dẫn đến những phản hồi tự nhiên và thuyết phục hơn có thể được tạo ra trong nhiều cuộc đối thoại phức tạp. Việc kết hợp RLHF vào các mô hình này không chỉ nâng cao khả năng hiểu ngữ cảnh mà còn cho phép chúng đưa ra các phản hồi mạch lạc và phù hợp hơn, do đó mang lại trải nghiệm người dùng được cải thiện.
Sự ra đời của kỹ thuật cải tiến được gọi là “chú ý truy vấn theo nhóm” đã đẩy nhanh đáng kể quá trình suy luận, từ đó cho phép phát triển các ứng dụng có chức năng cao như chatbot và trợ lý ảo.
Phiên bản hiện tại thể hiện mức độ hiệu quả vượt trội về cả việc sử dụng bộ nhớ và tài nguyên tính toán so với phiên bản trước đó.
Llama 2 được cấp phép theo khuôn khổ nguồn mở và phi thương mại, cho phép các nhà nghiên cứu và nhà phát triển sử dụng và sửa đổi các tính năng của nó một cách tự do mà không có bất kỳ ràng buộc hoặc hạn chế nào do lợi ích thương mại áp đặt.
Llama 2 thể hiện hiệu suất vượt trội trên nhiều khía cạnh so với phiên bản trước, khiến nó trở thành một công cụ đặc biệt mạnh mẽ cho nhiều tiện ích, bao gồm tương tác chatbot, trình trợ giúp ảo và 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 bạn, cần phải thiết lập một môi trường phát triển nhằm tách biệt dự án hiện tại của bạn khỏi mọi dự án hiện có được lưu trữ trên thiết bị của bạn.
Để bắt đầu, hãy thiết lập một môi trường ảo sử dụng thư viện Pipenv theo cách sau:
pipenv shell
Tiếp theo, chúng ta sẽ tiến hành cài đặt các thành phần phần mềm cần thiết để xây dựng tác nhân hội thoại.
pipenv install streamlit replicate
Streamlit là một khung phát triển ứng dụng web nguồn mở, linh hoạt được thiết kế để tạo điều kiện triển khai nhanh chóng các dự án khoa học dữ liệu và học máy.
Về bản chất, “Sao chép” đề cập đến một nền tảng điện toán đám mây cung cấp cho người dùng quyền truy cập vào một loạt các mô hình học máy nguồn mở có thể dễ dàng triển khai và sử dụng trong nhiều ứng dụng khác nhau.
Nhận mã thông báo API Llama 2 của bạn từ bản sao
Để nhận 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 Replicate bằng tài khoản GitHub của mình.
Sao chép chỉ cho phép đăng nhập thông qua tài khoản GitHub.
Khi truy cập trang tổng quan, hãy chuyển tới tab “Khám phá” và tìm thanh tìm kiếm. Nhập’Trò chuyện Llama 2’vào trường tìm kiếm để xem mô hình cụ thể có tên’llama-2–70b-chat'.
Vui lòng chọn tùy chọn “Điểm cuối API Llama 2” từ menu thả xuống và nhấp vào tùy chọn đó. Khi bạn đã làm như vậy, hãy điều hướng đến phần có nhãn “Mã thông báo API”. Tại đây, bạn sẽ tìm thấy một nút được chỉ định là “Ứng dụng Python”. Bằng cách nhấp vào nút này, bạn sẽ được cấp quyền truy cập vào thông tin xác thực cần thiết để sử dụng API Llama 2 trong các dự án Python của mình.
Vui lòng sao chép mã thông báo API cho mục đích sao chép và đảm bảo lưu trữ an toàn để sử dụng trong tương lai.
Mã nguồn hoàn chỉnh có thể được truy cập thông qua kho lưu trữ GitHub của chúng tôi, nơi cung cấp tài nguyên toàn diện để các nhà phát triển sử dụng và đóng góp cho dự án.
Xây dựng Chatbot
Để bắt đầu phát triển Llama Chatbot, ban đầu hãy tạo hai tệp riêng biệt-một tệp có tên “llama\_chatbot.py” dùng làm tập lệnh chính để triển khai chức năng của chatbot và một tệp khác có tên “.env”, được thiết kế dành riêng cho chứa thông tin nhạy cảm như khóa bí mật và mã thông báo API cần thiết để hoạt động bình thường. Bằng cách tuân thủ thiết lập ban đầu này, bạn có thể tách biệt dữ liệu nhạy cảm khỏi mã nguồn chính một cách hiệu quả đồng thời đảm bảo tích hợp liền mạch với các dịch vụ bên ngoài.
Để sử dụng các chức năng khác nhau trong tập lệnh llama\_chatbot.py
, cần phải nhập một số thư viện. Quá trình nhập các thư viện này bao gồm việc chỉ định tên tương ứng của chúng và đảm bảo rằng chúng được tích hợp đúng cách với cơ sở mã hiện có. Điều này cho phép hoạt động liền mạch và thực thi chức năng dự định của chatbot.
import streamlit as st
import os
import replicate
Tiếp theo, chúng tôi sẽ thiết lập các tham số chung cho mô hình ngôn ngữ “llama-2–70b-chat” bằng cách khởi tạo các biến liên quan của nó.
# 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='')
Để kết hợp mã thông báo API Sao chép và thông tin mô hình trong các biến môi trường của ứng dụng, bạn nên thêm các chi tiết có liên quan vào tệp “.env” bằng cách sử dụng cấu trúc định dạng cụ thể. Điều này sẽ cho phép tích hợp liền mạch các thành phần này trong dự án của bạn.
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'
Vui lòng sao chép mã thông báo được cung cấp và đảm bảo rằng bạn đã lưu tệp.env tương ứng.
Thiết kế luồng hội thoại của Chatbot
Quá trình bắt đầu sử dụng mô hình ngôn ngữ Llama 2 cho các tác vụ cụ thể có thể được tạo điều kiện thuận lợi bằng cách tạo lời nhắc sơ bộ nêu rõ mục tiêu mong muốn. Ví dụ: nếu mục tiêu là sử dụng mô hình với tư cách là trợ lý thì việc xây dựng một tuyên bố khởi đầu phù hợp sẽ liên quan đến việc xác định mục đích đó và có khả năng phân định bất kỳ lĩnh vực trọng tâm hoặc chuyên môn lĩnh vực cụ thể nào cần thiết để hoàn thành vai trò một cách hiệu quả. Bằng cách cung cấp trước các hướng dẫn rõ ràng, quá trình tương tác tiếp theo với trợ lý ảo được hỗ trợ bởi AI sẽ diễn ra hiệu quả và chính xác hơn.
# 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."
Việc thiết lập trang chatbot có thể được sắp xếp theo nhiều cách khác nhau, tùy thuộc vào giao diện và chức năng mong muốn. Một số cân nhắc chính cần ghi nhớ bao gồm các yếu tố thiết kế như cách phối màu, lựa chọn phông chữ và tùy chọn bố cục. Ngoài ra, điều quan trọng là xác định thông tin hoặc tính năng nào sẽ được hiển thị trên trang, bao gồm mọi thành phần tương tác như nút hoặc biểu mẫu. Các chi tiết cụ thể của sự sắp xếp có thể khác nhau tùy theo sở thích và yêu cầu của từng cá nhân, nhưng việc có một kế hoạch rõ ràng có thể giúp đảm bảo rằng kết quả cuối cùng đáp ứng được các mục tiêu và mục đích đã định.
# Set initial page configuration
st.set_page_config(
page_title="LLaMA2Chat",
page_icon=":volleyball:",
layout="wide"
)
Bắt đầu và thiết lập các cấu hình biến dành riêng cho phiên thông qua việc thực hiện quy trình chức năng.
# 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
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)
Quá trình nói trên định cấu hình các tham số quan trọng, chẳng hạn như chat\_dialogue
, pre\_prompt
, llm
, top\_p
, max\_seq\_len
, và templates
trong trạng thái của phiên. Ngoài ra, nó còn tạo điều kiện thuận lợi cho việc lựa chọn mẫu Llama 2 ưa thích theo sở thích của người dùng.
Dưới đây là ví dụ về cách bạn có thể tạo một hàm trong Python để hiển thị nội dung thanh bên cho ứng dụng Streamlit của bạn:pythondef render_sidebar():# Mã tạo mã HTML cho thanh bên sẽ ở đâytrở về “ Nội dung thanh bên của bạn sẽ ở đây ”
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
Thành phần nói trên hiển thị tiêu đề và các tham số cấu hình có thể được sửa đổi để tối ưu hóa hiệu suất của chatbot Llama 2, tạo điều kiện cho các điều chỉnh cần thiết để đạt được chức năng tối ưu.
Dưới đây là một phương pháp triển khai khả thi để hiển thị lịch sử trò chuyện trong khu vực nội dung chính của ứng dụng Streamlit bằng cách sử dụng HTML và CSS:pythonimport Streamlit as stfrom Transformers import GPT2LMHeadModel, GPT2Tokenizerfrom tin nhắn nhập Streamlit_chat# Tải mô hình tinh chỉnh và tokenizermodel=GPT2LMHeadModel.from_pretrain(‘meditations_model’)tokenizer=GPT2Tokenizer.from_pretrain(‘meditations_model’)# Xác định chức năng chatbotdef chatbot(text):input_ids=tokenizer.encode(text, return_tensors=‘pt’)output=model.generate(input_ids=input_ids, max_length=
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"])
Phương thức này duyệt qua đối tượng chat\_dialogue
được lưu trữ trong trạng thái của phiên, hiển thị từng giao tiếp được trao đổi giữa người dùng và trợ lý, kèm theo mã nhận dạng vai trò tương ứng của nó (“người dùng"hoặc"trợ lý”).
Đoạn mã được cung cấp dường như là một phần giữ chỗ cho một hàm xử lý thông tin đầu vào của người dùng nhưng không đưa ra cách triển khai thực tế nào. Để xử lý đầu vào của người dùng theo cách phức tạp hơn, cần xác định và triển khai thuật toán hoặc logic thích hợp trong hàm dựa trên các yêu cầu cụ thể của ứng dụng của bạn.
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)
Thành phần trình bày cung cấp giao diện nhập văn bản cho người dùng, cho phép họ gửi tin nhắn hoặc truy vấn trong ngữ cảnh hội thoại. Sau khi nhận được thông tin đầu vào của người dùng, nó sẽ thêm thông báo vào cuộc hội thoại đang diễn ra được lưu trữ như một phần của dữ liệu dành riêng cho phiên, bao gồm siêu dữ liệu chỉ định vai trò của người tham gia là “người dùng” hoặc “bot”.
Dưới đây là ví dụ về cách bạn có thể triển khai chức năng này bằng Python và thư viện Hugging Face Transformers:pythonfrom Transformers import LlamaTokenizer, LlamaForCausalLMimport torchdef generate_responses(input_text):# Tải mã thông báo Llama được đào tạo trước và modeltokenizer=LlamaTokenizer.from_pretrain(‘facebook/llama-base’)model=LlamaForCausalLM.from_pretrain(‘facebook/llama-base’)# Mã hóa văn bản đầu vào dưới dạng ID đầu vàosinputs=tokenizer(input_text, return_tensors=‘pt’).input_ids# Tạo
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ệ thống tạo ra một kho lưu trữ các thông tin liên lạc trong quá khứ, bao gồm cả đầu vào của con người và AI, trước khi gọi quy trình sao chép trì hoãn. Điều này mang lại trải nghiệm đối thoại liền mạch bằng cách cập nhật động giao diện với câu trả lời mới nhất của AI.
Nhiệm vụ chính của ứng dụng này là hiển thị tất cả các thành phần trong khung Streamlit, đóng vai trò là giao diện toàn diện cho người dùng.
def render_app():
setup_session_state()
render_sidebar()
render_chat_history()
handle_user_input()
generate_assistant_response()
Ứng dụng sử dụng một chuỗi hoạt động có tổ chức để thiết lập hiện trạng của phiên, hiển thị bảng điều khiển bên, ghi lại các cuộc trò chuyện, xử lý thông tin đầu vào của người dùng và tạo phản hồi của người trợ giúp bằng cách sử dụng tất cả các chức năng được xác định trước đó.
Sau đây là ví dụ về cách bạn có thể sửa đổi hàm main()
trong index.js
để sử dụng hàm renderApp()
và khởi động ứng dụng khi tập lệnh được thực thi:javascriptasync function main() {const app=createContext (vô giá trị);//Tạo bối cảnh Nhà cung cấp với giá trị ban đầu là null//Bao bọc hàm renderApp bằng một khối try-catch để xử lý lỗitry {renderApp(app, document.getElementById(‘root’));} Catch (err) {console.error( Lỗi khi thực thi thành phần gốc:\n${err.stack}
);}}//Gọi hàm chính để chạy applicationmain();Mã này tạo một phiên bản mới của bối cảnh Nhà cung cấp bằng cách chuyển null
def main():
render_app()
if __name__ == "__main__":
main()
Ứng dụng của bạn hiện đã được chuẩn bị và trang bị để triển khai, cho phép nó được thực thi một cách dễ dàng.
Xử lý các yêu cầu API
Để triển khai chức năng được yêu cầu, cần phải tạo một mô-đun Python mới có tên là “utils.py” trong thư mục chính của dự án. Mô-đun này sẽ chứa một chức năng duy nhất thực hiện nhiệm vụ được chỉ định. Dưới đây là một ví dụ về cách đạt được điều này:pythondef some_function():# Mã hàm ở đây…
import replicate
import time
# Initialize debounce variables
last_call_time = 0
debounce_interval = 2 # Set the debounce interval (in seconds)
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
Chức năng này kết hợp cơ chế gỡ lỗi để giảm thiểu rủi ro về các yêu cầu API quá thường xuyên và hoang phí do tương tác của người dùng, từ đó đảm bảo sử dụng tài nguyên một cách thận trọng.
Kết hợp chức năng phản hồi đã được gỡ lỗi vào tập lệnh llama\_chatbot.py
bằng cách thực hiện các bước 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:
Tương tác hiển thị ở đầu ra này là cuộc đối thoại giữa mô hình ngôn ngữ AI và người dùng.
Ứng dụng thực tế của Chatbot Streamlit và Llama 2
Có thể quan sát thấy một số trường hợp sử dụng thực tế phần mềm Llama 2 trong các ngành khác nhau, chẳng hạn như:
Chatbots là một công cụ linh hoạt được sử dụng để phát triển các tác nhân tương tác có khả năng tiến hành các cuộc thảo luận theo thời gian thực trên nhiều chủ đề, tận dụng thuật toán xử lý ngôn ngữ tự nhiên và trí tuệ nhân tạo để cung cấp phản hồi phù hợp dựa trên đầu vào của người dùng.
Kết hợp công nghệ hiểu ngôn ngữ tự nhiên, công cụ này được thiết kế để phát triển các tác nhân đàm thoại có khả năng hiểu và phản hồi giao tiếp của con người theo cách bắt chước sự tương tác giống con người.
Việc sử dụng công nghệ dịch ngôn ngữ chỉ giới hạn ở việc dịch các ngôn ngữ trong các nhiệm vụ ngôn ngữ khác nhau.
Tóm tắt văn bản bao gồm việc cô đọng một đoạn văn dài thành một phiên bản ngắn hơn, súc tích hơn mà vẫn giữ được ý nghĩa thiết yếu và các điểm chính trong khi loại bỏ các chi tiết không cần thiết. Quá trình này có thể hữu ích trong nhiều bối cảnh khác nhau như báo chí, tài liệu nghiên cứu hoặc phương tiện truyền thông xã hội, nơi việc truy cập thông tin nhanh chóng là rất quan trọng. Bằng cách chỉ trình bày những khía cạnh quan trọng nhất của một chủ đề nhất định, phần tóm tắt cho phép người đọc nắm bắt các ý chính một cách hiệu quả mà không cần phải đọc toàn bộ tài liệu từng chữ một.
Việc áp dụng Llama 2 cho mục đích nghiên cứu liên quan đến việc trả lời các câu hỏi trải rộng trên nhiều chủ đề.
Tương lai của AI
Thách thức đặt ra bởi chi phí cao liên quan đến việc sử dụng các mô hình ngôn ngữ lớn như các mô hình có trong GPT-3.5 và GPT-4 đã hạn chế khả năng của các thực thể nhỏ hơn trong việc xây dựng các ứng dụng đáng chú ý của chúng, vì việc có được quyền truy cập vào API cho các mô hình này thường đi kèm với thách thức. với một chi phí đáng kể.
Việc công bố các khuôn khổ ngôn ngữ mạnh mẽ như Llama 2 cho cộng đồng phát triển đánh dấu sự khởi đầu của một kỷ nguyên mới trong trí tuệ nhân tạo. Tình huống cuối cùng này sẽ thúc đẩy việc sử dụng các hệ thống này một cách sáng tạo và giàu trí tưởng tượng trong các tình huống thực tế, từ đó thúc đẩy tiến trình đạt được Siêu trí tuệ nhân tạo với tốc độ nhanh chóng.