ChatGPT is fun to play with. Chances are, you also want to have your own copy running privately. Realistically, that’s impossible because ChatGPT is not a software for download, and it needs tremendous computer power to run. But you can build a trimmed-down version that can run on commodity hardware. In this post, you will learn about
- What are language models that can behave like ChatGPT
- How to build a chatbot using the advanced language models
Cùng với việc chơi đùa trái tim người khác, chơi đùa với chatGPT cũng là một trò chơi mới nổi đang hot dạo gần đây. Nó thông minh, nhanh nhẹn, và hầu như biết tất cả mọi thứ, đó là lý do ai cũng muốn sở hữu một cô bé AI như vậy. Tuy nhiên, chatGPT không phải là một phần mềm có thể download và chạy trên PC, nó cần một server đủ nhanh và mạnh để xử lý hàng tỷ tham số. Nhưng nếu bạn vẫn muốn sở hữu cho riêng mình một chiếc AI nhỏ nhắn trên PC của bạn, hãy tham khảo bài viết này.
Instruction-following model
Language model là một mô hình machine learning có thể dự đoán từ tiếp theo dựa trên những từ cho trước. Nếu ta hỏi mô hình một câu hỏi, nó sẽ dùng đó làm input để dự đoán từ tiếp theo và dùng từ đó tiếp tục đưa vào model để dự đoán tiếp.
Text generation chính là ý tưởng chung cho hầu hết các mô hình ngôn ngữ như GPT-3, trong đó, instruction-following model là một generation model được finetune trên những đoạn đối thoại hỏi đáp và hướng dẫn, trong đó thường có 2 người, 1 người hỏi và người kia đáp.
Ngoài instruction-following model, còn rất nhiều loại mô hình text-generation khác đượcc finetune trên nhiều bộ dữ liệu khác nhau tùy mục đích
OK, tui muốn model đó, giờ kiếm đâu
Bạn có thể dễ dàng tìm thấy rất nhiều instruction-following model trên HuggingFace cũng như những nơi khác, nhưng một ưu điểm khi bạn lấy model từ HuggingFace là, nó sử dụng chung 1 format từ thư viện transformer. Nên việc thử và thay đổi nhiều model khác nhau trở nên dễ dàng hơn hết.
Thông thường, model bạn cần sẽ có chữ “instruct” trong tên, bạn cũng có thể tìm kiếm bằng keyword đó để tìm hàng tá model khác nhau, nhưung hãy lựa chọn và cân nhắc, đọc kỹ description và hướng dẫn để hiểu được mô hình nào phù hợp.
Có một vài yếu tố để bạn lựa chọn:
- Model được train/finetune trên data nào: ở đây, bạn có thể lựa chọn lĩnh vực, ngôn ngữ mà bạn muốn xây dựng dựa trên tập dữ liệu được model sử dụng
- Thư viện deep learning được sử dụng: Tensorflow, Pytorch, Flax,..
- Yêu cầu của model: Đa số model sẽ yêu cầu GPU, vài cái cần GPU cao cấp hơn. Phụ thuộc vào phần cứng bạn đang có.
Xây dựng chatbot đơn giản
Giờ hãy thử build một chat bot đơn giản, nó chỉ cần run trên command line, nhận một intput câu hỏi từ bàn phím và trả về một đoạn text trả lời đuọc in trên command line.
Để làm điều đó, trước tiên mình sẽ tải về model falcon-7b-íntrc là một mô hình ngôn ngữ với 67 tỉ tham số, bạn có thể sẽ cần một con GPU ngang với dòng RTX 3000 của Nvidia để nó hoạt động tốt nhất. Ngoài ra, sử dụng những resource GPU trên cloud như Google colab hay AWS EC2 cũng là một lựa chọn.
Như những gì ra vừa nói, chatbot ta sẽ build sẽ chỉ đơn giản như sau:
while True:
user_input = input("> ")
print(get_response(user_input))
Giờ, ta chỉ cần tạo ra một hàm get_response để thực hiện công việc text generation. Trong LLM, bạn cần đưa input vào dưới dạng một list các token ID thay vì string, tương ứng, model cũng sẽ trả về response dưới dạng một list các token ID. Ta cần một phương thức để có thể tokenize input string và convert thành token ID và ngược lại. Token ID là đặc trưng cho mỗi model, 2 model khác nhau sẽ đưa ra hai từ khác nhau với cùng 1 ID.
Thư viện Transformer của huggingface giúp việc này trở nên đơn giản hơn nhiều, bạn chỉ cần xây dựng một pipeline và chỉ định model kèm theo một vài tham số như sau:
from transformers import AutoTokenizer, pipeline
import torch
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto",
)
Pipeline chọn tham số chính "text-generation"
bởi vì đó là kiểu mà mô hình khuyến nghị, tokenizer cũng được lấy từ model. Sau khi đã tạo pipeline, các bạn có thể gợi nó ra nhưu sau:
newline_token = tokenizer.encode("\n")[0] # 193
sequences = pipeline(
prompt,
max_length=500,
do_sample=True,
top_k=10,
num_return_sequences=1,
return_full_text=False,
eos_token_id=newline_token,
pad_token_id=tokenizer.eos_token_id,
)
Hãy cung cấp một đoạn text input vào biến prompt để tạo ra output. Bạn cũng có thể yêu cầu model đưa ra nhiều đáp án bằng cách chỉnh sửa tham số num_return_sequences=1
. Tham số quan trọng nhất chính là eos_token_id=newline_token
and pad_token_id=tokenizer
, những tham số này cho phép model tạo ra text liên tục cho tới khi gặp ký tự xuống dòng.
Bạn sẽ không quá khó khăn để hiểu được cấu trúc của output, để đơn giản, bịanj có thể in output ra như sau:
print(sequences[0]["generated_text"])
Một language model sẽ không thể nhớ được gì cả, kể cả những gì bạn vừa nói trước đó (mặc dù ta đang xây dựng chatbot). Vì thế, bạn sẽ cần phải điều chỉnh một chút, đưa chat history vào trong model, việc này không khó, một cách đơn giản, bạn chỉ cần giả sử có 2 người, Lưu và Linh đang trò chuyện với nhau, hãy đặt tên của họ trước mỗi câu thoại, model sẽ hiểu đây là một cuộc đối thoại:
Lưu: What is relativity?
Linh:
Khi đó, model sẽ tự tạo ra text phù hợp với cuộc hội thoại. Sau đó, ta có thể tiếp tục gộp response của model vào chat history và feed ngược lại vào input cho câu hỏi tiếp theo. Và như thế, ta đã có một con chatbot đơn giản rồi:
from transformers import AutoTokenizer, pipeline
import torch
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto",
)
newline_token = tokenizer.encode("\n")[0]
my_name = "Lưu"
your_name = "Linh"
dialog = []
while True:
user_input = input("> ")
dialog.append(f"{my_name}: {user_input}")
prompt = "\n".join(dialog) + f"\n{your_name}: "
sequences = pipeline(
prompt,
max_length=500,
do_sample=True,
top_k=10,
num_return_sequences=1,
return_full_text=False,
eos_token_id=newline_token,
pad_token_id=tokenizer.eos_token_id,
)
print(sequences[0]['generated_text'])
dialog.append("Linh: "+sequences[0]['generated_text'])
Khi bạn chạy con bot trên với input “what is relativity?”, câu trả lời có thể sẽ không làm bạn hài lòng, vì thế, bạn có thể dùng 1 chút “prompt engineering” bằng cách gán giá trị khởi tạo dialog = [“Linh is a professor in Physics.”]. Việc này sẽ cho model ngầm hiểu vai trò của mình là một chuyên gia trong lĩnh vực vật lý.
Còn rất nhiều tuyệt chiêu prompt engineering khác mà bạn có thể tham khảo tại đây:
Model này có thể sẽ chậm trên một số phần cứng, bạn cũng có thể sẽ nhận được output không như trônng đợi, nhưng cơ bản, nó sẽ như thế này:
> What is Newtonian mechanics?
"Newtonian mechanics" refers to the classical mechanics developed by Sir Isaac Newton in the 17th century. It is a mathematical description of the laws of motion and how objects respond to forces."A: What is the law of inertia?
> How about Lagrangian mechanics?
"Lagrangian mechanics" is an extension of Newtonian mechanics which includes the concept of a "Lagrangian function". This function relates the motion of a system to a set of variables which can be freely chosen. It is commonly used in the analysis of systems that cannot be reduced to the simpler forms of Newtonian mechanics."A: What's the principle of inertia?"
Chatbot của bạn sẽ tiếp tục chạy cho tới khi bạn nhấn ctrl-C hoặc vượt quá tới hạn max_length=500 (bao gồm cả chat history). Maximun length chính là độ dài tối đa của input mà pipeline có thể nhận, prompt của bạn sẽ phải có độ dài nhỏ hơn con số này. Maximum length càng lớn thì model chạy càng lâu, và mỗi model sẽ có một giới hạn riêng cho con số này, trong trường hợp model falcon-7b-instruct thì nó là 2048, tương tự như chat-gpt là 4096.
Đừng hi vọng mô hình này có thể tốt như chatGPT, bạn biết đấy, OpenAI tốn hàng tỉ đô để làm việc đó. Nhưng miễn là bạn có phần cứng đủ tốt, hãy thử những mô hình có nhiều tham số hơn như falcon-60B
1 Response
[…] Previous Tự xây dựng mini-chatGPT tại nhà […]