Thế giới của các Mô hình ngôn ngữ lớn (LLM) đang bùng nổ. Nhiều người có thể cho dùng những phù thủy AI này có thể viết thơ, dịch ngôn ngữ và thậm chí tạo mã như hiện tại công cụ của https://llamacoder.together.ai/ đã cho thấy tiềm năng thay thế con người trong cả việc lập trình. Nhưng bạn đã bao giờ tự hỏi chúng hoạt động như thế nào chưa? Và quan trọng hơn, bạn có thể tự xây dựng một mô hình như vậy không?
Câu trả lời là hoàn toàn có và chỉ bằng một vài dòng code đơn giản! Mặc dù việc tạo ra một LLM tiên tiến đòi hỏi nhiều tài nguyên tính toán, nhưng một phiên bản đơn giản hóa có thể đạt được ngay cả đối với những lập trình viên mới bắt đầu.
Trong bài viết này, chúng ta sẽ cùng tìm cách một LLM cơ bản bằng TensorFlow và Python.
Trước tiên, bạn cần cài đặt TensorFlow trong môi trường Python của mình. Nếu bạn chưa thực hiện, bạn có thể cài đặt bằng pip:
pip install tensorflow
Nội dung chính
Xây dựng mô hình ngôn ngữ lớn từng bước như sau
1: Nhập các thư viện cần thiết
import tensorflow as tf
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
2: Chuẩn bị dữ liệu văn bản của chính bạn
Mô hình ngôn ngữ lớn (LLM) của chúng ta cần học từ dữ liệu văn bản (dạng dữ liệu text). Giống như một đứa trẻ được đọc sách về một chủ đề nào đó, có thể sách cổ tích, sách trinh thám, càng đọc nhiều nó càng hiểu nhiều hơn và có khả năng tạo ra các bài viết tốt hơn.
Ví dụ, Chúng ta có thể bắt đầu với một tập dữ liệu nhỏ gồm các câu chuyện cổ tích.
data = [
# Tập dữ liệu của bạn sẽ ở đây...
]
3: Phân loại và sắp xếp theo thứ tự
Hãy tưởng tượng việc cắt các từ thành các chữ cái riêng lẻ, phân loại theo thứ tự cũng hoạt động tương tự, chia các câu thành các từ riêng lẻ. Sau đó, LLM tìm hiểu mối quan hệ giữa các từ này bằng cách phân tích trình tự của chúng. Dưới đây là Mã nguồn chúng ta mã hóa dữ liệu và tạo ra các chuỗi có độ dài khác nhau, mô phỏng các kí tự ngôn ngữ trong thực tế.
Đoạn code này được sử dụng để tiền xử lý văn bản và chuẩn bị dữ liệu cho một mô hình học máy (ví dụ, mô hình dự đoán từ tiếp theo)
Tokenizer(): Đây là một đối tượng từ thư viện Keras dùng để chuyển đổi văn bản thành các chuỗi số. Mỗi từ trong văn bản sẽ được gán một số duy nhất.
tokenizer = Tokenizer()
tokenizer.fit_on_texts(data)
total_words = len(tokenizer.word_index) + 1
- fit_on_texts(data): Phương thức này “học” các từ trong dữ liệu
data
, sau đó xây dựng một từ điển (dictionary) ánh xạ mỗi từ đến một số.
input_sequences = []
for line in data:
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1]
input_sequences.append(n_gram_sequence)
- tokenizer.word_index: Đây là thuộc tính chứa từ điển các từ đã được tokenizer ánh xạ. Mỗi từ được ánh xạ đến một số nguyên.
- total_words: Để tính tổng số từ trong từ điển, ta lấy độ dài của từ điển cộng thêm 1 (vì chỉ số bắt đầu từ 1, và giá trị 0 có thể được dành cho padding).
max_sequence_length = max([len(x) for x in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre')
- tokenizer.texts_to_sequences([line]): Chuyển câu (line) thành một danh sách các số dựa trên từ điển đã xây dựng. Mỗi từ trong câu được chuyển thành chỉ số tương ứng.
- for i in range(1, len(token_list)): Vòng lặp tạo ra các chuỗi n-gram cho từng câu. N-gram là một chuỗi con của các từ liên tiếp.
- n_gram_sequence = token_list[+1]: Đây là cách tạo ra các chuỗi n-gram với độ dài tăng dần từ 2 từ trở lên. Ví dụ, nếu câu là “I love coding”, các n-gram sẽ là [“I love”, “I love coding”].
- input_sequences.append(n_gram_sequence): Thêm chuỗi n-gram vào danh sách
input_sequences
.
4: Xây dựng cấu trúc LLM
Chúng ta hãy xem LLM như một mạng lưới phức tạp của các tế bào thần kinh. Mã nguồn dưới đây xây dựng một mô hình tuần tự trong TensorFlow:
model = Sequential()
model.add(Embedding(total_words, 100,input_length=max_sequence_length-1))
model.add(LSTM(150, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(100))
model.add(Dense(total_words, activation='softmax'))
5: Cho mô hình LLM học (LLM traning)
Cũng giống như con người học thông qua thực hành, LLM của chúng ta cần được đào tạo. Mã chia các chuỗi thành từ đầu vào và từ mục tiêu, sau đó đưa chúng vào mô hình. Mô hình điều chỉnh các kết nối nội bộ của nó dựa trên mức độ dự đoán các từ mục tiêu tốt như thế nào, dần dần trở nên tốt hơn trong việc tạo ra các câu đúng ngữ pháp và phù hợp với ngữ cảnh.
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
X, y = input_sequences[:, :-1], input_sequences[:, -1]
y = tf.keras.utils.to_categorical(y, num_classes=total_words)
model.fit(X, y, epochs=200, verbose=1)
6: Sáng tạo
Với LLM đã được đào tạo, đã đến lúc tạo ra một số văn bản! Chúng ta cung cấp một câu gốc và mô hình dự đoán từ tiếp theo dựa trên sự hiểu biết của nó về trình tự và từ vựng. Quá trình này tiếp tục, xây dựng một câu mới theo từng từ.
seed_text = "Dữ liệu bắt đầu của bạn sẽ ở đây"
next_words = 15
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_length-1, padding='pre')
predict_probabilities = model.predict(token_list, verbose=0)[0]
predict_index = np.argmax(predicted_probabilities)
output_word = tokenizer.index_word[predicted_index]
seed_text += " " + output_word
print(seed_text)
Đoạn mã này lấy một văn bản hạt giống và mở rộng nó bằng cách dự đoán các từ tiếp theo, từng từ một.
Kết quả đầu ra
Đây là một LLM đơn giản hóa, nhưng nó chứng minh các nguyên tắc cốt lõi của các mô hình ngôn ngữ. Mặc dù không thể sánh bằng sự mạnh mẽ của ChatGPT, nhưng đây là bước đệm để chúng ta bước vào thế giới hấp dẫn của AI và NLP.
Khi bạn đào sâu hơn, khám phá các kiến trúc phức tạp hơn, thử nghiệm với các tập dữ liệu khác nhau (có thể là về các chủ đề khác nhau) và tinh chỉnh quy trình đào tạo của mình, bạn sẽ chứng kiến mô hình LLM của mình phát triển thành một trình tạo ngôn ngữ tinh vi và sáng tạo hơn.
Hãy nhớ rằng, hành trình cũng quan trọng như đích đến (nhưng điều quan trọng là hạnh phúc nằm ở hành trình 🙂 ). Hãy tận hưởng quá trình học hỏi, mày mò và chứng kiến sức mạnh của AI phát triển. Chúc bạn sớm tạo ra được một trợ lí ngôn ngữ của riêng mình thật xuất sắc 🙂