Chào mừng các bạn trở lại với chuỗi bài viết “AI Engineer Roadmap”! Sau khi khám phá khái niệm về Embeddings là gì và vì sao chúng là nòng cốt của AI Search, cũng như tìm hiểu về các trường hợp sử dụng hàng đầu của Embeddings, hôm nay chúng ta sẽ đi sâu vào thực hành: Sử dụng OpenAI Embedding API – một công cụ mạnh mẽ giúp biến văn bản thành vector số mà các mô hình AI có thể “hiểu” được.
Nếu bạn đang theo đuổi con đường trở thành một Kỹ sư AI, việc nắm vững cách làm việc với các API của các mô hình AI tiên tiến là cực kỳ quan trọng. OpenAI không chỉ cung cấp API cho các mô hình ngôn ngữ tạo sinh (như GPT cho Chat Completions mà chúng ta đã tìm hiểu trong bài Bắt Đầu Với OpenAI Chat Completions API), mà còn là nhà cung cấp hàng đầu về các mô hình Embedding hiệu quả và tiết kiệm chi phí. Bài viết này sẽ là kim chỉ nam chi tiết, từng bước một, giúp bạn bắt đầu hành trình biến văn bản thành vector và mở ra cánh cửa cho vô vàn ứng dụng AI thú vị.
Mục lục
Embeddings Là Gì? (Nhắc Lại Ngắn Gọn)
Trước khi bắt tay vào code, hãy cùng nhắc lại nhanh về Embeddings. Đơn giản mà nói, Embeddings là các vector (dãy số) chiều cao đại diện cho ngữ nghĩa của một đoạn văn bản (từ, câu, đoạn văn). Các văn bản có ý nghĩa tương đồng sẽ có vector Embedding “gần” nhau trong không gian vector nhiều chiều. Sự “gần gũi” này thường được đo bằng các thước đo khoảng cách như Cosine Similarity.
Vai trò của Embeddings cực kỳ quan trọng vì máy tính không thể trực tiếp xử lý văn bản theo nghĩa ngữ nghĩa. Bằng cách chuyển đổi văn bản thành vector số, chúng ta cho phép máy tính thực hiện các phép toán trên chúng, từ đó hiểu được mối quan hệ và ngữ cảnh giữa các đoạn văn bản khác nhau. Điều này là nền tảng cho nhiều ứng dụng AI như:
- Tìm kiếm ngữ nghĩa (Semantic Search): Tìm kiếm dựa trên ý nghĩa thay vì chỉ từ khóa.
- Phân cụm (Clustering): Gom nhóm các đoạn văn bản có chủ đề tương đồng.
- Hệ thống gợi ý (Recommendation Systems): Đề xuất nội dung tương tự dựa trên văn bản người dùng đã xem.
- Phát hiện sự bất thường (Anomaly Detection): Tìm các đoạn văn bản khác biệt đáng kể so với phần còn lại.
- Phân loại (Classification): Gán nhãn cho văn bản dựa trên nội dung của nó.
Các Mô Hình Embedding Của OpenAI
OpenAI cung cấp một số mô hình Embedding khác nhau, mỗi loại có đặc điểm và chi phí riêng. Việc lựa chọn mô hình phù hợp phụ thuộc vào yêu cầu về hiệu suất, độ chính xác và ngân sách của bạn. Hiện tại, các mô hình Embedding được khuyến nghị sử dụng là thế hệ thứ 3:
text-embedding-3-small:
- Mô hình nhỏ hơn, hiệu quả về chi phí.
- Cung cấp hiệu suất tốt cho nhiều tác vụ.
- Kích thước vector mặc định là 1536 chiều.
- Hỗ trợ giảm chiều vector thông qua tham số
dimensions
.
text-embedding-3-large:
- Mô hình lớn hơn, mạnh mẽ hơn.
- Thường cho kết quả chính xác hơn trên các tập dữ liệu phức tạp hoặc yêu cầu độ phân biệt cao.
- Kích thước vector mặc định là 3072 chiều.
- Cũng hỗ trợ giảm chiều vector thông qua tham số
dimensions
.
Trước đây, mô hình text-embedding-ada-002
rất phổ biến, nhưng OpenAI khuyến khích chuyển sang sử dụng thế hệ thứ 3 vì chúng hiệu quả hơn (tốt hơn hoặc tương đương với chi phí thấp hơn).
Dưới đây là bảng so sánh tóm tắt các mô hình phổ biến:
Tên Mô Hình | Kích Thước Vector Mặc Định | Khả Năng Giảm Chiều | Hiệu Suất | Chi Phí (Tham khảo – nên kiểm tra trang chủ OpenAI) | Trạng Thái |
---|---|---|---|---|---|
text-embedding-3-small |
1536 | Có (qua tham số dimensions ) |
Tốt, cân bằng | Rất thấp | Được khuyến nghị |
text-embedding-3-large |
3072 | Có (qua tham số dimensions ) |
Tốt nhất của OpenAI | Thấp | Được khuyến nghị |
text-embedding-ada-002 |
1536 | Không | Tốt | Trung bình | Đã cũ hơn, nên thay thế |
Lưu ý: Chi phí có thể thay đổi. Luôn kiểm tra trang Pricing chính thức của OpenAI để có thông tin cập nhật nhất về chi phí của Tokens, Cửa Sổ Ngữ Cảnh và Chi Phí API.
Bắt Đầu Sử Dụng OpenAI Embedding API: Hướng Dẫn Từng Bước
Hãy cùng đi vào thực hành. Chúng ta sẽ sử dụng Python SDK chính thức của OpenAI để tương tác với API.
Bước 1: Chuẩn Bị Môi Trường
Bạn cần có:
- Một tài khoản OpenAI.
- Một API Key từ tài khoản OpenAI của bạn. (Hãy đảm bảo giữ bí mật cho API Key của bạn!)
- Cài đặt Python trên máy tính.
- Cài đặt thư viện OpenAI Python SDK.
Nếu chưa có API Key, bạn có thể tạo nó tại trang OpenAI Platform API Keys.
Cài đặt thư viện OpenAI bằng pip:
pip install openai numpy scipy scikit-learn
Chúng ta sẽ cài đặt thêm numpy
, scipy
, scikit-learn
vì chúng rất hữu ích khi làm việc với vector (ví dụ: tính toán độ tương đồng Cosine Similarity).
Lưu API Key của bạn vào một biến môi trường để giữ an toàn. Ví dụ, trên Linux/macOS:
export OPENAI_API_KEY='your-api-key-here'
Hoặc trong code Python (chỉ cho mục đích thử nghiệm, không nên làm trong ứng dụng production):
import os
os.environ['OPENAI_API_KEY'] = 'your-api-key-here' # Thay bằng API Key của bạn
Bước 2: Kết Nối & Tạo Embedding Đầu Tiên
Bây giờ, chúng ta sẽ viết đoạn code Python đầu tiên để gọi API Embedding.
import os
from openai import OpenAI
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# Khởi tạo client OpenAI
# API key sẽ tự động lấy từ biến môi trường OPENAI_API_KEY
client = OpenAI()
# Đoạn văn bản bạn muốn tạo embedding
text_to_embed = "AI Engineer Roadmap: Sử dụng OpenAI Embedding API thật thú vị!"
# Gọi API để tạo embedding
try:
response = client.embeddings.create(
input=text_to_embed,
model="text-embedding-3-small" # Sử dụng mô hình thế hệ 3
)
# Lấy vector embedding từ phản hồi
# Phản hồi là một đối tượng, embedding nằm trong data[0].embedding
embedding = response.data[0].embedding
print(f"Đoạn văn bản gốc: '{text_to_embed}'")
print(f"Kích thước vector embedding: {len(embedding)}")
# In ra một phần nhỏ của vector để xem
print(f"Vector embedding (10 phần tử đầu tiên): {embedding[:10]}...")
print(f"Thông tin sử dụng tokens: {response.usage}")
except Exception as e:
print(f"Có lỗi xảy ra: {e}")
Giải thích code:
- Chúng ta import các thư viện cần thiết.
- Khởi tạo đối tượng
OpenAI()
. Thư viện sẽ tự động tìm kiếm API Key từ biến môi trườngOPENAI_API_KEY
. - Định nghĩa biến
text_to_embed
chứa đoạn văn bản đầu vào. - Sử dụng
client.embeddings.create()
để gọi API. - Truyền vào
input
là văn bản vàmodel
là tên mô hình Embedding mong muốn (ở đây dùngtext-embedding-3-small
). - Phản hồi từ API chứa thông tin về các embeddings được tạo ra. Với một đoạn văn bản đầu vào,
response.data
sẽ chứa một mục duy nhất (index 0), và vector embedding chính là thuộc tínhembedding
bên trong đó. - Chúng ta in ra kích thước của vector và một phần nhỏ của nó để kiểm tra.
- In ra thông tin
usage
để biết đã sử dụng bao nhiêu token cho yêu cầu này. Điều này rất quan trọng để theo dõi chi phí API.
Bước 3: Embedding Nhiều Đoạn Văn Bản (Batching)
API Embedding của OpenAI rất hiệu quả khi xử lý nhiều đoạn văn bản cùng lúc. Bạn chỉ cần truyền vào một danh sách các chuỗi thay vì chỉ một chuỗi duy nhất cho tham số input
.
# Danh sách các đoạn văn bản
texts_to_embed = [
"Embeddings giúp máy tính hiểu ngữ nghĩa của văn bản.",
"Semantic Search là một ứng dụng phổ biến của embeddings.",
"Học AI Engineer đòi hỏi kiến thức về nhiều lĩnh vực."
]
# Gọi API với danh sách các đoạn văn bản
try:
response = client.embeddings.create(
input=texts_to_embed,
model="text-embedding-3-small"
)
# response.data sẽ chứa một danh sách các đối tượng embedding,
# mỗi đối tượng tương ứng với một đoạn văn bản trong input theo thứ tự.
embeddings = [item.embedding for item in response.data]
print(f"\nĐã tạo {len(embeddings)} embeddings.")
print(f"Kích thước mỗi vector: {len(embeddings[0])}")
print(f"Thông tin sử dụng tokens: {response.usage}")
except Exception as e:
print(f"Có lỗi xảy ra khi batching: {e}")
Giải thích code:
- Chúng ta tạo một danh sách
texts_to_embed
. - Truyền danh sách này vào tham số
input
. - Phản hồi
response.data
bây giờ là một danh sách các đối tượng. Mỗi đối tượng có thuộc tínhembedding
chứa vector tương ứng và thuộc tínhindex
chỉ vị trí của nó trong danh sách input gốc. - Chúng ta dùng list comprehension để trích xuất tất cả các vector embedding vào danh sách
embeddings
.
Việc gửi nhiều văn bản trong một lần gọi API (batching) thường nhanh hơn và hiệu quả chi phí hơn so với việc gọi API riêng lẻ cho từng văn bản.
Bước 4: Kiểm Soát Chiều Của Vector (Using dimensions
)
Một tính năng mới và rất hữu ích của các mô hình text-embedding-3
là khả năng kiểm soát chiều của vector đầu ra bằng tham số dimensions
. Mặc dù các mô hình được huấn luyện với chiều mặc định lớn (1536 hoặc 3072), bạn có thể yêu cầu API trả về vector ở chiều thấp hơn mà vẫn giữ được phần lớn hiệu suất ngữ nghĩa.
Tại sao lại cần điều này? Vector có chiều thấp hơn sẽ:
- Tốn ít dung lượng lưu trữ hơn.
- Tính toán khoảng cách (như Cosine Similarity) nhanh hơn.
- Thích hợp cho các ứng dụng cần tốc độ hoặc tài nguyên hạn chế.
Bạn có thể chỉ định bất kỳ giá trị chiều nào nhỏ hơn hoặc bằng chiều mặc định của mô hình. OpenAI khuyến cáo các giá trị từ 50 đến chiều mặc định.
# Đoạn văn bản
text_to_embed_low_dim = "Ví dụ về giảm chiều vector embedding."
# Gọi API với tham số dimensions
try:
response_low_dim = client.embeddings.create(
input=text_to_embed_low_dim,
model="text-embedding-3-small",
dimensions=256 # Yêu cầu vector 256 chiều
)
embedding_low_dim = response_low_dim.data[0].embedding
print(f"\nĐoạn văn bản gốc: '{text_to_embed_low_dim}'")
print(f"Kích thước vector embedding (giảm chiều): {len(embedding_low_dim)}")
print(f"Vector embedding (10 phần tử đầu tiên): {embedding_low_dim[:10]}...")
print(f"Thông tin sử dụng tokens: {response_low_dim.usage}")
except Exception as e:
print(f"Có lỗi xảy ra khi giảm chiều: {e}")
Lưu ý: Mặc dù vector giảm chiều vẫn hiệu quả, hiệu suất có thể giảm nhẹ so với vector chiều đầy đủ, đặc biệt đối với các tác vụ phân biệt ngữ nghĩa rất tinh tế. Bạn cần thử nghiệm để tìm ra chiều tối ưu cho ứng dụng của mình.
Bước 5: Sử Dụng Embeddings – Ví Dụ Tính Độ Tương Đồng Ngữ Nghĩa
Sau khi có được các vector embedding, bước tiếp theo là sử dụng chúng cho các tác vụ AI. Một trong những ứng dụng cơ bản nhất là tính toán độ tương đồng ngữ nghĩa giữa hai đoạn văn bản.
Chúng ta sẽ tính Cosine Similarity giữa hai vector. Cosine Similarity đo lường cosin của góc giữa hai vector. Giá trị càng gần 1 thì hai vector càng tương đồng về hướng (nghĩa là ngữ nghĩa càng giống nhau). Giá trị gần 0 hoặc âm cho thấy sự khác biệt.
# Hai đoạn văn bản cần so sánh
text1 = "Tôi thích ăn pizza vào buổi tối."
text2 = "Buổi tối nay, tôi muốn thưởng thức một chiếc bánh pizza."
text3 = "Mèo là loài động vật rất đáng yêu."
# Tạo embeddings cho cả ba đoạn văn bản cùng lúc (batching)
try:
response_similarity = client.embeddings.create(
input=[text1, text2, text3],
model="text-embedding-3-small"
)
embedding1 = response_similarity.data[0].embedding
embedding2 = response_similarity.data[1].embedding
embedding3 = response_similarity.data[2].embedding
# Chuyển đổi list sang numpy array để tính toán dễ dàng
embedding1_np = np.array(embedding1).reshape(1, -1)
embedding2_np = np.array(embedding2).reshape(1, -1)
embedding3_np = np.array(embedding3).reshape(1, -1)
# Tính Cosine Similarity
similarity_1_2 = cosine_similarity(embedding1_np, embedding2_np)[0][0]
similarity_1_3 = cosine_similarity(embedding1_np, embedding3_np)[0][0]
similarity_2_3 = cosine_similarity(embedding2_np, embedding3_np)[0][0]
print(f"\nĐộ tương đồng ngữ nghĩa (Cosine Similarity):")
print(f"'{text1}' vs '{text2}': {similarity_1_2:.4f}")
print(f"'{text1}' vs '{text3}': {similarity_1_3:.4f}")
print(f"'{text2}' vs '{text3}': {similarity_2_3:.4f}")
except Exception as e:
print(f"Có lỗi xảy ra khi tính độ tương đồng: {e}")
Giải thích code:
- Chúng ta định nghĩa ba đoạn văn bản. Hai đoạn đầu liên quan đến pizza, đoạn thứ ba nói về mèo.
- Sử dụng batching để tạo embedding cho cả ba.
- Lấy các vector embedding tương ứng.
- Chuyển các list vector thành numpy array. Hàm
cosine_similarity
từ scikit-learn yêu cầu input là mảng 2D, nên chúng ta dùng.reshape(1, -1)
. - Tính toán độ tương đồng giữa các cặp vector sử dụng
cosine_similarity
. - In kết quả. Bạn sẽ thấy độ tương đồng giữa
text1
vàtext2
cao hơn đáng kể so với khi so sánhtext1
hoặctext2
vớitext3
.
Đây chỉ là một ví dụ rất cơ bản. Trong thực tế, các vector embedding này thường được lưu trữ trong các cơ sở dữ liệu vector (Vector Databases) để thực hiện các truy vấn láng giềng gần nhất (Nearest Neighbor Search) một cách hiệu quả, là nền tảng của các hệ thống tìm kiếm ngữ nghĩa hoặc RAG (Retrieval-Augmented Generation).
Một Vài Lưu Ý Quan Trọng
- Xử lý văn bản đầu vào: API Embedding có giới hạn về độ dài văn bản đầu vào (thường tính bằng tokens). Với các tài liệu dài, bạn cần chia nhỏ chúng thành các đoạn nhỏ hơn trước khi tạo embedding. Hiểu về Context Length và Tokens là rất quan trọng ở đây.
- Tokenization: OpenAI API tự động xử lý việc chuyển văn bản thành tokens. Bạn có thể sử dụng thư viện
tiktoken
của OpenAI để ước tính số tokens trước khi gọi API và quản lý việc chia nhỏ văn bản. - Quản lý API Key: Tuyệt đối không nhúng trực tiếp API Key vào code ứng dụng production. Sử dụng biến môi trường hoặc các dịch vụ quản lý bí mật an toàn.
- Xử lý lỗi: Luôn triển khai khối
try...except
để bắt các lỗi có thể xảy ra khi gọi API (ví dụ: lỗi kết nối mạng, lỗi xác thực, lỗi vượt quá giới hạn tỷ lệ yêu cầu). - Chọn mô hình và chiều phù hợp: Dựa vào yêu cầu cụ thể của dự án (độ chính xác cần thiết, ngân sách, tài nguyên lưu trữ/tính toán) để lựa chọn mô hình (small vs large) và chiều (dimensions) tối ưu.
- Chi phí: OpenAI tính phí dựa trên số lượng tokens được xử lý. Các mô hình thế hệ 3 rẻ hơn đáng kể so với
ada-002
, đặc biệt là khi sử dụng tính năng giảm chiều.
Kết Luận
Việc sử dụng OpenAI Embedding API là một kỹ năng cốt lõi cho bất kỳ ai muốn xây dựng các ứng dụng AI dựa trên xử lý ngôn ngữ tự nhiên phức tạp. Từ tìm kiếm ngữ nghĩa, phân loại tài liệu, đến xây dựng các hệ thống gợi ý thông minh, embeddings là nền tảng không thể thiếu.
Qua bài viết này, bạn đã nắm được cách:
- Hiểu lại vai trò của Embeddings.
- Nhận biết các mô hình Embedding của OpenAI.
- Thiết lập môi trường và gọi API Embedding cơ bản.
- Thực hiện batching để xử lý nhiều văn bản hiệu quả.
- Kiểm soát chiều của vector đầu ra.
- Thực hiện một tác vụ đơn giản với embeddings (tính độ tương đồng).
Đây chỉ là bước khởi đầu. Hãy tiếp tục khám phá và thực hành. Thử nghiệm với các mô hình khác nhau, các giá trị chiều khác nhau, và áp dụng embeddings vào các bài toán thực tế của bạn. Trong các bài tiếp theo của chuỗi AI Engineer Roadmap, chúng ta sẽ đi sâu hơn vào việc sử dụng các vector embedding này, chẳng hạn như lưu trữ chúng trong cơ sở dữ liệu vector và xây dựng một hệ thống tìm kiếm ngữ nghĩa hoàn chỉnh.
Chúc bạn thành công trên con đường trở thành một Kỹ sư AI!