😊

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. [参考]アーキテクチャイメージとプロトタイピング

https://youtu.be/MMIBd20cekU

Discussion