1. Giới thiệu
Lần cập nhật gần đây nhất: 8/4/2024
Nhúng văn bản
Nhúng văn bản là quá trình chuyển đổi dữ liệu văn bản thành dữ liệu biểu diễn bằng số. Những biểu diễn bằng số này, thường là vectơ, nắm bắt ý nghĩa ngữ nghĩa và mối quan hệ giữa các từ trong một văn bản. Hãy tưởng tượng như sau:
Văn bản giống như một ngôn ngữ phức tạp, đầy sắc thái và mơ hồ.
Tính năng nhúng văn bản sẽ dịch ngôn ngữ đó thành một định dạng toán học đơn giản hơn mà máy tính có thể hiểu và thao tác.
Lợi ích của tính năng nhúng văn bản
- Cho phép xử lý hiệu quả: Máy tính xử lý dữ liệu dạng số nhanh hơn nhiều so với dữ liệu dạng văn bản thô. Điều này rất quan trọng đối với các tác vụ như công cụ tìm kiếm, hệ thống đề xuất và dịch máy.
- Ghi lại ý nghĩa ngữ nghĩa: Nội dung nhúng không chỉ dừng lại ở ý nghĩa đen của từ. Các từ khoá này nắm bắt ngữ cảnh và mối quan hệ giữa các từ, cho phép phân tích chi tiết hơn.
- Cải thiện hiệu suất học máy: Bạn có thể sử dụng văn bản nhúng làm các tính năng trong mô hình học máy, nhờ đó nâng cao hiệu suất trong các nhiệm vụ như phân tích cảm xúc, phân loại văn bản và lập mô hình chủ đề.
Các trường hợp sử dụng tính năng Nhúng văn bản
Việc nhúng văn bản (bằng cách chuyển đổi văn bản thành biểu diễn dạng số) sẽ mở ra nhiều ứng dụng trong quy trình Xử lý ngôn ngữ tự nhiên (NLP). Sau đây là một số trường hợp sử dụng chính:
1. Công cụ tìm kiếm và truy xuất thông tin:
Tính năng nhúng văn bản giúp các công cụ tìm kiếm hiểu được ý nghĩa ngữ nghĩa đằng sau các cụm từ tìm kiếm và so khớp các cụm từ đó với các tài liệu có liên quan, ngay cả khi không có từ khoá chính xác.
Bằng cách so sánh nội dung nhúng của một cụm từ tìm kiếm với nội dung nhúng của tài liệu, công cụ tìm kiếm có thể xác định những tài liệu đề cập đến các chủ đề hoặc khái niệm tương tự.
2. Hệ thống đề xuất:
Hệ thống đề xuất sử dụng văn bản nhúng để phân tích hành vi và lựa chọn ưu tiên của người dùng được thể hiện thông qua bài đánh giá, điểm xếp hạng hoặc nhật ký duyệt web.
Sau đó, hệ thống có thể đề xuất các mặt hàng tương tự bằng cách so sánh nội dung nhúng của sản phẩm, bài viết hoặc nội dung khác mà người dùng đã tương tác.
3. Phát hiện đạo văn:
Việc so sánh nội dung nhúng của hai đoạn văn bản có thể giúp xác định hành vi đạo văn tiềm ẩn bằng cách tìm những điểm tương đồng đáng kể trong cấu trúc ngữ nghĩa của các đoạn văn bản đó.
Đây chỉ là một vài ví dụ và khả năng sẽ tiếp tục phát triển khi các kỹ thuật nhúng văn bản phát triển. Khi máy tính hiểu rõ hơn về ngôn ngữ thông qua các nội dung nhúng, chúng ta có thể mong đợi các ứng dụng sáng tạo hơn nữa trong tương lai.
textembedding-gecko@003
Textembedding-gecko@003 là một phiên bản cụ thể của mô hình nhúng văn bản được huấn luyện trước do Google Cloud Platform (GCP) cung cấp thông qua Vertex AI và bộ công cụ cũng như dịch vụ AI của họ.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ tạo một tập lệnh Python. Tập lệnh này sẽ:
- Sử dụng Vertex API để gọi textembedding-gecko@003 và chuyển đổi văn bản thành văn bản nhúng (vectơ).
- Tạo cơ sở dữ liệu mô phỏng gồm văn bản và các vectơ của văn bản đó
- Thực hiện truy vấn vào cơ sở dữ liệu vectơ mô phỏng của chúng tôi bằng cách so sánh các vectơ và nhận được phản hồi có nhiều khả năng nhất.
Kiến thức bạn sẽ học được
- Cách sử dụng tính năng Nhúng văn bản trong GCP
- Cách gọi textembedding-gecko@003
- Cách chạy mã này trong Workbench
- Cách sử dụng Vertex AI – Workbench để thực thi tập lệnh
Bạn cần có
- Phiên bản Chrome mới nhất
- Có kiến thức về Python
- Một dự án trên Google Cloud
- Quyền truy cập vào Vertex AI – Workbench
2. Thiết lập
Tạo một thực thể Vertex AI Workbench
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án Google Cloud.
- Chuyển đến bộ chọn dự án
- Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Google Cloud.
- Bật Notebooks API.
Bạn có thể tạo một thực thể Vertex AI Workbench bằng cách sử dụng Google Cloud Console, gcloud CLI hoặc Terraform. Trong hướng dẫn này, chúng ta sẽ tạo ứng dụng bằng Google Cloud Console. Bạn có thể xem thêm thông tin về các phương thức khác tại đây.
- Trong Google Cloud Console, hãy chuyển đến trang Instances (Thực thể) có thể truy cập trong trình đơn Vertex AI, phần Notebooks (Sổ tay) rồi nhấp vào Workbench (Bảng điều khiển).
- Chuyển đến phần Phiên bản.
- Nhấp vào Tạo mới.
- Trong hộp thoại Create instance (Tạo thực thể), trong phần Details (Chi tiết), hãy cung cấp thông tin sau cho thực thể mới:
Tên: Cung cấp tên cho thực thể mới. Tên phải bắt đầu bằng một chữ cái, theo sau là tối đa 62 chữ cái viết thường, số hoặc dấu gạch nối (-) và không được kết thúc bằng dấu gạch nối.
Khu vực và Vùng: Chọn khu vực và vùng cho thực thể mới. Để có hiệu suất mạng tốt nhất, hãy chọn khu vực gần bạn nhất về mặt địa lý.
Không cần cài đặt GPU
Trong phần Kết nối mạng, hãy cung cấp những thông tin sau:
Mạng: Điều chỉnh các tuỳ chọn mạng để sử dụng mạng trong dự án hiện tại hoặc mạng VPC dùng chung từ một dự án lưu trữ, nếu bạn đã định cấu hình mạng. Nếu đang sử dụng VPC dùng chung trong dự án lưu trữ, bạn cũng phải cấp vai trò Người dùng mạng điện toán (roles/compute.networkUser) cho Tác nhân dịch vụ của máy tính xách tay từ dự án dịch vụ.
Trong trường Mạng: Chọn mạng mà bạn muốn. Bạn có thể chọn một mạng VPC, miễn là mạng đó đã bật tính năng Quyền truy cập riêng của Google hoặc có thể truy cập Internet
Trong trường Mạng con: Chọn mạng con mà bạn muốn. Bạn có thể chọn một giao diện mặc định.
Trong Thuộc tính thực thể, bạn có thể giữ nguyên thuộc tính mặc định, tức là e2-standard-4.
- Nhấp vào Tạo.
Vertex AI Workbench sẽ tạo một thực thể và tự động khởi động thực thể đó. Khi thực thể đã sẵn sàng để sử dụng, Vertex AI Workbench sẽ kích hoạt đường liên kết Open JupyterLab. Nhấp vào mục đó.
Tạo sổ ghi chú Python 3
- Bên trong Jupyterlab, từ Trình chạy, trong phần Notebook (Sổ tay), hãy nhấp vào biểu tượng có biểu trưng Python có nội dung Python3.
- Một sổ tay Jupyter được tạo với tên Untitled (Chưa có tiêu đề) và đuôi tệp ipynb.
- Bạn có thể đổi tên tệp bằng cách sử dụng phần trình duyệt tệp ở bên trái hoặc để nguyên tên tệp.
Bây giờ, chúng ta có thể bắt đầu đưa mã vào sổ tay.
3. Nhập thư viện bắt buộc
Sau khi tạo thực thể và mở Jupyterlab, chúng ta cần cài đặt tất cả thư viện bắt buộc cho lớp học lập trình.
Chúng ta sẽ cần:
- numpy
- gấu trúc
- TextEmbeddingInput, TextEmbeddingModel từ vertexai.language_models
Sao chép và dán mã bên dưới vào một ô:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
URL sẽ có dạng như sau:
4. Tạo cơ sở dữ liệu vectơ mô phỏng
Để kiểm thử mã, chúng ta sẽ tạo một cơ sở dữ liệu gồm văn bản và các vectơ tương ứng được dịch bằng mô hình nhúng văn bản gecko@003.
Mục tiêu là để người dùng tìm kiếm một văn bản, dịch văn bản đó thành một vectơ, tìm văn bản đó trong cơ sở dữ liệu của chúng tôi và trả về kết quả gần đúng nhất.
Cơ sở dữ liệu vectơ của chúng ta sẽ chứa 3 bản ghi, sau đây là cách tạo cơ sở dữ liệu này:
Sao chép và dán mã dưới đây vào một ô mới.
DOCUMENT1 = {
"title": "Operating the Climate Control System",
"content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console. Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}
DOCUMENT2 = {
"title": "Touchscreen",
"content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon. For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}
DOCUMENT3 = {
"title": "Shifting Gears",
"content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position. Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
Mã sẽ có dạng như sau:
Hãy phân tích mã
Trong các biến DOCUMENT1, DOCUMENT2 và DOCUMENT3, chúng ta đang lưu trữ một từ điển sẽ mô phỏng các tài liệu bằng tiêu đề và nội dung của chúng. Những "tài liệu" này đang tham chiếu đến một sách hướng dẫn mô phỏng của một chiếc ô tô do Google sản xuất.
Trong dòng tiếp theo, chúng ta tạo một danh sách gồm 3 tài liệu (từ điển) đó.
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
Cuối cùng, bằng cách tận dụng pandas, chúng ta sẽ tạo một dataframe từ danh sách đó và sẽ được gọi là df_initial_db.
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
5. Tạo văn bản nhúng
Bây giờ, chúng ta sẽ có một văn bản được nhúng bằng cách sử dụng mô hình gecko@003 cho mỗi bản ghi trong cơ sở dữ liệu tài liệu mô phỏng của chúng ta.
Sao chép và dán mã dưới đây vào một ô mới:
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
Mã sẽ có dạng như sau:
Hãy phân tích mã
Chúng ta đã xác định một hàm có tên là embed_fn. Hàm này sẽ nhận dữ liệu đầu vào là một khung dữ liệu pandas chứa văn bản để thực hiện tính năng nhúng. Sau đó, hàm này trả về văn bản được mã hoá dưới dạng vectơ.
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
Trong danh sách có tên list_embedded_values, chúng ta sẽ lưu trữ và thêm văn bản đã mã hoá của mỗi hàng.
Bằng cách sử dụng phương thức iterrows từ pandas, chúng ta có thể lặp lại mọi hàng trong khung dữ liệu, lấy các giá trị từ cột Văn bản (chứa thông tin thủ công từ cơ sở dữ liệu mô phỏng của chúng ta).
Để gửi văn bản thông thường và trả về vectơ của văn bản đó bằng mô hình gecko@003, chúng ta khởi tạo mô hình biến là nơi chúng ta đặt mô hình để sử dụng bằng cách gọi hàm TextEmbeddingModel.from_pretrained.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
Sau đó, trong các biến nhúng, chúng ta sẽ thu thập vectơ của văn bản mà chúng ta gửi thông qua hàm model.get_embeddings.
Ở cuối hàm, chúng ta tạo một cột mới trong khung dữ liệu có tên là Văn bản được nhúng. Cột này sẽ chứa danh sách các vectơ được tạo dựa trên mô hình gecko@003.
df_input['Embedded text'] = list_embedded_values
return df_input
Cuối cùng, trong biến df_embedded_values_db, chúng ta sẽ thu thập khung dữ liệu chứa dữ liệu ban đầu của chúng ta từ cơ sở dữ liệu được mô phỏng cùng với một cột mới chứa danh sách vectơ cho mỗi hàng.
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
6. Đặt câu hỏi cho cơ sở dữ liệu vectơ
Bây giờ, cơ sở dữ liệu của chúng ta chứa văn bản và vectơ của văn bản đó, chúng ta có thể tiếp tục đặt câu hỏi và truy vấn cơ sở dữ liệu để tìm câu trả lời.
Để làm việc đó, hãy sao chép và dán mã dưới đây vào một ô mới:
question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])
text_to_search=embeddings[0].values
len(text_to_search)
Kết quả sẽ có dạng như sau:
Hãy phân tích mã
Tương tự như hàm ở bước trước, trước tiên, chúng ta khởi chạy biến câu hỏi bằng nội dung mà chúng ta dự định hỏi cơ sở dữ liệu.
question='How do you shift gears in the Google car?'
Sau đó, trong biến mô hình, chúng ta đặt mô hình mà chúng ta muốn sử dụng thông qua hàm TextEmbeddingModel.from_pretrained. Trong trường hợp này, đó là mô hình gecko@003.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
Trong biến nhúng, chúng ta gọi hàm model.get_embeddings và truyền văn bản cần chuyển đổi thành vectơ, trong trường hợp này, chúng ta truyền câu hỏi cần hỏi.
embeddings = model.get_embeddings([(question)])
Cuối cùng, biến text_to_search chứa danh sách các vectơ được dịch từ câu hỏi.
Chúng ta in độ dài của vectơ chỉ để tham khảo.
text_to_search=embeddings[0].values
len(text_to_search)
7. So sánh vectơ
Bây giờ, chúng ta có một danh sách các vectơ trong cơ sở dữ liệu mô phỏng và một câu hỏi được chuyển đổi thành vectơ. Tức là giờ đây, chúng ta có thể so sánh vectơ của câu hỏi với tất cả vectơ trong cơ sở dữ liệu để tìm ra vectơ nào gần nhất để trả lời câu hỏi của chúng ta một cách chính xác hơn.
Để thực hiện việc này, chúng ta sẽ đo khoảng cách giữa vectơ của câu hỏi và từng vectơ của cơ sở dữ liệu. Có nhiều kỹ thuật để đo khoảng cách giữa các vectơ. Đối với lớp học lập trình cụ thể này, chúng ta sẽ sử dụng khoảng cách Euclide hoặc chuẩn L2.
Trong python, chúng ta có thể tận dụng hàm numpy để thực hiện việc này.
Sao chép và dán mã dưới đây vào một ô mới:
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')
Kết quả sẽ có dạng như sau:
Hãy phân tích mã
Chúng ta bắt đầu bằng cách chuyển đổi cột chứa văn bản được nhúng hoặc các vectơ của cơ sở dữ liệu thành một danh sách và lưu trữ trong list_embedded_text_from_db.
Chúng ta cũng khởi tạo biến shortest_distance thành 1 để tiếp tục cập nhật biến này cho đến khi tìm thấy khoảng cách ngắn nhất thực tế.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
Sau đó, sử dụng vòng lặp for, chúng ta lặp lại và lấy khoảng cách giữa vectơ của câu hỏi và mỗi vectơ trên cơ sở dữ liệu.
Sử dụng hàm numpy linalg.norm, chúng ta tính toán khoảng cách giữa các điểm.
Nếu khoảng cách được tính nhỏ hơn khoảng cách trong biến shortest_distance, thì khoảng cách được tính sẽ được đặt thành biến này
Sau đó, chúng ta sẽ ghi lại khoảng cách ngắn nhất cũng như vị trí trong danh sách nơi tìm thấy khoảng cách đó. Trong các biến shortest_distance và shortest_position.
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
8. Kết quả
Khi biết vị trí trong danh sách của vectơ giữ khoảng cách ngắn nhất giữa câu hỏi và cơ sở dữ liệu, chúng ta có thể in kết quả.
Sao chép và dán mã dưới đây vào một ô mới:
print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
df_embedded_values_db.at[shortest_position, 'Title']+": "+
df_embedded_values_db.at[shortest_position, 'Text'])
Sau khi thực thi, bạn sẽ thấy kết quả như sau:
9. Xin chúc mừng
Xin chúc mừng! Bạn đã tạo thành công ứng dụng đầu tiên bằng cách sử dụng mô hình textembedding-gecko@003 trong một trường hợp sử dụng thực tế!
Bạn đã tìm hiểu kiến thức cơ bản về tính năng nhúng văn bản và cách sử dụng mô hình gecko003 trên GCP Workbench.
Giờ đây, bạn đã biết các bước quan trọng cần thiết để tiếp tục áp dụng kiến thức của mình cho nhiều trường hợp sử dụng hơn.
Tiếp theo là gì?
Hãy xem một số lớp học lập trình này...