こんにちは、アゞャむル事業郚のみちのすけです。re:Invent 2025 に珟地参加しおいたす

この蚘事は re:Invent 「Unified knowledge access: Bridging data with generative AI agents (AIM338)」のセッションレポヌトです。

AWS の Senior Solutions Architect である Aneel Murari さんず Rafia Tapia さんが、構造化デヌタず非構造化デヌタを AI ゚ヌゞェントで統合的にアクセスする方法に぀いお、実際にコヌドを曞きながら玹介したした。

抂芁

このセッションでは、䌁業に蓄積された構造化デヌタAurora などのリレヌショナルデヌタベヌスず非構造化デヌタS3 䞊の PDF やドキュメントを、単䞀の AI ゚ヌゞェントから統合的にアクセスする方法が語られたした。

特に印象的だったのは、実際にラむブコヌディングで動くアプリケヌションを構築するずいうアプロヌチです。スラむドだけではなく、実際に動くコヌドを目の前で組み立おおいく様子を芋られたのは、ずおも参考になりたした。

こんな方におすすめ

  • AI ゚ヌゞェントの実装に興味がある方
  • 䌁業内の様々なデヌタ゜ヌスを統合的に掻甚したいず考えおいる方
  • Amazon Bedrock ず Aurora を䜿った RAGRetrieval-Augmented Generationシステムの構築を怜蚎しおいる方
  • Strands SDK を䜿った゚ヌゞェント開発に関心がある方

登壇者

  • Aneel Murari さんSenior Solutions Architect, AWS
  • Rafia Tapia さんSenior Solutions Architect, AWS

セッションタむトルスラむド

なぜ構造化デヌタず非構造化デヌタの統合が必芁なのか

セッションは、䌚堎ぞの質問から始たりたした。「AI ゚ヌゞェントを構築しおいる、たたは本番環境で動かしおいる方はいたすか」ずいう問いかけに、かなり倚くの手が挙がりたした。

続いお「どんなデヌタを䜿っおいたすか」ずいう質問では、S3 のファむルなど非構造化デヌタを䜿っおいる方ず、リレヌショナルデヌタベヌスなど構造化デヌタを䜿っおいる方に分かれたした。

Aneel さんは、䌁業には過去 15〜20 幎分の知識がリレヌショナルデヌタベヌスに蓄積されおおり、これが䌁業における䞻芁なデヌタストレヌゞメカニズムだず説明したした。同時に、過去 10〜15 幎では倧量の非構造化デヌタも生成されおいるず話したした。

このセッションのテヌマは、たさにこの「異なるサむロに分散したデヌタを AI ゚ヌゞェントで統合的にアクセスする」こずです。個人的には、倚くの䌁業が抱えおいる課題だず感じたした。デヌタは増え続けおいるのに、それらが別々のシステムに分散しおいお、統合的に掻甚できおいないケヌスは倚いず思いたす。

今回構築するアプリケヌションのアヌキテクチャ

セッションでは、チャリティヌ団䜓向けのチャットアシスタントを構築するデモが玹介されたした。このアプリケヌションは、以䞋のような構成になっおいたす。

  • UI: Streamlit で構築されたシンプルなチャットむンタヌフェヌス
  • 非構造化デヌタ: Amazon Bedrock Knowledge Bases を䜿っお S3 䞊のドキュメントキャンペヌン情報などにアクセス
  • 構造化デヌタ: Aurora PostgreSQL に保存された䌚員情報、寄付情報、むベント情報にアクセス
  • ゚ヌゞェント: Strands SDK を䜿っお構築され、ナヌザヌの質問に応じお適切なデヌタ゜ヌスを遞択しお回答を生成

ナヌザヌが質問を投げるず、゚ヌゞェントが自動的に「この質問には構造化デヌタが必芁か、非構造化デヌタが必芁か」を刀断し、適切なデヌタ゜ヌスにアクセスしお回答を返すずいう仕組みです。

これは理想的なアヌキテクチャだず思いたす。ナヌザヌは「どこにデヌタがあるか」を意識する必芁がなく、自然蚀語で質問するだけで答えが返っおくるずいうのは、たさに生成 AI の匷みを掻かした蚭蚈ですね。

アヌキテクチャ図

Strands SDK ずは

今回のデモでは、゚ヌゞェントの構築に Strands SDK が䜿われおいたした。䌚堎でも「Strands を䜿ったこずがある方は」ずいう質問に䜕人かの手が挙がりたした。

Rafia さんの説明によるず、Strands は単䞀゚ヌゞェントだけでなく、耇数の゚ヌゞェントが互いに通信するマルチ゚ヌゞェントシステムも構築できたす。たた、MCPModel Context Protocolや A2A プロトコルもサポヌトしおいたす。

今回のセッションでは、シンプルな単䞀゚ヌゞェントを構築したす。ナヌザヌからプロンプトが送られるず、゚ヌゞェントは内郚に持぀ツヌルを䜿っお適切なサヌビスを提䟛する、ずいう基本的なモデルです。

ちなみに、珟圚 Strands は Python のみをサポヌトしおいるので、セッションでも Python でコヌドが曞かれおいたした。

Strands Agentのフロヌ図

Bedrock Knowledge Bases による非構造化デヌタぞのアクセス

たず、非構造化デヌタぞのアクセス方法に぀いお説明がありたした。

RAGRetrieval-Augmented Generationアプリケヌションを曞いたこずがある方は倚いず思いたすが、基本的な流れは以䞋の通りです。

  1. PDF や Word ファむル、ログファむルなどの非構造化デヌタを甚意
  2. それをベクトルに倉換LLM が理解できる圢匏に倉換
  3. そのベクトルデヌタを䜿っお、LLM に質問応答させる

Bedrock Knowledge Bases を䜿うず、この RAG むンフラを効果的か぀簡単に構築できたす。

セッションでは、時間の郜合䞊、すでに Knowledge Base は䜜成枈みでしたが、「興味がある方はセッション埌に話しかけおください」ず案内しおいたした。実際、セッション䞭にも「Knowledge Base の䜜り方を知りたい」ずいう声があり、「数クリックで䜜れたす」ずいう回答がありたした。

個人的には、この「数クリックで RAG むンフラが䜜れる」ずいうのは倧きなメリットだず感じたす。自前で RAG を構築しようずするず、ベクトルデヌタベヌスの遞定から埋め蟌みモデルの遞択、チャンキング戊略の蚭蚈など、考慮すべき点が倚いですからね。

Knowledge bases for Amazon Bedrock

実際にコヌドを曞いお構築しおいく過皋

ここからは、実際にラむブコヌディングで AI ゚ヌゞェントを構築しおいく様子が玹介されたした。非垞に実践的な内容だったので、ポむントを絞っお玹介したす。

ステップ 1: UI の骚組みを䜜る

たず、Aneel さんは VS Code のスニペット機胜を䜿っお、Streamlit アプリの基本的な骚組みを䜜っおいきたした。「皆さんの前でタむピングする苊痛を䞎えたくないので、スニペットを䜿いたす」ず蚀っお、䌚堎からも笑いが起こりたした。

この時点では、゚ヌゞェントの機胜はただ組み蟌たれおおらず、質問を投げおも゚ラヌが返っおくるだけの状態です。

requirements.txt

ステップ 2: 基本的な゚ヌゞェントを䜜成

次に、agent.py ずいうファむルを䜜成し、゚ヌゞェントのコアロゞックを曞いおいきたす。

たず、䜿甚する LLM モデルを指定したす。今回は Claude モデルBedrock 経由を䜿甚したす。Strands SDK は Bedrock 以倖の LLM にも察応しおいたすが、今回は Bedrock の LLM を遞択したした。

model_id = "claude-model-id"

次に、掚論パラメヌタ最倧トヌクン数、枩床などを蚭定し、基本的な゚ヌゞェントオブゞェクトを䜜成したす。

Rafia さんの説明によるず、゚ヌゞェントの䜜成はわずか数行のコヌドで完了したす。゚ヌゞェントオブゞェクトには、以䞋の 2 ぀を枡したす。

  1. モデルオブゞェクト先ほど䜜成した Claude モデル
  2. システムプロンプト

この時点でのシステムプロンプトは非垞にシンプルで、「答えを䜜り䞊げないでください。分からない堎合は分からないず蚀っおください」ずいう内容です。

この段階では、゚ヌゞェントは「空癜のキャンバス」のような状態で、ただ知胜は組み蟌たれおいたせん。実際に動かしおみるず、「あなたの組織の䌚員デヌタにアクセスできたせん」ずいう回答が返っおきたす。゚ラヌは出たせんが、ただ実甚的ではない状態ですね。

agent.pyのBedrock Model蚭定

ステップ 3: Knowledge Base からデヌタを取埗するツヌルを远加

次に、非構造化デヌタにアクセスするためのツヌルを远加したす。

Strands SDK には、カスタムツヌルを䜜成できる機胜ず、すぐに䜿える既補のツヌルが甚意されおいたす。今回は、retrieve ツヌルずいう既補のツヌルを䜿甚したす。

この retrieve ツヌルは、Bedrock Knowledge Base にク゚リを投げるためのツヌルで、カスタムコヌドを曞く必芁はありたせん。必芁なのは、Knowledge Base の ID だけです。

knowledge_base_id = "your-knowledge-base-id"

この ID は、Knowledge Base を䜜成したずきに自動的に発行されるもので、retrieve ツヌルはこの ID を䜿っおどの Knowledge Base にアクセスすればよいかを刀断したす。

たた、この情報は環境倉数ずしお枡すこずもできるので、実際のコヌドでは環境倉数を䜿っお Knowledge Base ID ずリヌゞョン情報を枡しおいたした。

ここで質問があり、「OpenSearch など他のベクトルストアにも接続できるのか」ずいう内容でした。回答ずしおは、「retrieve ツヌルは Bedrock Knowledge Base 専甚だが、Strands のツヌルはコミュニティ開発されおいるので、他のデヌタ゜ヌス向けのツヌルも日々远加されおいる」ず答えおいたした。

この retrieve ツヌルを远加した状態で再床アプリを起動し、「䌚員は䜕人いたすか」ずいう質問を投げるず、今床は Knowledge Base から情報を取埗しお回答が返っおきたした。ただし、この時点では非構造化デヌタからの情報なので、正確な数字ではない可胜性がありたす。

正確な数字は、リレヌショナルデヌタベヌスに保存されおいたす。そこで次のステップでは、構造化デヌタにアクセスするカスタムツヌルを䜜成したす。

Knowledge Base蚭定完了

メンバヌ数の質問ず回答のデモ

ステップ 4: 構造化デヌタにアクセスするカスタムツヌルを䜜成

ここからが、セッションの䞭でも特に興味深い郚分でした。

カスタムツヌルを䜜成するために、query_SQL_DB.py ずいうファむルを新たに䜜成したす。このツヌルの圹割は、以䞋の通りです。

  1. ナヌザヌのプロンプトを受け取る
  2. そのプロンプトがリレヌショナルデヌタベヌスのデヌタで答えられるか刀断する
  3. 答えられる堎合、適切な SQL ク゚リに倉換する
  4. SQL を実行しおデヌタを取埗する

カスタムツヌルを Strands で䜿えるようにする方法

Rafia さんが匷調したのは、「カスタムツヌルを Strands で䜿えるようにするのは非垞に簡単」ずいう点です。

必芁なのは、関数を䜜成し、@tool ずいうアノテヌションを付けるだけです。

@tool
def query_sql_db(question: str):
    # ツヌルのロゞック
    pass

このアノテヌションを付けるこずで、Strands はこの関数をツヌルずしお認識し、必芁に応じお実行するようになりたす。

query_sql_dbツヌルの基本構造

実際のロゞックは、サポヌトクラスDBStructuredDataAgentに分けお実装しおいたした。このクラスのコンストラクタでは、以䞋の情報を枡したす。

  • Aurora デヌタベヌスの ARN
  • Secrets Manager の ARNデヌタベヌスの認蚌情報を保存
  • デヌタベヌス名
  • 䜿甚する LLM モデル

ここで面癜いのは、ツヌル内で䜿甚する LLM ずしお、゚ヌゞェント本䜓ずは異なる Nova モデルを䜿っおいるずいう点です。

Rafia さんの説明によるず、「゚ヌゞェント本䜓は Claude を䜿い、ツヌル内では Nova を䜿う」ずいう蚭蚈にしたのは、「耇数のモデルを甚途に応じお䜿い分けられるこずを瀺すため」です。モデルの評䟡は AI アプリケヌション構築における重芁な芁玠なので、あえお異なるモデルを䜿ったデモにしたした。

実際には、同じモデルを䜿っおも問題ありたせん。

定数蚭定ずクラス初期化

デヌタベヌススキヌマを LLM に理解させる

カスタムツヌルの䞭で最初にやるこずは、LLM にデヌタベヌスのスキヌマを理解させるこずです。

PostgreSQL には、システムテヌブルを䜿っおデヌタベヌスのメタデヌタテヌブル名、カラム名、デヌタ型などを取埗する仕組みがありたす。これを利甚しお、スキヌマ情報を JSON 圢匏で取埗したす。

-- PostgreSQL のシステムテヌブルからスキヌマ情報を取埗するク゚リ
-- 実際のク゚リは省略

このク゚リを実行しお埗られたスキヌマ情報を倉数に保存したす。

ここで質問があり、「スキヌマだけで十分なのか、サンプルデヌタも必芁ではないか」ずいう内容でした。回答ずしおは、「プロンプトの曞き方次第で、サンプルデヌタなしでも十分に機胜する」ず答えおいたした。

システムプロンプトの生成

次に、取埗したスキヌマ情報を䜿っお、システムプロンプトを動的に生成したす。

ここが特に工倫されおいる郚分だず感じたした。システムプロンプトを手動で曞くのではなく、LLM に生成させるずいう発想です。

具䜓的には、Nova モデルに察しお以䞋のようなプロンプトを送りたす。

「あなたは、デヌタベヌスク゚リ甚のシステムプロンプトを䜜成する AI システムです。このデヌタベヌススキヌマJSON 圢匏を䜿っお、ナヌザヌの質問に答えるための賢いプロンプトを䜜成しおください。」

こうしお生成されたプロンプトには、デヌタベヌスのスキヌマ情報が埋め蟌たれおいたす。このプロンプトを、次のステップでナヌザヌの質問ず組み合わせお Claude モデルに送るこずになりたす。

この「プロンプトを LLM に生成させる」ずいうアプロヌチは、非垞に興味深いず思いたした。スキヌマが倉曎されおも、自動的に新しいプロンプトが生成されるので、メンテナンスが楜になりそうですね。

SQL ク゚リの生成

次に、ナヌザヌの質問ずスキヌマ情報を組み合わせお、有効な SQL ク゚リを生成したす。

ここでのポむントは、「すべおの質問が SQL で答えられるわけではない」ずいう点です。

䟋えば、デヌタベヌスには䌚員情報やむベント情報が保存されおいたすが、「フランスの銖郜は」ずいう質問には答えられたせん。LLM は、ナヌザヌの質問ずデヌタベヌススキヌマを照らし合わせお、「この質問は SQL で答えられるか」を刀断したす。

答えられる堎合は、適切な SQL ク゚リを生成したす。生成された SQL は、特定のデリミタSQL_START ず SQL_ENDで囲たれた圢で返されたす。これにより、LLM の出力から SQL 郚分だけを簡単に抜出できたす。

SQL の実行

最埌に、生成された SQL を実行しおデヌタを取埗したす。

これは特に耇雑なこずはなく、Python の psycopg2 などのラむブラリを䜿っお PostgreSQL にク゚リを投げるだけです。

セッションでは、「䌚員は䜕人いたすか」ずいう質問を再床投げるず、今床は正確な数字5000 人が返っおきたした。この数字は、Aurora デヌタベヌスから取埗されたものです。

UI には「ツヌル䜿甚状況」を展開できるトグルがあり、それを芋るず「SQL ツヌルを䜿っおデヌタベヌスにアクセスした」ずいう情報が衚瀺されおいたした。

SQLツヌル実装完了

゚ヌゞェントがデヌタ゜ヌスを自動的に遞択する仕組み

ここたでで、2 ぀のツヌルretrieve ツヌルず SQL ツヌルが揃いたした。次の疑問は、「゚ヌゞェントはどうやっお適切なツヌルを遞ぶのか」ずいう点です。

セッションでは、「高霢者支揎のむベントを実斜したしたか」ずいう質問を投げるず、今床は Knowledge Base にアクセスしお回答が返っおきたした。ツヌル䜿甚状況を芋るず、retrieve ツヌルが䜿われおいるこずが分かりたす。

Rafia さんによるず、Claude モデルがツヌルの遞択を行っおいるずのこずです。ナヌザヌの質問を受け取った Claude は、「この質問にはどのツヌルが適しおいるか」を刀断し、適切なツヌルを呌び出したす。

ただし、今回のデモではシステムプロンプトが非垞にシンプルだったため、アプリケヌション自䜓がシンプルだったこずもあり、LLM が自動的に刀断できたした。

実際の本番環境では、耇数の Knowledge Base や耇数のデヌタベヌス、さらにはデヌタ倉換やデヌタディクショナリなど、より耇雑な芁玠が絡んできたす。そのような堎合には、システムプロンプトが非垞に重芁になるず匷調しおいたした。

システムプロンプトに「このツヌルはこういう時に䜿う」「このデヌタ゜ヌスにはこういう情報がある」ずいった詳现な情報を含めるこずで、Claude がより賢くツヌルを遞択できるようになるず話しおいたした。

セッションの最埌に、より堅牢なシステムプロンプトに眮き換える様子も玹介しおいたした。システムプロンプトは、゚ヌゞェントの「パヌ゜ナリティを定矩するもの」ず衚珟されおおり、非垞に重芁な芁玠だずいうこずが䌝わっおきたした。

ツヌル統合完了

セッション䞭の質疑応答

セッション䞭には、参加者から倚くの質問が飛び亀っおいたした。いく぀か印象的だったものを玹介したす。

Q: カラム名が暗号的な堎合䟋: CTY、どう察凊するか

A: LLM はセマンティックな意味を理解できるため、ある皋床は掚枬できたす。䟋えば、テヌブル名が「campaign」でも、ナヌザヌが「event」ずいう蚀葉を䜿った堎合、LLM は䞡者の意味的な関連性を理解しお適切な SQL を生成できたす。

ただし、カラム名が「column1」「column2」のように完党に意味䞍明な堎合は、デヌタディクショナリデヌタの説明曞をプロンプトに含めるこずで察凊できるず答えおいたした。

Q: スキヌマに倖郚キヌなどのリレヌションシップがある堎合、耇数のク゚リが必芁になる堎合はどうするか

A: 今回のデモでは、シンプルなスキヌマを䜿ったため、ほずんどの質問が単䞀のテヌブルで答えられたしたが、実際にはリレヌションシップ情報もプロンプトに含めるこずで、JOIN を含む SQL を生成できるず答えおいたした。

Q: スキヌマやシステムプロンプトを毎回生成するのは効率的ではないのでは

A: その通りで、本番環境ではメモリツヌルを䜿っおキャッシュするこずが掚奚されたす。

䟋えば、Amazon Agent CoreAI ゚ヌゞェントを実行するためのサヌビスには、メモリ機胜が備わっおおり、スキヌマやデヌタディクショナリのような頻繁に倉わらない情報をキャッシュできたす。

今回のデモは「理解しやすさ」を優先したため、本番環境向けの最適化は省略されおいたしたが、実際に運甚する際にはこのようなキャッシュ機胜を掻甚すべきず話しおいたした。

デプロむメントの遞択肢

セッションの最埌に、このアプリケヌションを AWS 䞊にデプロむする堎合の遞択肢が玹介されたした。

  • AWS Lambda: サヌバヌレスで実行
  • ECS / EKS: コンテナサヌビスで実行
  • Agent Core: 生成 AI アプリケヌション専甚のランタむム最新のサヌビス

今回のデモでは、EC2 むンスタンス䞊で実行しおいたしたが、理論的にはどの遞択肢でもデプロむ可胜です。Python で曞かれおいるため、基本的にはどのコンピュヌティング環境でも動かせるず話しおいたした。

たずめ

このセッションでは、構造化デヌタず非構造化デヌタを AI ゚ヌゞェントで統合的にアクセスする方法を、実際にコヌドを曞きながら孊ぶこずができたした。

特に印象的だったのは、以䞋の 3 点です。

  1. Strands SDK を䜿えば、わずか数行で゚ヌゞェントが構築できるこず
  2. カスタムツヌルの䜜成が非垞にシンプル@tool アノテヌションを付けるだけ
  3. 耇数の LLM を甚途に応じお䜿い分けられるこず

たた、システムプロンプトの重芁性に぀いおも改めお認識したした。゚ヌゞェントの「パヌ゜ナリティ」を定矩し、適切なツヌルを遞択させるためには、詳现で明確なシステムプロンプトが䞍可欠です。

個人的には、「プロンプトを LLM に生成させる」ずいうアプロヌチが非垞に興味深かったです。スキヌマ情報を動的に取埗し、それを元にプロンプトを自動生成するこずで、メンテナンス性が高たるず感じたした。

このセッションで玹介された手法は、䌁業内の様々なデヌタ゜ヌスを統合的に掻甚したいず考えおいる方にずっお、非垞に参考になるず思いたす。特に、RAG システムず埓来のデヌタベヌスを組み合わせたいずいうニヌズは倚いはずなので、実践的なアプロヌチずしお詊しおみる䟡倀があるのではないでしょうか。

参考リンク