Je parcours votre contenu pour vous aider à trouver rapidement les réponses à vos questions.
Architecture et fondements de données pour la recherche basée sur l'IA
Ce livre blanc présente un modèle opérationnel pour la recherche basée sur l'IA. Il décrit l'ensemble de la chaîne de traitement, de l'ingestion et de l'enrichissement des données à l'indexation et à la récupération hybrides, en passant par les recommandations et les interfaces RAG (Response, Agilité, Référencement) ancrées dans les sources extraites. Il aborde également les mesures qui garantissent la fiabilité de ces systèmes en conditions réelles : observabilité, gouvernance par clés API sécurisées et filtrage par enregistrement, maîtrise des coûts et gestion du cycle de vie grâce à des métadonnées d'expiration explicites et des indicateurs de suppression logique.
La recherche n'est plus une simple fonction. Elle s'intègre pleinement à l'expérience utilisateur, et les utilisateurs ressentent immédiatement les ralentissements, les imprécisions et les coûts cachés, comme les délais d'attente, les résultats vides ou les réponses inadaptées. Pour les équipes techniques, cela change la donne. La qualité, la latence et le coût de la recherche font désormais partie intégrante de l'expérience utilisateur ; il est donc essentiel de les concevoir et de les mesurer, notamment les latences p95 et p99.
La plupart des équipes ont également abandonné la recherche monomode. La solution de base actuelle est la recherche hybride : la correspondance par mots-clés gère les termes exacts et les identifiants, tandis que la correspondance sémantique facilite le traitement du langage naturel et des requêtes plus longues nécessitant la conservation du contexte complet. Les filtres et les facettes permettent de maîtriser ce système hybride en imposant des contraintes et en rendant les résultats prévisibles.
Ce livre blanc présente un modèle opérationnel pour la recherche basée sur l'IA. Il décrit l'ensemble de la chaîne de traitement, de l'ingestion et de l'enrichissement à l'indexation et à la récupération hybrides, en passant par les recommandations et les interfaces RAG (Response, Agilité, Gravité) ancrées dans les sources extraites. Il aborde également les éléments qui garantissent la fiabilité de ces systèmes en conditions réelles : observabilité, gouvernance via des clés API sécurisées et le filtrage par enregistrement, maîtrise des coûts et gestion du cycle de vie grâce à des métadonnées d'expiration explicites et des indicateurs de suppression logique. Algolia NeuralSearch combine la recherche par mots-clés et par vecteur, tandis que les filtres et les facettes appliquent les contraintes. Le document traite également des règles et des synonymes, de l'analyse et des tests A/B, des recommandations et des modèles opérationnels tels que les mises à jour partielles et les basculements d'index atomiques par copie ou déplacement d'index.
La qualité de la recherche est un indicateur crucial. Elle se manifeste concrètement dans les actions des utilisateurs : moins de tentatives, un taux de conversion plus élevé, une résolution plus rapide des problèmes et la confiance accordée aux résultats. C’est pourquoi cet article considère la recherche comme une interface produit et la mesure de la même façon, à travers la pertinence, la latence et le coût.
En pratique, les utilisateurs perçoivent la qualité de la recherche à travers :
La recherche basée sur l'IA se résume rarement à une simple requête renvoyant des résultats. Il s'agit d'un processus complexe, et chaque étape ajoutée peut ralentir le traitement ou rendre les performances moins prévisibles. C'est pourquoi cette section considère la qualité, la latence et le coût comme des caractéristiques du produit, et incite les équipes à concevoir en fonction des performances à 95 et 99 %, et non pas seulement des moyennes.
Une manière pratique de mettre cela en œuvre consiste à définir un budget de latence par étape :
Les systèmes monomodes tombent en panne de manière prévisible :
La recherche hybride combine la précision lexicale et le rappel sémantique, puis utilise des filtres et des facettes pour garantir des résultats précis et pertinents pour l'entreprise.
Algolia sert ici d'implémentation de référence principale pour une architecture de recherche IA de niveau production. L'objectif est de montrer comment la recherche hybride moderne est assemblée en pratique à l'aide d'une plateforme concrète dotée de composants opérationnels tels que les pipelines d'ingestion, les mécanismes de gouvernance, l'observabilité et les outils d'IA ou de données associés.
Cette section présente une architecture de référence moderne pour la recherche basée sur l'IA, en commençant par l'ingestion (exploration ou ETL – Extraction, Transformation, Chargement) et l'enrichissement, puis en abordant l'indexation hybride et la recherche. Elle couvre également les couches optionnelles telles que le réordonnancement et les recommandations, et montre comment RAG peut générer des réponses pertinentes à partir des sources extraites.
L'ingestion est optimale lorsque l'approche choisie correspond à l'emplacement de vos données. Utilisez des robots d'exploration lorsque la source est principalement du contenu web ou de la documentation, des connecteurs lorsque les données se trouvent dans des systèmes e-commerce ou CRM, et des pipelines ETL lorsque vous êtes propriétaire du système de stockage en amont et que vous avez besoin d'un contrôle total sur l'extraction et la publication des données. Quelle que soit la méthode, une liste de contrôle pratique pour l'ingestion reste la même : définir vos sources de référence et vos exigences de fraîcheur, normaliser les champs et les identifiants pour garantir la cohérence des enregistrements, créer des processus reproductibles prenant en charge le remplissage et la relecture, et séparer les étapes d'extraction, de transformation et de publication afin de pouvoir déboguer et améliorer chaque étape indépendamment.
L'idempotence garantit la sécurité de la réindexation. Utilisez des valeurs objectID stables et des transformations déterministes afin que la réexécution du pipeline produise les mêmes enregistrements pour les mêmes entrées. Ceci devient essentiel lorsque vous modifiez la stratégie de segmentation, les plongements ou le schéma et qu'une reconstruction complète est nécessaire.
import os
import hashlib
import logging
from datetime import datetime, timezone
from algoliasearch.search.client import SearchClientSync
APP_ID = os.environ["ALGOLIA_APP_ID"]
ADMIN_KEY = os.environ["ALGOLIA_ADMIN_API_KEY"]
INDEX_NAME = os.environ.get("ALGOLIA_INDEX", "docs_index_v1")
client = SearchClientSync(APP_ID, ADMIN_KEY)
logger = logging.getLogger(__name__)
def fetch_docs_from_source():
return [
{
"doc_id": "docs_payment_api",
"version": "v3.2",
"doc_type": "api_reference",
"audience": "developer",
"product": "payments",
"paragraphs": [
{
"text": "Create a payment by sending a POST request to /payments with amount and currency.",
"page": 1,
"heading_path": ["Payments", "Create payment"],
},
{
"text": "Use idempotency keys to prevent duplicate payment creation during retries.",
"page": 1,
"heading_path": ["Payments", "Create payment"],
},
],
},
{
"doc_id": "docs_refunds_guide",
"version": "v1.8",
"doc_type": "guide",
"audience": "merchant",
"product": "refunds",
"paragraphs": [
{
"text": "Refund requests can be submitted from the dashboard or through the refunds API.",
"page": 2,
"heading_path": ["Refunds", "Submitting a refund"],
}
],
},
]
def stable_object_id(doc_id: str, chunk_id: str) -> str:
raw = f"{doc_id}:{chunk_id}".encode("utf-8")
return hashlib.sha256(raw).hexdigest()
def to_record(doc_id: str, chunk_id: str, text: str, meta: dict) -> dict:
now = int(datetime.now(timezone.utc).timestamp())
return {
"objectID": stable_object_id(doc_id, chunk_id),
"doc_id": doc_id,
"chunk_id": chunk_id,
"text": text,
"updated_at": now,
**meta,
}
records = []
for item in fetch_docs_from_source():
doc_id = item["doc_id"]
version = item["version"]
for idx, paragraph in enumerate(item["paragraphs"]):
meta = {
"doc_type": item.get("doc_type", "kb"),
"audience": item.get("audience", "public"),
"version": version,
"product": item.get("product", "unknown"),
"page": paragraph.get("page"),
"heading_path": paragraph.get("heading_path", []),
}
records.append(to_record(doc_id, f"p{idx}", paragraph["text"], meta))
if not records:
logger.warning("No records generated for indexing, skipping publish.")
else:
try:
response = client.save_objects(
index_name=INDEX_NAME,
objects=records,
)
client.wait_for_task(
index_name=INDEX_NAME,
task_id=response.task_id,
)
logger.info("Published %d records to %s", len(records), INDEX_NAME)
except Exception:
logger.exception(
"Batch publish failed for index %s with %d records",
INDEX_NAME,
len(records),
)
# In production, send to retry / replay queue or alerting system here.
raise
Ce modèle prend en charge les reconstructions déterministes et l'évolution sûre du schéma, ce qui devient particulièrement important lorsque vous modifiez le découpage en blocs, les intégrations ou le schéma et que vous souhaitez une transition propre sans rompre la pertinence ni les contrôles d'accès.
L'enrichissement peut améliorer la pertinence sans ajouter de latence, à condition d'être effectué en amont et non lors de l'exécution de la requête. Lorsque l'enrichissement est intégré à l'index, la recherche reste rapide, prévisible et plus facile à interpréter.
L'enrichissement est plus efficace lorsqu'il intervient avant même que les données n'atteignent l'index, ce qui garantit des temps de requête rapides et prévisibles. Les enrichissements courants comprennent la reconnaissance optique de caractères (OCR) pour les PDF et les numérisations, associée à des contrôles de qualité pour gérer les extractions bruitées, la détection et la normalisation de la langue pour assurer la cohérence du contenu entre les différentes langues, l'extraction d'entités et l'étiquetage taxonomique pour améliorer le filtrage et le facettage, ainsi que la classification pour signaler les catégories sensibles ou de conformité ayant une incidence sur l'accès et la gouvernance.
L'indexation permet de définir les capacités de la recherche. Si le schéma ne reflète pas les contraintes et l'intention, aucun paramétrage ultérieur ne pourra y remédier.
Concrètement, cela signifie que votre schéma d'index doit inclure :
La conception de l'index fixe le plafond de rappel. Décisions importantes :
Pour les documents, le découpage en segments et les ancres déterminent la qualité des citations. Pour le commerce, la normalisation des attributs détermine la facilité d'utilisation des facettes et la stabilité des filtres.
Considérez les facettes et les filtres comme des éléments de premier ordre. Définition :
La pile devrait prendre en charge la récupération hybride, puis les contraintes structurées, puis l'optimisation.
Un flux pratique lors de l'exécution des requêtes :
Les filtres et les facettes garantissent la précision du rappel sémantique. Le plan les désigne explicitement comme des stabilisateurs.
import { algoliasearch } from "algoliasearch";
const client = algoliasearch(
process.env.ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_API_KEY
);
const response = await client.searchSingleIndex({
indexName: "products",
searchParams: {
query: "camping cooler for drinks",
filters: "inStock:true AND region:US AND price_range:mid",
facetFilters: ["category:Outdoor"],
hitsPerPage: 20,
},
});
const hits = response.hits;
Le reclassement et les recommandations sont à considérer comme des options complémentaires à une base de recherche stable. Ils peuvent améliorer la précision et la visibilité des résultats en haut de page, mais uniquement s'ils sont budgétisés, mesurables et appliqués de manière sélective. L'approche la plus sûre consiste à appliquer d'abord des filtres d'éligibilité, puis à n'utiliser le reclassement que lorsque la latence et les tendances de trafic le justifient.
Utilisez le réordonnancement lorsque :
Utilisez la fonction « Recommander » lorsque :
La fonctionnalité de réordonnancement dynamique d'Algolia permet d'ajuster l'ordre des résultats et vous pouvez la contrôler pour chaque requête grâce au paramètre `enableReRanking`. Ceci est utile lorsque vous souhaitez améliorer la précision des résultats en haut de la liste tout en conservant la logique de recherche et de contraintes inchangée.
Certaines équipes exécutent un modèle supplémentaire après la récupération des résultats afin de reclasser les meilleurs candidats. Cette méthode peut fonctionner, mais elle doit être optionnelle et soumise à des contraintes de latence, car elle engendre une surcharge réseau et de calcul. Les filtres d'éligibilité et l'application des listes de contrôle d'accès (ACL) doivent être effectués avant le reclassement afin que le module de reclassement ne prenne jamais en compte les candidats non autorisés.
Vous souhaitez des résultats de recherche allant au-delà de la requête initiale, tels que des articles associés ou des modules fréquemment achetés ensemble.
import { algoliasearch } from "algoliasearch";
const client = algoliasearch(
process.env.ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_API_KEY
);
const query = "running shoes";
const commonSearchParams = {
filters: "tenant_id:acme AND region:us",
hitsPerPage: 20,
};
let hits = [];
try {
const response = await client.searchSingleIndex({
indexName: "products",
searchParams: {
query,
...commonSearchParams,
enableReRanking: true,
},
});
hits = response.hits;
} catch (error) {
console.error("Search with re-ranking failed, falling back to standard retrieval", error);
const fallbackResponse = await client.searchSingleIndex({
indexName: "products",
searchParams: {
query,
...commonSearchParams,
enableReRanking: false,
},
});
hits = fallbackResponse.hits;
}
Un budget de latence n'est efficace que s'il est explicite et appliqué. Considérez la requête de recherche comme une succession d'étapes, puis attribuez à chaque étape une durée maximale et une durée de repli. Par exemple, vous pouvez réserver un budget fixe pour la récupération, un budget optionnel plus restreint pour le réordonnancement et un budget plafonné pour la génération si vous utilisez RAG.
Le moyen le plus fiable de garantir la stabilité de p95 est de rendre les étapes précédentes prévisibles. En suivant les règles de récupération mentionnées précédemment, appliquez les filtres de locataire et d'ACL avant l'expansion des candidats, puis gérez la latence grâce aux facettes, à la mise en cache et au réordonnancement optionnel. La latence devient ainsi un choix produit plutôt qu'un aléa technique. Les équipes peuvent communiquer clairement les compromis et mesurer leur impact sur des résultats tels que le taux de réussite de la première requête et le taux de reformulation.
La génération ne remplace pas la recherche. Il s'agit d'une couche d'interface qui doit rester ancrée dans les résultats de recherche, avec des citations et un comportement de refus lorsque la couverture est faible.
Un motif RAG sûr :
System role:
You are a product support assistant. Answer only from the retrieved sources provided in the
context pack. Do not use outside knowledge. Do not infer undocumented behavior. If the sources
are weak, conflicting, outdated, or missing the requested version or product, do not guess.
Goal:
Return a grounded answer that is useful, concise, and easy to verify.
Input contract:
- user_question: the end-user’s question
- requested_version: optional version string from user context
- retrieved_sources: a list of source objects, each containing:
- source_id
- title
- url
- anchor
- version
- doc_type
- passage_text
- answerability_score: high, medium, or low
- max_answer_tokens: hard output limit
- max_citations_per_claim: default 1, maximum 2
Grounding rules:
1. Use only facts supported by retrieved_sources.
2. Every material claim, step, warning, limit, or configuration must cite at least one source_id.
3. Prefer sources that match the requested_version. If version mismatch exists, state that
clearly.
4. If top sources conflict, do not merge them into one answer. Surface the conflict.
5. If answerability_score is low, refuse to answer directly and return the best sources plus
refinement suggestions.
6. If answerability_score is medium, answer only if the top sources agree and version alignment
is clear.
7. Never invent parameters, endpoints, error codes, limits, or product behavior.
Output format:
Return valid JSON with this schema:
{
"status": "answered" | "insufficient_coverage" | "version_conflict",
"answer": [
{
"step": "short actionable statement",
"citations": ["source_id"]
}
],
"warnings": [
"optional warning about version mismatch, weak coverage, or conflicting docs"
],
"follow_up_question": "ask only if needed to disambiguate version, product, or environment",
"suggested_filters": {
"product": ["optional"],
"version": ["optional"],
"doc_type": ["optional"]
},
"top_sources": [
{
"source_id": "string",
"title": "string",
"url": "string",
"anchor": "string"
}
]
}
Refusal behavior:
- If the answer is not supported, set status to "insufficient_coverage".
- Leave answer as an empty list.
- Populate warnings with the reason.
- Return top_sources and suggested_filters.
- Do not fabricate a partial answer.
Token and length constraints:
- Keep the full response under max_answer_tokens.
- Prefer 3 to 5 short answer steps.
- Prefer direct quotations only when necessary and keep them minimal.
User question:
{{user_question}}
Requested version:
{{requested_version}}
Answerability score:
{{answerability_score}}
Retrieved sources:
{{retrieved_sources}}
max_answer_tokens:
{{max_answer_tokens}}
max_citations_per_claim:
{{max_citations_per_claim}}
Un contrat d'invite RAG utilisable doit définir bien plus que la tonalité. Il doit spécifier les champs d'entrée, les règles de mise à la terre, le comportement en cas de refus, la gestion des versions, le schéma de sortie et les limites de jetons afin que la couche de génération puisse être testée, surveillée et dégradée en toute sécurité lorsque la couverture est faible.
L'architecture ci-dessus illustre le schéma sous-jacent : récupération, contextualisation, assemblage des invites, rendu des citations et validation de la pertinence. Les équipes souhaitant un contrôle total peuvent créer ce flux de travail directement. Celles qui préfèrent s'affranchir de la majeure partie de l'orchestration peuvent utiliser Algolia Agent Studio, qui connecte un module de recherche (LLM) choisi à la recherche et aux outils Algolia, gère le flux de travail de bout en bout et ancre les réponses dans les données Algolia en temps réel. Pour les équipes développant des flux de travail d'agents plus vastes et interopérables, le serveur MCP hébergé d'Algolia offre une solution sécurisée pour exposer les fonctionnalités de recherche et de recommandation aux modules de recherche et aux agents.
Les boucles de rétroaction transforment la recherche en un système d'amélioration continue :
Utilisez cette nomenclature pour faire correspondre l'architecture de référence aux composants Algolia concrets et aux outils connexes qui les entourent généralement dans les déploiements en production.
Pièges courants à repérer au plus tôt :
Voici la version abrégée de la liste de contrôle opérationnelle. Une section plus complète sur les écueils et les mesures correctives figure plus loin dans ce document et doit être utilisée lors des revues de conception, de la planification de la reconstruction et du suivi des incidents.
| Couche | But | Composants Algolia | Outils communs adjacents |
|---|---|---|---|
| Ingestion | Acquisition de données | Crawler, connecteurs, clients API | Frameworks ETL/d'orchestration, webhooks sources, pipelines CDC, files d'attente, systèmes de relecture |
| Enrichissement | Améliorer le contenu et les métadonnées | Modélisation des enregistrements prêts pour l'indexation | Services de reconnaissance optique de caractères (OCR), de reconnaissance d'entités nommées (NER), de classification et de taxonomie |
| Indexage | Stocker lexique et vecteurs | Conception de l'index NeuralSearch | Registre de schémas, pipelines CI |
| Récupération | Recherche hybride avec contraintes | Recherche neuronale, filtres, facettes | Passerelle API, mise en cache, contrôle des indicateurs de fonctionnalités, intergiciel de requêtes |
| Réglage | Pertinence du contrôle | Classement personnalisé, règles, synonymes | drapeaux publicitaires, systèmes de marchandisage |
| Réorganisation facultative | Améliorer le top K | Étape de réorganisation par IA | Réorganisation des modèles, surveillance de la latence |
| Recommander | Découverte | Étape recommandée | Systèmes de personnalisation, entrepôt de données analytiques |
| face avant RAG | Réponses fondées | Résultats de la recherche en tant que contexte | Fournisseur de LLM, intergiciel de gestion des citations, outil d'évaluation |
| Observabilité | Mesurer et déboguer | Analyses et perspectives | Tableaux de bord, journaux, traçage |
| Gouvernance | Accès et confidentialité | Clés API sécurisées, filtres par enregistrement | Systèmes de gestion des identités et des accès (IAM), de perte de données (DLP), de journaux d'audit, de gestion des clés et de rotation des secrets |
| Cycle de vie | Rétention et reconstruction | Métadonnées d'expiration, indicateurs de suppression réversible, opérations de copie ou de déplacement d'index pour les bascules planifiées et mises à jour partielles pour une fraîcheur incrémentale. | Remplissage, pipelines de relecture, sauvegardes |
Lorsque la qualité de la recherche se dégrade, la tentation est grande d'incriminer le modèle, mais la cause profonde réside généralement dans les données et leur structure. La plupart des solutions consistent à améliorer la précision de la recherche, à appliquer des contraintes telles que la version, la région et le contrôle d'accès, et à garantir la stabilité du comportement lors des reconstructions.
Compte tenu de ces modes de défaillance, les sections suivantes se concentrent sur les performances, les coûts et les choix de déploiement qui assurent la stabilité de l'architecture en production.
Cet exemple utilise un catalogue de vente au détail classique où les clients effectuent des recherches de deux manières différentes. Parfois, ils savent précisément ce qu'ils veulent, comme « AirPods Pro 2 ». D'autres fois, ils décrivent un besoin, comme « chaussures de course pour pieds plats ». L'objectif est de maintenir une latence P95 stable, de garantir la fiabilité du filtrage et, au final, d'améliorer le taux de conversion.
Le flux ci-dessous applique les règles de récupération, de filtrage et de budget de latence précédentes à une expérience de recherche de vente au détail.
import { algoliasearch } from "algoliasearch";
const client = algoliasearch(
process.env.ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_API_KEY
);
const query = "running shoes for flat feet";
const response = await client.searchSingleIndex({
indexName: "products",
searchParams: {
query,
filters: "tenant_id:acme AND region:US AND language:en AND in_stock:true",
facetFilters: ["category_path:Shoes > Running"],
hitsPerPage: 24,
attributesToRetrieve: [
"objectID",
"title",
"brand",
"category_path",
"price",
"currency",
"discount_percent",
"in_stock",
"rating_avg",
"image_url",
"product_url"
],
facets: ["brand", "category_path", "price_bucket", "rating_bucket", "attributes.color",
"attributes.size"]
}
});
const hits = response.hits;
const facets = response.facets;
Cet exemple suppose un portail de documentation où les utilisateurs demandent « comment configurer X » et attendent des réponses fiables et référencées. L’objectif est de garantir l’exactitude des informations, un contrôle d’accès strict, la prise en compte des versions et un comportement clair en cas de contenu manquant.
Le flux ci-dessous applique les règles précédentes de segmentation, de filtrage des versions, de contrôle d'accès et de génération de données ancrées à un flux de travail de documentation.
import { algoliasearch } from "algoliasearch";
const client = algoliasearch(
process.env.ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_API_KEY
);
function buildContextPack(hits) {
return hits.map((hit) => ({
source_id: hit.objectID,
doc_id: hit.doc_id,
section_id: hit.section_id,
heading_path: hit.heading_path ?? [],
content: hit.content,
url: hit.url,
anchor: hit.anchor,
version: hit.version,
}));
}
async function retrieveChunks({ query, product, version, aclRole }) {
const response = await client.searchSingleIndex({
indexName: "docs_chunks",
searchParams: {
query,
filters: `product:${product} AND version:${version} AND acl_roles:${aclRole}`,
hitsPerPage: 8,
attributesToRetrieve: [
"objectID",
"doc_id",
"section_id",
"heading_path",
"content",
"product",
"version",
"url",
"anchor",
],
},
});
return response.hits;
}
const hits = await retrieveChunks({
query: "how do I configure webhook retries",
product: "payments",
version: "v3",
aclRole: "developer",
});
const contextPack = buildContextPack(hits);
// Replace this with your actual LLM call.
const promptPayload = {
user_question: "how do I configure webhook retries",
retrieved_sources: contextPack,
answerability_score: "high",
max_answer_tokens: 300,
max_citations_per_claim: 2,
};
Filtres : tenant_id, acl_roles, langue et, le cas échéant, produit et version
Facettes : produit, version, type de document (guide, référence API, dépannage) et, en option, plateforme (web, iOS, Android).
L'implémentation exacte varie selon l'environnement d'exécution du backend et la configuration de gestion des clés, mais le modèle reste le même : générer une clé de recherche sécurisée à courte durée de vie sur le serveur, la limiter à des filtres de locataire et de rôle, et la renvoyer uniquement à un client autorisé.
Générez sur le serveur une clé de recherche sécurisée à durée de vie limitée à partir d'une clé de recherche parente, définissez sa portée avec des filtres de locataire et de rôle, limitez-la éventuellement à l'index requis et ne la renvoyez qu'à un client autorisé.
const securedApiKey = client.generateSecuredApiKey({
parentApiKey: process.env.ALGOLIA_SEARCH_API_KEY,
restrictions: {
restrictIndices: ["docs_chunks"],
filters: "tenant_id:acme AND acl_roles:developer",
validUntil: Math.floor(Date.now() / 1000) + 3600,
},
});
En production, associez ce modèle aux contrôles backend classiques tels que le stockage des secrets, la rotation des clés, l'authentification des utilisateurs et la journalisation des audits. Pour en savoir plus, consultez la documentation sur les clés API sécurisées d'Algolia pour la sécurité des données .
La recherche par mots clés repose sur le chevauchement des termes et est performante pour les requêtes portant sur des articles connus tels que les références, les identifiants et les noms exacts. Elle est en revanche peu performante pour le langage naturel et les recherches exploratoires, notamment lorsque les métadonnées du catalogue sont incomplètes et que les utilisateurs décrivent des cas d'utilisation plutôt que des noms de produits.
La recherche vectorielle excelle en matière de similarité sémantique, mais elle manque par défaut de contraintes strictes. La recherche purement sémantique produit souvent des résultats non pertinents pour le métier, ignore des contraintes telles que la disponibilité et la conformité, et peine à trouver des correspondances exactes comme les codes d'erreur.
Une architecture de production sépare :
Cette séparation facilite le débogage. En cas d'échec d'une requête, il est possible de déterminer si le problème provient de données manquantes, de filtres incorrects, de signaux de classement erronés ou d'intégrations de mauvaise qualité.
Si vous gérez vous-même votre couche vectorielle, les paramètres du réseau de neurones artificiels (RNA) influent sur la latence et le rappel. Les paramètres courants incluent :
L'optimisation est l'étape où la recherche hybride prend forme. Il est nécessaire de définir clairement les critères de priorité : quand privilégier l'analyse lexicale, quand enrichir l'analyse sémantique et quand refuser la génération de nouvelles données.
Une approche pratique :
Les domaines restreints nécessitent un contrôle explicite. Conformément aux règles d'éligibilité précédentes, appliquez des filtres ACL lors de la récupération, puis ajoutez des contrôles supplémentaires tels que la séparation des index, les balises de sensibilité et l'accès limité aux sources pour les requêtes à haut risque.
Le contrôle d'accès n'est pas seulement un mécanisme de sécurité. Il améliore également la confiance et réduit les incidents en aval.
Principes de fonctionnement fondamentaux explorés tout au long du document :
Le découpage en blocs et la conception des enregistrements sont souvent plus importants que le choix du modèle, car ils déterminent la possibilité d'appliquer les contraintes, de placer les citations dans la bonne section et d'évaluer la qualité de manière reproductible. Si l'indexation est réalisée à une granularité inadéquate, l'analyse des accès, des références et des documents (RAG) devient aléatoire et les filtres perdent en fiabilité. Une règle pratique consiste à faciliter l'obtention du résultat souhaité, les contraintes étant déjà appliquées. Cela implique des identifiants stables, un ensemble restreint de métadonnées obligatoires et des blocs suivant une structure visible par l'utilisateur, comme les titres et les sections.
Champs minimums requis :
Les documents Word et les PDF sont particulièrement sensibles au découpage en segments, car la qualité des citations et la précision de la recherche dépendent des limites structurelles. Les règles ci-dessous visent à préserver les titres, le sens des paragraphes et les ancres des liens profonds.
Lineage vous permet de répondre à des questions comme « pourquoi ai-je des doublons » et « quelle source fait autorité ? »
La recherche documentaire nécessite généralement des filtres que les utilisateurs ne voient pas toujours, mais dont ils bénéficient toujours :
Cela permet une récupération correcte avant tout classement.
Champs minimums recommandés :
Champs optionnels très utiles :
La documentation du code et des API nécessite une approche différente de celle des documents écrits classiques. Les utilisateurs effectuent des recherches en utilisant des éléments tels que les noms de symboles, les codes d'erreur, les signatures de méthodes, les noms de paramètres et la syntaxe spécifique au langage. Si votre indexation ne prend pas en compte cette structure, les résultats de recherche paraîtront incohérents, même si le contenu est techniquement présent.
Les exemples sont souvent ce dont les utilisateurs ont le plus besoin. Si vous les séparez, la recherche aboutira à un résultat erroné. Stockez les exemples dans le même enregistrement ou comme enregistrements enfants étroitement liés au symbole parent.
La documentation des SDK partage souvent du contenu entre les versions. Cela peut créer des doublons qui compliquent la recherche et augmentent les coûts.
Stratégies recommandées :
Vous souhaitez que le schéma prenne en charge trois types de requêtes :
Pour les recherches exactes, les champs lexicaux sont importants. Pour les recherches du type « comment faire », ce sont les champs sémantiques qui le sont. En cas d'erreur, les deux sont importants.
Champs minimums recommandés :
Champs optionnels très utiles :
La recherche en e-commerce obéit à des règles légèrement différentes. Les filtres doivent être instantanés et les modifications telles que le prix ou la disponibilité des produits doivent s'afficher sans délai. De plus, le classement doit souvent concilier pertinence et objectifs commerciaux. Le découpage en segments n'est généralement pas le facteur déterminant. Ce qui influence réellement les performances et l'expérience utilisateur, c'est un schéma clair et des attributs bien normalisés.
La recherche doit être rapide et simple lors de l'exécution de la requête. Dénormalisez les champs clés dans chaque enregistrement :
Choisissez si vous souhaitez indexer :
La disponibilité et les prix doivent pouvoir être filtrés pour garantir leur exactitude :
Utilisez des mises à jour partielles pour les stocks et les prix si votre objectif de fraîcheur est limité.
Exploration guidée par Facettes :
Champs minimums recommandés :
Les embeddings ne sont utiles que s'ils améliorent le produit. Leur utilité réelle dépend moins du modèle lui-même que de la manière dont vous indexez le contenu et dont vous évaluez les résultats.
Les plongements lexicaux prêts à l'emploi constituent une base solide pour le langage général. Les modèles spécifiques à un domaine sont utiles lorsque :
Une approche pratique consiste à commencer par un modèle d'intégration de base, puis à l'affiner seulement après avoir obtenu des données d'évaluation solides et un découpage stable.
La dimension d'intégration influe sur les coûts de stockage et de récupération. Maîtrisez ces coûts en :
Les représentations vectorielles dérivent lorsque le contenu ou les modèles changent. Traitez les représentations vectorielles comme des artefacts versionnés :
La recherche vectorielle n'est véritablement prête pour la production que lorsqu'elle fonctionne comme le reste de votre système. Cela implique un filtrage performant, une application fiable des listes de contrôle d'accès (ACL), une gestion claire du cycle de vie des contenus obsolètes et un schéma évolutif qui s'adapte sans perturber le fonctionnement du système.
Pour éviter les mauvaises surprises, le plus simple est de centraliser la recherche par mots-clés et la recherche vectorielle dans le même index. Ainsi, chaque enregistrement contient le texte à rechercher, les attributs nécessaires au filtrage et à la segmentation, ainsi que l'intégration vectorielle. En regroupant toutes ces informations, la recherche reste cohérente et vos contraintes (locataire, région, contrôle d'accès, etc.) s'appliquent systématiquement de la même manière.
Si vous séparez l'infrastructure lexicale et vectorielle, veillez à conserver les mêmes règles d'éligibilité décrites dans la section Récupération, notamment l'application des ACL et des règles de locataire, pour les deux chemins. Si vous ne pouvez pas appliquer les mêmes règles aux deux niveaux, vous risquez de renvoyer des résultats inappropriés pour l'utilisateur, ou des résultats qui semblent pertinents mais qui ne correspondent pas à la requête.
La mutualisation est un problème de contraintes. Modèles :
Choisissez en fonction des exigences d'isolation des données, des modèles de trafic et de la simplicité d'utilisation. Quel que soit le modèle choisi, assurez-vous que les balises tenant_id et role sont présentes au niveau de l'enregistrement.
Votre schéma évoluera, aussi « définitif » qu'il puisse paraître aujourd'hui. À mesure que le produit se développe, vous ajouterez de nouveaux champs, affinerez les métadonnées et, tôt ou tard, quelqu'un demandera une nouvelle facette ou un nouveau filtre. Les équipes qui gèrent bien ces évolutions sont celles qui anticipent les changements, afin que les mises à jour restent prévisibles et n'entraînent pas une migration perturbatrice.
Une manière pratique de procéder :
Il existe deux méthodes courantes pour combiner recherche structurée et non structurée. La fusion précoce consiste à centraliser toutes les données dans un seul index et un seul flux de recherche, en mélangeant champs structurés et signaux textuels. Cette approche simplifie généralement la gestion du classement et des contraintes, mais elle n'est efficace que si votre schéma est robuste et cohérent. La fusion tardive, quant à elle, consiste à interroger plusieurs index, tels que le catalogue, la documentation et les tickets, puis à fusionner les résultats au niveau de l'application. Elle offre une plus grande flexibilité pour optimiser chaque source indépendamment, mais complexifie également la gestion et la mesure de l'éligibilité, car les contraintes doivent rester cohérentes sur tous les chemins de recherche. En général, la fusion précoce est adaptée aux schémas stables et aux contraintes partagées, tandis que la fusion tardive est plus appropriée lorsque les sources sont très différentes ou nécessitent des optimisations distinctes.
La recherche d'assistance doit être optimisée pour le délai de résolution :
La recherche d'assistance bénéficie grandement de l'enrichissement, tel que l'extraction d'entités pour les codes d'erreur et les clés de configuration.
L'intégration des résultats de catalogue avec le contenu généré par les utilisateurs nécessite des garde-fous :
La recherche en temps réel repose moins sur une simple fonctionnalité que sur un modèle opérationnel. Lorsque les stocks, les prix, les détails des produits ou la documentation changent, les utilisateurs s'attendent à ce que la recherche reflète ces changements rapidement et de manière cohérente. Pour ce faire, il est indispensable de disposer d'un processus de mise à jour fiable depuis les systèmes sources vers l'index, d'objectifs de fraîcheur clairs et mesurables, ainsi que d'un plan de reprise opérationnel en cas de blocage des flux de traitement ou de données erronées.
Modèle de pipeline :
import { algoliasearch } from "algoliasearch";
const client = algoliasearch(
process.env.ALGOLIA_APP_ID,
process.env.ALGOLIA_ADMIN_API_KEY
);
const { taskID } = await client.partialUpdateObjects({
indexName: "products",
objects: [
{
objectID: "prod_123",
inStock: true,
inventory_count: 12,
updated_at: 1738020000,
},
{
objectID: "prod_456",
inStock: false,
inventory_count: 0,
updated_at: 1738020000,
},
],
createIfNotExists: false,
});
await client.waitForTask({
indexName: "products",
taskID,
});
La mise à jour des informations n'est pas une chose que l'on tient pour acquise ; elle se mesure et se protège. Si les utilisateurs s'attendent à ce que les modifications d'inventaire, de prix ou de documentation soient rapidement visibles, vous avez besoin de signaux clairs indiquant si le système est à jour ou s'il diffuse des informations obsolètes.
Commencez par suivre un petit ensemble de métriques révélant la qualité de l'index. Mesurez le délai d'ingestion, c'est-à-dire l'écart entre le moment où la source est modifiée et celui où l'index reflète cette modification. Surveillez votre taux d'échec des mises à jour partielles afin de savoir quand les mises à jour incrémentales échouent, tentent de se reconnecter trop souvent ou sont abandonnées. Observez le pourcentage de requêtes qui ciblent des éléments récemment mis à jour, car c'est précisément lors de ces sessions que les problèmes de fraîcheur apparaissent en premier. Pour la documentation, surveillez l'exposition au contenu obsolète, ce qui vous indique la fréquence à laquelle les utilisateurs accèdent à des versions anciennes ou obsolètes au lieu de la version appropriée.
Configurez des alertes pour les retards d'ingestion et l'augmentation des échecs de mise à jour. Ce sont généralement les premiers signes avant-coureurs, et ils apparaissent souvent avant même que les tableaux de bord ne rendent le problème évident.
De plus, considérez la récupération comme un élément essentiel de la mise à jour des données. Les pipelines peuvent s'interrompre et des données erronées peuvent parfois passer inaperçues ; le processus de récupération doit donc être fiable. Conservez des journaux d'événements exploitables ou un processus de restauration des données manquantes afin de pouvoir rétablir les mises à jour manquées. Rendez les transformations idempotentes afin que les exécutions répétées ne créent pas de doublons ni de dérives. Mettez en place un flux de travail de reconstruction prenant en charge une bascule atomique : créez un nouvel index, validez-le, puis basculez le trafic en une seule étape. Avant la bascule, effectuez une série de contrôles essentiels pour vérifier que les contraintes, la pertinence et le comportement des versions sont corrects.
L'évaluation RAG dans un portail documentaire ne se limite pas à la pertinence. Il est nécessaire de déterminer quand la génération de réponses est appropriée et de vérifier si les réponses restent pertinentes. Un score de pertinence est un outil pratique qui combine différents indicateurs de qualité de la recherche en une seule décision. Utilisez-le pour contrôler la génération de réponses lors de la requête et comme indicateur d'évaluation au fil du temps.
Vous pouvez calculer un score de pertinence pour chaque requête en utilisant une combinaison pondérée de signaux tels que :
Commencez par un modèle simple. Définissez des seuils pour les scores des N meilleurs résultats de recherche et la présence de métadonnées produit et version parmi ces résultats. Au fur et à mesure de la collecte de données, affinez le score en le corrélant avec des indicateurs tels que le taux de reformulation, les clics sur les citations et les retours de satisfaction des utilisateurs.
Définissez des règles simples et explicites pour la génération de réponses. Si le niveau de fiabilité est élevé, générez une réponse étayée avec des citations. Si ce niveau est moyen, ne générez de réponses que si la requête est non sensible et que les sources principales concordent ; sinon, privilégiez les meilleures sources. Si ce niveau est faible, ne générez aucune réponse. Retournez les passages les plus pertinents, appliquez des filtres utiles comme le produit et la version, et consignez la requête comme une lacune de contenu ou de métadonnées. Ce contrôle préserve la confiance en évitant les réponses trop catégoriques mais non étayées, et maîtrise la latence et les coûts, car la génération n'est pas déclenchée pour chaque requête.
La validité des citations doit être évaluée avec autant de rigueur que leur exactitude. Une citation n'est pas un ornement : elle atteste du bien-fondé d'une réponse. Utilisez la liste de contrôle ci-dessous lors de la relecture hors ligne, dans les processus d'assurance qualité et lors de l'échantillonnage automatisé.
La sécurité n'est pas une fonctionnalité supplémentaire ajoutée ultérieurement ; elle fait partie intégrante du produit. En matière de recherche, les principaux risques proviennent généralement de contraintes appliquées de manière incohérente et de flux de données qu'il est facile de perdre de vue à mesure que le système se développe.
Contrôlez l'accès et la gestion des locataires grâce à des clés API sécurisées et des filtres par enregistrement.
Un modèle pratique :
Gérez la protection de la vie privée en amont, et non après coup. Masquez les données personnelles en amont, évitez d'indexer les informations que vous ne souhaitez pas voir consultées et assurez-vous de la sécurité de vos journaux tout en respectant les exigences d'audit. La recherche accède souvent à des données sensibles ; considérez-la donc comme une contrainte de conception primordiale : étiquetez les enregistrements susceptibles de contenir des données personnelles, séparez les données consultables de celles uniquement affichables, évitez d'intégrer des données personnelles brutes dans les vecteurs et mettez en place des règles de conservation et des procédures de suppression pour vous conformer aux obligations légales.
Il est toujours bon de surveiller les schémas d'utilisation abusive, de conserver des pistes d'audit fiables et de s'assurer que votre système est prêt pour les contrôles de conformité.
La gouvernance exige de l'observabilité :
Les mécanismes de sécurité sont souvent intégrés à la partie la plus critique du chemin de requête. Les passerelles sécurisées, le filtrage des invites et la modération des sorties réduisent les risques, mais peuvent également engendrer des sauts réseau supplémentaires, du temps de calcul et des modes de défaillance qui dégradent insidieusement la latence des paquets p95 et p99. Il est donc essentiel de considérer ces mécanismes comme faisant partie intégrante de l'architecture, et non comme un ajout.
Conformément aux règles de récupération et de gouvernance ci-dessus, appliquez les contraintes de locataire et d'accès avant l'expansion des candidats, puis gérez la latence en limitant les ensembles de candidats et en traitant le reclassement et la génération comme des étapes budgétées optionnelles.
Enfin, définissez des règles de dégradation contrôlée. Si la requête dépasse le budget alloué, ignorez le réordonnancement dans un premier temps. Si le dépassement persiste, réduisez la longueur du contexte et limitez le nombre de passages récupérés. En cas de faible couverture ou de citations peu fiables, n'effectuez aucune supposition. Affichez les résultats les mieux classés, assortis de filtres et de suggestions d'affinage. Ainsi, l'expérience de recherche reste fluide tout en préservant les garanties de sécurité essentielles.
Les coûts résultent rarement d'une seule décision majeure. Ils s'accumulent au fil des choix quotidiens, comme le niveau de détail de vos enregistrements, les facettes activées, la taille de vos ensembles de candidats, la fréquence des réordonnancements et la fréquence de génération du RAG. Pour des dépenses prévisibles, considérez ces éléments comme des décisions de conception et non comme des solutions de dernière minute.
Dimensionnez l'index en fonction de vos besoins réels d'affichage et de récupération. Des enregistrements plus petits et plus clairs sont plus faciles à gérer et moins coûteux à mettre à l'échelle. Les répliques peuvent être utiles, mais uniquement si elles répondent à un besoin produit précis. Utilisez-les lorsque vous pouvez les associer à un résultat mesurable, comme une stratégie de classement alternative ou un comportement spécifique à une région. Si une réplique n'a aucun impact sur un indicateur que vous suivez, il est généralement inutile de la conserver.
Les budgets permettent de maîtriser les performances et les dépenses. Définissez des limites strictes pour les éléments qui ont tendance à dériver avec le temps :
Ces budgets facilitent également les compromis. Utilisez les règles de dégradation définies dans la section sur la latence, par exemple en ignorant le réordonnancement initial et en réduisant le contexte uniquement lorsque cela est nécessaire, au lieu d'attendre l'expiration du délai.
La mise en cache est l'un des moyens les plus fiables de garantir la stabilité de p95, notamment en cas de requêtes répétées. Privilégiez la mise en cache des requêtes fréquentes avec des combinaisons de filtres courantes et des résultats de facettes pour les pages de catégories ou de navigation populaires. Veillez à ce que l'ordre de traitement soit déterministe et les paramètres cohérents afin que les caches soient effectivement utilisés. En cas de forte charge, privilégiez une dégradation contrôlée plutôt que des délais d'expiration.
Principes fondamentaux d'optimisation :
Ces règles d'optimisation mettent en œuvre les principes de récupération et de latence précédents : imposer l'éligibilité dès le début, limiter les ensembles de candidats, éviter les facettes incontrôlées et réserver le réordonnancement et la génération aux requêtes qui justifient leur coût.
Les points suivants portent sur un déploiement sur 90 jours, depuis le projet pilote jusqu'à l'évaluation, le renforcement de la gouvernance et la mise à l'échelle avec le CDC.
L'architecture détermine la pertinence, la latence et le coût. La recherche hybride est la norme en production pour la plupart des expériences de recherche modernes, et la modélisation des données fixe le niveau de qualité maximal. Les systèmes qui mesurent les résultats, appliquent une gouvernance rigoureuse et itèrent avec discipline sont plus performants que les architectures qui privilégient uniquement la nouveauté.
La sécurité est une responsabilité partagée au sein d'une organisation et avec ses partenaires. Un contrôle d'accès strict, une gestion rigoureuse des données et une surveillance continue réduisent les risques, mais ces mesures ne sont efficaces que si la plateforme et le modèle opérationnel les rendent applicables à grande échelle. Choisir le bon partenaire est crucial, car cela influe sur la rapidité avec laquelle les équipes peuvent déployer leurs solutions en toute sécurité, ajuster leur pertinence avec précision et maintenir des performances stables malgré la croissance de l'utilisation.
Demandez une démonstration de la solution de recherche IA d'Algolia sur algolia.com/demorequest ou consultez la documentation sur algolia.com/blog/ai/