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 candidatosComportamento do resultadoelement_scope
Campo vetorial ao nível da coleção + subcampo EmbeddingList do StructArrayNível da entidadeOs 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 StructArrayNível da entidadeOs 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 StructArrayNível de elementoOs 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 StructArrayNível da entidadeOs 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.

RequisitoDetalhes
Campo StructArrayA coleção contém um campo StructArray, como, por exemplo, chunks.
Subcampos VectorUtilize subcampos «vector» separados para a pesquisa na «EmbeddingList» e para a pesquisa ao nível dos elementos.
Índiceschunks[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 ».
ReclassificadorEscolha 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`.

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.

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égiaComportamentotopkRequisito métrico
maxManter a melhor pontuação do elemento devolvido para a entidade.Não permitido.Qualquer métrica vetorial regular suportada.
sumSomar 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.
avgCalcular a média de todas as pontuações dos elementos devolvidos para a entidade.Não permitido.Qualquer métrica vetorial regular suportada.
topk_sumSome 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_avgCalcular 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 candidatosChave do resultadoComportamento do deslocamentoQuando ocorre
Nível da entidadeChave 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 elementoChave 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`.

  • sum e 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_sum e topk_avg requerem um valor positivo de topk. Outras estratégias de colapso não devem incluir topk.

  • 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 3 em chunks e o deslocamento 3 noutro campo StructArray correspondem a elementos diferentes, pelo que a solicitação híbrida passa a ser ao nível da entidade.

  • Utilizar topk_sum com L2. Utilize max, avg ou topk_avg para 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

  1. Para conhecer os dois modos básicos de pesquisa vetorial com StructArray, leia «Pesquisa vetorial básica com StructArray».

  2. Para adicionar filtros escalares à pesquisa híbrida, leia «Pesquisa filtrada com StructArray».

  3. Para utilizar limites de pontuação ou distância na pesquisa híbrida, leia «Pesquisa por intervalo com StructArray».

  4. Para agrupar resultados híbridos ao nível do elemento por entidade pai, leia «Pesquisa de agrupamento com StructArray».

  5. Para verificar os limites de pesquisa do StructArray, leia «Limites do StructArray».