Sử dụng textembedding-gecko@003 cho nội dung nhúng vectơ

Sử dụng textembedding-gecko@003 cho tính năng Nhúng vectơ

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 10 7, 2024
account_circleTác giả: Eduardo Godinez

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 đề cập đến quá trình chuyển dữ liệu văn bản thành biểu diễn số. Những cách biểu diễn bằng số này, thường là các vectơ, nắm bắt được ý 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 cũng giống như một ngôn ngữ phức tạp, đầy sắc thái và những điều không rõ ràng.

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ả: Biểu diễn số nhanh hơn nhiều đối với máy tính khi xử lý so với 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.
  • Nắm bắt ý nghĩa ngữ nghĩa: Nội dung nhúng không chỉ có nghĩa của từ ngữ. 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 của công nghệ học máy: Tính năng nhúng văn bản có thể được dùng làm tính năng trong các mô hình học máy, giúp nâng cao hiệu suất cho những công việc như phân tích quan điểm, 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

Tính năng nhúng văn bản bằng cách chuyển văn bản thành biểu diễn dạng số giúp mở ra nhiều ứng dụng trong lĩnh vực Xử lý ngôn ngữ tự nhiên (NLP). Dưới đâ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 của cụm từ tìm kiếm và so khớp chúng với các tài liệu 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 các phần nhúng của 2 đoạn văn bản có thể giúp xác định những trường hợp có khả năng đạo văn bằng cách tìm ra những điểm tương đồng đáng kể trong cấu trúc ngữ nghĩa của chúng.

Đây chỉ là một vài ví dụ còn nhiều khả năng sẽ tiếp tục được cải thiện khi 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à 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
  • Làm thế nào để gọi textembedding-gecko@003
  • Cách chạy lệnh 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

  1. 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.
  1. Chuyển đến bộ chọn dự án
  2. Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Google Cloud.
  3. Bật API Notebooks.

Bạn có thể tạo một thực thể Vertex AI Workbench bằng cách sử dụng bảng điều khiển Google Cloud, 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.

  1. Trong bảng điều khiển của Google Cloud, hãy chuyển đến trang Thực thể mà bạn có thể truy cập trong trình đơn Vertex AI, mục Sổ tay rồi nhấp vào Workbench. 56c087d619c464dd.png
  2. Chuyển đến phần Phiên bản.
  3. Nhấp vào Tạo mới. 381ff9b895e77641.pngS
  4. 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 phiên bản 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.

Region and Zone (Khu vực và vùng): Chọn một khu vực và vùng cho phiên bản 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 tính toán (roles/compute.networkUser) cho Nhân viên hỗ trợ dịch vụ của Notebooks 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 chế độ cài đặt mặc định.

Trong các thuộc tính của Thực thể, bạn có thể để nguyên giá trị mặc định, đây là một e2-standard-4.

d47bdc2d7f516c46.png

  1. 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 đó.

Tạo sổ ghi chú Python 3

  1. Bên trong Jupyterlab, trên Trình chạy, ở phần Sổ tay, hãy nhấp vào biểu tượng có biểu trưng Python với nội dung Python3. e16bb118cd28256f.png
  2. Sổ tay Jupyter được tạo có tên là Không có tiêu đề và có đuôi ipynb. da9bd34cf307156c.png
  3. 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 các 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 tôi sẽ cần:

  1. mãnh liệt
  2. gấu trúc
  3. TextEmbeddingInput, TextEmbeddingModel từ vertexai.language_models

Sao chép và dán mã dưới đây 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:

6852d323eedcac93.pngS

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 văn bản, dịch văn bản đó sang vectơ, tìm kiế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ẽ lưu 3 bản ghi, sau đây là cách chúng ta tạo bản ghi:

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:

26baa3b876c0605d.png.

Hãy phân tích mã

Trong các biến DOCUMENT1, DOCUMENT2 và DOCUMENT3 chúng tôi đang lưu trữ một từ điển sẽ mô phỏng các tài liệu với tiêu đề và nội dung của chúng. Các "tài liệu" này đang tham khảo hướng dẫn mô phỏng về 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      

Ứng dụng sẽ hiển thị như sau:

4c4af091c7a82861.pngS

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 là list_embedded_values là nơi chúng tôi sẽ lưu trữ và nối thêm văn bản đã mã hoá của mọi hàng.

Khi sử dụng phương thức lặp lại từ gấu trúc, chúng ta có thể lặp lại từng hàng trong khung dữ liệu, nhận 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 được mô phỏng của chúng tôi).

Để gửi văn bản thông thường và trả về vectơ của nó bằng cách sử dụng mô hình gecko@003, chúng ta khởi tạo mô hình biến, nơi chúng ta đặt mô hình để sử dụng bằng cách gọi hàm TextNhúngModel.from_pretrained.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                    

Sau đó, trong các mục nhúng biến, chúng ta chụp vectơ của văn bản mà chúng ta gửi 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 các 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à các vectơ của chúng, chúng ta có thể tiếp tục đặt câu hỏi và truy vấn cơ sở dữ liệu của mình để tìm câu trả lời.

Để làm được 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:

6b7cf9b08e3b4573.png

Hãy cùng phân tích mã này

Tương tự như hàm ở bước trước, trước tiên, chúng ta khởi tạo 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 Text MexicoModel.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ơ. Giờ đây, chúng ta có thể so sánh vectơ của câu hỏi với tất cả các vectơ trong cơ sở dữ liệu nhằm tìm ra vectơ nào gần nhất để trả lời câu hỏi của chúng ta chính xác hơn.

Để thực hiện điều này, chúng ta sẽ đo khoảng cách giữa vectơ câu hỏi và mỗi 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 mực L2.

73ea8635c4570bea.png

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:

b70563b50ea86668.png

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 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 tôi thu thập khoảng cách ngắn nhất cũng như vị trí trong danh sách nơi tìm thấy thiết bị đó. 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ã bên dưới 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ẽ nhận được kết quả như sau:

7a0e429171a19afe.png

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ề việc 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 vào 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...

Tài liệu tham khảo