View a markdown version of this page

Amazon Kendra 可用性變更 - Amazon Kendra

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 和自訂連接器。服務一律執行混合式搜尋 (關鍵字加上語意),而且不提供僅語意搜尋模式。

Amazon Kendra 與 Bedrock 受管知識庫之間的架構比較
功能 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 到 BMKB 的 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