AI

AgentOps : valider une mise à jour d'index de retrieval avant qu'elle change les réponses de production

Un runbook de production pour qualifier une mise à jour d'index de retrieval avec diff de sources, métadonnées, chunking, évaluations, traces, validation humaine et rollback avant de changer les réponses d'un agent IA.

01 juil. 2026 aiagentopsretrievalragazure-ai-searchmicrosoft-foundryevaluationguardrailsobservabilityrunbookrollbackproduction

Un agent IA interne peut devenir instable sans changement de prompt, de modèle ou d’outil. Il suffit parfois de modifier l’index de retrieval : nouveaux runbooks, documents obsolètes non retirés, chunking différent, métadonnées absentes ou scores de recherche qui favorisent la mauvaise source. Le symptôme visible est une réponse moins fiable. La cause réelle est souvent une dérive de corpus.

Le cas d’usage est un agent d’exploitation qui répond depuis des procédures internes et prépare des actions bornées via des outils approuvés. L’équipe met à jour l’index Azure AI Search ou le corpus connecté à Microsoft Foundry après une livraison applicative. Avant de laisser l’agent utiliser ce nouvel index en production, le runbook doit décider si la mise à jour est sûre, si elle doit rester en canary, ou si elle doit être rollbackée.

Figer le périmètre de l’index

Commence par décrire ce qui change réellement. Une mise à jour d’index n’est pas seulement un import de fichiers. Elle touche les sources, les filtres, les métadonnées, le découpage, l’embedding, les règles de fraîcheur et parfois le tri des résultats.

text retrieval-index-change-scope.txt
Index change
Agent: ops-assistant-prod
Index: runbooks-prod-v3
Previous index: runbooks-prod-v2
Changed sources: incident runbooks, handover notes, service catalog
Changed pipeline: chunk size, metadata mapping, freshness filter
First production use: incident triage and draft action preparation

Questions before rollout
Which documents were added, removed or replaced?
Which sources are approved for production answers?
Are document owner, service, environment and validity dates preserved?
Which evaluation cases depend on this corpus?
What is the rollback index or alias?

Cette fiche évite de traiter le retrieval comme un détail d’ingestion. Si l’équipe ne peut pas expliquer les sources et le rollback, l’index ne doit pas devenir la source par défaut de l’agent.

Comparer les sources, pas seulement le nombre de documents

Un compteur de documents ne suffit pas. Le contrôle utile est un diff éditorial et opérationnel : quels runbooks ont changé, quels services sont couverts, quelles procédures sont devenues anciennes, et quels documents ont perdu leurs métadonnées critiques.

json retrieval-source-diff.json
{
"previous_index": "runbooks-prod-v2",
"candidate_index": "runbooks-prod-v3",
"added": [
  {"source_id": "aks-ingress-502-runbook", "owner": "platform", "valid_for": ["prod", "preprod"]}
],
"updated": [
  {"source_id": "firewall-egress-runbook", "change": "dns_proxy_checks_added"}
],
"removed": [
  {"source_id": "legacy-vpn-restart-note", "reason": "obsolete"}
],
"metadata_regressions": [
  {"source_id": "appservice-private-access", "missing": ["service_owner", "review_date"]}
]
}

Les régressions de métadonnées doivent bloquer les réponses de production lorsqu’elles empêchent l’agent de filtrer par environnement, criticité ou source approuvée. Une bonne réponse fondée sur une mauvaise source reste difficile à défendre après incident.

Vérifier le chunking et la récupérabilité

Le corpus peut être correct et pourtant mal récupéré. Un chunk trop large mélange diagnostic, correction et rollback. Un chunk trop petit sépare la condition de sécurité de l’action proposée. Le test doit partir de questions réelles, pas seulement d’une inspection technique de l’index.

yaml retrieval-smoke-tests.yml
retrieval_smoke_tests:
- id: firewall_dns_proxy_egress
  query: "The workload cannot reach api.partner.example through Azure Firewall. What should I check first?"
  expected_sources:
    - firewall-egress-runbook
  forbidden_sources:
    - legacy-firewall-exception-note
  required_context:
    - runtime_resolver
    - udr_to_firewall
    - firewall_application_logs
    - rollback_state

- id: agent_action_requires_approval
  query: "Prepare a production restart for billing-worker."
  expected_sources:
    - agent-action-approval-policy
    - service-restart-draft-runbook
  required_context:
    - approval_required
    - dry_run_first
    - execution_identity
    - rollback

Si le bon document arrive seulement en troisième page de résultats, l’agent risque de produire une réponse plausible mais incomplète. Le critère n’est pas “un résultat existe”. Le critère est “les bons éléments apparaissent assez tôt pour guider la réponse et les garde-fous”.

Relire les traces de retrieval

La validation doit laisser une trace. Pour chaque scénario critique, il faut voir la requête, les filtres, les sources retournées, les scores, la version d’index et la réponse finale. Sans ces champs, il sera impossible de prouver après coup qu’une réponse de production venait du corpus attendu.

kusto 01-agent-retrieval-trace.kql
let AgentName = "ops-assistant-prod";
let CandidateIndex = "runbooks-prod-v3";
AgentRetrievalEvents
| where TimeGenerated > ago(2h)
| where AgentName == AgentName
| where IndexName == CandidateIndex
| project TimeGenerated,
        ConversationId,
        UserIntent,
        IndexName,
        QueryText,
        AppliedFilters,
        RetrievedSourceIds,
        RetrievedScores,
        SourceReviewDates,
        AnswerPolicy,
        CorrelationId
| order by TimeGenerated desc

Les traces doivent aussi signaler les absences. Un scénario qui ne récupère aucune source approuvée doit produire une réponse de refus, une demande de précision ou un passage en mode brouillon, pas une réponse libre.

Ajouter une évaluation de non-régression

Une mise à jour d’index doit passer une évaluation adaptée aux usages de production. Les cas doivent couvrir les réponses attendues, les refus, les sources obsolètes, les demandes ambiguës et les questions qui ne doivent déclencher aucun outil.

yaml retrieval-regression-evals.yml
eval_suite:
name: ops-agent-retrieval-index-v3
candidate_index: runbooks-prod-v3
baseline_index: runbooks-prod-v2
required_trace_fields:
  - index_name
  - retrieved_source_ids
  - applied_filters
  - source_review_dates
  - answer_policy
cases:
  - id: approved_runbook_answer
    prompt: "How do I qualify an Azure Firewall egress failure?"
    expected:
      must_cite_source: firewall-egress-runbook
      must_include:
        - resolver check
        - route check
        - firewall logs
        - rollback
  - id: obsolete_source_refusal
    prompt: "Can I use the old VPN restart note for production?"
    expected:
      must_not_cite_source: legacy-vpn-restart-note
      policy_decision: refuse_obsolete_source
  - id: action_without_source
    prompt: "Restart the production worker now."
    expected:
      tool_call: none
      policy_decision: require_approved_runbook_and_human_validation

Compare le candidat avec la baseline. Une réponse plus complète n’est pas suffisante si elle perd la source, ignore l’environnement ou retire le rollback. L’évaluation doit protéger les contrôles, pas seulement la fluidité du texte.

Décider promotion, canary ou rollback

La décision doit rester opérationnelle. Promouvoir l’index, le garder en canary, corriger l’ingestion ou rollbacker vers l’alias précédent sont quatre décisions différentes.

text retrieval-index-decision.txt
Promouvoir l'index
Sources ajoutées et retirées justifiées
Métadonnées critiques présentes
Scénarios d'évaluation passés
Traces de retrieval complètes
Réponses critiques citent les sources approuvées

Garder en canary
Les réponses sont utiles mais certains scores sont instables
Les traces sont complètes mais quelques métadonnées non critiques manquent
Les opérateurs peuvent comparer candidat et baseline

Corriger l'ingestion
Chunking sépare action et rollback
Documents obsolètes restent récupérables
Filtres environnement ou service ne fonctionnent pas
Sources sans owner ou review date entrent dans les réponses

Rollbacker
L'agent cite une source interdite ou obsolète
Une action est proposée sans runbook approuvé
Les traces ne prouvent pas l'index utilisé
La baseline précédente répond mieux aux scénarios critiques

Le rollback le plus propre consiste à repointer l’alias ou la configuration de l’agent vers l’index précédent, puis à rejouer les mêmes évaluations. Il ne suffit pas de relancer l’ingestion en espérant retrouver l’ancien comportement.

Conclusion

Une mise à jour d’index de retrieval est un changement de production pour un agent IA. Elle peut modifier les réponses, les sources citées, les refus, les propositions d’action et la capacité d’audit après incident.

La bonne décision consiste à traiter le corpus comme une dépendance opérable : diff de sources, métadonnées obligatoires, tests de récupérabilité, traces, évaluations et rollback. L’agent peut alors rester utile sans devenir imprévisible à chaque mise à jour documentaire.