Pesquisa híbrida com StructArray
Utilize esta página para combinar a pesquisa vetorial do StructArray com outras pesquisas vetoriais numa única solicitação de pesquisa híbrida. A pesquisa híbrida do StructArray pode produzir resultados ao nível da entidade ou ao nível do elemento, dependendo dos objetos « AnnSearchRequest » que combinar.
Esta página utiliza a coleção « tech_articles » da secção «Criar um campo StructArray». A coleção possui um campo vetorial de nível superior denominado « title_vector » e um campo StructArray denominado « chunks ». O subcampo « chunks[emb_list_vector] » está indexado para a pesquisa «EmbeddingList», e « chunks[emb] » está indexado para a pesquisa ao nível do elemento.
Como a pesquisa híbrida se aplica ao StructArray
AnnSearchRequest combinação | Âmbito final dos candidatos | Comportamento do resultado | element_scope |
|---|---|---|---|
| Campo vetorial ao nível da coleção + subcampo EmbeddingList do StructArray | Nível da entidade | Os candidatos finais são indexados pela chave primária. | Não utilizar. |
| Campo vetorial ao nível da coleção + subcampo ao nível do elemento StructArray | Nível da entidade | Os resultados ao nível do elemento são agrupados em candidatos ao nível da entidade antes da reclassificação híbrida. | Configuração opcional de agrupamento no sub AnnSearchRequest, ao nível do elemento StructArray. |
| Vários subcampos ao nível do elemento no âmbito do mesmo campo StructArray | Nível de elemento | Os candidatos finais são identificados pela chave primária mais o deslocamento do elemento Struct. | Não utilizar. |
| Subcampos ao nível do elemento em diferentes campos StructArray | Nível da entidade | Os deslocamentos dos elementos não partilham identidade, pelo que cada AnnSearchRequest ao nível do elemento StructArray é recolhido antes da reclassificação. | Configuração opcional de recolhimento em cada AnnSearchRequest de nível de elemento do StructArray. |
Aviso
Utilize o parâmetro « element_scope » apenas para configurar o colapso de objetos « AnnSearchRequest » ao nível do elemento do StructArray numa pesquisa híbrida ao nível do elemento que não seja da mesma estrutura. Não o utilize para pedidos «EmbeddingList», pedidos de vetores ao nível da coleção ou pesquisas híbridas ao nível do elemento do StructArray da mesma estrutura.
Antes de começar
Prepare a coleção, os dados e os índices antes de executar a pesquisa híbrida.
| Requisito | Detalhes |
|---|---|
| Campo StructArray | A coleção contém um campo StructArray, como, por exemplo, chunks. |
| Subcampos Vector | Utilize subcampos «vector» separados para a pesquisa na «EmbeddingList» e para a pesquisa ao nível dos elementos. |
| Índices | chunks[emb_list_vector] utiliza uma métrica do tipo « MAX_SIM* ». O « chunks[emb] » utiliza uma métrica vetorial normal, como « COSINE », « IP » ou « L2 ». |
| Reclassificador | Escolha um reclassificador híbrido, como RRFRanker ou outro reclassificador suportado pela sua aplicação. |
Para a configuração do índice, consulte Campos do StructArray do índice.
Executar uma pesquisa híbrida com um pedido EmbeddingList
A pesquisa EmbeddingList num subcampo vetorial StructArray é ao nível da entidade na pesquisa híbrida. Funciona como uma solicitação de pesquisa vetorial ao nível da entidade e não devolve um único deslocamento de elemento Struct correspondente.
from pymilvus import AnnSearchRequest, MilvusClient, RRFRanker
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query_vector = [0.19, 0.24, 0.30, 0.37]
query_list = EmbeddingList()
query_list.add([0.12, 0.21, 0.32, 0.44])
query_list.add([0.18, 0.23, 0.29, 0.36])
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_list_req = AnnSearchRequest(
data=[query_list],
anns_field="chunks[emb_list_vector]",
limit=10,
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_list_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
Neste exemplo, ambos os objetos ` AnnSearchRequest ` produzem candidatos ao nível da entidade. O resultado final é indexado pela chave primária da entidade pai. Não adicione ` element_scope ` à solicitação `EmbeddingList`.
Executar pesquisa híbrida ao nível do elemento no mesmo StructArray
Quando todos os objetos ` AnnSearchRequest ` têm como alvo subcampos vetoriais ao nível do elemento no âmbito do mesmo campo `StructArray`, a pesquisa híbrida pode manter os candidatos ao nível do elemento através de uma reclassificação. Este é o único modo híbrido do `StructArray` em que os resultados finais permanecem ao nível do elemento.
O exemplo seguinte pressupõe que o campo StructArray « chunks » tem dois subcampos vetoriais ao nível do elemento, « chunks[emb] » e « chunks[code_emb] », e que ambos utilizam métricas vetoriais regulares.
index_chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
limit=10,
expr='element_filter(chunks, $[section] == "index")',
)
code_chunk_req = AnnSearchRequest(
data=[code_query_vector],
anns_field="chunks[code_emb]",
limit=10,
expr='element_filter(chunks, $[has_code] == true)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[index_chunk_req, code_chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
for hits in results:
for hit in hits:
print(
"doc_id:", hit["id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)
Ambos os objetos « AnnSearchRequest » pesquisam subcampos vetoriais em « chunks ». O mesmo deslocamento com base zero refere-se ao mesmo elemento Struct, pelo que o reclassificador híbrido pode classificar diretamente os candidatos ao nível do elemento. Não defina « element_scope » neste modo, uma vez que não é realizada qualquer consolidação ao nível da entidade.
Agrupar resultados ao nível do elemento para pesquisa híbrida ao nível da entidade
Se uma pesquisa híbrida combinar um AnnSearchRequest ao nível do elemento StructArray com um pedido de vetor ao nível da coleção, um pedido EmbeddingList ou um pedido ao nível do elemento num campo StructArray diferente, o âmbito final dos candidatos é ao nível da entidade. Neste caso, cada AnnSearchRequest ao nível do elemento StructArray é agrupado em candidatos ao nível da entidade antes da reclassificação híbrida.
Utilize « element_scope » dentro do « params » do « AnnSearchRequest » ao nível do elemento do StructArray quando precisar de controlar a forma como vários elementos correspondentes da mesma entidade são agrupados.
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
param={
"params": {
"element_scope": {
"collapse": {
"strategy": "topk_sum",
"topk": 3,
},
},
},
},
limit=30,
expr='element_filter(chunks, $[quality_score] > 0.8)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
Neste exemplo, « title_req » é ao nível da entidade, pelo que o resultado híbrido final também é ao nível da entidade. O pedido « chunk_req » devolve primeiro os resultados dos elementos do « chunks[emb] » e, em seguida, agrupa os elementos devolvidos da mesma entidade somando as três melhores pontuações dos elementos. Se « element_scope » for omitido quando for necessário um agrupamento ao nível da entidade, a estratégia de agrupamento assume por predefinição « max ».
Escolher uma estratégia de agrupamento
| Estratégia | Comportamento | topk | Requisito métrico |
|---|---|---|---|
max | Manter a melhor pontuação do elemento devolvido para a entidade. | Não permitido. | Qualquer métrica vetorial regular suportada. |
sum | Somar todas as pontuações dos elementos devolvidos para a entidade. | Não permitido. | Apenas métricas de correlação positiva, tais como IP ou COSINE. |
avg | Calcular a média de todas as pontuações dos elementos devolvidos para a entidade. | Não permitido. | Qualquer métrica vetorial regular suportada. |
topk_sum | Some as melhores pontuações dos elementos devolvidos por « K » para a entidade. | Obrigatório e deve ser positivo. | Apenas métricas de correlação positiva, tais como « IP » ou « COSINE ». |
topk_avg | Calcular a média das melhores pontuações dos elementos devolvidos pelo « K » para a entidade. | Obrigatório e deve ser positivo. | Qualquer métrica vetorial regular suportada. |
A função «Collapse» utiliza apenas os resultados dos elementos devolvidos por essa « AnnSearchRequest » ao nível do elemento do StructArray. Não analisa todos os elementos Struct da entidade após a pesquisa ANN. Defina o valor de « limit » do pedido suficientemente alto para disponibilizar os elementos que pretende para a função «Collapse».
Adicionar filtros, pesquisa por intervalo e agrupamento
Pode associar um « element_filter » a um « AnnSearchRequest » ao nível do elemento do StructArray quando forem necessárias condições escalares aplicáveis aos mesmos elementos Struct que participam na pesquisa vetorial. Também pode utilizar um « filter » de nível superior em « hybrid_search() » para condições relativas à entidade pai.
Os campos vetoriais ao nível do elemento StructArray suportam a pesquisa por intervalo na pesquisa híbrida. Adicione radius e, opcionalmente, range_filter ao AnnSearchRequest ao nível do elemento. Os pedidos StructArray ao nível da EmbeddingList não suportam a pesquisa por intervalo.
O agrupamento híbrido ao nível do elemento só é suportado quando todos os objetos « AnnSearchRequest » têm como alvo campos vetoriais ao nível do elemento no âmbito do mesmo campo «StructArray», e « group_by_field » deve ser a chave primária. O agrupamento híbrido não é suportado quando a solicitação mistura campos vetoriais ao nível da coleção, diferentes campos «StructArray» ou solicitações ao nível de «EmbeddingList». Não combine a pesquisa por intervalo com o agrupamento.
Interpretar resultados híbridos
| Âmbito final dos candidatos | Chave do resultado | Comportamento do deslocamento | Quando ocorre |
|---|---|---|---|
| Nível da entidade | Chave primária. | Sem deslocamento de elementos no resultado final. | A solicitação híbrida inclui um campo vetorial ao nível da coleção, uma solicitação EmbeddingList ou solicitações ao nível do elemento em diferentes campos StructArray. |
| Nível do elemento | Chave primária mais o campo StructArray pai mais o deslocamento do elemento. | O deslocamento do elemento selecionado pode ser devolvido quando exposto pela API ou pelo SDK. | Todos os objetos « AnnSearchRequest » estão ao nível do elemento e no mesmo campo «StructArray». |
Limitações
Utilize o `
element_scope` apenas para objetos `AnnSearchRequest` ao nível do elemento do `StructArray` que devam ser reduzidos a candidatos ao nível da entidade numa pesquisa híbrida.Não utilize o `
element_scope` para pedidos `EmbeddingList`, pedidos de vetores ao nível da coleção ou pesquisa híbrida ao nível do elemento do mesmo `StructArray`.sume as estratégias de redução «topk_sum» requerem métricas de correlação positiva, tais como «IP» ou «COSINE». Não as utilize com «L2».topk_sumetopk_avgrequerem um valor positivo detopk. Outras estratégias de colapso não devem incluirtopk.Os pedidos de StructArray ao nível de EmbeddingList não suportam pesquisa por intervalo nem agrupamento.
A agrupamento híbrido só é suportada para pesquisas híbridas ao nível do elemento do mesmo StructArray e apenas por chave primária.
Não combine a pesquisa por intervalo com a agrupamento por.
Erros comuns
Adicionar «
element_scope» a uma solicitação híbrida ao nível do elemento do mesmo StructArray. Essa solicitação permanece ao nível do elemento e não realiza o colapso ao nível da entidade.Adicionar «
element_scope» a «chunks[emb_list_vector]». A pesquisa «EmbeddingList» já é ao nível da entidade.Presumir que dois campos StructArray partilham deslocamentos de elementos. O deslocamento
3emchunkse o deslocamento3noutro campo StructArray correspondem a elementos diferentes, pelo que a solicitação híbrida passa a ser ao nível da entidade.Utilizar
topk_sumcomL2. Utilizemax,avgoutopk_avgpara métricas de distância negativas.Espera-se que os resultados híbridos ao nível da entidade incluam o deslocamento do elemento Struct selecionado após a recolocação.
Próximos passos
Para conhecer os dois modos básicos de pesquisa vetorial com StructArray, leia «Pesquisa vetorial básica com StructArray».
Para adicionar filtros escalares à pesquisa híbrida, leia «Pesquisa filtrada com StructArray».
Para utilizar limites de pontuação ou distância na pesquisa híbrida, leia «Pesquisa por intervalo com StructArray».
Para agrupar resultados híbridos ao nível do elemento por entidade pai, leia «Pesquisa de agrupamento com StructArray».
Para verificar os limites de pesquisa do StructArray, leia «Limites do StructArray».