AIの進化スピードに驚かされる毎日です。
生成AIだけでなく、データ活用の仕組みもどんどん進化していますね。
今回は、昨年12月にサポートされたBedrock Knowledge Basesのカスタムデータソースとドキュメントの直接取り込みAPIを試してみたいと思います!
1. はじめに
RAG(Retrieval-Augmented Generation)の活用も広がっている中、ナレッジベースの情報を最新に保つことは非常に重要です。
しかしながら、以下のようなことがよく課題となることがあります。
- データソース全体の同期が必要なため、処理に時間がかかる
- リアルタイムに最新情報を反映しにくい
- Bedrock Knowledge Basesでサポートされていないデータソースは連携に手間がかかる
上記のような課題を解決するのに、カスタムデータソースと直接取り込みAPIが有効です。
この記事では、これらの機能を実際に試してみた内容を紹介します。
2. カスタムデータソース+直接取り込みAPIの概要とメリット
カスタムコネクタとは?
従来のナレッジベースでは、S3など限られたデータソースからのみしかドキュメントを取り込めませんでした。
たとえば、Google Driveなどの未対応のデータソースからドキュメントを取り込むには、一度ドキュメントをS3などのサポートされているデータソースにコピーしてから取り込むという手間のかかる中間処理が必要でした。
これにより、データの取り込みが遅くなる、運用工数が増える、などの問題が発生していました。
しかし、カスタムコネクタのサポートによりS3などを経由せずにAPI経由で任意の外部データソースから直接ドキュメントを取り込めるようになりました!
ドキュメントの直接取り込みとは?
従来のナレッジベースでは、取り込んだ最新のドキュメントを参照するためにデータソースとナレッジベースのデータ同期処理を行う必要がありました。
これは、たとえばニュースなどの頻繁に更新されるようなデータを扱う場合に定期的にデータ同期処理を行うことになり不便です。
しかし、ナレッジベースへのドキュメントの直接取り込みが対応されたことで、ナレッジベースとデータソースの定期的な同期処理が不要になり、ドキュメント取り込みのリアルタイム性・効率性が確保され、常に最新のデータをユーザに提供できるようになりました!
2つの機能の概要をまとめると以下のようになります。

| 従来 | カスタムデータソース+直接取り込みAPI適用後 |
| 未対応のデータソースはS3などに一時取り込みが必要 | ドキュメントを任意のデータソースから取り込み可能 |
| データソースとの同期が必要 | ドキュメントを直接取り込めてほぼリアルタイムに反映可能 |
3. 実際に試してみる
ドキュメントの直接取り込み機能は以下の表の組み合わせで利用可能です。
ここでは、カスタムデータソースを利用してインライン定義したドキュメントの投入(表の左下)を試してみます。
| データソース | インライン定義されたドキュメント | S3に格納されているドキュメント |
| S3 | ❌ | ⭕️ |
| カスタム | ⭕️ | ⭕️ |
インライン定義されたドキュメントという言葉がイメージしづらいですが、
これはAPIのリクエストボディに直接ドキュメントの内容を指定することを指しています。
また、カスタムデータソースであってもS3にあるドキュメントを同期なしで取り込むことが可能になっています。
事前準備(ナレッジベースの作成)
AWSマネジメントコンソールからBedrockサービスの画面に移動し、ナレッジベースを作成します。
今回はカスタムデータソースを利用したいので、データソースの選択画面で「カスタム」を選択します。

AWSマネジメントコンソールからドキュメントを投入
作成したナレッジベースからデータソースの画面に遷移し、「Add documents」ドロップダウンから「Add document directly」を選択します。

投入するドキュメントの設定画面に遷移するので、サンプルのテキストデータをインラインで定義して追加してみます。
プレーンテキストかBase64エンコードされた文字列を指定できますが、今回は「サンプルデータです。」というプレーンテキストを入力しています。

ドキュメントが追加されたかどうかはナレッジベースのデータソースの画面からわかります。
ドキュメントの直接取り込み機能によって、データソースとの同期なしでナレッジベースにドキュメントを投入できていることを確認できました。

APIからドキュメントを投入
AWSマネジメントコンソールからだとドキュメント投入が手動作業になります。
実運用を考えてコードからAPIを呼び出す方法も確認しておきます。
この記事では、boto3を使ったPythonプログラムで試します。
boto3ではドキュメントの投入にingest_knowledge_base_documentsメソッドを使用します。
import uuid import boto3 bedrock_client = boto3.client("bedrock-agent") response = bedrock_client.ingest_knowledge_base_documents( knowledgeBaseId=<ナレッジーベースID>, dataSourceId=<データソースID>, documents=[ { "content": { "dataSourceType": "CUSTOM", "custom": { "customDocumentIdentifier": { "id": str(uuid.uuid4()), }, "sourceType": "IN_LINE", "inlineContent": { "type": "TEXT", "textContent": { "data": "サンプルデータです。", }, }, }, }, }, ], )
PDFなどのドキュメントは以下のようにinlineContentの内容をバイト用に変更することで投入できます。
response = bedrock_client.ingest_knowledge_base_documents(
knowledgeBaseId=<ナレッジーベースID>,
dataSourceId=<データソースID>,
documents=[
{
"content": {
"dataSourceType": "CUSTOM",
"custom": {
"customDocumentIdentifier": {
"id": str(uuid.uuid4()),
},
"sourceType": "IN_LINE",
"inlineContent": { # このプロパティを変更
"type": "BYTE",
"byteContent": {
"data": "Amazon Bedrock Knowledge Basesは、Amazon Bedrock上で構築されたRAG(Retrieval-Augmented Generation)アプリケーション向けのデータ接続機能です。".encode(),
"mimeType": "application/pdf",
},
},
},
},
},
],
)
ナレッジベースが投入したドキュメントを元に回答できるのかも念の為確認しておきます。
以下のコードでナレッジベースに質問してみます。
import boto3 bedrock_agent_runtime_client = boto3.client("bedrock-agent-runtime") response = bedrock_agent_runtime_client.retrieve_and_generate( input={"text": "Knowledge Basesについて教えてください。"}, retrieveAndGenerateConfiguration={ "type": "KNOWLEDGE_BASE", "knowledgeBaseConfiguration": { "knowledgeBaseId": <ナレッジベースID>, "modelArn": <アクセスを有効にしているモデルのARN>, }, }, ) print(response["output"]["text"]) # "Amazon Bedrock Knowledge Basesは、Amazon Bedrock上で構築されたRAG(Retrieval-Augmented Generation)アプリケーション向けのデータ接続機能です。"
投入したドキュメントに基づいて回答生成されていそうです。
データソースからドキュメント一覧を取得
データソースに追加されたドキュメントの一覧取得にはlist_knowledge_base_documentsメソッドを利用します。
レスポンスは以下のような形になります。
{ "documentDetails": [ { "dataSourceId": <データソースID>, "identifier": { "custom": { "id": "sample_1" }, "dataSourceType": "CUSTOM" }, "knowledgeBaseId": <ナレッジベースID>, "status": "INDEXED", "statusReason": "", "updatedAt": "2025-05-10T11:52:50.014747" } ] }
ドキュメントIDや更新日時など基本的な情報は取得できますが、ドキュメントのメタデータなどは取得できないみたいですね。
statusではドキュメントの投入ステータスを確認できます。
ステータスとして「INDEXED, IN_PROGRESS, IGNORED」などの計12種類が定義されています。
ステータス一覧はlist_knowledge_base_documentsメソッドのドキュメントで確認ください。
statusReasonはstatusがIGNOREDであるときのみ設定される項目で、ドキュメント投入が無効になった理由を把握できます。
4. 制限事項の確認
サポートされていない拡張子のドキュメントを投入した場合
サポートされているMIME typeの一覧はingest_knowledge_base_documentsのドキュメントに書かれています。
ここではサポートされていないMP3形式の音声ファイルをAWSマネジメントコンソールから投入してみました。

想定通りドキュメントの投入に失敗しています。
データソースの画面からだと投入失敗の原因がわからないのでログを見にいきます。
{ "event_timestamp": 1745883248556, "event": { "document_location": { "customDocument_location": { "id": "sample_mp3" }, "type": "CUSTOM" }, "request_id": "JweBaHJjtjMEIjA=", "data_source_id": <データソースID>, "status_reasons": [ "Format is not supported for this resource" ], "knowledge_base_arn": "arn:aws:bedrock:<リージョン>:<アカウントID>:knowledge-base/<ナレッジベースID>", "status": "RESOURCE_IGNORED" }, "event_version": "1.0", "event_type": "IngestKnowledgeBaseDocuments.ResourceStatusChanged", "level": "WARN" }
投入失敗の原因がサポートされていない形式のドキュメントを投入しようとしたためであることを確認できました。
容量の大きいドキュメントの投入
ドキュメントの容量制限はユーザーガイドにある通り50MBのようです。
ドキュメントの容量が大きい場合はインライン定義しづらいので、S3経由でドキュメントの直接取り込みを実施してみます。
テストデータとして60MBのPDFファイルを用意しました。
import uuid import boto3 bedrock_client = boto3.client("bedrock-agent") response = bedrock_client.ingest_knowledge_base_documents( knowledgeBaseId=<ナレッジベースID>, dataSourceId=<データソースID>, documents=[ { "content": { "dataSourceType": "CUSTOM", "custom": { "customDocumentIdentifier": { "id": str(uuid.uuid4()), }, "sourceType": "S3_LOCATION", "s3Location": { "uri": "s3://kb-direct-ingest/60mb.pdf", }, }, }, }, ], )
ログを見にいくと想定通り50MBを超えているためにエラーになっていることを確認できました。
{ "event_timestamp": 1745887796152, "event": { "document_location": { "customDocument_location": { "id": "76191f78-4ddd-4842-ab71-be2a23c1319d" }, "type": "CUSTOM" }, "request_id": "JwpIEFnatjMEtNA=", "data_source_id": <データソースID>, "status_reasons": [ "Resource exceeded allowed size limit of 50 Megabytes. Please reduce the resource size and retry" ], "knowledge_base_arn": "arn:aws:bedrock:<リージョン>:<アカウントID>:knowledge-base/<ナレッジベースID>", "status": "RESOURCE_IGNORED" }, "event_version": "1.0", "event_type": "IngestKnowledgeBaseDocuments.ResourceStatusChanged", "level": "WARN" }
また.JPEGや.PNG形式の画像ファイルは3.75MBが上限のようです。
データ投入時は上限を超えないように工夫が必要ですね。
5. まとめ
今回はナレッジベースのカスタムデータソースとドキュメントの直接取り込みAPIを試してみました。
多様な情報源からのナレッジ統合、データの同期処理省略化などナレッジベースを実用する上での利便性向上を感じました!
今後も情報をキャッチアップして生成AIの活用を進めていきたいと思います。
Acroquest Technologyでは、キャリア採用を行っています。
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
