Stratégies de Recherche Hybride pour les Applications LLM
La recherche hybride combine les méthodes traditionnelles par mots-clés et les techniques vectorielles modernes pour améliorer la récupération d'information dans les systèmes basés sur les grands modèles de langage (LLM). Cette approche vise à exploiter les avantages des deux méthodes pour une précision accrue et une meilleure robustesse.
Définition de la Recherche Hybride
La recherche hybride est une stratégie qui fusionne la recherche par correspondance exacte des termes avec la recherche basée sur la similarité sémantique. La recherche par mots-clés, telle qu'utilisée dans les bases de données SQL ou les moteurs de recherche plein texte, offre une correspondance rapide mais manque de compréhension contextuelle. En revanche, la recherche vectorielle convertit le texte en représentations de haute dimension pour capturer les nuances sémantiques, mais peut négliger des correspondances spécifiques. L'intégration de ces deux approches permet de couvrir un éventail plus large de résultats pertinents.
Avantages de la Recherche Hybride
Les méthodes de recherche uniques présentent des limites : la recherche par mots-clés échoue face aux synonymes ou aux expressions variées, tandis que la recherche vectorielle peut retourner des résultats approximatifs. La recherche hybride améliore la précision, réduit les erreurs de récupération et s'adapet à divers types de données, offrant ainsi une expérience utilisateur optimisée.
Comparaison des Approches de Recherche
Recherche par Mots-clés : Avantages : simplicité, rapidité, résultats explicites, efficace pour les correspondances exactes. Inconvénients : incapacité à interpréter la sémantique, sensibilité aux fautes d'orthographe, dépendance au vocabulaire.
Recherche Vectorielle : Avantages : compréhension des similarités sémantiques, tolérance aux variations, adaptée aux requêtes complexes. Inconvénients : coût de calcul élevé, opacité des résultats, nécessité de modèles d'embedding de qualité.
Implémentation Pratique avec LangChain et Chroma
L'implémentation repose sur le framework LangChain, en utilisant Chroma comme base de données vectorielle pour une intégration efficace.
Création de la Base de Données Vectorielle
from langchain_community.vectorstores import Chroma
from mon_module_embedding import ModeleRepresentation
# Initialisation du modèle d'embedding
modele_rep = ModeleRepresentation()
# Emplacement pour la persistance des vecteurs
chemin_stockage = '../donnees/base_vecteurs'
# Initialisation de la base vectorielle
base_vectors = Chroma(
persist_directory=chemin_stockage,
embedding_function=modele_rep
)
Développement du Rechercheur Hybride
from langchain.retrievers import BaseRetriever
from typing import List
from langchain_core.documents import Document
class RechercheurMixte(BaseRetriever):
def __init__(self, stockage_vectors, moteur_mots_cles):
self.stockage_vectors = stockage_vectors
self.moteur_mots_cles = moteur_mots_cles
def get_relevant_documents(self, requete: str) -> List[Document]:
# Exécution de la recherche vectorielle
resultats_vectors = self.stockage_vectors.similarity_search(requete, k=3)
# Exécution de la recherche par mots-clés
resultats_mots_cles = self.moteur_mots_cles.get_relevant_documents(requete)
# Fusion des résultats et suppression des doublons
tous_resultats = resultats_vectors + resultats_mots_cles
ids_uniques = set()
documents_finaux = []
for doc in tous_resultats:
identifiant = doc.metadata.get('identifiant', hash(doc.page_content))
if identifiant not in ids_uniques:
ids_uniques.add(identifiant)
documents_finaux.append(doc)
return documents_finaux
Intégration dans une Chaîne RAG
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
template = """Répondez à la question en utilisant le contexte fourni. Si l'information manque, indiquez-le sans inventer.
Soyez concis, maximum trois phrases.
{contexte}
Question: {input}
"""
prompt_template = ChatPromptTemplate.from_template(template)
rechercheur = RechercheurMixte(stockage_vectors=base_vectors, moteur_mots_cles=rechercheur_mots_cles)
chaine_rag = (
{"contexte": rechercheur | assembler_documents, "input": RunnablePassthrough()}
| prompt_template
| llm
| StrOutputParser()
)
Optimisations Avancées
Pour améliorer les performances, il est conseillé d'ajuster les poids entre les deux méthodes de recherche selon le cas d'utilisation. Des tehcniques telles que la fusion par scores de similarité, l'expansion de requêtes avec des synonymes ou la correction orthographique peuvent être intégrées. De plus, l'utilisation de stratégies de découpage intelligentes des documents, comme le découpage sémantique, améliore l'efficacité de la recherche vectorielle.
Exemple de Découpage de Documents
from langchain_text_splitters import RecursiveCharacterTextSplitter
decoupeur = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", " ", ""]
)
Application Concrète
Dans un assistant de base de connaissances, la recherche hybride permet de traiter des requêtes variées. Par exemple, pour une question sur un sujet spécifique, la recherche par mots-clés identifie les mentions exactes, tandis que la recherche vectorielle détecte des contenus thématiquement liés. La combinaison de ces résultats fournit une réponse plus complète et contextuelle.