メインコンテンツに移動

Amazon S3 Vectors と Amazon DynamoDB で社内文書の関連グラフを構築

2026-10-05 | Author : 森本 康太 (ダイキン工業株式会社)

Missing alt text value

はじめに

ダイキン工業株式会社の森本です。

社内には、設計書、手順書、報告書など、形式や用語の異なる文書が大量にあります。キーワード検索やベクトル検索で目的の文書を見つけても、関連資料までは容易にたどれません。そのため、条件を変えながら検索を繰り返す必要があります。

そこで、文書をノード、文書同士の関連をエッジとする「文書関連グラフ」を構築しました。本記事では、Amazon S3 Vectors と Amazon DynamoDB を使って関連候補を計算・保存し、検索ツールとグラフ画面から利用するまでの流れを紹介します。

 

X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ登録 »

文書検索で関連資料を探す難しさ

製造業では、製品ごとの設計書や手順書だけでなく、複数の製品で共通して使う規程や標準、過去の資料なども大量に蓄積されます。文書によって用途や対象が異なり、同じ部品や技術に関する情報が複数の文書に分かれていることもあります。

キーワード検索やベクトル検索を使えば、検索内容に関連するチャンクや文書を見つけられます。一方で、検索結果にはチャンクや文書が一覧で並ぶため、その周辺にどのような関連資料があるかまでは分かりません。製品や部品に関する文書と、共通して参照する規程などを横断して確認するには、検索結果を手がかりに条件を変えて検索し直す必要があります。

製品や部品などをエンティティとして関係を定義するナレッジグラフなら、文書をまたいだつながりを詳しく表現できます。ただし、エンティティと関係の設計に加えて、文書から情報を抽出し、更新する仕組みが必要です。種類の異なる文書を共通の仕組みで扱うには、構築と運用の負担が大きくなります。

そこで、エンティティや関係を細かく定義せず、文書の内容の近さだけで文書同士をつなぐことにしました。

文書関連グラフを構築する

文書関連グラフでは、文書をノード、文書同士の関連をエッジとして扱い、関連の強さをスコアで表します。関係の種類は定義せず、設計書、手順書、報告書などを同じ方法で扱います。

全体構成

図のとおり、文書取り込み、利用、データストアの 3 つに分けて構成しました。取り込みは Amazon S3 へのアップロードを起点に AWS Step Functions で進め、結果を用途ごとのデータストアに保存します。チャンクの埋め込みは Amazon S3 Vectors、文書メタデータと関連候補は Amazon DynamoDB、文書と変換後の Markdown は Amazon S3 に置きます。利用側は、Amazon CloudFront で配信する画面から Amazon API Gateway を経由して、グラフ画面 API と Amazon Bedrock AgentCore 上の AI エージェントを呼び出します。

文書取り込みパイプライン

Amazon S3 への文書のアップロードを起点に、AWS Step Functions と AWS Lambda で構成した取り込みパイプラインを実行します。本文の抽出から関連候補の更新までを、図の順に処理します。

文書取り込みパイプラインの処理順と各段の保存先

  1. 文書を分類・変換する : 文書形式に応じて、MarkItDown や OCR で本文を抽出し、Markdown 形式に変換する
  2. チャンクに分ける : 文や見出しなどを単位として、話題の境界で本文を分割する
  3. タグと要約を生成する : LLM で文書種別や製品名などのタグと、文書全体の要約を生成する
  4. チャンクを埋め込む : チャンクごとに埋め込みを生成し、Amazon S3 Vectors に保存する
  5. 関連候補を更新する : 要約とチャンクの埋め込みから関連候補を計算し、結果を Amazon DynamoDB に保存する

OCR には Qwen3 VL 235B A22B、タグと要約の生成には Anthropic Claude Sonnet 5、埋め込み生成には Amazon Nova Multimodal Embeddings を使用しました。いずれのモデルも Amazon Bedrock 経由で呼び出しています。

ベクトル検索には、インフラのプロビジョニングが不要で、運用負荷とコストを抑えやすい Amazon S3 Vectors を採用しました。保存したチャンクの埋め込みは、文書検索と関連候補の計算に利用します。

チャンク分割では、Markdown を文や見出しに分けます。隣り合う文章の埋め込みから類似度を求め、意味のある単位で区切ります。1 チャンクの長さは 450〜1,500 文字に収めます。

タグと要約は、文書のタイトル、ファイル名、本文の先頭 12,000 文字から LLM で同時に生成します。タグは 3 個程度で、先頭が文書種別、残りが製品名や機能などを表す名詞句です。生成後のタグは人が追加、編集できます。

要約から内容の近い文書を探す

関連候補は、ベクトル検索だけで集めます。元の文書の要約をクエリとして、内容の近いチャンクを Amazon S3 Vectors から検索します。

検索結果は文書ごとにまとめ、各文書に含まれるチャンクのうち、最も高い類似度をその文書への関連スコアとして扱います。チャンク単位で比較するため、文書全体としては話題が異なっていても、一部に近い内容を含む文書を候補に残せます。

関連文書の候補を事前計算して保存する

関連候補は、文書の取り込み時に計算し、画面や検索ツールから利用します。文書の内容が変わった場合は、影響する候補を更新します。

取り込み時に計算する

関連候補を求めるには、ベクトル検索と関連スコアの計算が必要です。これらを利用のたびに行わず、文書の取り込み完了時に実行します。文書ごとにスコア上位 20 件を選び、スコアとともに Amazon DynamoDB に保存します。

Amazon DynamoDB に隣接リストとして保存する

既存の文書メタデータテーブルは、文書 ID を `id` に持つ単一パーティションキーの構成です。このキー構造は変更せず、関連候補を文書とは別の項目として同じテーブルに保存します。関連候補を取得するため、`graphPk` をパーティションキー、`graphSk` をソートキーとするグローバルセカンダリインデックス `KnowledgeGraphLookupIndex` を追加しました。インデックスの射影は `ALL` とし、スコアも Query の結果から取得します。 文書 A から文書 B への関連は、次の項目で表します。

属性
用途
値の例
id

テーブルのパーティションキー。関連を一意に識別する

EDGE#DOCREL#A#B

graphPk

インデックスのパーティションキー。起点文書を表す

DOC#A

graphSk

インデックスのソートキー。順位と関連先文書を表す

REL#000001#DOC#B

itemType

項目の種類を表す

related-document

targetKnowledgeId

関連先の文書 ID を表す

B

score

関連スコア (ベクトル類似度) を表す

0.82

文書 A の関連候補を取得するときは、graphPk = DOC#A と begins_with(graphSk, "REL#") を条件に Query します。graphSk の順位をゼロ埋めしているため、起点となる文書 ID を指定するだけで、関連スコアの順位どおりに候補をまとめて取得できます。

利用時に絞り込む

全体グラフと検索結果の周辺表示では、必要な関連の強さや件数が異なります。そのため、保存時には用途を限定せずに候補を残し、利用時にそれぞれの条件で絞り込みます。

変更時に再計算する

文書の本文を更新すると、要約とチャンクの埋め込みが変わり、周辺文書との関連も変わります。更新した文書の候補はその場で再計算し、影響を受ける周辺文書については別の AWS Lambda 関数を非同期で起動して再計算します。これにより、すべての文書を作り直さずに関連候補を更新できます。

検索ツールから関連候補を利用する

社内では、文書を検索して回答する AI エージェントを運用しています。取り込み時に保存した関連候補は、この AI エージェントの検索ツールからも利用できます。検索にヒットした文書だけでなく、その周辺文書も候補に加えます。

検索・探索・本文確認を 3 つのツールに分ける

AI エージェントは、文書の検索、関連候補の探索、本文の確認を 3 つのツールに分けて行います。

  • 文書検索 : 検索内容と意味の近いチャンクを返し、ヒットした文書ごとに関連候補を最大 2 件追加する
  • グラフ探索 : 文書、タグ、または検索語を起点に、1 段先にある関連文書やタグを返す。返された文書やタグを新しい起点にすることで、さらに先まで探索できる
  • 本文取得 : 文書 ID を使って、回答の根拠として確認するチャンクを取得する

文書検索は、回答に必要なチャンクとその周辺候補をまとめて探すために使います。さらに関連資料へ候補を広げたい場合は、グラフ探索を使います。グラフ探索で見つけた文書の内容は、本文取得で確認します。

文書検索で周辺候補を加える処理とグラフ探索には、取り込み時に事前計算した関連候補を使います。そのため、利用のたびにベクトル検索を追加で実行する必要はありません。

同じ関連候補は、AI エージェントだけでなく、グラフ画面からも確認できます。

関連グラフを画面で確認する

グラフ画面では、文書全体のつながりと、検索した文書の周辺にある関連候補を確認できます。

文書全体のつながりを確認する

全体グラフでは、閲覧できる文書とそのつながりを 1 つの画面で確認できます。縮小時は、つながりの多い文書や関連する文書のまとまりを見渡せます。気になる場所を拡大すると、個々の文書名や文書同士のつながりを確認できます。

図 3 に掲載した画面は、338 件の文書を登録したデモ環境です。実運用では、より多くの文書を扱っています。全体を見やすく保つため、最初はつながりの数とエッジの重みから選んだ上位 200 ノードを表示します。拡大すると、残りのノードとラベルが重要度順に現れます。画面に表示していないノードもレイアウトの計算に含め、文書全体の配置に反映しています。

Missing alt text value

検索結果の周辺文書を確認する

全体グラフで検索すると、該当する文書が強調されます。図 4 のように、1 件を選ぶと関連資料が右側に並びます。同じ画面で検索結果とその周辺を見比べられます。

Missing alt text value

まとめ

文書の要約をクエリにしたベクトル検索で、関連候補を計算します。この方法で文書関連グラフを構築しました。

チャンクの埋め込みは Amazon S3 Vectors に保存します。関連候補は取り込み時に事前計算し、隣接リストとして Amazon DynamoDB に保存することで、専用のグラフデータベースを使わずに構成しました。計算した関連候補は、AI エージェントの検索ツールとグラフ画面から利用できます。

今後は、実運用における利用状況をもとに、関連候補が AI エージェントの文書探索に与える効果を評価していきます。

筆者プロフィール

森本 康太

ダイキン工業株式会社で、空調分野に特化した LLM や、生成 AI を活用した業務支援システムの研究開発に取り組んでいます。AWS Community Builders の Security カテゴリに選出されています。

最近は海外旅行が趣味で、今年の訪問国は 20 カ国になる見込みです。

Missing alt text value