正如本文所暗示的:https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/ 3929167 可以通过对结果集进行语义重新排序来执行混合搜索。然而,我一直无法在 python SDK 中一起实现这些。如果两者的参数都设置了,则语义优先。
下面的代码片段有效,但如上所述,这只会执行语义搜索(即,如果我从
vector_queries
中删除 client.search()
,将返回相同的搜索结果。类似地,删除 query_type
、semanic_configuration_name
和 query_answer
允许我执行混合搜索,但是,我想执行两者。
vector = embedding_client.embeddings.create(input = [name], model="embedding").data[0].embedding
vector_query = VectorizedQuery(vector=vector,k_nearest_neighbors=4,fields="contentVector")
credential = AzureKeyCredential(key)
client = SearchClient(endpoint=service_endpoint,
index_name=index_name,
credential=credential)
results = client.search(search_text=name,
vector_queries=[vector_query],
query_type="semantic",
semantic_configuration_name = "azureml-default",
query_answer="extractive",
top = 4
)
SDK中有这样的功能吗?我附上了使用 REST api 实现的屏幕截图。
文档表示最佳实践是为语义排名器提供最大文档数 50。
为语义排名器提供最大文档数量 (50) 是明智之举。
因此,您可以通过给出
k=50
并获取前 50 个结果来更改代码,如下所示。
vector_query = VectorizedQuery(vector=get_embeddings(query), k_nearest_neighbors=50, fields="text_vector")
semantic_search_results = search_client.search(
search_text=query,
vector_queries=[vector_query],
select=["title", "chunk"],
query_type="semantic",
semantic_configuration_name="vector-1721991000151-semantic-configuration",
top=50
)
接下来,我使用下面的代码获得了语义和混合的结果。
def semantic_hybrid_search(query):
search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))
vector_query = VectorizedQuery(vector=get_embeddings(query), k_nearest_neighbors=50, fields="text_vector")
semantic_search_results = search_client.search(
search_text=query,
vector_queries=[vector_query],
select=["title", "chunk"],
query_type="semantic",
semantic_configuration_name="vector-1721991000151-semantic-configuration",
top=50
)
hybrid_search_results = search_client.search(
search_text=query,
vector_queries=[vector_query],
select=["title", "chunk"]
)
print("hybrid search results-----------------------")
for result in hybrid_search_results:
a = result['title']
c = result["@search.reranker_score"]
d = result['@search.score']
print(f'{a} : {c} : {d}')
print("\n")
print("semantic search results-----------------------")
for result in semantic_search_results:
a = result['title']
c = result["@search.reranker_score"]
d = result['@search.score']
print(f'{a} : {c} : {d}')
并输出:
hybrid search results-----------------------
78776426_7_24_24.html : None : 0.03333333507180214
78750167_7_22_24.html : None : 0.03226646035909653
78782543_7_23_24.html : None : 0.03201844170689583
Azure Search Index VIA .NET Core console app, over-writes old document.html : None : 0.03128054738044739
78776426_7_24_24.html : None : 0.031054403632879257
78781003_7_24.html : None : 0.03077651560306549
Azure Search Index VIA .NET Core console app, over-writes old document.html : None : 0.03076923079788685
78783121.html : None : 0.03057890012860298
78783121.html : None : 0.02921108715236187
Azure Search Index VIA .NET Core console app, over-writes old document.html : None : 0.028991596773266792
78783121.html : None : 0.028985507786273956
semantic search results-----------------------
78776426_7_24_24.html : 3.254748821258545 : 0.03333333507180214
78776426_7_24_24.html : 2.1206436157226562 : 0.031054403632879257
Azure Search Index VIA .NET Core console app, over-writes old document.html : 1.555912971496582 : 0.028991596773266792
78783121.html : 1.5436580181121826 : 0.02921108715236187
Azure Search Index VIA .NET Core console app, over-writes old document.html : 1.4620863199234009 : 0.03128054738044739
Azure Search Index VIA .NET Core console app, over-writes old document.html : 1.4142156839370728 : 0.03076923079788685
78781003_7_24.html : 1.3766850233078003 : 0.03077651560306549
78783121.html : 1.3763020038604736 : 0.028985507786273956
78783121.html : 1.212775707244873 : 0.03057890012860298
78782543_7_23_24.html : 1.155330777168274 : 0.03201844170689583
78750167_7_22_24.html : 0.9561886787414551 : 0.03226646035909653
如果您观察文档 2 的输出,排名会发生变化,并且文档 1 是常见的。这是因为混合搜索还根据您的文档数据和分块为您提供与某些顶级文档的语义等效的结果,因为搜索查询将位于同一文档中,即使它被分成块。
混合搜索并不总是给出比语义更准确的结果。
这个过程就像首先使用倒数排名融合(RRF)将混合搜索的结果合并并通过新的搜索分数重新排序,然后将这些结果发送到语义排名。
当
k=50
在混合查询中时,混合的一些顶级结果在语义排名后仍将位于顶部,这就是您在两个查询中获得相同结果的原因。
因此,获取更多文档以查看这些查询之间的真正区别。