Chapitre 1 : Mise à l'échelle des applications RAG
Défis de mise à l'échelle
| Défi | Impact | Solution |
|---|---|---|
| Millions de documents | Indexation lente | Traitement par lots |
| QPS élevé | Délai d'attente | Répartition de charge |
| Grands vecteurs | Limites de mémoire | Fragmentation |
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
| Documents | Architecture |
|---|---|
| <100K | Instance unique |
| 100K-1M | BD répliquée |
| 1M-10M | Cluster fragmenté |
| >10M | Système distribué |