Amazon Kendra ne sera plus ouvert aux nouveaux clients à compter du 30 juillet 2026. Si vous souhaitez utiliser le service, veuillez vous inscrire avant le 30 juillet. Pour des fonctionnalités similaires à Amazon Kendra, explorez les bases de connaissances Amazon Bedrock. En savoir plus.
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Amazon Kendra changement de disponibilité
Présentation de
Après mûre réflexion, nous avons pris la décision de passer Amazon Kendra en mode maintenance, à compter du 30 juin 2026. À cette date, aucune nouvelle fonctionnalité ou capacité ne sera développée pour le service, et à compter du 30 juillet 2026, le service cessera d'accepter de nouveaux clients.
Pendant le mode maintenance, le service reste entièrement pris en charge et AWS continuera à fournir des corrections de bogues et des mises à jour de sécurité aux clients existants, mais les demandes de nouvelles fonctionnalités ne seront plus prises en compte.
Nous recommandons aux clients de migrer leurs applications Kendra et d'implémenter toute nouvelle application de recherche sur Amazon Bedrock Managed Knowledge Base (BMKB) afin d'obtenir des fonctionnalités similaires à celles de Kendra et des fonctionnalités plus avancées pour les cas d'utilisation de l'IA générative et de l'IA agentique. Bedrock Managed Knowledge Base est une solution RAG entièrement gérée, dotée de connecteurs intégrés, d'une analyse intelligente, d'un magasin vectoriel géré avec recherche hybride, ainsi que de la possibilité de générer des réponses (avec une API de récupération et de génération) et d'effectuer un raisonnement en plusieurs étapes sur plusieurs bases de connaissances (avec une API de récupération agentic). Le BMKB vous permet également d'ajuster les stratégies de segmentation et d'intégration des modèles afin de les optimiser pour votre application spécifique, ainsi que de choisir le modèle de base pour la génération de réponses. Ce nouveau niveau de fonctionnalités et de flexibilité s'accompagne de coûts prévisibles basés sur la taille de la base de connaissances ingérée, le nombre de requêtes effectuées et l'utilisation du LLM.
Conseils de migration
La migration depuis Amazon Kendra Amazon Bedrock Managed Knowledge Base (BMKB) est réalisable pour la plupart des charges de travail de recherche et RAG d'entreprise, moyennant une planification minutieuse. Toutes les fonctionnalités de Kendra ne sont pas directement disponibles dans la base de connaissances gérée de Bedrock, mais bon nombre d'entre elles peuvent être mises en œuvre grâce à des solutions de contournement. Ce guide fournit un processus de migration complet, étape par étape, permettant aux clients existants de Kendra de faire migrer leurs applications vers BMKB, y compris le mappage de l'architecture, la traduction d'API, des exemples de code, une analyse des lacunes en matière de fonctionnalités et des solutions de contournement recommandées.
Fonctionnalités de la base de connaissances gérée Amazon Bedrock
BMKB gère l'ensemble du pipeline RAG de bout en bout. Il prend en charge des modèles d'intégration tels qu'Amazon Titan Text Embeddings V2, Cohere Embed English v3, Cohere Embed Multilingual v3, Cohere Embed v4 et Amazon Nova Multimodal Embeddings, tous fixés à 1024 dimensions avec des vecteurs float32. Le magasin vectoriel géré est entièrement géré par Bedrock, ce qui élimine le besoin de provisionner ou de gérer OpenSearch Aurora ou d'autres bases de données vectorielles. Les stratégies de segmentation incluent Default (taille fixe à environ 300 jetons), (MaxTokens et OverlapPercentage configurables), Hierarchical Fixed-size (parent-enfant avec configurations de niveau) et No Chunking ; le découpage sémantique n'est pas pris en charge pour les bases de connaissances gérées.
BMKB prend actuellement en charge sept connecteurs de source de données : Amazon S3, Confluence SharePoint, Microsoft, Web Crawler, Google Drive OneDrive, Microsoft et un connecteur personnalisé. Le service effectue toujours une recherche hybride (mot clé plus sémantique) et ne propose pas de mode de recherche uniquement sémantique.
| Fonctionnalité | Kendra | Base de connaissances gérée Bedrock |
|---|---|---|
| Connecteurs natifs | Plus de 32 connecteurs | 7 connecteurs |
| Vectorisation | Géré en interne | Customer-selectable (Titan V2, Cohere, Nova) |
| Boutique vectorielle | Géré en interne | Entièrement géré par Bedrock |
| Type de recherche | Mot-clé, sémantique ou hybride | Hybride (mot-clé+sémantique) |
| Support RAG | Nécessite une intégration LLM externe | RetrieveAndGenerate API native |
| Récupération par agent | Non disponible | Récupération native à plusieurs itérations |
| Résultats maximaux | 100 passages (API de récupération) | 100 résultats (API de récupération) |
Etapes de la migration
Configuration de la base de connaissances gérée Amazon Bedrock
Étape 1 : Configuration des rôles IAM
Créez un rôle IAM qui autorise Bedrock à accéder à vos sources de données et à invoquer des modèles d'intégration. La politique de confiance doit autoriser bedrock.amazonaws.com à assumer le rôle, et la politique d'autorisation doit inclure l'accès à vos compartiments S3 et au modèle d'intégration sélectionné.
Configuration IAM (code Python) :
import boto3 import json iam = boto3.client('iam') trust_policy = { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": "bedrock.amazonaws.com"}, "Action": "sts:AssumeRole" }] } iam.create_role( RoleName="BedrockKBRole", AssumeRolePolicyDocument=json.dumps(trust_policy), Description="Role for Bedrock Managed Knowledge Base" ) permissions_policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Effect": "Allow", "Action": ["bedrock:InvokeModel"], "Resource": ["arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0"] } ] } iam.put_role_policy( RoleName="BedrockKBRole", PolicyName="BedrockKBPermissions", PolicyDocument=json.dumps(permissions_policy) )
Étape 2 : Création d'une base de connaissances gérée
Utilisez l' CreateKnowledgeBase API de type MANAGED pour créer la base de connaissances :
import boto3 bedrock_agent = boto3.client("bedrock-agent", region_name="us-east-1") response = bedrock_agent.create_knowledge_base( name="my-managed-kb", description="Migrated from Kendra index", roleArn="arn:aws:iam::123456789012:role/BedrockKBRole", knowledgeBaseConfiguration={ "type": "MANAGED", "managedKnowledgeBaseConfiguration": { "embeddingModelArn": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0", "embeddingModelConfiguration": { "bedrockEmbeddingModelConfiguration": { "embeddingDataType": "FLOAT32" } } } } ) kb_id = response["knowledgeBase"]["knowledgeBaseId"] print(f"Created knowledge base: {kb_id}")
Étape 3 : Configuration des sources de données
Créez une source de données S3 avec la configuration du connecteur géré :
response = bedrock_agent.create_data_source( knowledgeBaseId=kb_id, name="my-s3-data-source", description="Product documentation from S3", dataSourceConfiguration={ "type": "MANAGED_KNOWLEDGE_BASE_CONNECTOR", "managedKnowledgeBaseConnectorConfiguration": { "connectorParameters": { "type": "S3", "version": "1", "connectionConfiguration": { "bucketName": "your-bucket-name", "bucketOwnerAccountId": "123456789012" }, "filterConfiguration": { "inclusionPrefixes": ["documents/"] } } } }, vectorIngestionConfiguration={ "parsingConfiguration": { "parsingStrategy": "SMART_PARSING" } } ) data_source_id = response["dataSource"]["dataSourceId"] print(f"Created data source: {data_source_id}")
Note
CreateDataSource est asynchrone pour les bases de connaissances gérées. L'état de la source de données passe de CREATING à DISPONIBLE, généralement en 2 à 5 minutes. Ne procédez pas à l'ingestion tant que le statut n'est pas DISPONIBLE.
Étape 4 : démarrer et surveiller l'ingestion
Déclenchez l'ingestion du document et interrogez-le pour le terminer :
import time ingestion_response = bedrock_agent.start_ingestion_job( knowledgeBaseId=kb_id, dataSourceId=data_source_id, description="Initial ingestion" ) ingestion_job_id = ingestion_response["ingestionJob"]["ingestionJobId"] print(f"Started ingestion job: {ingestion_job_id}") while True: job_response = bedrock_agent.get_ingestion_job( knowledgeBaseId=kb_id, dataSourceId=data_source_id, ingestionJobId=ingestion_job_id ) job = job_response["ingestionJob"] status = job["status"] stats = job.get("statistics", {}) print(f"Status: {status} | Scanned: {stats.get('numberOfDocumentsScanned', 0)} | " f"Indexed: {stats.get('numberOfNewDocumentsIndexed', 0)} | " f"Failed: {stats.get('numberOfDocumentsFailed', 0)}") if status == "COMPLETE": print("Ingestion complete!") break elif status in ("FAILED", "STOPPED"): print(f"Ingestion {status}: {job.get('failureReasons', [])}") break time.sleep(30)
Cartographie de migration d'API et exemples de code
Cartographie des opérations d'API
| Opération | API Kendra | API BMKB | Client |
|---|---|---|---|
| Créez index/KB | kendra.create_index () | bedrock-agent.create_knowledge_base () | kendra → agent de base |
| Ajouter une source de données | kendra.create_data_source (Type="S3 ») | bedrock-agent.create_data_source () | kendra → agent de base |
| Sync/ingest documents | kendra.start_data_source_sync_job () | bedrock-agent.start_ingestion_job () | kendra → agent de base |
| Ajouter des documents par lots | kendra.batch_put_document () | Non directement pris en charge (utilisez le téléchargement et l'ingestion S3) | kendra → agent de base S3 + |
| Récupérez des passages | kendra.retrieve (=...) QueryText | bedrock-agent-runtime.retrieve () | kendra → bedrock-agent-runtime |
| Recherche à l'aide de filtres | AttributeFilter: {"EqualsTo": {...}} | filtre : {"est égal à » : {...}} | Même modèle, syntaxe différente |
| Génération RAG | N/A (LLM externe requis) | bedrock-agent-runtime.retrieve_and_generate () | Nouvelle capacité |
Migration de l'API Retrieve
Avant (Kendra) :
kendra_client = boto3.client("kendra") response = kendra_client.retrieve( IndexId="your-kendra-index-id", QueryText="How do I configure VPC endpoints?", AttributeFilter={ "EqualsTo": { "Key": "_category", "Value": {"StringValue": "networking"} } }, PageSize=10 ) for item in response["ResultItems"]: print(item["DocumentTitle"]) print(item["Content"])
Après (BMKB) :
bedrock_runtime = boto3.client("bedrock-agent-runtime", region_name="us-east-1") response = bedrock_runtime.retrieve( knowledgeBaseId="your-kb-id", retrievalQuery={ "text": "How do I configure VPC endpoints?" }, retrievalConfiguration={ "managedSearchConfiguration": { "numberOfResults": 10, "filter": { "equals": { "key": "category", "value": "networking" } } } } ) for result in response["retrievalResults"]: print(f"Score: {result['score']}") print(f"Content: {result['content']['text']}") print(f"Source: {result['location']['s3Location']['uri']}")
Les principales différences sont les suivantes : le texte de la requête passe d'un paramètre de haut niveau à un Query.text champ de récupération imbriqué ; AttributeFilter il devient filtré dans le cadre de la commande managé SearchConfiguration ; et les résultats incluent un champ de score de pertinence.
Utilisation RetrieveAndGenerate pour RAG
Le BMKB fournit une fonctionnalité RAG native qui élimine le besoin d'appeler séparément un LLM après la récupération :
response = bedrock_runtime.retrieve_and_generate( input={ "text": "Explain how to configure VPC endpoints for S3 access" }, retrieveAndGenerateConfiguration={ "type": "KNOWLEDGE_BASE", "knowledgeBaseConfiguration": { "knowledgeBaseId": "your-kb-id", "modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0", "retrievalConfiguration": { "managedSearchConfiguration": { "numberOfResults": 5 } } } } ) # Generated answer with citations print(response["output"]["text"]) # Source citations for citation in response.get("citations", []): for ref in citation.get("retrievedReferences", []): print(f"Source: {ref['location']['s3Location']['uri']}")
Cette API renvoie une réponse en langage naturel générée ainsi que des citations pointant vers les documents sources, fournissant ainsi un RAG intégré que Kendra ne propose pas de manière native.
Traduction de la syntaxe du filtre de métadonnées
| Kendra AttributeFilter | Filtre BMKB | Remarques |
|---|---|---|
| EqualsTo | equals | Cartographie directe |
| ContainsAll | dans (partiel) | Le BMKB utilise une adhésion définie |
| ContainsAny | in | Cartographie directe |
| GreaterThan | greaterThan | Cartographie directe |
| LessThan | lessThan | Cartographie directe |
| GreaterThanOrEquals | plus grand ThanOrEquals | Cartographie directe |
| LessThanOrEquals | moins ThanOrEquals | Cartographie directe |
| NotFilter | Pas dedans//Pas égal | Utiliser une négation appropriée |
| AndAllFilters | andAll | Cartographie directe |
| OrAllFilters | orAll | Cartographie directe |
Note
BMKB ne prend pas en charge les opérateurs StartsWith ou StringContains pour les bases de connaissances gérées. Si votre application Kendra utilise des caractères génériques ou des sous-chaînes de correspondance dans les filtres, vous devrez restructurer votre schéma de métadonnées pour utiliser plutôt des modèles de correspondance exacte ou d'appartenance à un ensemble.
Lacunes dans les fonctionnalités et solutions
Toutes les fonctionnalités de Kendra ne sont pas disponibles dans BMKB. Les suggestions de requêtes, la recherche à facettes, les synonymes personnalisés, la vérification orthographique, l'apprentissage progressif et l'enrichissement des documents sont des fonctionnalités qui nécessitent des solutions de contournement dans BMKB. Cette section décrit ces solutions de contournement.
- Suggestions de requêtes (saisie semi-automatique)
-
Kendra fournit l' GetQuerySuggestions API qui renvoie des suggestions de saisie semi-automatique basées sur le vocabulaire des documents indexés. BMKB ne propose pas cette fonctionnalité pour le moment.
Solution : implémentez une couche de saisie semi-automatique personnalisée à l'aide d'Amazon OpenSearch Service avec sa fonctionnalité de suggestion intégrée, ou utilisez un service de saisie des LLM-based requêtes. Vous pouvez également utiliser Bedrock Agents pour reformuler des requêtes partielles avant leur extraction. Une approche pratique consiste à maintenir un OpenSearch index distinct des termes de requête courants extraits de votre corpus de documents et à appeler son API de suggestion depuis votre interface avant d'appeler la récupération BMKB.
- Recherche à facettes
-
Kendra prend en charge les facettes des attributs du document via le paramètre Facets de l'API Query, qui affiche jusqu'à 10 valeurs de facettes par facette avec le nombre de documents. L'architecture du BMKB ne prend pas en charge la recherche à facettes.
Solution : simulez une navigation à facettes à l'aide du filtrage des métadonnées. Marquez les documents avec des attributs de métadonnées structurés (département, auteur, type de document, plage de dates) dans les fichiers annexes .metadata.json. Présentez les options de filtre dans l'interface utilisateur de votre application en fonction de votre schéma de métadonnées connu et appliquez les opérateurs de filtre correspondants au moment de la requête. Bien que cela ne fournisse pas un décompte dynamique des facettes, cela permet aux utilisateurs de restreindre les résultats par catégorie :
# Simulating faceted search with metadata filters response = bedrock_runtime.retrieve( knowledgeBaseId="your-kb-id", retrievalQuery={"text": "security best practices"}, retrievalConfiguration={ "managedSearchConfiguration": { "numberOfResults": 10, "filter": { "andAll": [ {"equals": {"key": "department", "value": "engineering"}}, {"equals": {"key": "doc_type", "value": "policy"}} ] } } } ) - Synonymes personnalisés
-
Kendra permet de créer un mappage personnalisé de termes spécifiques à l'entreprise qui sont mappés à d'autres termes pour faire correspondre les résultats de recherche via un fichier de thésaurus. BMKB ne prend actuellement pas en charge les synonymes personnalisés.
Solution : créez un service d'extension de synonymes léger devant vos requêtes BMKB :
-
Conservez votre fichier de thésaurus Kendra existant (ou un dictionnaire de synonymes dans) DynamoDB/S3
-
Avant d'appeler le BMKB Retrieve ou RetrieveAndGenerate l'API, étendez la requête de l'utilisateur en ajoutant des synonymes correspondants
-
Exemple : si l'utilisateur demande « Problèmes DNS », votre application la réécrit en « Problèmes DNS Route53 » avant de l'envoyer à BMKB
Cela fonctionne particulièrement bien car BMKB utilise toujours la recherche hybride (mot-clé et sémantique), de sorte que l'ajout de termes synonymes au texte de la requête correspondra à la fois aux dimensions du mot clé et à la sémantique.
-
- Correcteur orthographique
-
Kendra fournit des corrections orthographiques automatiques basées sur le vocabulaire du document indexé via. SpellCorrectionConfiguration BMKB ne prend actuellement pas en charge la vérification orthographique.
Solution : ajoutez une couche de prétraitement avant d'envoyer des requêtes à BMKB. Utilisez une fonction AWS Lambda qui invoque une bibliothèque de correction orthographique (telle que SymSpell ou TextBlob) ou appelle un LLM pour corriger les requêtes :
import boto3 lambda_client = boto3.client("lambda") def correct_and_retrieve(query_text, kb_id): # Step 1: Spell-correct the query using a Lambda function correction_response = lambda_client.invoke( FunctionName="spell-correction-function", Payload=json.dumps({"query": query_text}) ) corrected_query = json.loads(correction_response["Payload"].read())["corrected"] # Step 2: Query BMKB with corrected text bedrock_runtime = boto3.client("bedrock-agent-runtime") return bedrock_runtime.retrieve( knowledgeBaseId=kb_id, retrievalQuery={"text": corrected_query}, retrievalConfiguration={"managedSearchConfiguration": {"numberOfResults": 5}} ) - Apprentissage progressif
-
Kendra prend en charge l' SubmitFeedback API pour les signaux de clics et les commentaires de pertinence afin d'améliorer le classement au fil du temps. BMKB ne propose pas cette fonctionnalité.
Solution : utilisez les modèles de reclassement du BMKB pour améliorer la pertinence au moment de la requête. Créez une boucle de rétroaction personnalisée qui stocke les signaux de clic et d'évaluation des utilisateurs dans un magasin de données externe (tel que DynamoDB), et utilisez ces signaux pour ajuster les pondérations d'augmentation des métadonnées ou les paramètres de reclassement. Pour une amélioration à long terme, pensez à peaufiner régulièrement votre modèle d'intégration en fonction des commentaires de pertinence collectés.
- Enrichissement personnalisé des documents
-
Kendra prend en charge les hooks Lambda de pré-extraction et de post-extraction qui manipulent le contenu et les métadonnées des documents lors de l'ingestion. BMKB utilise Smart Parsing pour le traitement des documents mais ne propose pas de hooks Lambda équivalents.
Solution : implémentez un pipeline de prétraitement à l'aide de AWS Step Functions ou Lambda qui transforme les documents avant qu'ils ne soient placés dans S3 pour l'ingestion de BMKB. Ce pipeline peut effectuer l'extraction de contenu, l'enrichissement des métadonnées, la rédaction des informations personnelles ou la conversion de format avant que les documents n'atteignent le compartiment de sources de données BMKB.
Stratégie de migration des sources de données
Écart de couverture du connecteur
Kendra supporte 32 connecteurs natifs tandis que BMKB en supporte 7. Pour les sources de données qui ne sont pas directement prises en charge par BMKB, l'approche recommandée consiste à exporter le contenu vers Amazon S3 et à configurer une source de données S3 dans BMKB.
Modèle de migration pour les connecteurs non pris en charge : créez un pipeline automatique (à l'aide de AWS Lambda, Step Functions ou EventBridge Amazon Scheduler) qui extrait régulièrement le contenu du système source via son API, écrit des documents dans un compartiment S3 avec des fichiers annexes JSON de métadonnées appropriés et déclenche une tâche d'ingestion BMKB. Cela reproduit le comportement de synchronisation périodique des connecteurs Kendra.
Migration des métadonnées
Les attributs du document Kendra doivent être traduits au format de métadonnées BMKB. Dans Kendra, les attributs sont définis au niveau de l'index et attachés aux documents lors de l'ingestion. Dans BMKB, les métadonnées sont définies via des fichiers annexes .metadata.json stockés avec les documents sources dans S3, avec une taille maximale de 10 Ko par fichier. Chaque attribut doit être saisi sous la forme STRING, NUMBER ou BOOLEAN.
Sélection de la stratégie de segmentation
Lorsque vous migrez depuis Kendra (qui gère le découpage en interne), vous devez choisir explicitement une stratégie de segmentation pour BMKB. Pour la plupart des scénarios de migration, la Fixed-size stratégie avec 200 jetons et 30 % de chevauchement constitue un bon point de départ. Si vos documents ont une structure hiérarchique claire (chapitres, sections, sous-sections), envisagez le découpage hiérarchique pour une meilleure récupération du contexte général et des détails spécifiques.
Tests et validation
Pour évaluer les performances, exécutez Kendra et BMKB en parallèle. Envoyez des requêtes identiques aux deux services et comparez les résultats en utilisant les dimensions suivantes : qualité de pertinence (mesurée par le NDCG ou MRR par rapport à un ensemble de tests de référence), latence (temps de réponse p50, p95, p99), débit (requêtes par seconde sous charge) et exhaustivité (pourcentage de documents attendus récupérés).
Créez un harnais de test qui évalue la qualité de l'extraction :
def compare_retrieval(query, kendra_index_id, bmkb_kb_id): # Query Kendra kendra_results = kendra_client.retrieve( IndexId=kendra_index_id, QueryText=query, PageSize=10 ) # Query BMKB bmkb_results = bedrock_runtime.retrieve( knowledgeBaseId=bmkb_kb_id, retrievalQuery={"text": query}, retrievalConfiguration={ "managedSearchConfiguration": {"numberOfResults": 10} } ) # Compare overlap in top-10 results kendra_docs = {r["DocumentId"] for r in kendra_results["ResultItems"]} bmkb_docs = {r["location"]["s3Location"]["uri"] for r in bmkb_results["retrievalResults"]} overlap = len(kendra_docs.intersection(bmkb_docs)) print(f"Query: {query}") print(f"Result overlap: {overlap}/10 documents in common") return overlap
Avant de transférer le trafic de production vers BMKB, vérifiez les points suivants : toutes les sources de données sont ingérées et mises à jour sans aucun document défaillant ; les filtres de métadonnées produisent les résultats attendus pour tous les modèles de filtres d'applications ; les solutions de contrôle d'accès limitent correctement les accès non autorisés ; les critères de pertinence atteignent ou dépassent la qualité de référence de Kendra ; la gestion des erreurs d'application traite correctement les formats de réponse BMKB ; et la surveillance et les alertes sont configurées pour les erreurs et la latence des API BMKB.
Résumé
La migration depuis Amazon Kendra Bedrock Managed Knowledge Base nécessite deux efforts principaux : réingérer les sources de données dans BMKB et réécrire le code de l'application pour utiliser les API BMKB. Bien que BMKB intègre de puissantes RAG-native fonctionnalités, notamment RetrieveAndGenerate la récupération agentique, les clients utilisant des fonctionnalités de recherche d'entreprise telles que le facettage, les suggestions de requêtes, les synonymes personnalisés et l'apprentissage progressif devront mettre en œuvre des solutions de contournement décrites dans ce guide.
Veuillez contacter AWS
le Support pour