AgentCoreを使って、Google Driveのデータを検索するRAGシステムを作ってみた
1. きっかけ:「AgentCoreって何?使えるの?」
社内で話が出て、ちょっと自分で触ってないとわからないと思ったので、AgentCoreを実際に触ってみたくて、「とりあえず何か作ってみよう!」という軽い気持ちで始めました。ちょうど文書検索が面倒だったので、Google Driveの資料からサクッと情報を引っ張ってくるRAGシステムを作ってみることに。
AgentCoreのフレームワークフリーな設計が気になっていたんです。Strandsだけでなく、LangChain、AutoGPT、CrewAIなど、好きなエージェントフレームワークを選べる設計になっているらしく、「フレームワーク縛りなしで、どこまで簡単に作れるのか?」という興味本位で始めました。
# 単純に試してみたかったこと
what_i_wanted_to_try = {
"AgentCore": "本当に簡単に使えるのか?",
"検索システム": "Google Driveから賢く検索できるか?",
"開発体験": "どのくらいサクサク作れるか?",
"フレームワーク": "Strands以外も使えそうか?"
}
2. 実際に作ってみて「えっ、こんなに簡単?」
AgentCoreを触ってみて最初に驚いたのは、本当にシンプルだったことです。@app.entrypoint
デコレータを付けるだけで本番環境デプロイができるって、正直「本当?」って疑いました(笑)。
Strandsと組み合わせて、Claude Sonnet 4を使った検索エージェントを作るのに、コア部分は数十行程度。Google Drive APIと繋げて、OpenSearchでベクトル検索して...というのが、想像していたより遥かに簡単に実装できました。
# 拍子抜けするほどシンプルなコード
from bedrock_agentcore import BedrockAgentCoreApp
from strands import Agent # ← 今回はStrandsを選択
# LangChainでも同じように書ける!
# from langchain.agents import AgentExecutor
# from crewai import Agent as CrewAgent
app = BedrockAgentCoreApp()
@app.entrypoint # ← フレームワーク関係なくこれで本番デプロイ
def production_agent(request):
return invoke(request)
def build_agent() -> Agent: # エージェントフレームワークを自由選択
return Agent(
tools=[universal_document_search],
model="us.anthropic.claude-sonnet-4-20250514-v1:0"
)
3. 「こんなこともできるの?」と驚いた機能たち
作っているうちに「え、これもできるの?」って驚く機能がたくさんありました。特に面白かったのは、検索の賢さが勝手に調整されるところです。
例えば「OpenSearch API エラー」みたいな技術的な検索だと、自動でキーワード検索重視(alpha=0.30)になって、「RAGシステムについて教えて」みたいな概念的な質問だと、ベクトル検索重視(alpha=0.75)に切り替わる。これ、手動で調整する必要がないんです!
# 勝手に賢くなる検索システム(面白い!)
@tool
def universal_document_search(query: str, max_results: int = 5) -> str:
# クエリを見て、自動でパラメータ調整
if "エラー" in query or "API" in query:
alpha = 0.30 # 技術的 → キーワード重視
elif "について" in query or "教えて" in query:
alpha = 0.75 # 概念的 → ベクトル重視
else:
alpha = 0.50 # バランス型
# 複数のインデックスから同時検索(これも便利)
results_rag = search_rag_documents(query, alpha)
results_docs = search_documents(query, alpha)
return merge_and_rank_results(results_rag, results_docs)
4. AgentCoreの「実はすごい」ポイント
使ってみて気づいたAgentCoreの「地味にすごい」部分をシェアします。
フレームワークフリーな設計が本当に良いです。今回はStrandsを使いましたが、LangChain、AutoGPT、CrewAI、Semantic Kernelなど、お好みのエージェントフレームワークを自由に選べる設計になっている。フレームワーク縛りを避けたい開発者には、これは相当なメリットだと思います。
あと、監視機能が最初から組み込まれているのも地味に便利。OpenSearchの制限(/_stats
が使えない)にぶつかった時も、AgentCoreの抽象化レイヤーがうまく吸収してくれて、「あ、こういう時に抽象化って役立つんだ」と実感しました。
# 環境に応じて勝手に切り替わる(賢い!)
def build_agent() -> Agent:
if USE_OPENSEARCH:
# 本格モード:OpenSearch使用
tools = [universal_document_search, search_analytics]
else:
# お試しモード:Google Drive直接検索(お金かからない)
tools = [drive_search_v1]
return Agent(tools=tools)
# お財布に優しい設計(これ重要)
cost_friendly_design = {
"開発中": "フォールバック検索で$0/月",
"本番運用": "OpenSearch使って月$500",
"切替": "環境変数1つ変えるだけ",
"感想": "開発中にお金かからないのは神"
}
5. 「これ、将来的にもっと面白くなりそう」と思った部分
作ってみて「これ、もっと発展させたら面白そう」と思った機能がいくつかあります。
自動パラメータ調整は、今回は簡単なルールベースでしたが、もっと賢くできそう。ユーザーの検索履歴を学習して、その人の検索パターンに合わせて自動調整するとか、かなり夢が広がります。
拡張性も良い感じです。今回はテキスト検索だけでしたが、AgentCoreの設計を見る限り、画像や音声ファイルの検索も同じ仕組みで追加できそう。「あの資料のスクリーンショット、どこだっけ?」みたいな検索ができるようになったら便利ですよね。
# 適応的alpha調整の実装
def calculate_adaptive_alpha(query: str) -> float:
"""AgentCoreベースの高度なクエリ分析"""
technical_patterns = ["API", "エラー", "設定", "バージョン", "仕様"]
conceptual_patterns = ["について", "とは", "教えて", "説明", "概要"]
technical_score = sum(1 for pattern in technical_patterns if pattern in query)
conceptual_score = sum(1 for pattern in conceptual_patterns if pattern in query)
if technical_score > conceptual_score:
return 0.30 # テキスト検索重視
elif conceptual_score > technical_score:
return 0.75 # ベクトル検索重視
else:
return 0.50 # バランス型
# 品質監視システム
QUALITY_METRICS = {
"response_time": {"threshold": 2.0, "weight": 0.2},
"search_precision": {"threshold": 0.8, "weight": 0.25},
"answer_relevance": {"threshold": 0.7, "weight": 0.2},
"source_citation": {"threshold": 0.9, "weight": 0.15},
"error_rate": {"threshold": 0.05, "weight": 0.1},
"user_satisfaction": {"threshold": 0.8, "weight": 0.1}
}
# 自動品質評価
def evaluate_system_quality():
"""AgentCore統合による継続的品質監視"""
metrics = collect_quality_metrics()
grade = calculate_quality_grade(metrics)
if grade < "B":
trigger_quality_alert(metrics)
return generate_quality_report(metrics, grade)
6. まとめ
2日間でRAGシステムを作ってみて、正直「AgentCore、思ったより良いじゃん」というのが素直な感想です。
一番良かった点は、エージェントフレームワークに縛られない設計。今回はStrandsで作ったけど、将来的にLangChainやAutoGPTに変更したくなっても、比較的楽にできそうです。これは技術選択の自由度という点で重要だと思います。
開発体験も想像以上に良かった。複雑なインフラ設定を考えなくても、@app.entrypoint
一つで本番デプロイの準備ができるのは、開発者としてはかなりストレスフリーでした。
もちろん、今回は小規模なプロトタイプなので、大規模システムでどうなるかは分からません。でも、「AIエージェントシステムを作ってみたい」という人には、AgentCoreは良い選択肢の一つだと思います。
# 今度試してみたいこと
next_experiments = {
"もっと大きなデータ": "数万件の文書で試してみたい",
"画像検索": "スクリーンショットとか図表も検索したい",
"他のフレームワーク": "LangChain/AutoGPT/CrewAIでも動くか試したい",
"チーム利用": "複数人で使った時の使い勝手"
}
# 今回の開発で良かったポイント
good_points = {
"開発速度": "予想の2倍速で作れた",
"フレームワーク自由度": "Strands/LangChain/Crew AI等を自由選択",
"運用の楽さ": "監視とかが最初から付いてる",
"拡張しやすさ": "後から機能追加が簡単そう",
"コスト": "開発中はお金がかからない"
}
開発期間: 2025年9月14-15日(たった2日間!)
技術スタック: AgentCore + Strands + OpenSearch + Bedrock
感想: AgentCoreでこんなに簡単にRAGシステムが作れるとは思わなかった
7. [参考]アーキテクチャイメージとプロトタイピング
Discussion