Un clone de Perplexity à vocation pédagogique pour comprendre et apprendre les différents concepts du moteur de recherche augmenté par IA.
Techno: Next.js, Vercel AI SDK, Mistral, Langchain.js, Serper et Brave API (search), OpenAI Embeddings
OpenAI propose une API de RAG sur étagère (c’est en bêta encore)
Concrètement ça permet d’ingérer des documents dans une base de données vectorielle et de faire un RAG en très peu de code.
Il n’y a pas beaucoup de contrôle sur les différentes étapes, par exemple le chunking c’est uniquement chunking simple avec overlap, mais c’est très pratique pour faire un POC rapide par exemple.
Les détails d'une méthode qui allie un RAG à des comportements d'Agent.
Leur benchmark est une optimisation de flux financiers et logistique à réaliser en interrogeant de la donnée dans une base relationnelle.
Concrètement, un plan des données nécessaires et de leurs relations est établie en amont puis les différentes requêtes sont exécutées.
Si des données sont manquantes, un nouveau plan peut être établie.
Ils affichent des résultats jusqu'à 2 fois meilleurs (60%) qu'un RAG simple sur le benchmark qu'ils ont créé.
Donner la représentation interne de la base de connaissance au modèle pour lui permettre de créer ses propres requêtes est une piste intéressante que j'avais déjà envisagé (mais repoussé faute de structuration correcte dans notre base de connaissances à l'époque)
Une étude sur les capacités des modèles ayant de grandes fenêtres de contexte à réaliser des tâches de type RAG.
Il apparaît que les modèles sont autant capable qu'un RAG lorsque l'on met tous les documents dans leur fenêtre de contexte.
A première vue, on pourrait se dire que les RAG sont obsolètes mais:
- le nombre de tokens consommé est de 10 à 100x plus élevé
- même 2 millions de tokens peuvent s'avérer insuffisant pour une grande base de connaissances
En général, les modèles se débrouillent aussi mieux lorsque l'on limite le nombre d'informations présentes dans leur prompt et sur des cas d'usages de raisonnement comme en SQL, cela peut améliorer les performances.
Une solution clé en main de Text-to-SQL, un RAG pour poser des questions en langage naturelle à sa base de données.
Une autre solution un peu plus mature: Dataherald
Les deux sont Open Source :-)
Un retour d'expérience très complet sur le système d'interrogation du datawarehouse de Pinterest avec du langage naturel.
Ils ont construit un RAG avec lequel les utilisateurs peuvent poser des questions en langage naturel. 40% du temps le résultat est bon du premier coup et le reste du temps les utilisateurs doivent affiner leur question en plusieurs messages. (comme toujours, l'IA reste un copilote)
Une idée intéressante, ils utilisent les questions les plus courantes sur une table pour générer un summary de la table et son utilité. Ce summary est ensuite vectorisé.
Ils utilisent OpenSearch (la fork d'Elasticsearch) comme moteur de recherche vectoriel notamment parce qu'ils peuvent utiliser le scoring boost.
L'article est une mine d'information et ils donnent tous leurs prompts!
Un article qui parle de techniques avancées pour améliorer les résultats d'un RAG.
-
Query Expension: le but est d'améliorer le champ lexical de la requête pour retrouver plus de documents pertinents. On peut aussi parler de la méthode HyDE pour récupérer des documents en provenance de champs lexicaux différents.
-
Self Query: c'est ce que j'appelle l'extraction de facettes, en gros ça consiste à extraire du texte brut les filtres que l'on a définit dans son moteur de recherche (couleur, poids, etc)
-
Hybrid & Filtered vector search: cette étape je conseille de la faire exclusivement avec un vrai moteur de recherche comme Elasticsearch en utilisant les query avancées et le scoring
-
ReRanking: après la récupération des documents potentiellement pertinents (disons 50), on refait une passe en demandant à un LLM de choisir les documents contenant réellement des informations pour répondre à la demande de l'utilisateur.
Microsoft propose un outil qui prend des screenshots à intervalles réguliers puis les analyse avec de l'IA pour que l'on puisse chercher dedans n'importe quelle information.
Rewind propose la même chose sur Macos par exemple.
Dans l'idée, c'est un RAG automatique sur tout ce que vous faites donc ça peut être pratique.
Dans les faits, la qualité de la donnée est assez mauvaise et l'utilité limitée.
Par contre pour un pirate ayant accès à votre PC c'est une mine d'or 😬
Unstructured propose des produits autour de la normalisation de documents en vue de leur ingestion dans un RAG.
Ils proposent des produits en API et SaaS pour ingérer les documents mais aussi des lib open source !
Sur cette page, ils présentent leur format de découpage d'un document en plusieurs éléments standardisés comme NarrativeText
, Title
, Table
, etc
Toutes les méthodes de chunking de documents disponibles dans Langchain et LlaMa Index.
Les plus intéressants sont ceux qui se basent sur la structure du document comme le markdown ou le HTML.
Cela n'est néanmoins pas suffisant car on peut perdre le contexte d'un chunk à l'autre. Par exemple, si le deuxième chunk fait référence au sujet du premier mais sans le reformuler.
Dans les techniques plus avancées, on peut noter le Semantic Splitting qui tente de découper les chunk entre les phrases en fonction du moment ou on change de sujet.
Une introduction à l'utilisation d'un graphe en addition à la recherche sémantique classique pour améliorer la récupération d'informations d'un RAG.
Ce genre de technique est de plus en plus populaire pour palier à la limite de la perte de contexte en plusieurs chunks.
Le plus difficile reste bien sûr de créer le graphe et de le faire évoluer. (Je pense qu'il y a moyen d'utiliser un LLM pour ça)
Les LogProbs sont des métadonnées retournées avec la génération et elles indiquent la confiance du modèle dans le texte généré.
Dans le cas d'un RAG cela est extrêmement utile car ces informations peuvent nous aider à renvoyer un score de pertinence de la réponse généré.
Par exemple, si le prompt ne contient pas suffisamment d'informations pour répondre à la question, au mieux la réponse sera incomplète, au pire elle sera pleine d'hallucination.
Avec les LogProbs, il est possible de savoir quel degré de confiance accorder à cette réponse et de transmettre cette information à l'utilisateur ou de basculer sur un autre processus (nouvelle requête, prompt différent, etc)
Cet article utilise l'API d'OpenAI mais techniquement c'est possible de le faire avec n'importe quel modèle (pour peu que l'API retournent ces métadonnées)
2 modèles de re-ranking open source ont été release par Jina.
Pour rappel, le re-ranking est une méthode supplémentaire utilisée pour noter la pertinence de documents retrouvés dans la partie retrieval d'un RAG.
Ce sont de plus petits modèles de langue qui coûtent beaucoup moins cher à faire fonctionner et qui donne une note de similarité supplémentaire en plus de la simple recherche vectorielle.
Ça me rappelle le temps des modèles comme BERT par exemple.
Une collection de datasets pour évaluer un RAG est disponible chez LlaMa Hub.
Par exemple, ce dataset contient 44 questions et réponses basées sur les articles de Paul Graham. (Pas forcément le meilleur car il y a de fortes chances que ces articles soient dans les données d'entraînement de votre LLM)
Les évaluations se font entre autre avec le module LabelledRagDataset de LlaMaIndex.
On peut aussi créer ses propres datasets bien sûr.
Une méta-étude sur les RAG.
Au programme les techniques pour chaque étape:
- pre-retrieval: query extension, data modification
- retrieval
- post-retrieval: re-ranking, filtering
- generation
- evaluation
RAGAS est un framework pour évaluer les RAG.
Il propose d'évaluer les deux aspects importants du RAG, à savoir:
- le retrieval: le RAG est-il capable de retrouver les documents pertinents?
- la génération: le RAG est-il capable de générer une réponse à la question?
Il y a plusieurs évaluateurs de disponible pour évaluer ces deux critères.
Pour tout ce qui est évaluation de la réponse à la question, RAGAS propose d'utiliser GPT4.
A noter aussi, le framework ARES
Une compétition de RAG. Je trouve ça intéressant de garder sous la main les 8 types de questions:
-
Question simple : questions demandant des faits simples, comme la date de naissance d'une personne et les auteurs d'un livre.
-
Question simple avec certaines conditions : questions demandant des faits simples avec certaines conditions données, telles que le cours de l'action à une certaine date et les films récents d'un réalisateur dans un certain genre.
-
Set Question: Questions qui attendent un ensemble d'entités ou d'objets comme réponse. Un exemple : quels sont les continents de l’hémisphère sud ?
-
Question de comparaison : des questions qui peuvent comparer deux entités, comme par exemple qui a commencé à se produire plus tôt, Adele ou Ed Sheeran ?
-
Question d'agrégation : questions qui peuvent nécessiter une agrégation des résultats de récupération pour répondre, par exemple, combien d'Oscars Meryl Streep a-t-elle remportés ?
-
Questions multi-sauts : questions qui peuvent nécessiter d'enchaîner plusieurs éléments d'information pour composer la réponse, comme par exemple qui a joué dans le dernier film d'Ang Lee ?
-
Question de post-traitement : questions qui nécessitent un raisonnement ou un traitement des informations récupérées pour obtenir la réponse, par exemple : combien de jours Thurgood Marshall a-t-il été juge à la Cour suprême ?
-
Question à faux prémisse : questions comportant une fausse préposition ou hypothèse ; par exemple, quel est le nom de l'album rap de Taylor Swift avant sa transition vers la pop ? (Taylor Swift n'a sorti aucun album de rap.)
Une méta étude sur les RAG avec notamment:
- Sentence-window retrieval
- Document summary index
- HyDE
- Multi-query
- Maximal Marginal Relevance
- Cohere Re-ranker
- LLM-based Re-ranker
L'étude montre que la combinaisons des méthodes Sentence Window Retrieval, LLM Rerank, Cohere Rerank et HyDE donnent les meilleurs résultats.
Dommage que l'étude ne parle pas des techniques qui limitent le chunking et d'autre chose méthode que les seules Vector Database pour récupérer les documents comme Elasticsearch par exemple.
Une méthode très intéressante pour améliorer les performances d'un RAG avec du fine tuning de modèle.
En gros on va créer un dataset contenant:
- une question
- un document pertinent pour y répondre
- un document non pertinent ("distractor")
- la réponse générée depuis le document pertinent
- une chaine de pensée (Chain of Thought) expliquant le raisonnement (généré par GPT4 par exemple)
Ensuite il faut fine tuner un modèle avec ce dataset (Voir ce LlamaPack ou un exemple sur Azure AI)
Ils ont des résultats avec Llama2 7B qui sont meilleurs que GPT3.5 + RAG.
Dommage qu'ils n'aient pas comparés avec GPT4 + RAG mais c'est surement parce que GPT4 est meilleur. Il faudrait fine tuner un modèle de 4è génération Open Source comme Mistral ou GPT4 via l'API de fine tuning pour arriver à des résultats vraiment bons.
Un article que j'ai écrit pour parler de la hype autour des bases de données vectorielles et de pourquoi il vaut mieux utiliser une base de données classique avec fonctionnalité de recherche vectorielle comme Elasticsearch ou Postgres.