Todos os produtos
Search
Central de documentação

DashVector:Busca vetorial agrupada

Última atualização: Jun 29, 2026

Uma busca vetorial padrão retorna os k vetores mais similares globalmente. No entanto, quando vários vetores têm a mesma origem (por exemplo, múltiplos trechos de um mesmo documento ou várias imagens de um único produto), esses k resultados podem ser dominados por essa única source. A busca vetorial agrupada resolve esse problema ao retornar os melhores resultados de grupos distintos. Assim, cada grupo contribui com no máximo group_topk resultados e o total retornado contém no máximo group_count grupos.

Casos de uso

  • Geração aumentada por recuperação (RAG): Documentos são divididos em segmentos, vetorizados e armazenados no DashVector. Sem o agrupamento, diversos trechos do mesmo documento podem ocupar as primeiras posições dos resultados. Defina group_by_field como o campo de ID do documento para garantir que cada grupo represente um documento de source distinto.

  • Recuperação de imagens de produtos: Várias imagens representam um único produto, cada uma armazenada como um vetor separado. Configure group_by_field com o campo de ID do produto para obter resultados de produtos diferentes, em vez de múltiplas imagens do mesmo item.

Pré-requisitos

Antes de começar, verifique se você possui:

Execute uma busca vetorial agrupada

O exemplo a seguir utiliza um cenário de RAG. Seis segmentos de documentos, provenientes de três artigos, estão armazenados em uma coleção. A busca retorna os dois artigos mais similares (grupos), com até dois segmentos por artigo.

A coleção usa fields_schema para definir document_id (string) e chunk_id (inteiro). O parâmetro group_by_field deve referenciar um campo definido em fields_schema, pois campos sem esquema não são suportados na busca agrupada.

Etapa 1: Crie uma coleção e inserir documentos

Substitua YOUR_API_KEY e YOUR_CLUSTER_ENDPOINT pelos seus valores reais.

import dashvector
import numpy as np

client = dashvector.Client(
    api_key='YOUR_API_KEY',
    endpoint='YOUR_CLUSTER_ENDPOINT'
)

# Create a collection with schema-defined fields
ret = client.create(
    name='group_by_demo',
    dimension=4,
    fields_schema={'document_id': str, 'chunk_id': int}
)
assert ret

collection = client.get(name='group_by_demo')

# Insert six segments across three documents
ret = collection.insert([
    ('1', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 1, 'content': 'xxxA'}),
    ('2', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 2, 'content': 'xxxB'}),
    ('3', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 1, 'content': 'xxxC'}),
    ('4', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 2, 'content': 'xxxD'}),
    ('5', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 3, 'content': 'xxxE'}),
    ('6', np.random.rand(4), {'document_id': 'paper-03', 'chunk_id': 1, 'content': 'xxxF'}),
])
assert ret

Etapa 2: Consultar com agrupamento

ret = collection.query_group_by(
    vector=[0.1, 0.2, 0.3, 0.4],
    group_by_field='document_id',  # Group results by document
    group_count=2,                 # Return at most 2 groups
    group_topk=2,                  # Return at most 2 segments per group
)

if ret:
    print('query_group_by success')
    print(len(ret))
    print('------------------------')
    for group in ret:
        print('group key:', group.group_id)
        for doc in group.docs:
            print(' -', doc)

A saída agrupa os resultados por document_id. Cada grupo lista seus segmentos em ordem decrescente de pontuação:

query_group_by success
4
------------------------
group key: paper-01
 - {"id": "2", "fields": {"document_id": "paper-01", "chunk_id": 2, "content": "xxxB"}, "score": 0.6807}
 - {"id": "1", "fields": {"document_id": "paper-01", "chunk_id": 1, "content": "xxxA"}, "score": 0.4289}
group key: paper-02
 - {"id": "3", "fields": {"document_id": "paper-02", "chunk_id": 1, "content": "xxxC"}, "score": 0.6553}
 - {"id": "5", "fields": {"document_id": "paper-02", "chunk_id": 3, "content": "xxxE"}, "score": 0.4401}

Dois grupos são retornados (paper-01 e paper-02), cada um com até dois segmentos. O grupo paper-03 foi excluído porque group_count=2 limita o número total de grupos na resposta.

Limitações

Restrição

Detalhes

Tipo de campo de group_by_field

Deve referenciar um campo definido em fields_schema durante a criação da coleção. Campos sem esquema não são suportados. Consulte Crie uma coleção e Sem esquema.

Natureza de melhor esforço de group_count e group_topk

A quantidade real de grupos ou segmentos retornados pode ser inferior aos valores definidos. O DashVector prioriza group_count: primeiro preenche o máximo possível de grupos e depois completa os segmentos dentro de cada grupo até atingir group_topk.

Valores máximos

Máximo para group_count: 64. Máximo para group_topk: 16. Valores maiores aumentam a carga de varredura do índice e elevam o tempo de resposta da API.

Próximos passos