|
|
Chạy trong Google Colab
|
|
|
Xem nguồn trên GitHub
|
EmbeddingGemma là một mô hình nhúng mã nguồn mở, có dung lượng nhẹ, được thiết kế để truy xuất nhanh chóng và chất lượng cao trên các thiết bị hằng ngày như điện thoại di động. Chỉ với 308 triệu tham số, mô hình này đủ hiệu quả để chạy các kỹ thuật AI nâng cao (chẳng hạn như Tạo sinh tăng cường truy xuất (RAG)) ngay trên máy cục bộ mà không cần kết nối Internet.
Thiết lập
Trước khi bắt đầu hướng dẫn này, hãy hoàn tất các bước sau:
- Bạn có thể truy cập vào Gemma bằng cách đăng nhập vào Hugging Face rồi chọn Acknowledge license (Chấp nhận giấy phép) cho một mô hình Gemma.
- Tạo Mã truy cập Hugging Face và dùng mã này để đăng nhập từ Colab.
Sổ tay này sẽ chạy trên CPU hoặc GPU.
Cài đặt các gói Python
Cài đặt các thư viện cần thiết để chạy mô hình EmbeddingGemma và tạo các vectơ nhúng. Sentence Transformers là một khung Python để nhúng văn bản và hình ảnh. Để biết thêm thông tin, hãy xem tài liệu về Sentence Transformers.
pip install -U sentence-transformers git+https://github.com/huggingface/transformers@v4.56.0-Embedding-Gemma-previewSau khi chấp nhận giấy phép, bạn cần có một mã thông báo Hugging Face hợp lệ để truy cập vào mô hình.
# Login into Hugging Face Hub
from huggingface_hub import login
login()
Tải mô hình
Sử dụng các thư viện sentence-transformers để tạo một thực thể của lớp mô hình bằng EmbeddingGemma.
import torch
from sentence_transformers import SentenceTransformer
device = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "google/embeddinggemma-300M"
model = SentenceTransformer(model_id).to(device=device)
print(f"Device: {model.device}")
print(model)
print("Total number of parameters in the model:", sum([p.numel() for _, p in model.named_parameters()]))
Device: cuda:0
SentenceTransformer(
(0): Transformer({'max_seq_length': 2048, 'do_lower_case': False, 'architecture': 'Gemma3TextModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Dense({'in_features': 768, 'out_features': 3072, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(3): Dense({'in_features': 3072, 'out_features': 768, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(4): Normalize()
)
Total number of parameters in the model: 307581696
Tạo vectơ nhúng
Vectơ nhúng là một biểu diễn bằng số của văn bản, chẳng hạn như một từ hoặc câu, giúp nắm bắt ý nghĩa ngữ nghĩa của văn bản đó. Về cơ bản, đây là một danh sách các con số (một vectơ) giúp máy tính hiểu được mối quan hệ và ngữ cảnh của các từ.
Hãy xem cách EmbeddingGemma xử lý 3 từ khác nhau ["apple", "banana", "car"].
EmbeddingGemma được huấn luyện trên một lượng lớn văn bản và đã học được mối quan hệ giữa các từ và khái niệm.
words = ["apple", "banana", "car"]
# Calculate embeddings by calling model.encode()
embeddings = model.encode(words)
print(embeddings)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1} (shape): {embedding.shape}")
[[-0.18476306 0.00167681 0.03773484 ... -0.07996225 -0.02348064 0.00976741] [-0.21189538 -0.02657359 0.02513712 ... -0.08042689 -0.01999852 0.00512146] [-0.18924113 -0.02551468 0.04486253 ... -0.06377774 -0.03699806 0.03973572]] Embedding 1: (768,) Embedding 2: (768,) Embedding 3: (768,)
Mô hình này xuất ra một vectơ số cho mỗi câu. Các vectơ thực tế rất dài (768), nhưng để đơn giản, các vectơ đó được trình bày với một vài phương diện.
Điều quan trọng không phải là các con số riêng lẻ mà là khoảng cách giữa các vectơ. Nếu chúng ta vẽ các vectơ này trong một không gian đa chiều, thì các vectơ cho apple và banana sẽ rất gần nhau. Và vectơ cho car sẽ cách xa hai vectơ còn lại.
Xác định mức độ tương đồng
Trong phần này, chúng ta sẽ sử dụng các mục nhúng để xác định mức độ tương đồng về ngữ nghĩa giữa các câu. Ở đây, chúng tôi đưa ra ví dụ về điểm tương đồng cao, trung bình và thấp.
Mức độ tương đồng cao:
- Câu A: "Đầu bếp đã chuẩn bị một bữa ăn ngon cho các vị khách."
- Câu B: "Đầu bếp đã nấu một bữa tối ngon miệng cho khách."
- Lý do: Cả hai câu đều mô tả cùng một sự kiện bằng cách sử dụng các từ và cấu trúc ngữ pháp khác nhau (chủ động so với bị động). Chúng truyền tải cùng một ý nghĩa cốt lõi.
Mức độ tương đồng trung bình:
- Câu A: "Cô ấy là chuyên gia về học máy".
- Câu B: "Anh ấy rất quan tâm đến trí tuệ nhân tạo."
- Lý do: Các câu này có liên quan với nhau vì học máy là một lĩnh vực con của trí tuệ nhân tạo. Tuy nhiên, họ nói về những người khác nhau với mức độ tương tác khác nhau (chuyên gia so với người quan tâm).
Mức độ tương đồng thấp:
- Câu A: "Hôm nay thời tiết ở Tokyo có nắng."
- Câu B: "Tôi cần mua thực phẩm cho tuần này."
- Lý do: Hai câu này hoàn toàn không liên quan đến nhau và không có điểm chung về ngữ nghĩa.
# The sentences to encode
sentence_high = [
"The chef prepared a delicious meal for the guests.",
"A tasty dinner was cooked by the chef for the visitors."
]
sentence_medium = [
"She is an expert in machine learning.",
"He has a deep interest in artificial intelligence."
]
sentence_low = [
"The weather in Tokyo is sunny today.",
"I need to buy groceries for the week."
]
for sentence in [sentence_high, sentence_medium, sentence_low]:
print("🙋♂️")
print(sentence)
embeddings = model.encode(sentence)
similarities = model.similarity(embeddings[0], embeddings[1])
print("`-> 🤖 score: ", similarities.numpy()[0][0])
🙋♂️ ['The chef prepared a delicious meal for the guests.', 'A tasty dinner was cooked by the chef for the visitors.'] `-> 🤖 score: 0.8002148 🙋♂️ ['She is an expert in machine learning.', 'He has a deep interest in artificial intelligence.'] `-> 🤖 score: 0.45417833 🙋♂️ ['The weather in Tokyo is sunny today.', 'I need to buy groceries for the week.'] `-> 🤖 score: 0.22262995
Sử dụng câu lệnh với EmbeddingGemma
Để tạo các vectơ nhúng tốt nhất bằng EmbeddingGemma, bạn nên thêm "câu lệnh hướng dẫn" hoặc "nhiệm vụ" vào đầu văn bản đầu vào. Những câu lệnh này tối ưu hoá các vectơ nhúng cho những nhiệm vụ cụ thể, chẳng hạn như truy xuất tài liệu hoặc trả lời câu hỏi, đồng thời giúp mô hình phân biệt giữa các loại dữ liệu đầu vào, chẳng hạn như cụm từ tìm kiếm so với tài liệu.
Cách áp dụng câu lệnh
Bạn có thể áp dụng câu lệnh trong quá trình suy luận theo 3 cách.
Sử dụng đối số
prompt
Truyền chuỗi câu lệnh đầy đủ trực tiếp đến phương thứcencode. Điều này giúp bạn kiểm soát chính xác.embeddings = model.encode( sentence, prompt="task: sentence similarity | query: " )Sử dụng đối số
prompt_name
Chọn một câu lệnh được xác định trước theo tên. Các câu lệnh này được tải từ cấu hình của mô hình hoặc trong quá trình khởi tạo.embeddings = model.encode(sentence, prompt_name="STS")Sử dụng câu lệnh mặc định
Nếu bạn không chỉ địnhprompthoặcprompt_name, hệ thống sẽ tự động sử dụng câu lệnh được đặt làmdefault_prompt_name. Nếu bạn không đặt câu lệnh mặc định, thì hệ thống sẽ không áp dụng câu lệnh nào.embeddings = model.encode(sentence)
print("Available tasks:")
for name, prefix in model.prompts.items():
print(f" {name}: \"{prefix}\"")
print("-"*80)
for sentence in [sentence_high, sentence_medium, sentence_low]:
print("🙋♂️")
print(sentence)
embeddings = model.encode(sentence, prompt_name="STS")
similarities = model.similarity(embeddings[0], embeddings[1])
print("`-> 🤖 score: ", similarities.numpy()[0][0])
Available tasks: query: "task: search result | query: " document: "title: none | text: " BitextMining: "task: search result | query: " Clustering: "task: clustering | query: " Classification: "task: classification | query: " InstructionRetrieval: "task: code retrieval | query: " MultilabelClassification: "task: classification | query: " PairClassification: "task: sentence similarity | query: " Reranking: "task: search result | query: " Retrieval: "task: search result | query: " Retrieval-query: "task: search result | query: " Retrieval-document: "title: none | text: " STS: "task: sentence similarity | query: " Summarization: "task: summarization | query: " -------------------------------------------------------------------------------- 🙋♂️ ['The chef prepared a delicious meal for the guests.', 'A tasty dinner was cooked by the chef for the visitors.'] `-> 🤖 score: 0.9363755 🙋♂️ ['She is an expert in machine learning.', 'He has a deep interest in artificial intelligence.'] `-> 🤖 score: 0.6425841 🙋♂️ ['The weather in Tokyo is sunny today.', 'I need to buy groceries for the week.'] `-> 🤖 score: 0.38587403
Trường hợp sử dụng: Tạo nội dung dựa trên thông tin truy xuất (RAG)
Đối với các hệ thống RAG, hãy sử dụng các giá trị prompt_name sau đây để tạo các mục nhúng chuyên biệt cho các cụm từ tìm kiếm và tài liệu của bạn:
Đối với Cụm từ tìm kiếm: Sử dụng
prompt_name="Retrieval-query".query_embedding = model.encode( "How do I use prompts with this model?", prompt_name="Retrieval-query" )Đối với Tài liệu: Sử dụng
prompt_name="Retrieval-document". Để cải thiện hơn nữa việc nhúng tài liệu, bạn cũng có thể thêm tiêu đề bằng cách sử dụng trực tiếp đối sốprompt:- Có tiêu đề:
doc_embedding = model.encode( "The document text...", prompt="title: Using Prompts in RAG | text: " )- Không có tiêu đề:
doc_embedding = model.encode( "The document text...", prompt="title: none | text: " )- Có tiêu đề:
Tài liệu đọc thêm
- Để biết thông tin chi tiết về tất cả các câu lệnh EmbeddingGemma hiện có, hãy xem thẻ mô hình.
- Để biết thông tin chung về mẫu câu lệnh, hãy xem tài liệu về Sentence Transformer.
- Để xem bản minh hoạ về RAG, hãy xem Ví dụ đơn giản về RAG trong Sổ tay Gemma.
Phân loại
Phân loại là nhiệm vụ chỉ định một đoạn văn bản cho một hoặc nhiều danh mục hoặc nhãn được xác định trước. Đây là một trong những nhiệm vụ cơ bản nhất trong Xử lý ngôn ngữ tự nhiên (NLP).
Một ứng dụng thực tế của việc phân loại văn bản là định tuyến phiếu yêu cầu hỗ trợ khách hàng. Quy trình này tự động chuyển các câu hỏi của khách hàng đến đúng bộ phận, giúp tiết kiệm thời gian và giảm bớt công việc thủ công.
labels = ["Billing Issue", "Technical Support", "Sales Inquiry"]
sentence = [
"Excuse me, the app freezes on the login screen. It won't work even when I try to reset my password.",
"I would like to inquire about your enterprise plan pricing and features for a team of 50 people.",
]
# Calculate embeddings by calling model.encode()
label_embeddings = model.encode(labels, prompt_name="Classification")
embeddings = model.encode(sentence, prompt_name="Classification")
# Calculate the embedding similarities
similarities = model.similarity(embeddings, label_embeddings)
print(similarities)
idx = similarities.argmax(1)
print(idx)
for example in sentence:
print("🙋♂️", example, "-> 🤖", labels[idx[sentence.index(example)]])
tensor([[0.4673, 0.5145, 0.3604],
[0.4191, 0.5010, 0.5966]])
tensor([1, 2])
🙋♂️ Excuse me, the app freezes on the login screen. It won't work even when I try to reset my password. -> 🤖 Technical Support
🙋♂️ I would like to inquire about your enterprise plan pricing and features for a team of 50 people. -> 🤖 Sales Inquiry
Học biểu diễn Matryoshka (MRL)
EmbeddingGemma tận dụng MRL để cung cấp nhiều kích thước không gian embedding từ một mô hình. Đây là một phương pháp huấn luyện thông minh, tạo ra một mục nhúng duy nhất, chất lượng cao, trong đó thông tin quan trọng nhất được tập trung ở phần đầu của vectơ.
Điều này có nghĩa là bạn có thể nhận được một vectơ nhúng nhỏ hơn nhưng vẫn rất hữu ích bằng cách chỉ lấy N chiều đầu tiên của vectơ nhúng đầy đủ. Việc sử dụng các vectơ nhúng nhỏ hơn, bị cắt bớt sẽ giúp bạn tiết kiệm đáng kể chi phí lưu trữ và tăng tốc độ xử lý, nhưng hiệu quả này sẽ đánh đổi bằng việc vectơ nhúng có thể có chất lượng thấp hơn. MRL cho phép bạn chọn mức cân bằng tối ưu giữa tốc độ và độ chính xác này cho các nhu cầu cụ thể của ứng dụng.
Hãy sử dụng 3 từ ["apple", "banana", "car"] và tạo các mục nhúng đơn giản để xem cách hoạt động của MRL.
def check_word_similarities():
# Calculate the embedding similarities
print("similarity function: ", model.similarity_fn_name)
similarities = model.similarity(embeddings[0], embeddings[1:])
print(similarities)
for idx, word in enumerate(words[1:]):
print("🙋♂️ apple vs.", word, "-> 🤖 score: ", similarities.numpy()[0][idx])
# Calculate embeddings by calling model.encode()
embeddings = model.encode(words, prompt_name="STS")
check_word_similarities()
similarity function: cosine tensor([[0.7510, 0.6685]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.75102395 🙋♂️ apple vs. car -> 🤖 score: 0.6684626
Giờ đây, để có thể áp dụng nhanh hơn, bạn không cần một mô hình mới. Bạn chỉ cần cắt bớt các vectơ nhúng đầy đủ thành 512 phương diện đầu tiên. Để có kết quả tối ưu, bạn cũng nên đặt normalize_embeddings=True, giúp điều chỉnh tỷ lệ các vectơ thành độ dài đơn vị là 1.
embeddings = model.encode(words, truncate_dim=512, normalize_embeddings=True)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1}: {embedding.shape}")
print("-"*80)
check_word_similarities()
Embedding 1: (512,) Embedding 2: (512,) Embedding 3: (512,) -------------------------------------------------------------------------------- similarity function: cosine tensor([[0.7674, 0.7041]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.767427 🙋♂️ apple vs. car -> 🤖 score: 0.7040509
Trong môi trường cực kỳ hạn chế, bạn có thể rút ngắn thêm các mục nhúng xuống chỉ còn 256 phương diện. Bạn cũng có thể sử dụng tích vô hướng hiệu quả hơn để tính toán mức độ tương đồng thay vì mức độ tương đồng cosine tiêu chuẩn.
model = SentenceTransformer(model_id, truncate_dim=256, similarity_fn_name="dot").to(device=device)
embeddings = model.encode(words, prompt_name="STS", normalize_embeddings=True)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1}: {embedding.shape}")
print("-"*80)
check_word_similarities()
Embedding 1: (256,) Embedding 2: (256,) Embedding 3: (256,) -------------------------------------------------------------------------------- similarity function: dot tensor([[0.7855, 0.7382]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.7854644 🙋♂️ apple vs. car -> 🤖 score: 0.7382126
Tóm tắt và các bước tiếp theo
Giờ đây, bạn đã có thể tạo các vectơ nhúng văn bản chất lượng cao bằng EmbeddingGemma và thư viện Sentence Transformers. Áp dụng những kỹ năng này để xây dựng các tính năng mạnh mẽ như tính tương đồng ngữ nghĩa, phân loại văn bản và hệ thống Tạo sinh tăng cường khả năng truy xuất (RAG), đồng thời tiếp tục khám phá những khả năng của các mô hình Gemma.
Hãy xem các tài liệu sau đây:
- Tinh chỉnh EmbeddingGemma
- Ví dụ đơn giản về RAG trong Sổ tay Gemma
Chạy trong Google Colab
Xem nguồn trên GitHub