Skip to content

Instantly share code, notes, and snippets.

@suissa
Created June 12, 2026 05:10
Show Gist options
  • Select an option

  • Save suissa/0d43c41d00330fc4270582d0d235f826 to your computer and use it in GitHub Desktop.

Select an option

Save suissa/0d43c41d00330fc4270582d0d235f826 to your computer and use it in GitHub Desktop.

Estou querendo criar uma representação compacta só para agrupamento, roteamento e migração para fazer sharding em qualquer banco vetorial, de todos os tipos diferentes de bancos que uso esse é o último que preciso resolver.

embedding original = verdade semântica
coordenada compactada = índice de separação
cluster/cell_id = destino de shard/servidor

Compactar para descobrir “com quem esse vetor anda junto”, mas quando o grupo é separado ou enviado para outro servidor, envia os valores originais.

texto/documento
→ embedding original 1536D
→ compactação semântica 3D/bucket/hash
→ cluster_id
→ decide servidor
→ envia embedding original + payload para esse servidor

Nesse caso, a compactação não precisa ser reversível. Ela só precisa ser boa o suficiente para colocar valores semanticamente próximos no mesmo agrupamento.

O nome técnico mais próximo seria algo como:

Semantic Routing Code

Ou, no seu vocabulário:

Semantic Compression Sharding

A estrutura ideal seria ter dois campos por vetor:

{
  "vector_id": "doc_123",
  "embedding": [0.012, -0.883, 0.442, "..."],
  "semantic_code": "09:02:03",
  "cluster_id": "cluster_health_17",
  "virtual_shard": 331,
  "payload_ref": "eventstore://doc_123"
}

O semantic_code serve para agrupar. O embedding original continua guardado para busca real.

Sua técnica poderia funcionar assim:

1. Gera embedding original.
2. Calcula cosseno contra âncoras/centroides.
3. Transforma os scores em ranges.
4. Gera uma coordenada compactada.
5. Agrupa tudo que caiu na mesma região.
6. Quando a região fica grande/quente, envia o grupo inteiro para outro servidor.
7. No destino, reconstrói o índice vetorial usando os embeddings originais.

Exemplo:

"consulta psiquiátrica infantil"
→ embedding original
→ cos(saúde)=0.91
→ cos(comércio)=0.18
→ cos(tecnologia)=0.26
→ semantic_code = 09:01:02
→ cluster = saúde_mental
→ servidor = node-health-02

Quando for migrar:

semantic_code 09:01:02
→ pegar todos os vector_ids desse code
→ buscar embeddings originais
→ enviar lote para outro servidor
→ servidor destino cria índice local com valores originais

Então sim: compacta para separar, mas não depende da compactação para recuperar o valor semântico final.

Isso é parecido com criar um “CEP semântico”:

embedding original = endereço completo
semantic_code = CEP aproximado
cluster = bairro semântico
server = cidade/datacenter onde aquele bairro mora

Você não usa o CEP para saber a casa exata. Usa o CEP para mandar para a região certa.

A melhor forma de fazer isso não é necessariamente 3D fixo. Eu faria uma dessas três opções.

A primeira opção é anchor cosine code:

x = cos(v, anchor_1)
y = cos(v, anchor_2)
z = cos(v, anchor_3)

semantic_code = bucket(x):bucket(y):bucket(z)

É simples, barato e fácil de debugar.

A segunda opção é centroid code:

v → centroide mais próximo
cluster_id = C17

É mais direto para sharding. Você não precisa transformar em coordenada 3D; só pergunta “qual centroide é mais parecido?”.

A terceira opção é multi-anchor code:

v → top 4 âncoras mais próximas
semantic_code = C17:C91:C42:C08

Essa é provavelmente a melhor para o seu caso, porque preserva melhor a vizinhança semântica do que apenas 3 eixos.

Exemplo:

"ansiedade infantil"
→ top anchors:
   C17 saúde mental
   C91 pediatria
   C42 terapia
   C08 sintomas

Isso gera um agrupamento muito mais útil do que só (x,y,z).

Eu desenharia assim:

VectorIngestAgent
  ↓
EmbeddingAgent
  ↓
SemanticCompressionRouter
  ↓
ClusterAssignment
  ↓
UbiQ/NATS topic por cluster
  ↓
ShardWorker remoto
  ↓
VectorDB local no servidor destino

Tópicos:

vector.upsert.health_mental.C17
vector.upsert.commerce.products.C31
vector.upsert.legal.contracts.C08
vector.migrate.cluster.C17
vector.reindex.cluster.C17

O evento de migração seria:

{
  "op": "cluster.migrate",
  "cluster_id": "C17",
  "semantic_code_range": ["09:01:02", "09:01:03"],
  "from_node": "node-a",
  "to_node": "node-health-02",
  "vector_ids": ["doc_1", "doc_2", "doc_3"],
  "epoch": 88291
}

O destino não recebe só a coordenada compactada. Ele recebe ou consegue recuperar:

- vector_id
- embedding original
- metadata
- payload_ref
- epoch
- tombstone/deletedAt

Então o destino reconstrói o índice vetorial normal.

Essa parte é importante:

O semantic_code não precisa ser perfeito.
Ele só precisa reduzir o custo de decidir para onde mandar.

Depois que o dado está no servidor certo, a busca local continua sendo feita pelo banco vetorial com o embedding completo.

Para evitar erro de fronteira, você pode ter primary_cluster e neighbor_clusters.

{
  "vector_id": "doc_123",
  "primary_cluster": "C17",
  "neighbor_clusters": ["C91", "C42"],
  "semantic_code": "09:01:02"
}

Na escrita normal, manda para o primário. Em casos críticos, replica também nos vizinhos.

C17 = shard primário
C91 = réplica semântica
C42 = réplica semântica opcional

Isso permite que consultas que caiam perto da fronteira ainda encontrem o documento.

A versão mais enxuta do algoritmo seria:

onUpsert(entity):
  embedding = generateEmbedding(entity.text)

  semantic_code = compressForRouting(embedding)

  cluster_id = semanticCodeToCluster(semantic_code)

  node = clusterPlacement(cluster_id)

  publish("vector.upsert." + cluster_id, {
    vector_id,
    embedding,
    metadata,
    payload_ref,
    semantic_code,
    cluster_id
  })

E para migração:

onClusterHot(cluster_id):
  target_node = chooseNode(cluster_id)

  vector_ids = listVectorsByCluster(cluster_id)

  for vector_id in vector_ids:
    event = loadOriginalVectorEvent(vector_id)
    publish("vector.migrate." + target_node, event)

  updateClusterPlacement(cluster_id, target_node)

O que você está propondo, em uma frase:

Criar uma compactação semântica com perda apenas para separar regiões do espaço vetorial, mantendo os embeddings originais para reindexação, busca e ranking final.

Isso é bom. E combina muito com seu modelo de mensageria, porque cada agrupamento semântico pode virar um canal, tópico, shard lógico ou servidor especializado.

Eu só evitaria chamar isso de “voltar aos valores comuns” como se a compactação revertesse o vetor. Mais preciso seria:

compacta para endereçar;
reidrata pelo event log/storage original;
reindexa no destino com o embedding completo.

A técnica final ficaria:

Semantic Compression Sharding

- embedding original é preservado
- semantic_code é derivado
- cluster_id é calculado pelo semantic_code
- cluster_id define o servidor
- migração usa event log para reenviar embeddings originais
- busca final usa embedding completo

Isso é uma boa estratégia vendor-neutral para mandar agrupamentos semanticamente próximos para outro servidor sem depender do sharding interno do banco vetorial.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment