Como Construir um Banco de Dados Vetorial Elástico com Hashing Consistente, Sharding e Visualização…

Neste tutorial, construímos um simulador de banco de dados vetorial elástico que espelha como os sistemas RAG modernos fragmentam embeddings em nós de armazenamento distribuídos. Implementamos hashing consistente com nós virtuais para garantir o posicionamento equilibrado e uma reorganização mínima à medida que o sistema escala. Visualizamos o anel de hashing em tempo real e adicionamos ou removemos nós interativamente para observar como apenas uma pequena fração de embeddings se move. Usamos essa configuração para conectar a teoria da infraestrutura diretamente ao comportamento prático em sistemas de IA distribuídos. Copiar Código Copiado Use um navegador diferente!pip -q install networkx ipywidgets import hashlib import bisect import random from dataclasses import dataclass from typing import Dict, List, Optional import numpy as np import networkx as nx import matplotlib.pyplot as plt from IPython.display import display, clear_output import ipywidgets as widgets Configuramos o ambiente de execução e instalamos as bibliotecas necessárias para visualização e interatividade. Importamos todas as dependências core do Python, numéricas e de gráficos em um único local para manter o notebook autônomo. Garantimos que o tutorial seja executado sem problemas no Google Colab sem configuração externa. Copiar Código Copiado Use um navegador diferente def _u64_hash(s: str) -> int: h = hashlib.sha256(s.encode("utf-8")).digest()[:8] return int.from_bytes(h, byteorder="big", signed=False) @dataclass(frozen=True) class StorageNode: node_id: str class ConsistentHashRing: def __init__(self, vnodes_per_node: int = 80): self.vnodes_per_node = int(vnodes_per_node) self.ring_keys: List[int] = [] self.ring_map: Dict[int, str] = {} self.nodes: Dict[str, StorageNode] = {} def _vnode_key(self, node_id: str, v: int) -> int: return _u64_hash(f"node:{node_id}#vnode:{v}") def add_node(self, node: StorageNode) -> None: if node.node_id in self.nodes: return self.nodes[node.node_id] = node for v in range(self.vnodes_per_node): k = self._vnode_key(node.node_id, v) if k in self.ring_map: k = _u64_hash(f"node:{node.node_id}#vnode:{v}#salt:{random.random()}") bisect.insort(self.ring_keys, k) self.ring_map[k] = node.node_id def remove_node(self, node_id: str) -> None: if node_id not in self.nodes: return del self.nodes[node_id] to_remove = [k for k, nid in self.ring_map.items() if nid == node_id] for k in to_remove: del self.ring_map[k] self.ring_keys = sorted(self.ring_map.keys()) def get_node(self, key: str) -> Optional[str]: if not self.ring_keys: return None hk = _u64_hash(f"key:{key}") idx = bisect.bisect_left(self.ring_

Fonte: MarkTechPost

Publicado em 2026-02-26

Notícias relacionadas

Continue explorando