Aller au contenu principal

Chapitre 1 : Mise à l'échelle des applications RAG

Défis de mise à l'échelle​

DéfiImpactSolution
Millions de documentsIndexation lenteTraitement par lots
QPS élevéDélai d'attenteRépartition de charge
Grands vecteursLimites de mémoireFragmentation

Bases de données vectorielles distribuées​

# Configuration du cluster Milvus
from pymilvus import connections, Collection

# Connexion au cluster distribué
connections.connect(
alias="default",
host="milvus-cluster",
port="19530"
)

# Les données sont automatiquement distribuées entre les nœuds

Traitement asynchrone​

import asyncio
from langchain.embeddings import OpenAIEmbeddings

async def batch_embed_async(texts, batch_size=100):
"""Intégrer les textes en lots asynchrones"""
embeddings = OpenAIEmbeddings()

async def embed_batch(batch):
return await asyncio.to_thread(
embeddings.embed_documents, batch
)

tasks = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
tasks.append(embed_batch(batch))

results = await asyncio.gather(*tasks)
return [e for batch in results for e in batch]

Indexation basée sur une file d'attente​

# Producteur : Ajouter à la file d'attente
import redis

r = redis.Redis()
r.lpush("index_queue", document_json)

# Consommateur : Traiter la file d'attente
while True:
doc = r.brpop("index_queue")
process_and_index(doc)

Recommandations de mise à l'échelle​

DocumentsArchitecture
<100KInstance unique
100K-1MBD répliquée
1M-10MCluster fragmenté
>10MSystème distribué