
Comment fonctionne un bot RAG moderne
Un bon pipeline RAG, c’est bien plus que « mettre des documents dans une base de données vectorielle ». Le flux de base ressemble à ceci :| Étape | Ce qui se passe |
|---|---|
| Chargement | Lire les fichiers Markdown, texte ou reStructuredText locaux |
| Découpage | Diviser les longs documents en sections qui se chevauchent |
| Embedding | Utiliser les embeddings Venice pour transformer les passages en vecteurs |
| Stockage | Sauvegarder les vecteurs et les métadonnées de source dans Qdrant |
| Récupération | Encoder la question de l’utilisateur et lancer la recherche vectorielle |
| Re-ranking | Utiliser un cross-encoder pour rescorer les meilleurs candidats |
| Réponse | Envoyer le meilleur contexte à un modèle de chat Venice avec des instructions de citation |
Installation des dépendances
Nous utiliserons le SDK Python OpenAI car Venice expose une API compatible avec OpenAI. Nous utiliserons également le client Python de Qdrant avec le support de FastEmbed :requirements.txt avec les mêmes paquets :
Choix des modèles
Créez un fichier nommérag_bot.py, puis commencez par ajouter les imports, les structures de données, l’URL de l’API et les noms de modèles :
base_url et la clé API.
Vous pouvez lister les modèles Venice disponibles avec :
Création des clients Venice et Qdrant
Créez un seul client Venice compatible OpenAI pour les embeddings et les chat completions :| Mode | Quand l’utiliser |
|---|---|
QdrantClient(":memory:") | Démos et tests locaux rapides |
QdrantClient(path="./qdrant_data") | Stockage local persistant |
QdrantClient(url=..., api_key=...) | Un cluster Qdrant distant ou managé |
Chargement et découpage des documents
Pour ce tutoriel, nous laisserons le bot ingérer des fichiers ou dossiers locaux. Commencez par les fichiers.md, .rst et .txt :
1000 caractères avec un chevauchement de 150 caractères constitue un bon point de départ pour des documents mixtes Markdown et texte. Des passages plus petits peuvent améliorer la précision. Des passages plus grands peuvent préserver davantage de contexte. Le bon paramétrage dépendra souvent du type de documents que vous stockez.
Embedding des documents avec Venice
Une fois que nous avons des passages, nous les encodons par lots :Stockage des vecteurs dans Qdrant
Avant d’insérer des points, créez une collection Qdrant avec la bonne taille de vecteur. Le plus simple pour connaître la taille du vecteur est d’encoder le premier lot, puis d’utiliserlen(embeddings[0]).
source, chunk_index et du contenu. Cela rend l’ingestion répétée idempotente pour les passages inchangés.
Récupération des passages candidats
Au moment de la question, le bot encode la question de l’utilisateur et demande à Qdrant les meilleures correspondances vectorielles :limit ici représente le nombre de candidats. Il devrait généralement être plus élevé que le nombre de passages que vous prévoyez d’envoyer au modèle, car l’étape suivante les re-classera. Une bonne valeur par défaut est de récupérer 8 candidats et d’envoyer les 4 meilleurs au modèle de chat.
Re-ranking avec FastEmbed
Nous ajoutons maintenant la partie qui rend la récupération bien plus intelligente.- Récupérer un ensemble de candidats plus large via la recherche vectorielle.
- Re-classer uniquement ces candidats localement.
- Envoyer les quelques meilleurs passages au modèle de langage.
candidate_k=8 et top_k=4. Augmentez candidate_k si la bonne source est souvent proche mais n’arrive pas dans le contexte final.
Réponse avec les chat completions Venice
Une fois le contexte sélectionné, formatez-le avec des numéros de source :Exécution du bot
Une fois que vous avez assemblé les pièces dans un script, sauvegardez-le sous le nomrag_bot.py. Une première exécution simple peut utiliser quelques documents d’exemple intégrés afin de vérifier le pipeline avant d’ingérer vos propres fichiers :
Options CLI utiles
Exposez les principaux paramètres de récupération comme options CLI afin de pouvoir ajuster le bot sans éditer le code :| Option | Valeur par défaut | Ce qu’elle contrôle |
|---|---|---|
--candidate-k | 8 | Nombre de résultats de recherche vectorielle à re-classer |
--top-k | 4 | Nombre de passages re-classés envoyés au modèle de chat |
--chunk-size | 1000 | Taille maximale du passage avant chevauchement |
--chunk-overlap | 150 | Caractères répétés entre passages voisins |
--embedding-batch-size | 32 | Nombre de passages par requête d’embeddings Venice |
--qdrant-path | non défini | Chemin de stockage persistant local Qdrant |
--qdrant-url | non défini | URL Qdrant distante |
--skip-ingest | false | Interroger une collection existante sans recharger les docs |
--recreate-collection | false | Supprimer et reconstruire la collection Qdrant |
Notes sur la confidentialité
Pour une configuration RAG privée, pensez à chaque couche séparément :| Couche | Considération de confidentialité |
|---|---|
| Embeddings Venice | Les passages des documents sont envoyés à Venice pour créer des vecteurs |
| Chat Venice | Le contexte récupéré est envoyé à Venice pour répondre à la question |
| Qdrant local | Les vecteurs et payloads restent sur votre machine |
| Qdrant distant | Les vecteurs et payloads sont stockés là où s’exécute votre serveur Qdrant |
| Re-ranker FastEmbed | Le re-ranking s’exécute localement une fois le modèle disponible |
Erreurs courantes à anticiper
| Symptôme | Ce que cela signifie généralement | Que faire |
|---|---|---|
Set VENICE_API_KEY before running this example. | La variable d’environnement est manquante | Exporter VENICE_API_KEY avant d’exécuter le script |
Document path does not exist | Un chemin passé à --docs est incorrect | Vérifier le chemin du fichier ou du dossier |
| Résultats de récupération vides | Rien n’a été ingéré, ou la mauvaise collection est interrogée | Retirer --skip-ingest ou confirmer --collection et --qdrant-path |
| Erreur de taille de vecteur Qdrant | La collection a été créée avec un autre modèle d’embedding | Recréer la collection après avoir changé de modèle d’embedding |
| Premier re-rank lent | FastEmbed peut être en train de télécharger ou d’initialiser le cross-encoder | Laissez la première exécution se terminer, les suivantes devraient être plus rapides |
Pour aller plus loin
Une fois la base en place, les améliorations à plus fort impact sont généralement :- Ajouter des chargeurs spécifiques pour PDF, HTML, tickets ou pages de wiki internes.
- Stocker des métadonnées plus riches comme les titres, les en-têtes, les dates, les propriétaires et les URL.
- Ajuster
candidate_k,top_k, la taille des passages et le chevauchement sur de vraies questions. - Ajouter des questions d’évaluation afin de pouvoir mesurer la qualité de la récupération avant et après les changements.
- Streamer la chat completion finale de Venice pour une meilleure expérience de chat interactif.