- vừa được xem lúc

Scoring trong Azure AI Search - Part 2: Làm chủ Scoring Profiles

0 0 4

Người đăng: Trung Đức

Theo Viblo Asia

Mở đầu

Trong Phần 1, chúng ta đã cùng tìm hiểu về khái niệm cơ bản của scoring trong Azure AI Search và cách thuật toán mặc định BM25 xếp hạng các tài liệu dựa trên mức độ liên quan (relevance) với truy vấn tìm kiếm. Mặc dù BM25 hoạt động rất hiệu quả trong nhiều trường hợp, nhưng thực tế cho thấy, đôi khi chúng ta cần nhiều hơn thế. Có những lúc bạn muốn "ưu ái" những sản phẩm đang giảm giá, những bài viết mới nhất, hoặc những tài liệu khớp với tiêu đề hơn là nội dung. Đây chính là lúc Scoring Profiles phát huy sức mạnh, cho phép bạn tinh chỉnh và kiểm soát điểm số relevance một cách linh hoạt theo đúng logic nghiệp vụ của mình.

Phần 2 này sẽ đi sâu vào Scoring Profiles: cấu trúc, cách hoạt động của các thành phần bên trong, và làm thế nào để bạn có thể tạo và áp dụng chúng để cải thiện chất lượng kết quả tìm kiếm trên Azure AI Search.

Scoring Profiles là gì?

Scoring Profiles là một phần của định nghĩa index trong Azure AI Search. Chúng cho phép bạn định nghĩa các quy tắc tùy chỉnh để điều chỉnh điểm số relevance (được tính ban đầu bởi BM25) dựa trên các yếu tố khác nhau như giá trị của trường, độ mới của dữ liệu, vị trí địa lý, hoặc sự hiện diện của các thẻ (tags) cụ thể.

Khi nào nên sử dụng Scoring Profiles?

  • Khi thuật toán scoring mặc định (BM25) không phản ánh đúng mức độ quan trọng của các tài liệu theo góc nhìn nghiệp vụ của bạn.
  • Khi bạn muốn tăng hạng các tài liệu dựa trên các yếu tố ngoài sự khớp nối từ khóa (ví dụ: độ phổ biến, ngày xuất bản, vị trí).
  • Khi bạn muốn kết hợp nhiều yếu tố khác nhau để xác định relevance cuối cùng.

Các thành phần cấu tạo Scoring Profiles

Một Scoring Profile được cấu thành từ ba yếu tố chính: weights, functions, và functionAggregation.

Weights (Trọng số)

Đây là cách đơn giản nhất để tác động đến điểm số. Bạn có thể gán trọng số (weight) khác nhau cho các trường (field) trong index. Điểm số của một tài liệu sẽ được tăng lên nếu truy vấn khớp với các trường có trọng số cao hơn.

  • Cách hoạt động: Điểm số từ việc khớp các trường có trọng số sẽ được nhân với trọng số tương ứng trước khi tổng hợp lại.
  • Ví dụ: Bạn muốn kết quả khớp với trường title quan trọng gấp 3 lần so với khớp với trường description.
    "scoringProfiles": [ { "name": "boostTitle", "text": { "weights": { "title": 3, "description": 1 } } } // ... functions và functionAggregation có thể thêm ở đây
    ]
    
  • Lưu ý: Chỉ áp dụng cho các trường searchable. Trọng số mặc định là 1.

Functions (Hàm tính điểm)

Đây là trái tim của Scoring Profiles, cho phép bạn áp dụng các logic phức tạp hơn để điều chỉnh điểm số dựa trên giá trị của các trường cụ thể (không nhất thiết phải là trường searchable). Có 4 loại function chính:

  • magnitude: Tăng điểm dựa trên độ lớn của giá trị trong một trường số (Edm.Double, Edm.Int32, Edm.Int64). Rất hữu ích để tăng hạng các mục có đánh giá cao, nhiều lượt xem, giá cao/thấp tùy ý...

    • Tham số chính:
      • fieldName: Tên trường số cần xét.
      • boostingRangeStart, boostingRangeEnd: Khoảng giá trị mà điểm số sẽ được tăng.
      • boost: Mức độ tăng điểm (hệ số nhân).
      • interpolation: Cách điểm số thay đổi trong khoảng (linear, constant, quadratic, logarithmic) - mặc định là linear.
      • constantBoostBeyondRange: (true/false) Có áp dụng mức tăng tối đa cho các giá trị ngoài khoảng không.
    • Ví dụ: Tăng điểm mạnh hơn cho sản phẩm có rating từ 4 đến 5 sao.
      { "type": "magnitude", "fieldName": "rating", "boost": 2, "interpolation": "linear", "magnitude": { "boostingRangeStart": 4, "boostingRangeEnd": 5, "constantBoostBeyondRange": true // Rating 5 sao cũng nhận boost tối đa }
      }
      
  • freshness: Tăng điểm cho các tài liệu "mới" hơn dựa trên giá trị của trường Edm.DateTimeOffset. Lý tưởng cho tin tức, bài blog, bài đăng diễn đàn...

    • Tham số chính:
      • fieldName: Tên trường ngày giờ.
      • boostingDuration: Khoảng thời gian (tính từ hiện tại ngược về quá khứ) mà tài liệu được xem là "mới" và nhận điểm cộng. Định dạng "日数.giờ:phút:giây" (ví dụ: P30D cho 30 ngày).
      • boost: Mức độ tăng điểm tối đa cho tài liệu mới nhất.
    • Ví dụ: Ưu tiên các bài viết được xuất bản trong vòng 7 ngày qua.
      { "type": "freshness", "fieldName": "publishDate", "boost": 3, "freshness": { "boostingDuration": "P7D" // Ưu tiên trong 7 ngày }
      }
      
  • distance: Tăng điểm cho các tài liệu có vị trí địa lý gần với một điểm tham chiếu. Cực kỳ hữu ích cho tìm kiếm cửa hàng, địa điểm, sự kiện lân cận...

    • Tham số chính:
      • fieldName: Tên trường địa lý (Edm.GeographyPoint).
      • referencePointParameter: Tên tham số trong câu lệnh query sẽ chứa tọa độ tham chiếu (ví dụ: vị trí của người dùng).
      • boostingDistance: Khoảng cách (tính bằng km) mà trong đó điểm số sẽ được tăng.
      • boost: Mức độ tăng điểm tối đa cho tài liệu ở gần nhất.
    • Ví dụ: Tăng điểm cho các cửa hàng trong bán kính 10km từ vị trí người dùng.
      { "type": "distance", "fieldName": "location", "boost": 4, "distance": { "referencePointParameter": "userLocation", // Sẽ truyền vào query "boostingDistance": 10 // Bán kính 10km }
      }
      
  • tag: Tăng điểm cho các tài liệu chứa các thẻ (tag) nhất định trong một trường collection (Collection(Edm.String)). Phù hợp để quảng bá các mục được gắn cờ đặc biệt (ví dụ: "featured", "sale", "new").

    • Tham số chính:
      • fieldName: Tên trường collection chứa các tag.
      • tagsParameter: Tên tham số trong câu lệnh query sẽ chứa danh sách các tag cần ưu tiên.
      • boost: Mức độ tăng điểm cho mỗi tag khớp.
    • Ví dụ: Tăng điểm cho sản phẩm có tag "promotion" hoặc "clearance".
      { "type": "tag", "fieldName": "tags", "boost": 5, "tag": { "tagsParameter": "preferredTags" // Sẽ truyền vào query }
      }
      

Function Aggregation

Khi bạn sử dụng nhiều function (và cả weights), điểm số từ mỗi nguồn này cần được kết hợp lại với điểm số gốc từ BM25. functionAggregation cho phép bạn kiểm soát cách chúng được tổng hợp.

  • Các giá trị:
    • sum (mặc định): Cộng tất cả các điểm số (BM25 score + weight score + function scores).
    • average: Lấy trung bình cộng.
    • minimum: Lấy điểm số nhỏ nhất.
    • maximum: Lấy điểm số lớn nhất.
    • firstMatching: Chỉ lấy điểm số từ function đầu tiên khớp điều kiện.
  • Lựa chọn: sum là phổ biến nhất vì nó cho phép tất cả các yếu tố đóng góp vào điểm cuối cùng. Các lựa chọn khác hữu ích trong những kịch bản đặc thù hơn.
    "scoringProfiles": [ { "name": "complexProfile", "text": { /* ... weights ... */ }, "functions": [ /* ... multiple functions ... */ ], "functionAggregation": "sum" // hoặc "average", "maximum", ... }
    ]
    

Cách tạo và sử dụng Scoring Profiles

Để tạo và sử dụng, các bạn có thể tham khảo các bước tuần tự sau

Định nghĩa trong Index Schema

Scoring Profiles được định nghĩa bên trong thuộc tính scoringProfiles của index schema. Bạn có thể thực hiện việc này khi tạo index hoặc cập nhật index hiện có.

  • Sử dụng Azure Portal: Giao diện trực quan cho phép bạn thêm/sửa scoring profiles, chọn loại function và điền tham số. (Gợi ý: Chèn ảnh chụp màn hình các bước cấu hình trên Portal ở đây).

  • Sử dụng REST API / SDK: Bạn cần định nghĩa cấu trúc JSON như các ví dụ trên và gửi yêu cầu tạo/cập nhật index.

    Ví dụ cấu trúc JSON đầy đủ cho một scoring profile:

    { "name": "ecommerceProfile", "text": { "weights": { "productName": 3, "brand": 2, "description": 1 } }, "functions": [ { "type": "magnitude", "fieldName": "rating", "boost": 2, "interpolation": "linear", "magnitude": { "boostingRangeStart": 4, "boostingRangeEnd": 5, "constantBoostBeyondRange": true } }, { "type": "freshness", "fieldName": "lastUpdated", "boost": 1.5, "freshness": { "boostingDuration": "P90D" } // Ưu tiên SP cập nhật trong 90 ngày }, { "type": "tag", "fieldName": "tags", "boost": 4, "tag": { "tagsParameter": "promoTags" } // Ưu tiên tag được truyền vào } ], "functionAggregation": "sum"
    }
    

Áp dụng trong Query

Sau khi Scoring Profile được định nghĩa trong index, bạn cần chỉ định tên của nó trong câu lệnh query bằng cách sử dụng tham số scoringProfile.

  • Ví dụ (REST API):
    POST https://[service name].search.windows.net/indexes/[index name]/docs/search?api-version=[api-version]
    Content-Type: application/json
    api-key: [admin or query key]
    { "search": "smart watch", "scoringProfile": "ecommerceProfile", // Tên scoring profile đã định nghĩa "scoringParameters": [ // Truyền giá trị cho các tham số (nếu có) "promoTags-'onSale','newArrival'" // Cho tag function ở ví dụ trên // "userLocation-...' --> cho distance function (nếu dùng) ]
    }
    

Ví dụ thực tế

  • Kịch bản E-commerce:
    • Mục tiêu: Ưu tiên tên sản phẩm, thương hiệu; sản phẩm mới cập nhật; rating cao; và các sản phẩm đang "onSale".
    • Cấu hình: Sử dụng weights cho productName, brand; magnitude cho rating; freshness cho lastUpdated; tag cho tags (với tagsParameter là "promoTags"). functionAggregationsum.
  • Kịch bản Tìm kiếm tài liệu nội bộ:
    • Mục tiêu: Ưu tiên tài liệu khớp tiêu đề; tài liệu mới xuất bản; tài liệu được gắn tag "quan trọng".
    • Cấu hình: Sử dụng weights cho title; freshness cho publishDate; tag cho documentTags (với tagsParameter là "priorityTags"). functionAggregationsum.

Lưu ý và Hạn chế

Kết luận

Một số lưu ý và hạn chế của Scoring Profiles:

  • Ảnh hưởng hiệu năng: Scoring Profiles, đặc biệt là những profile phức tạp với nhiều function, có thể làm tăng độ trễ của query. Cần kiểm thử để đảm bảo hiệu năng chấp nhận được.
  • Độ phức tạp: Quản lý nhiều scoring profiles với logic phức tạp có thể trở nên khó khăn. Cần có tài liệu rõ ràng.
  • Debugging: Việc hiểu tại sao một tài liệu có điểm số nhất định khi dùng scoring profile phức tạp sẽ khó hơn so với BM25 mặc định.

Scoring Profiles là một công cụ cực kỳ mạnh mẽ trong Azure AI Search, giúp bạn vượt ra ngoài giới hạn của thuật toán relevance mặc định. Bằng cách sử dụng weights và các functions (magnitude, freshness, distance, tag), bạn có thể điều chỉnh thứ hạng kết quả tìm kiếm để phản ánh chính xác các ưu tiên nghiệp vụ, từ đó mang lại trải nghiệm tìm kiếm tốt hơn và phù hợp hơn cho người dùng cuối.

Việc hiểu rõ và áp dụng hiệu quả Scoring Profiles đòi hỏi sự thử nghiệm và tinh chỉnh, nhưng lợi ích mà nó mang lại trong việc cải thiện chất lượng tìm kiếm là rất đáng kể.

References

Bình luận

Bài viết tương tự

- vừa được xem lúc

Golang Data Structures and Algorithms - Stack

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 43

- vừa được xem lúc

AWS Certified Solutions Architect Professional - Security - Secrets Manager

Introduction. A quick note about AWS Secrets Manager.

0 0 52

- vừa được xem lúc

Golang Data Structures and Algorithms - Queue

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 54

- vừa được xem lúc

Terraform Series - Bài 17 - Security - Manage Secrets with Vault

Giới thiệu. Chào các bạn tới với series về Terraform, ở bài trước chúng ta đã tìm hiểu về vấn đề security trong Terraform.

0 0 46

- vừa được xem lúc

Golang Data Structures and Algorithms - Linked Lists

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 42

- vừa được xem lúc

AWS Certified Solutions Architect Professional - Security - AWS Certificate Manager

Introduction. A quick note about AWS Certificate Manager.

0 0 37