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ườngdescription
."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 } }
- Tham số chính:
-
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ườngEdm.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 } }
- Tham số chính:
-
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 } }
- Tham số chính:
-
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 } }
- Tham số chính:
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
choproductName
,brand
;magnitude
chorating
;freshness
cholastUpdated
;tag
chotags
(vớitagsParameter
là "promoTags").functionAggregation
làsum
.
- 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
chotitle
;freshness
chopublishDate
;tag
chodocumentTags
(vớitagsParameter
là "priorityTags").functionAggregation
làsum
.
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
- https://learn.microsoft.com/en-us/azure/search/index-add-scoring-profiles
- https://learn.microsoft.com/en-us/python/api/azure-search-documents/azure.search.documents.indexes.models.scoringprofile?view=azure-python
- https://www.linkedin.com/pulse/boost-search-scores-scoring-profiles-azure-ai-dimitar-iliev--ofmzf/