Stratégies de Recherche Hybride pour les Applications LLM : Intégration des Recherches par Mots-clés et Vectoriels

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.

Étiquettes: LLM-Universe langchain Chroma Recherche-Hybride rag

Publié le 22 juillet à 11h31