Arène RAG
RAG Arena est un projet open source Next.js créé par mon mendable.ai qui s'interface avec LangChain pour fournir une expérience de chatbot RAG où les requêtes reçoivent plusieurs réponses. Les utilisateurs votent sur ces réponses, qui sont ensuite débloquées pour révéler le Retriever utilisé, différenciant les chatbots par leurs méthodes RAG de données. Le projet utilise Supabase pour les opérations de base de données et propose un classement en temps réel affichant les données de la base de données.
Installation
Assurez-vous que pnpm
est installé sur votre système. Sinon, installez-le via :
Clonez le dépôt du projet :
git clone https://github.com/mendableai/rag-arena
Accédez au répertoire du projet et installez les dépendances :
Configurez vos variables d'environnement :
# probably in: https://platform.openai.com/api-keys
OPENAI_API_KEY=
# probably in: https://supabase.com/dashboard/ project>project settings>api
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PRIVATE_KEY=
# probably in: https://console.upstash.com/redis/
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
PRODUCTION=false
PYTHON_MICRO_SERVER=
Démarrez le serveur Web de développement (nextjs) :
Exécuter le serveur Python
*(si vous n'avez pas de poésie, ajoutez simplement un identifiant en utilisant pip install poésie)
Activation du magasin de graphiques Neo4j
Pour le récupérateur Graph Rag, vous devrez créer le magasin de graphiques ou laisser le serveur exécuter automatiquement la fonction 'create_neo4j_graph_store' (localisée dans /python_service/retrievers/neo4j_retriever.py
) en décommentant les lignes :
# if not os.path.exists(storage_dir) or not os.listdir(storage_dir):
# create_neo4j_graph_store()
Cela prendra un certain temps en fonction des données utilisées dans data/chunks
. À la fin, votre répertoire neo/storage
sera rempli de données persistantes pour le magasin de graphiques localement.
Chargement de l'index pour la première fois
Vous aurez besoin de l'index chargé et mis en cache pour que le Graph RAG puisse être utilisé. La fonction load_index()
fait cela pour vous dans python_service/app.py
. Ainsi, lors de votre toute première exécution, la création du fichier .pkl mis en cache placé dans python_service/index/cache
peut prendre un certain temps.
Exécutez le serveur Flask localement avec le mode débogage
poetry run flask run --debug
Ouvrez http://localhost:3000 avec votre navigateur pour voir le résultat.
Présentation de l'architecture
Système d'ingestion
- Chemin :
app/api/ingest/route.ts
- Description : ce module est chargé d'ingérer les articles dans une base de données vectorielle, les rendant ainsi récupérables pour de futures requêtes.
- Détails de mise en œuvre :
- Splitter : utilise le
RecursiveCharacterTextSplitter
de LangChain pour un fractionnement efficace du texte. - Embeddings : exploite
OpenAIEmbeddings
pour générer des intégrations de documents. - Stockage : utilise
SupabaseVectorStore
pour stocker les documents traités dans Supabase.
Récupérateur dynamique
- Chemin :
app/api/retrievers/dynamic-retriever/route.ts
- Description : sélectionne et utilise dynamiquement différents récupérateurs en fonction des entrées de l'utilisateur pour récupérer les documents pertinents.
- Principales caractéristiques :
- Limitation du débit : met en œuvre une limitation du débit pour gérer la charge et garantir une utilisation équitable.
- Document RAG : récupère les documents les plus pertinents par rapport à la requête de l'utilisateur.
- Intégration OpenAI : interagit avec l'API d'OpenAI pour améliorer la complétion des discussions, optimisée par SupabaseVectorStore pour la correspondance de documents.
Système de vote
- Chemin :
actions/voting-system.ts
- Objectif : Supervise la logique du vote pour les réponses récupérées, ce qui est crucial pour l'apprentissage et l'adaptation du système.
- Fonctionnalités :
- Suivi des votes : met à jour le nombre de votes, les temps de test et les notes Elo pour chaque récupérateur.
- Ajustement Elo : ajuste les notes Elo en fonction du nombre moyen de fois que les récupérateurs ont été testés, favorisant ainsi l'équité et la précision.
// calculation used for the elo
function calculateEloAdjustment(timesTested: number, averageTimesTested: number): number {
if (averageTimesTested === 0) return 10;
const adjustmentFactor = timesTested / averageTimesTested;
return (1 / adjustmentFactor) * 10;
}
Schéma de base de données
- Nom de la table : Classement
- Contenu : contient des données cruciales pour chaque récupérateur, notamment
id
, retriever
, elo
, votes
, times_tested
, full_name
, description
et link
.
Présentation des fonctions RAG
(https://js.langchain.com/docs/modules/data_connection/retrievers/)
Cette section décrit les différentes fonctions RAG définies dans app/api/retrievers/dynamic-retriever/tools/functions.ts
, détaillant leur objectif et leur mise en œuvre dans l'architecture du projet. Ces fonctions jouent un rôle crucial dans le processus RAG documentaire, en tirant parti de différentes stratégies et technologies pour optimiser les performances et la précision.
Magasin de vecteurs
- Quand l’utiliser : Idéal pour les débutants à la recherche d’une solution rapide et simple.
- Description : Cette fonction exploite la simplicité de création d'intégrations pour chaque morceau de texte, ce qui en fait le point de départ le plus accessible pour le document RAG.
Document parent
- Quand l’utiliser : Idéal pour les documents divisés en morceaux d’informations plus petits et distincts qui sont indexés séparément mais doivent être récupérés dans leur ensemble.
- Description : il indexe plusieurs fragments par document, identifiant les fragments les plus similaires dans l'espace d'intégration pour récupérer l'intégralité du document parent, plutôt que uniquement les fragments individuels.
Multi-vecteur
- Quand l'utiliser : convient lorsque vous pouvez extraire des informations plus pertinentes pour l'indexation que le texte du document lui-même.
- Description : crée plusieurs vecteurs pour chaque document, chaque vecteur représentant potentiellement des résumés de texte, des questions hypothétiques ou d'autres formes d'informations distillées.
Compression contextuelle
- Quand l'utiliser : utile lorsque les documents récupérés contiennent un excès d'informations non pertinentes, détournant l'attention de la réponse à la requête principale.
- Description : ajoute une étape de post-traitement à un autre outil de récupération, extrayant uniquement les informations les plus pertinentes des documents récupérés, ce qui peut être réalisé à l'aide d'intégrations ou d'un LLM.
Pondéré dans le temps
- Quand l'utiliser : Idéal pour les documents avec des horodatages associés, dans le but de récupérer les documents les plus récents en fonction de la similarité sémantique et de la récence.
- Description : Récupère les documents en équilibrant la similarité sémantique avec les horodatages des documents, garantissant ainsi que les documents récents sont priorisés dans le processus RAG.
Récupérateur multi-requêtes
- Quand l’utiliser : Idéal pour les requêtes complexes nécessitant plusieurs informations distinctes pour une réponse complète.
- Description : génère plusieurs requêtes à partir d'une seule entrée, répondant au besoin d'informations sur divers sujets pour répondre pleinement à la requête d'origine. Cette approche récupère les documents pour chaque requête générée, garantissant une réponse complète.
Contribuer
Les contributions sont les bienvenues ! Veuillez suivre le flux de travail standard des demandes de fork et de pull. Assurez-vous de respecter les styles et modèles de codage présents dans le projet et rédigez des tests pour les nouvelles fonctionnalités ou les corrections de bogues.
Licence
RAG Arena est open source et publié sous la licence MIT. Voir le fichier LICENSE pour plus d'informations.