Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Ce guide fournit une approche systématique de l'amélioration de la qualité de l'extraction pour les applications de RAG, de recherche et de correspondance en temps réel à l’aide de la recherche vectorielle de Mosaic AI. Les recommandations sont classées de l’impact le plus élevé/le plus faible effort à l’impact le plus faible/le plus élevé.
Prérequis : Établir un framework d’évaluation
Avant d’optimiser la qualité de récupération, vous devez disposer d’un système d’évaluation reproductible.
Important
Si vous n’avez pas d’évaluation en place, arrêtez ici et configurez-le en premier. L’optimisation sans mesure est devinage.
Définir les exigences de latence
Établissez des cibles de latence claires en fonction de votre cas d’usage :
- Agents RAG : Cible TTFT (Time to First Token) (par exemple, <2 secondes)
- Barres de recherche : latence de bout en bout pour afficher les résultats (par exemple, <100 msec)
Toute optimisation que vous essayez doit répondre à ces exigences.
Configurer l’évaluation automatisée
Utilisez une ou plusieurs des approches suivantes :
- Jeu de données golden existant : utilisez vos paires de requêtes-réponses étiquetées.
- Jeu d’évaluation synthétique : utilisez la génération de données synthétiques Databricks pour générer automatiquement des cas de test à partir de vos documents.
- Évaluation sans vérité de terrain : Utilisez les juges d’évaluation de l’agent Databricks pour juger la qualité sans annotations.
La clé consiste à avoir un moyen automatisé de mesurer les modifications : les données parfaites ne sont pas requises. Concentrez-vous sur les améliorations relatives lorsque vous testez des stratégies différentes, et non des scores absolus. Même un petit jeu de données synthétique peut vous indiquer si la reclassement améliore la qualité de 15% ou si la recherche hybride aide votre cas d’usage spécifique.
Choisir des métriques de qualité
Choisissez vos métriques de qualité en fonction de votre cas d’usage :
Si le rappel importe le plus (besoin de toutes les informations pertinentes) :
- Agents RAG : le contexte clé manquant entraîne des réponses ou des hallucinations incorrectes.
- Correspondance des essais cliniques pharmaceutiques : Ne pas manquer de patients éligibles ou d'études pertinentes.
- Recherche de conformité financière : besoin de toutes les réglementations, facteurs de risque ou précédents pertinents.
- Analyse de la cause racine de fabrication : doit exposer tous les incidents et modèles d’échec associés.
- Métrique à suivre : Recall@k (par exemple, recall@10, recall@50).
Si la précision importe le plus (n’avez besoin que des résultats les plus pertinents) :
- Résolution d’entité/correspondance approximative : correspondance entre les enregistrements clients, les noms de fournisseurs ou les références SKU de produit entre les systèmes.
- Déduplication des services financiers : identification des transactions ou des comptes en double avec une forte probabilité.
- Correspondance des composants de la chaîne d’approvisionnement : recherche de composants exacts ou compatibles entre les catalogues.
- Base de connaissances du support technique : les ingénieurs ont besoin de la solution exacte dans les meilleurs résultats.
- Métrique à suivre : Precision@k (par exemple, precision@3, precision@10).
Cas d’usage équilibrés (besoin à la fois d’un bon rappel et d’une bonne précision) :
- M&A due diligence : Vous ne pouvez pas manquer les risques (rappel), mais vous devez d’abord disposer de documents pertinents (précision).
- Recherche en matière de brevets : couverture complète avec les brevets les plus pertinents classés par ordre de priorité.
- Correspondance 360 des clients : unifier les données des clients sur plusieurs systèmes.
Étape 1 : Activer la recherche hybride
Combinez la précision des mots clés avec la compréhension sémantique.
Quand utiliser :
- Les utilisateurs effectuent une recherche avec des termes spécifiques (codes de produit, termes techniques).
- Besoin d’une correspondance exacte pour certaines requêtes.
- Vous souhaitez un recours lorsque la recherche sémantique omet des correspondances de mots-clés évidentes.
Impact sur les métriques :
- Améliore le rappel en capturant les correspondances sémantiques et de mots clés.
- Améliore la précision des requêtes avec des termes spécifiques.
Implémentation : changement d’une ligne dans la recherche vectorielle d’IA De mosaïque.
# Enable hybrid search
results = index.similarity_search(
query_text="error code E404",
query_type="HYBRID" # Combines vector and keyword search
)
Pour plus d’informations, consultez Interroger un index de recherche vectorielle.
Étape 2 : Implémenter le filtrage des métadonnées
C’est votre plus grand levier pour la qualité de récupération.
Le filtrage réduit considérablement l’espace de recherche et améliore à la fois la précision et le rappel.
Impact sur les métriques :
- Améliore considérablement la précision en éliminant les résultats non pertinents.
- Améliore le rappel dans le sous-ensemble filtré.
- Peut réduire l’espace de recherche de 90%+.
Examples
- Documentation technique : Filtrer par version, composant ou module du produit.
- Manuels de voiture : Filtrer par marque, modèle, année.
- Support client : Filtrer par ligne de produit, région, catégorie de problème.
Implementation
# Vector Search with metadata filtering
results = index.similarity_search(
query_text="brake system maintenance",
filters='make = "Toyota" AND model = "Camry" AND year = 2023',
num_results=10
)
Sélection de filtre dynamique
Approche programmatique :
# Parse query for filter criteria
def extract_filters(user_query):
filter_parts = []
if "Toyota" in user_query:
filter_parts.append('make = "Toyota"')
if "2023" in user_query:
filter_parts.append('year = 2023')
return " AND ".join(filter_parts) if filter_parts else None
Filtrage basé sur l’agent avec Databricks :
from databricks_ai_bridge.agents.tools.vector_search import VectorSearchTool
# Create the vector search tool
vector_search_tool = VectorSearchTool(
index_name="catalog.schema.car_manuals_index",
# Optional: specify columns to return
columns=["content", "make", "model", "year", "chunk_id"],
# Optional: set number of results
num_results=10,
# Optional: add additional parameters as needed
additional_parameters={
"query_type": "HYBRID" # Enable hybrid search
}
)
# The tool automatically handles filter generation based on the agent's understanding
# Agent analyzes "brake issues in my 2023 Toyota Camry" and generates appropriate filters
# For LangChain agents:
from langchain.agents import create_react_agent
agent = create_react_agent(
tools=[vector_search_tool],
llm=your_llm,
prompt=your_prompt
)
L'agent fonctionne automatiquement :
- Extrait les entités pertinentes de la requête.
- Génère des chaînes de filtre de type SQL appropriées.
- Exécute la recherche avec compréhension sémantique et filtrage précis.
Impact : peut réduire l’espace de recherche de 90%+ tout en améliorant la pertinence.
Étape 3 : Ajouter un réordonnancement
Changement d’une ligne pour une amélioration de la qualité d'environ 15%.
Databricks fournit un reranker intégré qui est parfait pour les agents RAG.
Impact sur les métriques :
- Améliore la précision en obtenant un rappel élevé avec moins de candidats.
- Fonctionne mieux lorsqu’il est combiné à des techniques telles que la recherche hybride et le filtrage.
Implementation
# Python SDK
results = index.similarity_search(
query_text="How to create a Vector Search index",
num_results=10,
columns=["id", "text", "parent_doc_summary"],
reranker={
"model": "databricks_reranker",
"parameters": {
"columns_to_rerank": ["text", "parent_doc_summary"]
}
}
)
Pour plus d’informations, consultez Les résultats de la requête Rerank.
Quand utiliser
Parfait pour :
- Agents RAG (la latence est principalement influencée par la génération LLM).
- Applications de qualité d’abord.
- QPS faible à modéré (environ 5 QPS par défaut).
Le reranker intégré ne convient pas pour :
- Applications QPS élevées (>5 QPS sans mise à l’échelle supplémentaire).
- Barres de recherche en temps réel nécessitant <une latence de 100 msec.
- Les applications où un temps de reclassement de 1,5 seconde est inacceptable.
Performance : réorganise 50 résultats en ~1,5 secondes dans les charges de travail classiques. Aussi vite que ~250 msec pour les segments plus courts.
Pour les cas d’utilisation à faible latence/non-RAG
Le reclassement peut toujours offrir des améliorations significatives de qualité pour les barres de recherche et les applications à haute QPS. Il vous suffit d'un reréordonnateur plus rapide. Envisagez de déployer un modèle de reclassement léger (par exemple, cross-encoder/ms-marco-TinyBERT-L-2-v2) en tant que modèle personnalisé sur Databricks Model Serving pour un reranking en moins de 100 ms.
Étape 4 : Améliorer la préparation des données
Cette section décrit certaines techniques que vous pouvez utiliser pour améliorer la préparation des données : segmentation, analyse, ajout de contexte sémantique et nettoyage des données.
Stratégie de segmentation
L’optimisation de la taille de segment reste un domaine actif de recherche. Le travail récent de DeepMind (LIMIT) montre que les embeddings peuvent ne pas capturer les informations de base dans de longs contextes, ce qui rend cette décision délicate.
Points de départ pour l’expérimentation :
# Common configurations to test
small_chunks = 256 # Better for precise fact retrieval
medium_chunks = 512 # Balanced approach
large_chunks = 1024 # More context per chunk
Compromis clés à prendre en compte :
- Segments plus petits : meilleure localisation d’informations spécifiques, mais peut perdre le contexte.
- Segments plus volumineux : plus de contexte conservé, mais plus difficile à identifier les informations pertinentes.
- Limites de contexte : doit s’adapter à la fenêtre de contexte LLM lors de la récupération de plusieurs blocs.
Optimisations plus impactantes : au lieu de sur-optimiser la taille de bloc, concentrez-vous sur :
- Extraction d’informations pour les métadonnées : extraire des entités, des rubriques et des catégories pour activer le filtrage précis.
- Analyse de haute qualité : utilisez ai_parse_document pour le texte propre et structuré.
- Métadonnées sémantiques : ajoutez des résumés de document et des en-têtes de section aux blocs.
Considérez également les approches avancées suivantes. Ces techniques nécessitent plus d’efforts, mais peuvent avoir un impact plus important :
Segmentation sémantique : regrouper les phrases par similarité plutôt que par taille fixe.
- Utilisez des incorporations pour rechercher des limites sémantiques naturelles.
- Maintient les idées connexes unies.
- Meilleure préservation du contexte.
- Consultez le guide ultime des stratégies de segmentation pour les applications RAG.
Découpage parent-enfant (récupération du plus petit au plus grand) :
# Record child and parent chunks in your source table
for parent_chunk in create_chunks(doc, size=2048): # Large for context
for child_chunk in create_chunks(parent_chunk, size=512): # Small for precision
source_table.append({"text": child_chunk, "parent_text": parent_chunk})
# Search children, return parents
results = index.similarity_search(
query_text="Is attention all you need?",
num_results=10,
columns=["text", "parent_text"]
)
Consultez les documents du récupérateur de documents principal LangChain.
Analyse de document
Pour les fichiers PDF et les documents complexes, Databricks recommande d’utiliser ai_parse_document pour l’analyse de haute qualité. L’analyse médiocre (tables manquantes, mise en forme rompue) a un impact direct sur la qualité de récupération.
Enrichir avec des métadonnées sémantiques
Ajoutez un contexte sémantique pour améliorer la récupération.
Pourquoi cela fonctionne :
- Fournit un signal sémantique supplémentaire pour les modèles d’incorporation.
- Donne aux systèmes de rerangement davantage de contexte pour l'évaluation.
- Aide avec les requêtes qui référencent les concepts au niveau du document.
Option 1 : Inclure des métadonnées dans des blocs
# Prepend document summary to each chunk
chunk_with_context = f"""
Document: {doc_title}
Summary: {doc_summary}
Section: {section_name}
{chunk_content}
"""
Option 2 : Stocker en tant que colonnes de métadonnées distinctes
# Store semantic metadata for reranker to use
metadata = {
"doc_summary": "Technical manual for brake system maintenance",
"section": "Emergency brake adjustment procedures",
"keywords": ["brake", "safety", "adjustment"]
}
Important
Cette approche nécessite un traitement en aval pour tirer parti des métadonnées :
- Pour les métadonnées sémantiques : utilisez le paramètre
columns_to_rerankavec le reclassement pour prendre en compte ces colonnes. - Pour les métadonnées par mot clé uniquement : utilisez la recherche hybride (mode texte intégral) pour correspondre à ces champs.
Nettoyage des données
- Supprimez les éléments récurrents (en-têtes, pieds de page, numéros de page).
- Conservez la structure du document (titres, listes, tables).
- Conservez des limites sémantiques lors de la segmentation.
Étape 5 : Optimisation des requêtes
Extension de requête
Générez plusieurs variantes de requête pour améliorer le rappel. Consultez le guide LangChain.
Impact : améliore le rappel en recherchant des documents avec une terminologie différente.
# Use LLM to expand query with synonyms and related terms
def expand_query(user_query):
prompt = f"""Generate 3 variations of this search query including synonyms:
Query: {user_query}
Return only the variations, one per line."""
variations = llm.generate(prompt).split('\n')
# Search with original + variations
all_results = []
for query in [user_query] + variations:
results = index.similarity_search(query_text=query, num_results=10)
all_results.extend(results)
# Deduplicate and return
return deduplicate_results(all_results)
Exemple : « entretien de voiture » recherche également « réparation automobile », « entretien des véhicules », « entretien automobile »
Pour plus de techniques, consultez :
Reformulation des requêtes
Pour les requêtes complexes, décomposez ou récapitulez-les. Consultez OpenAI stratégies RAG.
- Questions à plusieurs étapes → recherches séquentielles
- Requêtes ambiguës → plusieurs recherches spécifiques
- Voir les techniques de décomposition
Étape 6 : Techniques de sollicitation avancées
Optimisation des requêtes
Utilisez des techniques d’optimisation automatique des invites telles que MIPROv2 ou GEPA (disponibles dans DSPy) pour améliorer vos invites utilisées pour la préparation des données, la réécriture des requêtes ou n’importe où dans votre système de récupération. L’Assistant connaissances et l’agent de superviseur intègrent GEPA pour améliorer les performances à faible coût. Consultez Construire des agents d'entreprise à la pointe de la technologie, 90 fois moins coûteux grâce à l'optimisation automatisée des instructions.
Pour plus d’informations, consultez l’évolution de l’invite réflexive avec GEPA.
Étape 7 : Stratégies de récupération adaptative
Modèle d’agent React
Créez des agents capables d’orchestrer intelligemment la récupération :
- L’agent réfléchit à la nécessité d’un accès aux données.
- Peut reformuler des requêtes en fonction des résultats initiaux.
- Combine la récupération avec d’autres outils (calculatrices, API, etc.).
- Réessayez les récupérations échouées avec des requêtes modifiées.
- Mettez en œuvre Databricks Mosaic AI Agent Framework.
Exemples de récupération agentique
# Agent decides when to search and what filters to apply
# Based on conversation context and user intent
agent = create_agent(
tools=[vector_search_tool, calculator, web_search],
instructions="Retrieve relevant docs only when needed, apply appropriate filters"
)
Étape 8 : Ajuster les modèles d’incorporation
Tout d’abord : Diagnostiquer si vous rencontrez un problème d’incorporation
Test rapide : Comparez GTE et OpenAI incorporations sur Databricks.
# Test with both embedding models
# Databricks native: gte-large-en-v1.5
gte_results = gte_index.similarity_search(query)
# OpenAI: text-embedding-3-large (3072 dims)
openai_results = openai_index.similarity_search(query)
# If OpenAI text-embedding-3-large significantly outperforms GTE:
# - Fine-tuning a smaller model could match or exceed OpenAI quality
# - You have an embedding model problem, not a data problem
Interprétation :
- Si
text-embedding-3-largefonctionne beaucoup mieux quegte-large-en, considérez l'optimisation. Vous pouvez obtenir une qualité similaire avec un modèle plus petit. - Si
text-embedding-3-largefonctionne à peu près de la même manière quegte-large-en, votre problème n’est pas le modèle d’incorporation. Concentrez-vous sur d’autres optimisations.
Quand peaufiner
Important
Le réglage précis doit être considéré comme un dernier recours et ne doit être pris en compte que lorsque les critères suivants sont remplis :
- Vous avez essayé les étapes 1 à 7.
- OpenAI dépasse considérablement GTE dans vos tests.
- Vous disposez d’un vocabulaire ou d’un cas d’usage spécifique au domaine.
Note
Vous n’avez pas besoin de données d’apprentissage étiquetées : vous pouvez utiliser la génération de données synthétiques comme indiqué dans le blog d’incorporation de Databricks.