Bỏ qua đến nội dung chính

Text embeddings

📖 Nội dung bài học

Tóm tắt

Sau khi chia một tài liệu thành các đoạn, bước tiếp theo trong một pipeline RAG là tìm ra những đoạn nào liên quan nhất đến câu hỏi của người dùng. Về cơ bản, đây là một bài toán tìm kiếm - bạn cần xem xét tất cả các đoạn văn bản của mình và xác định những đoạn liên quan đến những gì người dùng đang hỏi.

Tìm các đoạn liên quan

Thách thức là xác định những đoạn nào "liên quan" đến câu hỏi của người dùng. Điều này không đơn giản như khớp từ khóa - bạn cần hiểu ý nghĩa và ngữ cảnh của cả câu hỏi và các đoạn văn bản.

Giải pháp phổ biến nhất là tìm kiếm ngữ nghĩa (semantic search), sử dụng text embeddings để hiểu nội dung thực sự của từng đoạn văn bản, thay vì chỉ tìm kiếm các từ khớp chính xác.

Text Embeddings là gì?

Text embedding là một biểu diễn dạng số của ý nghĩa chứa trong một đoạn văn bản. Hãy coi nó như việc chuyển đổi từ ngữ và câu thành một định dạng mà máy tính có thể xử lý bằng toán học.

Cách thức hoạt động như sau:

  • Bạn đưa văn bản vào một embedding model.
  • Model trả về một danh sách dài các số (thường là 1024 số).
  • Mỗi số đại diện cho một "điểm" cho một thuộc tính nào đó của văn bản đầu vào.
  • Các số nằm trong khoảng từ -1 đến +1.

Hiểu các con số

Mỗi số trong một embedding giống như một điểm cho một khía cạnh nào đó của văn bản. Mặc dù chúng ta không biết chính xác mỗi vị trí đại diện cho điều gì, nhưng có thể coi chúng như đo lường các thuộc tính khác nhau.

Ví dụ, một số có thể chấm điểm "mức độ vui vẻ của văn bản" trong khi một số khác có thể đo lường "mức độ văn bản nói về đại dương". Điểm mấu chốt là chúng ta không thực sự biết mỗi số đại diện cho điều gì - embedding model học các mẫu này trong quá trình huấn luyện và chúng không thể diễn giải được bởi con người.

Tạo Embeddings bằng Code

Việc tạo embeddings khá đơn giản. Đây là quy trình cơ bản:

def generate_embedding(
    text,
    embedding_model_id="amazon.titan-embed-text-v2:0",
    dimensions=1024,
    normalize=True,
):
    request_body = {
        "inputText": text,
        "dimensions": dimensions,
        "normalize": normalize,
    }
    
    request_json = json.dumps(request_body)
    response = client.invoke_model(
        modelId=embedding_model_id,
        body=request_json,
        accept="application/json",
        contentType="application/json",
    )
    
    response_body = json.loads(response.get("body").read())
    return response_body["embedding"]

Khi bạn chạy hàm này trên một đoạn văn bản, bạn sẽ nhận được một danh sách 1024 số đại diện cho ý nghĩa ngữ nghĩa của văn bản đó.

Lưu ý rằng bạn có thể cần yêu cầu quyền truy cập vào Titan embedding model trong bảng điều khiển AWS Bedrock. Nếu phiên bản 2 không có sẵn, phiên bản 1 cũng hoạt động tốt cho mục đích học tập.

Tại sao Embeddings quan trọng đối với RAG

Sức mạnh của embeddings trở nên rõ ràng khi bạn nhận ra rằng các văn bản tương tự sẽ có các giá trị embedding tương tự. Điều này có nghĩa là bạn có thể so sánh câu hỏi của người dùng với các đoạn văn bản của mình bằng toán học và tìm ra những đoạn tương đồng về ngữ nghĩa nhất - ngay cả khi chúng không chia sẻ cùng các từ chính xác.

Biểu diễn dạng số này là thứ làm cho semantic search khả thi và hiệu quả hơn nhiều so với khớp từ khóa đơn giản để tìm ngữ cảnh liên quan trong các hệ thống RAG.

Tải xuống

🔁 Bài học liên quan

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?