Amazon Kendra 從 2026 年 7 月 30 日開始, 將不再開放給新客戶。如果您想要使用 服務,請在 7 月 30 日之前註冊。對於類似 的功能 Amazon Kendra,探索 Amazon Bedrock 知識庫。進一步了解。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Kendra 可用性變更
概觀
在仔細考慮之後,我們決定 Amazon Kendra 進入維護模式,自 2026 年 6 月 30 日起生效。截至目前為止,該服務不會有新功能或功能開發,截至 2026 年 7 月 30 日,該服務將停止接受新客戶。
在維護模式中,服務仍然受到完全支援,並且 AWS 會繼續為現有客戶提供錯誤修正和安全性更新,但不會再考慮新的功能請求。
我們建議客戶遷移其 Kendra 應用程式,並在 Amazon Bedrock 受管知識庫 (BMKB) 上實作任何新的搜尋應用程式,以取得與 Kendra 類似的功能,並在生成式 AI 和代理式 AI 使用案例中實作更進階的功能。Bedrock 受管知識庫是一種全受管 RAG 解決方案,具有內建連接器、智慧剖析、具有混合搜尋的受管向量存放區,以及能夠產生回應 (使用擷取和產生 API) 並跨多個知識庫執行多步驟推理 (使用代理程式擷取 API)。BMKB 也可讓您調整區塊策略和內嵌模型,以針對特定應用程式進行最佳化,以及選擇回應產生的基礎模型。此新層級的功能和彈性根據擷取的知識庫大小、執行的查詢數量和 LLM 使用量,帶來可預測的成本。
遷移指引
對於大多數企業搜尋和 RAG 工作負載而言,從 遷移 Amazon Kendra 到 Amazon Bedrock 受管知識庫 (BMKB) 是可以實現的,但有一些仔細的規劃。並非所有 Kendra 功能都可以直接在 Bedrock 受管知識庫中使用,但許多功能可以透過解決方法實作。本指南提供全面的step-by-step遷移路徑,讓現有 Kendra 客戶將其應用程式轉換為 BMKB,包括架構映射、API 轉譯、程式碼範例、功能差距分析和建議的解決方法。
Amazon Bedrock 受管知識庫功能
BMKB 會end-to-end管理整個 RAG 管道。它支援內嵌模型,包括 Amazon Titan Text Embeddings V2、Cohere Embed English v3、Cohere Embed Multilingual v3、Cohere Embed v4 和 Amazon Nova Multimodal Embeddings,所有模型都固定為具有 float32 向量的 1024 維度。受管向量存放區完全由 Bedrock 操作,無需佈建或管理 OpenSearch、Aurora 或其他向量資料庫。區塊策略包括預設 (固定大小約 300 個字符)、固定大小 (可設定的 maxTokens 和 overlapPercentage)、階層式 (具有層級組態的父子) 和無區塊化;受管知識庫不支援語意區塊化。
BMKB 目前支援七個資料來源連接器:Amazon S3、Confluence、Microsoft SharePoint、Web Crawler、Google Drive、Microsoft OneDrive 和自訂連接器。服務一律執行混合式搜尋 (關鍵字加上語意),而且不提供僅語意搜尋模式。
| 功能 | Kendra | Bedrock 受管知識庫 |
|---|---|---|
| 原生連接器 | 32 個以上的連接器 | 7 個連接器 |
| 嵌入項目 | 在內部受管 | 客戶可選 (Titan V2、Cohere、Nova) |
| 向量存放區 | 在內部受管 | 完全由 Bedrock 管理 |
| 搜尋類型 | 關鍵字、語意或混合 | 混合 (關鍵字 + 語意) |
| RAG 支援 | 需要外部 LLM 整合 | 原生 RetrieveAndGenerate API |
| 代理程式擷取 | 不適用 | 原生多迭代擷取 |
| 最大結果 | 100 個段落 (擷取 API) | 100 個結果 (擷取 API) |
遷移步驟
Amazon Bedrock 受管知識庫設定
步驟 1:設定 IAM 角色
建立 IAM 角色,授予 Bedrock 存取資料來源和叫用內嵌模型的許可。信任政策必須允許 bedrock.amazonaws.com 擔任角色,且許可政策必須包含對 S3 儲存貯體和所選內嵌模型的存取權。
IAM 組態 (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) )
步驟 2:建立受管知識庫
使用類型為 MANAGED 的 CreateKnowledgeBase API 來建立知識庫:
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}")
步驟 3:設定資料來源
使用 受管連接器組態建立 S3 資料來源:
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}")
注意
受管知識庫的 CreateDataSource 是非同步的。資料來源狀態會從 CREATING 轉換為 Available,通常在 2-5 分鐘內。在狀態為可用之前,請勿繼續擷取。
步驟 4:啟動和監控擷取
觸發文件擷取和輪詢以完成:
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)
API 遷移映射和程式碼範例
API 操作映射
| 作業 | Kendra API | BMKB API | 用戶端 |
|---|---|---|---|
| 建立索引/KB | kendra.create_index() | bedrock-agent.create_knowledge_base() | kendra → bedrock-agent |
| 新增資料來源 | kendra.create_data_source(Type="S3") | bedrock-agent.create_data_source() | kendra → bedrock-agent |
| 同步/擷取文件 | kendra.start_data_source_sync_job() | bedrock-agent.start_ingestion_job() | kendra → bedrock-agent |
| 批次新增文件 | kendra.batch_put_document() | 未直接支援 (使用 S3 上傳 + 擷取) | kendra → S3 + bedrock-agent |
| 擷取段落 | kendra.retrieve(QueryText=...) | bedrock-agent-runtime.retrieve() | kendra → bedrock-agent-runtime |
| 使用篩選條件搜尋 | AttributeFilter:{"EqualsTo":{...}} | 篩選條件:{"equals": {...}} | 相同的模式、不同的語法 |
| RAG 產生 | 不適用 (需要外部 LLM) | bedrock-agent-runtime.retrieve_and_generate() | 新功能 |
遷移擷取 API
之前 (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"])
After (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']}")
主要差異為:查詢文字從頂層參數移至巢狀 retrievalQuery.text 欄位;AttributeFilter 在 managedSearchConfiguration 中成為篩選條件;結果包含相關性分數欄位。
針對 RAG 使用 RetrieveAndGenerate
BMKB 提供原生 RAG 功能,無需在擷取後單獨呼叫 LLM:
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']}")
此 API 會傳回產生的自然語言回應,以及指向來源文件的引文,提供 Kendra 原生不提供的內建 RAG。
中繼資料篩選條件語法轉譯
| Kendra AttributeFilter | BMKB 篩選條件 | 備註 |
|---|---|---|
| EqualsTo | equals | 直接映射 |
| ContainsAll | 中的 (部分) | BMKB 使用集合成員資格 |
| ContainsAny | in | 直接映射 |
| GreaterThan | greaterThan | 直接映射 |
| LessThan | lessThan | 直接映射 |
| GreaterThanOrEquals | greaterThanOrEquals | 直接映射 |
| LessThanOrEquals | lessThanOrEquals | 直接映射 |
| NotFilter | notIn / notEquals | 使用適當的否定 |
| AndAllFilters | andAll | 直接映射 |
| OrAllFilters | orAll | 直接映射 |
注意
BMKB 不支援 startsWith 或 stringContains 運算子用於受管知識庫。如果您的 Kendra 應用程式在篩選條件中使用萬用字元或子字串比對,您將需要重新建構中繼資料結構描述,以改用完全比對或設定成員身分模式。
特徵差距和解決方法
並非所有 Kendra 功能都可在 BMKB 中使用。查詢建議、面向搜尋、自訂同義詞、拼字檢查、增量學習和文件豐富是需要 BMKB 解決方法的功能。本節討論這些解決方法。
- 查詢建議 (自動完成)
-
Kendra 提供 GetQuerySuggestions API,根據索引文件詞彙傳回自動完成建議。BMKB 目前不提供此功能。
解決方法:使用 Amazon OpenSearch Service 搭配其內建建議程式功能來實作自訂自動完成層,或使用 LLM 型查詢完成服務。您也可以利用 Bedrock 代理程式在擷取之前重新格式化部分查詢。實際方法是維護從文件庫中擷取的常見查詢詞彙的個別 OpenSearch 索引,並在叫用 BMKB 擷取之前,從您的前端呼叫其建議 API。
- 面向搜尋
-
Kendra 透過查詢 API 中的面向參數支援文件屬性面向,每個面向最多可顯示 10 個面向值與文件計數。BMKB 的架構不支援面向搜尋。
解決方法:使用中繼資料篩選來模擬面向導覽。在 .metadata.json 附屬檔案中標記具有結構化中繼資料屬性 (部門、作者、文件類型、日期範圍) 的文件。根據您的已知中繼資料結構描述,在您的應用程式 UI 中呈現篩選條件選項,並在查詢時套用對應的篩選條件運算子。雖然這不提供動態面向計數,但可讓使用者依類別縮小結果範圍:
# 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"}} ] } } } ) - 自訂同義詞
-
Kendra 允許建置業務特定術語的自訂映射,這些術語映射到其他術語,以便透過saurus 檔案比對搜尋結果。BMKB 目前不支援自訂同義詞。
解決方法:在 BMKB 查詢前建置輕量型同義詞擴展服務:
-
維護現有的 Kendra thesaurus 檔案 (或 DynamoDB/S3 中的同義詞字典)
-
呼叫 BMKB Retrieve 或 RetrieveAndGenerate API 之前,請透過附加相符的同義詞來展開使用者的查詢
-
範例:如果使用者查詢「DNS 問題」,您的應用程式會將其重寫為「DNS Route53 問題」,再傳送至 BMKB
這尤其有效,因為 BMKB 一律使用混合搜尋 (關鍵字 + 語意),因此在查詢文字中新增同義詞詞彙將同時符合關鍵字和語意維度。
-
- 拼字檢查
-
Kendra 會透過 SpellCorrectionConfiguration 根據索引文件詞彙提供自動拼字修正。BMKB 目前不支援拼字檢查。
解決方法:在將查詢傳送至 BMKB 之前新增預處理層。使用 AWS Lambda 函數呼叫拼字修正程式庫 (例如 SymSpell 或 TextBlob) 或呼叫 LLM 進行查詢修正:
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}} ) - 增量學習
-
Kendra 支援 SubmitFeedback API 的點擊率訊號和相關性意見回饋,以改善隨著時間的排名。BMKB 不提供此功能。
解決方法:使用 BMKB 的重新排名模型來改善查詢時間的相關性。建置自訂意見回饋迴圈,將使用者點選和評分訊號存放在外部資料存放區 (例如 DynamoDB),並使用這些訊號來調整中繼資料提升權重或重新排名參數。如需長期改善,請考慮根據收集的相關性意見回饋定期微調內嵌模型。
- 自訂文件擴充
-
Kendra 支援擷取前和擷取後 Lambda 勾點,可在擷取期間操作文件內容和中繼資料。BMKB 使用智慧剖析處理文件,但不提供同等的 Lambda 掛鉤。
解決方法:使用 AWS Step Functions 或 Lambda 實作預先處理管道,在將文件放入 S3 進行 BMKB 擷取之前轉換文件。此管道可以在文件到達 BMKB 資料來源儲存貯體之前執行內容擷取、中繼資料擴充、PII 修訂或格式轉換。
資料來源遷移策略
連接器涵蓋範圍差距
Kendra 支援 32 個原生連接器,而 BMKB 支援 7。對於 BMKB 未直接支援的資料來源,建議的方法是將內容匯出至 Amazon S3,並在 BMKB 中設定 S3 資料來源。
不支援連接器的遷移模式:建立自動化管道 (使用 AWS Lambda、Step Functions 或 Amazon EventBridge Scheduler),透過其 API 定期從來源系統擷取內容、使用適當的中繼資料 JSON 附屬檔案將文件寫入 S3 儲存貯體,並觸發 BMKB 擷取任務。這會複寫 Kendra 連接器的定期同步行為。
中繼資料遷移
Kendra 文件屬性必須翻譯為 BMKB 中繼資料格式。在 Kendra 中,屬性是在索引層級定義,並在擷取期間附加至文件。在 BMKB 中,中繼資料是透過與 S3 中的來源文件一起存放的 .metadata.json 附屬檔案來定義,每個檔案的大小上限為 10 KB。每個屬性都必須輸入為 STRING、NUMBER 或 BOOLEAN。
區塊策略選擇
從 Kendra 遷移 (內部處理區塊) 時,您必須明確選擇 BMKB 的區塊策略。對於大多數遷移案例,具有 200 個字符和 30% 重疊的固定大小策略提供了良好的起點。如果您的文件具有明確的階層結構 (章節、區段、子區段),請考慮階層區塊,以改善廣泛內容和特定詳細資訊的擷取。
測試和驗證
若要評估效能,請平行執行 Kendra 和 BMKB。將相同的查詢傳送至這兩個服務,並使用下列維度比較結果:相關性品質 (以 NDCG 或 MRR 與黃金測試組測量)、延遲 (p50、p95、p99 回應時間)、輸送量 (負載下每秒查詢數) 和完整性 (擷取預期文件的百分比)。
建立評估擷取品質的測試機制:
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
在將生產流量切換到 BMKB 之前,請確認下列項目:所有資料來源都已擷取且up-to-date且沒有失敗的文件;中繼資料篩選條件會產生所有應用程式篩選條件模式的預期結果;存取控制解決方法會正確限制未經授權的存取;相關性基準符合或超過 Kendra 基準品質;應用程式錯誤處理會正確處理 BMKB 回應格式;以及針對 BMKB API 錯誤和延遲設定監控和提醒。
摘要
從 遷移 Amazon Kendra 至 Bedrock 受管知識庫需要兩個主要工作:將資料來源重新擷取至 BMKB,並重新撰寫應用程式程式碼以使用 BMKB APIs。雖然 BMKB 推出強大的 RAG 原生功能,包括 RetrieveAndGenerate 和代理程式擷取,但使用面向、查詢建議、自訂同義詞和增量學習等企業搜尋功能的客戶將需要實作解決方法,如本指南所述。
如有任何其他問題,請聯絡 AWS Support