Найти в Дзене
SkyNet | Новости ИИ

Как создать эластичную векторную базу данных с согласованным хешированием, шардингом и визуализацией в реальном времени для систем RAG

В этом руководстве мы создадим симулятор эластичной векторной базы данных, который имитирует распределение вложений в современных системах RAG по узлам распределённого хранения. Мы реализуем согласованное хеширование с виртуальными узлами, чтобы обеспечить сбалансированное размещение и минимальное перетасовка данных при масштабировании системы. Мы визуализируем кольцо хеширования в режиме реального времени и интерактивно добавляем или удаляем узлы, чтобы наблюдать, как перемещается лишь малая часть вложений. Установка среды выполнения и необходимых библиотек Мы настроим среду выполнения и установим необходимые библиотеки, необходимые для визуализации и интерактивности. Мы импортируем все основные зависимости Python, численные и графические в одном месте, чтобы сохранить записную книжку автономной. Мы обеспечим бесперебойную работу руководства в Google Colab без внешней настройки. ```python import hashlib import bisect import random from dataclasses import dataclass from typing impor

Как создать эластичную векторную базу данных с согласованным хешированием, шардингом и визуализацией в реальном времени для систем RAG

В этом руководстве мы создадим симулятор эластичной векторной базы данных, который имитирует распределение вложений в современных системах RAG по узлам распределённого хранения. Мы реализуем согласованное хеширование с виртуальными узлами, чтобы обеспечить сбалансированное размещение и минимальное перетасовка данных при масштабировании системы. Мы визуализируем кольцо хеширования в режиме реального времени и интерактивно добавляем или удаляем узлы, чтобы наблюдать, как перемещается лишь малая часть вложений.

Установка среды выполнения и необходимых библиотек

Мы настроим среду выполнения и установим необходимые библиотеки, необходимые для визуализации и интерактивности. Мы импортируем все основные зависимости Python, численные и графические в одном месте, чтобы сохранить записную книжку автономной. Мы обеспечим бесперебойную работу руководства в Google Colab без внешней настройки.

```python

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

```

Реализация согласованного хеширования

Мы реализуем согласованное хеширование и определим, как узлы хранения представлены в системе. Мы вводим виртуальные узлы для улучшения балансировки нагрузки и более равномерного распределения вложений. Мы сопоставляем ключи с узлами, используя детерминированную хеш-функцию, которая сохраняет стабильность при масштабировании.

```python

def u64hash(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, vnodespernode: int = 80):

self.vnodespernode = int(vnodespernode)

self.ring_keys: List[int] = []

self.ring_map: Dict[int, str] = {}

self.nodes: Dict[str, StorageNode] = {}

def vnodekey(self, node_id: str, v: int) -> int:

return u64hash(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.vnodespernode):

k = self.vnodekey(node.node_id, v)

if k in self.ring_map:

k = u64hash(f"node:{node.node_id}#vnode:{v}#salt:{random.random()}")

bisect.insort(self.ring_keys, k)

self.ringmap[k] = node.nodeid

def removenode(self, nodeid: str) -> None:

if node_id not in self.nodes:

return

del self.nodes[node_id]

toremove = [k for k, nid in self.ringmap.items() if nid == node_id]

for k in to_remove:

del self.ring_map[k]

self.ringkeys = sorted(self.ringmap.keys())

def get_node(self, key: str) -> Optional[str]:

if not self.ring_keys:

return None

...

Читать далее