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_fieldcomo 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_fieldcom 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:
Um cluster — Crie um cluster
Uma chave de API — Gerencie chaves de API
A versão mais recente do DashVector SDK instalada — Instale o DashVector SDK
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 |
Deve referenciar um campo definido em |
|
Natureza de melhor esforço de |
A quantidade real de grupos ou segmentos retornados pode ser inferior aos valores definidos. O DashVector prioriza |
|
Valores máximos |
Máximo para |
Próximos passos
Busca de documentos agrupada — referência completa da API para
query_group_byCrie uma coleção — defina
fields_schemapara buscas agrupadasSem esquema — entenda a diferença entre campos com esquema e sem esquema