Production de RAG sur Azure : segmentation en blocs, recherche hybride, filtres et citations
La récupération d’informations à grande échelle nécessite des blocs conscients de la structure, une recherche hybride, des filtres ACL, un réclassement, des prompts fondés sur des données concrètes, ainsi qu’une évaluation — et non une démonstration en PDF.
Les démos de RAG semblent simples : PDF → fragments → embeddings → base de données vectorielle → question au modèle. Puis cinq mille documents arrivent et quelqu’un demande la règle de remboursement des voyages internationaux. La partie difficile, c’est de faire entrer de manière fiable les preuves appropriées dans le modèle.
1. Commencez par les données, pas par le LLM
Évaluez les sources, le contrôle d’accès, la fraîcheur et les formats avant de choisir un modèle de chat. Des corpus de mauvaise qualité génèrent des réponses erronées et fluides.
2. Fragmentation : ne divisez pas aveuglément tous les N caractères
Préférez des divisions tenant compte de la structure (titres, pages, tableaux) avec chevauchement. Les tables de tarifs et les clauses des politiques détestent les fenêtres de caractères naïves.
3. Génération d’embeddings
Fixez une méthode de déploiement des embeddings ; enregistrez la dimension et l’ID du modèle avec chaque index. Mélanger des modèles endommage silencieusement la capacité de rappel.
document = {
"document_id": "HR-2026-001",
"title": "Employee Benefits Policy",
"department": "HR",
"country": "India",
"version": "2026.1",
"effective_date": "2026-01-01",
"source": "HR Portal"
}
def chunk_text(text, size=1000):
return [
text[i:i + size]
for i in range(0, len(text), size)
]
def chunk_by_sections(document):
chunks = []
for section in document.sections:
chunks.append({
"title": section.title,
"content": section.text,
"document_id": document.id
})
return chunks
pip install openai azure-identity
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(),
"https://ai.azure.com/.default"
)
client = OpenAI(
base_url="https://YOUR-RESOURCE.openai.azure.com/openai/v1/",
api_key=token_provider
)
response = client.embeddings.create(
model="text-embedding-3-small",
input="Employees are eligible after completing 12 months of service."
)
vector = response.data[0].embedding
{
"id": "HR-2026-001-004",
"document_id": "HR-2026-001",
"title": "Employee Benefits Policy",
"content": "...",
"country": "India",
"version": "2026.1",
"content_vector": embedding
}
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizedQuery
query = "Can I work remotely from another country?"
query_vector = client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
vector_query = VectorizedQuery(
vector=query_vector,
k_nearest_neighbors=10,
fields="content_vector"
)
results = search_client.search(
search_text=query,
vector_queries=[vector_query],
top=5,
select=["title", "content", "document_id", "country"]
)
results = search_client.search(
search_text=query,
vector_queries=[vector_query],
filter="country eq 'India'",
top=5
)
context = "\n\n".join(
f"Source: {r['title']}\n{r['content']}"
for r in results
)
prompt = f"""
You are an enterprise policy assistant.
Answer the user's question using only the provided evidence.
If the evidence does not contain the answer, say that you don't have enough information.
Do not invent policies.
Evidence: {context}
Question: {query}
"""
{
"document_id": "HR-2026-001",
"page": 14,
"section": "Eligibility",
"content": "..."
}
def answer_question(question):
# 1. Embed the question
vector = embed(question)
# 2. Hybrid retrieval
candidates = search(
query=question,
vector=vector,
top=20
)
# 3. Apply metadata/business filters
candidates = apply_filters(candidates)
# 4. Rerank
ranked = rerank(question, candidates)
# 5. Keep only useful evidence
evidence = ranked[:5]
# 6. Build grounded prompt
prompt = build_prompt(
question,
evidence
)
# 7. Generate answer
response = generate(prompt)
# 8. Return answer + citations
return {
"answer": response,
"sources": extract_sources(evidence)
}
test_cases = [
{
"question": "What is the India travel allowance?",
"expected_source": "travel-policy-india.pdf"
},
{
"question": "How long is parental leave?",
"expected_source": "leave-policy-2026.pdf"
}
]
4. Stocker les embeddings dans Azure AI Search
Conserver le texte, les vecteurs ainsi que les métadonnées filtrables (id du document, produit, région linguistique, groupe ACL, updated_at).
5. La recherche hybride est supérieure à la recherche vectorielle pour la plupart des entreprises
Combiner la similarité dense avec BM25/mots-clés pour les IDs, codes et noms propres rares.
6. Filtrer avant de gaspiller du contexte
Appliquer des filtres de sécurité et de location dans la requête, et non après que le modèle ait déjà pris en compte des fragments interdits.
7>La récupération n’est pas le contexte final
Réclasser, éliminer les doublons et limiter le nombre de tokens. Plus de fragments ne signifie pas des réponses meilleures.
8. Construire l’instruction à partir des éléments concrets
Les instructions doivent exiger des réponses uniquement à partir des passages fournis et indiquer clairement lorsque des preuves manquent.
9. Fonder les arguments sur des citations
Fournir les identifiants des passages ou des pages afin que les utilisateurs puissent vérifier. Une fluidité sans citations constitue un risque.
10. Un processus prêt à être déployé
Ingestion → segmentation en blocs → intégration → indexation → récupération hybride → filtrage → réclassement → génération de prompt → création du contenu → citation des sources → évaluation.
11. Ce qui se dégrade généralement
Une segmentation incorrecte ; des métadonnées insuffisantes ; une récupération basée uniquement sur des vecteurs ; un contexte trop volumineux ; l’absence d’ensemble d’évaluation ; l’absence de citations ; l’absence d’accès contrôlé ; des changements silencieux de modèles d’intégration ; l’absence d’information sur la fraîcheur des données.
Conclusion
RAG en environnement de production correspond à une recherche d’informations associée à un point d’accès LLM — et non l’inverse. Investissez dans la segmentation, la recherche hybride, les filtres, les citations et l’évaluation ; le modèle de chat constitue simplement la dernière étape.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
Gardez un ensemble de questions idéales par domaine : recherches par identifiant exact, questions de paraphrase et cas négatifs ACL. Automatisez-les dans l’environnement CI chaque fois que les paramètres de segmentation ou d’incorporation changent.
L’évaluation doit se trouver dans le même répertoire que la configuration de segmentation : lorsque quelqu’un « ajuste légèrement » les zones d’overlap, le paquet de référence doit échouer avant que les utilisateurs ne s’en aperçoivent.
La recherche hybride nécessite encore de bons analyseurs et des listes de synonymes pour le jargon sectoriel ; les embeddings seuls ne suffiront pas à corriger un code de politique mal orthographié.
Dokumentez le contrat du champ ACL sur une seule page afin que chaque nouvelle tâche d’ingestion écrive les mêmes informations attendues par le filtre de récupération.
L’évaluation doit se trouver dans le même répertoire que la configuration de segmentation : lorsque quelqu’un « ajuste légèrement » les zones d’overlap, le paquet de référence doit échouer avant que les utilisateurs ne s’en aperçoivent.