Customizing Cortex Search scoring¶
默认情况下,对 Cortex Search Service 的查询利用向量相似度、文本匹配和重新排名来确定每个结果的相关性。您可以通过多种方式自定义搜索结果的评分:
基于数值型元数据列应用 数值加权。
基于时间戳元数据列应用 时间衰减。
禁用 重新排名 以减少查询延迟。
修改 组件权重 以调整各个评分组件(向量、文本、重排名)在整体搜索排名中的权重。
Modify index-specific boosts to adjust the weight of individual indices in a multi-index search.
数字提升和时间衰减¶
您可以根据数值或时间戳元数据来对搜索结果应用提升或衰减。如果每个结果都有结构化元数据(例如流行度或时效性信号),而这有助于确定查询时文档的相关性,则此功能非常有用。在执行查询时,您可以指定两类排名信号:
类型 |
描述 |
适用列类型 |
元数据字段示例(仅供说明使用) |
|---|---|---|---|
数值提升 |
提升具有更高关注度或活跃度的结果的数值元数据。 |
|
|
时间衰减 |
可提升最近结果的日期或时间元数据。时效性信号的影响会随着时间的推移而减弱。 |
|
提升和衰减元数据来自创建 Cortex Search Service 的源表中的列。在发出查询时需要指定用于加权或衰减的元数据列,但这些列必须在创建 Cortex Search Service 时包含进去。
查询 Cortex Search Service 时,在 scoring_config.functions 字段的可选 numeric_boosts 和 time_decays 字段中指定用于提升或衰减的列。您还可以指定每次提升或衰减的权重。
{
"scoring_config": {
"functions": {
"numeric_boosts": [
{
"column": "column_name",
"weight": 1
},
/* ... */
],
"time_decays": [
{
"column": "column_name",
"weight": 1,
"limit_hours": 120
},
/* ... */
]
}
}
}
属性¶
``numeric_boosts``(数组,可选):
``time_decays``(数组,可选):
``<time_decay_object>``(对象,可选):
``column_name``(字符串):指定应该应用衰减的时间或日期列。
``weight``(浮点数):指定在排名过程中分配给衰减列的权重或重要性。指定多个列时,较高的权重会增加该字段的影响力。
limit_hours``(浮点数):设置边界,此后时间对文档的相关性或重要性的影响开始减弱。例如,``limit_hours值为 240 表示时间戳比now时间戳晚 240 小时(10 天)以上的文档不会获得显著提升,而时间戳在其过去 240 小时内的文档应该获得更显著的提升。now``(字符串,可选):可选的参考时间戳,根据该时间戳以 ISO-8601 ``yyyy-MM-dd'T'HH:mm:ss.SSSXXX格式计算衰减。例如"2025-02-19T14:30:45.123-08:00"。如果未指定,则默认为当前时间戳。
备注
数值提升以加权平均值的形式应用于返回的字段,衰减则利用对数平滑函数将不那么新的值降级。
在指定的提升或衰减字段中,权重是相对的。如果在 boosts 或 decays 数组中仅提供单个字段,则其权重值无关紧要。
如果提供了多个字段,则会相对于其他字段应用权重。例如,权重为 10 的字段对记录排名的影响是权重为 5 的字段的两倍。
重新排名¶
默认情况下,对 Cortex Search Service 的查询利用 语义重新排名 来提高搜索结果的相关性。虽然重新排名可以显著提高结果相关性,但也会明显增加查询延迟。如果在您的业务用例中,您发现可以牺牲重新排名提供的质量优势,以换取更快的查询速度,则可以在任何 Cortex Search 查询中禁用重新排名。
备注
禁用重新排名平均可将查询延迟减少 100-300 毫秒,但延迟的确切减少量以及质量下降的程度因工作负载而异。在决定在查询中禁用重新排名之前,请并排评估使用重新排名和未使用重新排名的结果。
在查询时,您可以在 scoring_config.reranker 字段中按照以下格式为单个查询禁用重新排名工具:
{
"scoring_config": {
"reranker": "none"
}
}
属性¶
``reranker``(字符串,可选):如果应该关闭重新排名工具,则可以将该参数设置为“none”。如果排除或为 null,则使用默认重新排名工具。
组件权重¶
通过 scoring_config 对象中的 weights 字段,您可以在每个结果的总分中指定各个评分组件(vectors、texts、reranker)的权重。默认情况下,每个组件的权重设置为 1.0,对总分的贡献相等。
您可以按以下格式指定权重:
{
"scoring_config": {
"functions": {
"weights": {
"texts": 3,
"vectors": 2,
"reranker": 1
}
}
}
}
备注
When using index-specific boosts with text_boots or vector_boosts on a multi-index service, the weights property
is placed at the top level of the scoring configuration, not as part of the functions object:
{
"scoring_config": {
"weights": {
"texts": 3,
"vectors": 2,
"reranker": 1
},
"functions": {
// ...
}
}
}
属性¶
``weights``(对象,可选):指定权重,用于合并每个文档的文本、向量和重新排名分数。在此字段中,权重是相对于彼此应用的。
例如,以下内容指定文本分数的权重应比向量分数高 3 倍,重新排名分数的权重应比文本分数高 2 倍:
{
"scoring_config": {
"functions": {
"weights": {
"texts": 3,
"vectors": 1,
"reranker": 2
}
}
}
}
命名评分配置文件¶
提升/衰减和重新排序器设置共同形成一个 评分配置,在查询时可通过 scoring_config 参数指定。评分配置可以命名并附加到 Cortex Search Service。
使用命名评分配置文件,您可以轻松在不同应用程序和查询中使用同一评分配置,而无需每次都指定完整配置。如果您修改评分配置,只需在一个地方更新,而不必在每个查询中修改。
要向您的 Cortex Search Service 添加评分配置文件,请使用 ALTER CORTEX SEARCH SERVICE ... ADD SCORING PROFILE 命令,如下例所示:
ALTER CORTEX SEARCH SERVICE my_search_service
ADD SCORING PROFILE IF NOT EXISTS heavy_comments_with_likes
'{
"functions": {
"numeric_boosts": [
{ "column": "comments", "weight": 6 },
{ "column": "likes", "weight": 1 }
]
}
}'
评分配置文件的定义语法与查询时 scoring_config 参数使用的架构相同。
评分配置文件创建后无法修改;要更改配置文件,请将其删除并使用新的评分配置重新创建。要删除命名评分配置文件,请使用 ALTER CORTEX SEARCH SERVICE ... DROP SCORING PROFILE。
要使用命名评分配置文件查询 Cortex Search Service,请在查询时在 scoring_profile 参数中指定配置文件名称,如下例所示:
results = svc.search(
query="technology",
columns=["comments", "likes"],
scoring_profile="heavy_comments_with_likes",
limit=10
)
curl --location https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"scoring_profile": "heavy_comments_with_likes",
"limit": 10
}'
SELECT SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'my_search_service',
'{
"query": "technology",
"columns": ["comments", "likes"],
"scoring_profile": "heavy_comments_with_likes",
"limit": 10
}'
);
要查看服务存储的评分配置文件,请查询 INFORMATION_SCHEMA 架构中的 CORTEX_SEARCH_SERVICE_SCORING_PROFILES 视图,如下例所示:
SELECT *
FROM my_db.INFORMATION_SCHEMA.CORTEX_SEARCH_SERVICE_SCORING_PROFILES
WHERE service_name = 'my_search_service';
备注
DESCRIBE CORTEX SEARCH SERVICE 和 SHOW CORTEX SEARCH SERVICE 的结果包含一列名为 scoring_profile_count,显示每个服务的评分配置文件数量。
组件分数¶
组件分数为搜索结果提供详细的评分信息。它们可帮助开发者了解搜索排名如何确定,并调试搜索性能。每个结果的分数在每个检索“组件”(文本、向量)的 @scores 字段中返回。组件分数在以下场景中非常有用:
建立阈值: 使用组件分数判断何时将结果传递给下游流程,例如代理。
调试搜索排名: 了解为什么某些文档在搜索结果中的排名高于其他文档。
了解组件分数¶
组件分数提供 Cortex Search 计算每个搜索结果最终相关性分数的详细分解。评分系统由多个组件组成:
- 余弦相似度
基于查询与向量索引之间语义相似度的分数。分数越高表示使用向量嵌入的概念或语义匹配越强。
- 文字匹配
基于查询与文本索引之间关键字/词汇相似度的分数。分数越高表示精确或模糊关键字匹配越强。
Response format¶
启用组件分数后,所有 Cortex Search 查询将返回以下评分信息。有关 Cortex Search 查询语法的更多信息,请参阅 查询 Cortex Search 服务。
{
"results": [
{
"@scores": {
"cosine_similarity": <cosine_similarity_score>,
"text_match": <text_match_score>
}
}
]
}
Score fields¶
@scores.cosine_similarity:选择使用 时默认使用的角色和仓库。查询与向量索引值之间的余弦相似度分数,范围 [-1, 1]。@scores.text_match:选择使用 时默认使用的角色和仓库。查询与文本索引值之间的文本匹配分数。该分数没有上限,其范围取决于查询。
使用说明¶
cosine_similarity分数为:对包含 VECTOR INDEX 的查询返回。
范围 [-1, 1],可在不同查询间比较。
在大多数情况下,每个查询前添加前缀后计算,可以提高搜索质量。此前缀因模型而异,但通常为:
Represent this sentence for searching relevant passages: {query}。返回的余弦相似度分数是带前缀查询与向量索引值之间的余弦相似度。
text_match分数为:对包含 TEXT INDEX 的查询返回。
text_match分数无限制。不能在不同的查询之间进行比较。例如,对于给定查询结果的文本匹配分数 0.95,不可与同一服务不同查询结果的 0.95 分数比较。
@scores值不受weights参数影响。权重仅影响结果的最终排序。
Index-specific boosts¶
Index-specific boosts adjust the weight of influence for indexes in a multi-index Cortex Search service. You can adjust the text matching and vector matching weights, which are applied relative to the other provided weights. Higher values take priority over lower values, using the same behavior as component weights.
属性¶
text_boosts(array, optional): Index-specific weights to be applied to text index columns. When this value is present, you're required to include a weight for all text columns. Column weights are applied relative to one another.vector_boosts(array, optional): Index-specific weights to be applied to vector columns. When this value is present, you're required to include a weight for all vector columns. Column weights are applied relative to one another.
Index-specific weights are objects containing column and weight keys:
{
"column": "<column name>",
"weight": <weight>
}
As an example, consider the following table indexed for search:
CREATE TABLE feedback_info (
id VARCHAR,
comment VARCHAR,
support_note VARCHAR,
sentiment VECTOR(FLOAT, 3),
issue_category VECTOR(FLOAT, 3)
);
The following JSON shows a scoring_config for a multi-index Cortex Search service that de-ranks the id text column while boosting the comment text column, and adjusting the vector rankings of sentiment to be twice as important as other vector columns.
{
"scoring_config": {
"functions": {
"text_boosts": [
{ "column": "id", "weight": 1 },
{ "column": "support_note", "weight": 2},
{ "column": "comment", "weight": 3},
],
"vector_boosts": [
{ "column": "issue_category", "weight": 1 },
{ "column": "sentiment", "weight": 2 }
]
}
}
}
