Cover image

Bedrock のナレッジベースでCSVをメタデータ付きでベクトル登録する

はじめに

Amazon Bedrock のナレッジベースにCSVをそのまま登録すると、ファイル全体が1つのテキストとして扱われてしまいます。

しかし、メタデータ設定を活用すると、CSVを「1行=1ドキュメント」として解析し、各行にメタデータを付けたうえでベクトルDBへ登録できます。FAQ形式のデータを扱う場合など、精度の高いRAGを構築したいときに非常に有効な手法です。

データソースにメタデータを含めてナレッジベースのクエリを改善する - Amazon Bedrock
CSV (カンマ区切り値) ファイルを取り込む場合、ナレッジベースで特定の列をコンテンツフィールドとメタデータフィールドとして扱うことができます。コンテンツ/メタデータファイルのペアは数百または数千にのぼる場合がありますが、その代わりに、単一の CSV ファイルと対応する metadata.json ファイルを用意し、CSV 内の各列をナレッジベースでどのように扱うべきかヒントを提供できるようになりました。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/kb-metadata.html

この記事では、Aurora PostgreSQL をベクトルストアとして手動で構築し、ナレッジベースと紐づけるまでの手順を、実際に遭遇したエラーの対処も含めてまとめます。


構成イメージ

S3(ソースデータ)
 ├── sample.md
 ├── sample.md.metadata.json     ← ファイル単位のメタデータ
 ├── sample.csv
 └── sample.csv.metadata.json    ← 行単位のメタデータ(今回のポイント)
          ↓ 同期
Amazon Bedrock ナレッジベース
          ↓ ベクトル化して保存
Aurora PostgreSQL(pgvector)

前提

  • AWS アカウントと適切な IAM 権限があること
  • 対象の VPC・サブネットが構成済みであること
  • S3 バケットが作成済みであること

全体の流れ

  1. Aurora PostgreSQL を作成し、ベクトルDB用のテーブルを構築する
  2. Bedrock ナレッジベースを作成し、Aurora と紐づける
  3. メタデータファイルを作成してS3にアップロードする
  4. 同期して動作確認する

Aurora の作成

DB クラスターを作成する

  1. マネージドコンソールから、 Aurora and RDS を開きます。
  2. データベースを作成する を選択します。
  3. 下記の表に合わせて各項目を入力します。
    • 記載ないものは、デフォルトで可です。
  4. 入力が終わったら、データベースの作成を選択します。
項目①項目②設定値
エンジンのオプションエンジンのタイプAurora (PostgreSQL Compatible)
データベース作成方法を選択データベース作成方法を選択フル設定
テンプレート開発/テスト
クラスタースケーラビリティタイプ Serverless v2
容量の範囲0~8
非アクティブ後に一時停止00:05:00
設定エンジンバージョンPostgreSQL 17.4
DB クラスター識別子例: sample-kb-db
認証情報の設定マスターユーザー名例: postgres
認証情報管理AWS Secrets Manager で管理
暗号化キーを選択aws/secretsmanager(デフォルト)
クラスターストレージ設定設定オプションAurora スタンダード
可用性と耐久性マルチ AZ 配置Aurora レプリカを作成しない
接続 コンピューティングリソースEC2 コンピューティングリソースに接続しない
ネットワークタイプIPv4
Virtual Private Cloud (VPC)<対象のVPC>
DB サブネットグループ<対象のサブネット>
パブリックアクセスなし
VPC セキュリティグループ (ファイアウォール)新規作成
新しい VPC セキュリティグループ名<任意の値> 例:aurora-kb-sg
アベイラビリティーゾーン<対象のアベイラビリティーゾーン>
認証機関 - 任意<デフォルト>
RDS Data API✅RDS Data API の有効化
タグ - オプション<任意の値>
以降はデフォルトでOKです。
📝

RDS Data API を有効にしておかないと、クエリエディタから接続できません。

  • 1~2分で作成完了するので、次の作業に移動します。

クエリエディタで Aurora に接続する

  1. AWS マネジメントコンソール
  2. Aurora and RDS → 左メニューの クエリエディタ
  3. 「データベースに接続」を選択します。
  4. 下記の表に合わせて各項目入力します。
  5. 「データベースに接続します」を選択します。
項目
データベースインスタンスまたはクラスター作成した Aurora クラスターを選択
データベースユーザー名Secrets Manager ARN と接続する
Secrets manager ARNデータベース→設定→マスター認証情報 ARNの値
データベースの名前を入力postgres

ベクトルDB用のデータベースを準備する

接続できたら、以下の順番でSQLを実行します。

SELECT datname FROM pg_database;
CREATE DATABASE bedrock;
SELECT datname FROM pg_database;
  • 作成後、再度一覧を確認して bedrock が追加されていれば成功です。

bedrock データベースに切り替える

  • 「データベースを変更する」を選択します。
  • 下記の表に合わせて各項目入力します。
項目
データベースインスタンスまたはクラスター作成したAurora
データベースユーザー名Secrets Manager ARN と接続する
Secrets manager ARNデータベース>設定>マスター認証情報 ARNの値
データベースの名前を入力bedrock

テーブルとインデックスを作成する

以下のSQLを順番に実行します。

CREATE EXTENSION IF NOT EXISTS vector;
CREATE SCHEMA bedrock_integration;
CREATE TABLE bedrock_integration.bedrock_knowledge_base (
  id UUID PRIMARY KEY,
  chunks TEXT,
  embedding VECTOR(1024),
  metadata JSONB,
  custommetadata JSONB
);
📝

embedding の次元数は、後で選択する埋め込みモデルに合わせる必要があります。Titan Text Embeddings V2 は 1024次元 です。

Bedrock のナレッジベース接続時に、各カラムへのインデックスが必須です。

-- chunks(全文検索用)
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (to_tsvector('simple', chunks));

-- embedding(ベクトル近傍探索用)
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING hnsw (embedding vector_cosine_ops);

-- custommetadata(JSONB 検索用)
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (custommetadata);
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema = 'bedrock_integration';
  • bedrock_knowledge_base が表示されれば、DB側の準備は完了です。

ナレッジベース作成

  1. Amazon Bedrockを開きます。
  2. 左のメニューで「ナレッジベース」を選択します。
  3. 「作成」を選択します。
  4. 「ベクトルストアを含むナレッジベース」を選択します。
  5. 以下の表を参考に設定してください。
  6. 「ナレッジベースを作成」を選択します。
項目項目
ナレッジベースの詳細を指定ナレッジベース名例: sample-kb
ナレッジベースの説明 - オプションサンプル用のナレッジベースです
IAM 許可新しいサービスロールを作成して使用
サービスロール名例: sample-kb-role
データソースを選択S3
タグ<任意の値>
データソースを設定データソース名例: sample-ds-kb-s3
データソースの場所この AWS アカウント
S3 の URI自身の値
解析戦略Amazon Bedrock デフォルトパーサー
チャンキング戦略<任意の値>
データストレージと処理を設定埋め込みモデルTitan Text Embeddings V2
or
Embed Multilingual v3
ベクトルストアの作成方法既存のベクトルストアを使用
ベクトルストア - 新規Aurora
Amazon Aurora DB クラスター ARN<Amazon リソースネーム (ARN)の値>
データベース名bedrock
テーブル名bedrock_integration.bedrock_knowledge_base
シークレット ARN<マスター認証情報 ARNの値>
ベクトルフィールド名embedding
テキストフィールド名chunks
Bedrock マネージドメタデータフィールドmetadata
カスタムメタデータ - オプションcustommetadata
プライマリキーid
  • 完了まで待ちます。

メタデータ作成

ナレッジベースは、ソースファイルと同名の .metadata.json ファイルをS3に置くことで、メタデータを自動的に取り込みます。

ファイル名のルール:

sample.md           → sample.md.metadata.json
sample.csv          → sample.csv.metadata.json
📂

サンプルのデータ

Markdown ファイルのメタデータ(ファイル単位)

sample.md

# 情報セキュリティ基本規程(架空) v1.0

## 第1条(目的)
本規程は、情報資産の漏えい・改ざん・滅失を防止し、業務継続性を確保することを目的とする。

## 第2条(認証情報の管理)
1. パスワードは第三者に共有してはならない。
2. パスワードは推測されにくいものを設定し、定期的に更新する。
3. 多要素認証が提供される場合は有効化する。

## 第3条(端末の利用・持ち出し)
1. 会社貸与端末は業務目的で使用する。
2. 社外持ち出しは承認を得たうえで行い、紛失・盗難時は速やかに報告する。
3. 公共ネットワーク利用時は、会社が指定する安全な接続手段を利用する。

## 第4条(外部送信・共有)
1. 社外への送信・共有は、機密区分と社外提供可否を確認したうえで実施する。
2. 原則として共有リンク(期限・権限制御)を利用する。
3. メール添付が必要な場合は、手順に従い適切な保護を施す。

## 第5条(データ保管)
1. 業務データは会社が指定する保管場所に保存する。
2. 個人クラウドや私物媒体への保存を禁止する。

## 第6条(インシデント報告)
1. 誤送信、紛失、マルウェア疑い等を認知した場合、速やかに所定窓口へ報告する。
2. 事実関係(対象、時刻、影響範囲)を整理し、指示に従って対応する。

## 附則
本規程は2026年4月1日から施行する。

sample.md.metadata.json

{
  "metadataAttributes": {
    "doc_type": "internal_policy",
    "policy_name": "情報セキュリティ基本規程(架空)",
    "policy_version": "1.0",
    "owner": "情報セキュリティ担当(架空)",
    "audience": "全社員",
    "confidentiality": "internal",
    "tags": ["セキュリティ", "端末", "メール", "インシデント"]
  }
}
  • Markdown ファイルはファイル全体に対してメタデータが付きます。

CSV ファイルのメタデータ(行単位)

CSVファイルにメタデータを設定するのが今回のポイントです。documentStructureConfiguration を使うことで、CSVを「1行=1ドキュメント」として登録できます。

サンプルCSV(sample.csv

ID,PolicyName,PolicyVersion,Section,Audience,Status,LastUpdatedDate,Tags,Content
faq_001,情報セキュリティ基本規程(架空),1.0,第2条(パスワード),全社員,Active,2026-03-23,"セキュリティ,パスワード,運用","question: パスワードはどのくらいの頻度で変更しますか?, answer: 原則90日以内に変更します。変更が難しい事情がある場合は、管理者に申請してください。"
faq_002,情報セキュリティ基本規程(架空),1.0,第3条(端末の持ち出し),全社員,Active,2026-03-23,"セキュリティ,端末,持ち出し","question: 社外にノートPCを持ち出すときの手続きは?, answer: 持ち出し申請を行い、承認後に持ち出してください。公共Wi‑Fi利用時はVPN接続を必須とします。"
faq_003,情報セキュリティ基本規程(架空),1.0,第4条(メール添付),全社員,Active,2026-03-23,"セキュリティ,メール,添付","question: 取引先にファイルをメール添付してよいですか?, answer: 機密区分を確認し、許可されている場合のみ送信します。原則は共有リンク(期限付き)を利用します。"
faq_004,情報セキュリティ基本規程(架空),1.0,第6条(インシデント報告),全社員,Active,2026-03-23,"セキュリティ,インシデント,報告","question: 誤送信に気づいたら最初に何をすればいいですか?, answer: まず上長と窓口(情報セキュリティ担当)へ連絡し、事実(宛先/内容/時刻)を共有します。自己判断で削除依頼だけして終わらせないでください。"
faq_005,情報セキュリティ基本規程(架空),1.0,第7条(データ保管),全社員,Active,2026-03-23,"セキュリティ,保管,共有","question: 社内資料を個人のクラウドストレージに置いてもいいですか?, answer: 禁止です。会社が指定する保管場所(社内ストレージ/許可されたクラウド)を利用してください。"

メタデータファイル(sample.csv.metadata.json

{
  "metadataAttributes": {
    "dataset": "policy_faq_sample"
  },
  "documentStructureConfiguration": {
    "type": "RECORD_BASED_STRUCTURE_METADATA",
    "recordBasedStructureMetadata": {
      "contentFields": [
        { "fieldName": "Content" }
      ],
      "metadataFieldsSpecification": {
        "fieldsToInclude": [
          { "fieldName": "ID" },
          { "fieldName": "PolicyName" },
          { "fieldName": "PolicyVersion" },
          { "fieldName": "Section" },
          { "fieldName": "Audience" },
          { "fieldName": "Status" },
          { "fieldName": "LastUpdatedDate" },
          { "fieldName": "Tags" }
        ]
      }
    }
  }
}

設定のポイント:

  • contentFields:ベクトル化する列(今回は Content 列)を指定します
  • fieldsToInclude:検索時に参照できるメタデータとして付与する列を指定します
  • type: "RECORD_BASED_STRUCTURE_METADATA":この指定があることで行単位の処理になります

S3 へアップロードして同期する

  1. 上記ファイルをS3バケットにアップロードします
  2. ナレッジベースの画面から「同期」を実行します

動作確認

  1. 「ナレッジベースをテスト」を選択します。
  2. モデルを選択して、下記の質問を送信します。
質問1:パスワードはどのくらいの頻度で変更する必要がありますか?
パスワードはどのくらいの頻度で変更する必要がありますか?
  • Sectiondataset などのメタデータが反映されているのが確認できます。
  • 元データがCSVなので、行単位でベクトルDBに登録されていることが確認できます。
質問2:公共Wi‑Fiで業務しても大丈夫ですか?
公共Wi‑Fiで業務しても大丈夫ですか?
  • こちらは Markdown ファイル全体に紐づいたメタデータが返ります。

リソースの削除

検証が終わったら、以下のリソースを削除します。

リソース削除の注意点
Bedrock ナレッジベースナレッジベース画面から削除
Aurora PostgreSQL • インスタンス → クラスターの順に削除。
• スナップショットと自動バックアップは不要であれば残さない
IAM ロールロール名で検索して削除
Secrets ManagerAurora 削除後に削除
S3 バケット他で使用していなければ削除

エラーと対処法

実際に構築した際に遭遇したエラーと、その原因・対処をまとめます。

NoSuchEntityException: Policy ... does not exist

Policy AmazonBedrockSecretsPolicyForKnowledgeBase_sample-kb-role does not exist.

原因: IAM ロールを新規作成した場合、初回作成時にポリシーが存在しないタイミングでエラーが出ることがあります。

対処: 時間をおいて再試行するか、ポリシーを手動でアタッチします。


id column has text data type, but expected uuid

原因: id カラムの型を TEXT で作成していた。

対処: テーブルを作り直し、id カラムの型を UUID にします。

-- 修正版
id UUID PRIMARY KEY,

embedding column has vector(1536) data type, but expected vector(1024)

原因: 埋め込みモデルの次元数とテーブルの次元数が一致していない。Titan Text Embeddings V2 は 1024次元なのに、テーブルを 1536次元で作成していた。

対処: 使用する埋め込みモデルの次元数に合わせてテーブルを作り直します。

埋め込みモデル次元数
Titan Text Embeddings V21024
Cohere Embed Multilingual v31024
Titan Embeddings G1 - Text1536

chunks column must be indexed

The knowledge base storage configuration provided is invalid...
chunks column must be indexed.

原因: chunks カラムに全文検索用インデックスが作成されていない。

対処:

CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (to_tsvector('simple', chunks));

embedding column must be indexed

原因: embedding カラムに近傍探索用インデックスが作成されていない。

対処:

CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING hnsw (embedding vector_cosine_ops);

custommetadata column must be indexed

原因: custommetadata カラムに JSONB 用インデックスが作成されていない。

対処:

CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (custommetadata);
Tips: Bedrock がナレッジベースと Aurora の接続を検証する際、3つのインデックス(全文検索・ベクトル・JSONB)がすべて存在しないとエラーになります。テーブル作成と同時に作成しておくのが確実です。

参考