■背景

最近、チーム内でメンバーとチームのタレントマッチング的なシステムを作りたいという話が持ち上がった。 プロンプトをペタペタ貼る検証を予定していたが、せっかくなので学習目的で個人的にAWSのBedrock AgentCoreを使ってPOC構築してみることに。

マッチングロジックは素直に巨人の肩に乗る方針で、Arxivで関連論文を調査。特に参考になったのがRAG(検索拡張生成)×マルチエージェント構成で履歴書評価を行い、スコアとその根拠を説明できる設計を提案している論文。今回の実装では、論文構成をそのまま実装に落とし込む形にした。

  • エージェント1:データ解析:メンバーデータ(スキル・経験・実績など)をJSON化しPIIを除去
  • エージェント2:正規化処理:表記ゆれ補正や集計、スキルレベル推定
  • エージェント3:マッチング評価:入力データをRAGで取り込み5カテゴリ採点
  • エージェント4:説明生成:サブスコア別に根拠断片+強み/ギャップを整理

出力はすべて厳密JSON形式とし、合計値チェック(total == sum(subscores))や再出力ルールも入れた。

■実装環境

今回はAWSに慣れる目的もあって、基盤からBedrockに寄せた。

  • リージョン:us-west-2(オレゴン)
  • ストレージ:S3(KB用フォルダ構成)
  • 知識ベース:Bedrock Knowledge Bases + Amazon Titan Embeddings(正直AI任せだった)
  • 推論モデル:Claude / Titan Text(用途別に使い分け)
  • 評価エンジン:LangGraphでマルチエージェントを分岐実行
  • 結果保存:DynamoDB(agent_runs / match_results)※結局POCでは使わず
  • サービス化:AgentCore Runtime(必要に応じてAPI Gateway + Lambda)

■構築ステップ(PoC版)

POCの流れは以下のとおり。

1. リージョン設定&権限付与

オレゴンに設定

aws configure set region us-west-2

POCではAmazonBedrockFullAccessなど広めの権限から始め、動作後に最小化。 IAMの操作にも慣れていなかったので、エラー&権限追加を繰り返した。

2. S3バケット作成

aws s3 mb s3://talent-match-poc-2025
aws s3api put-object --bucket talent-match-poc-2025 --key kb/positions/

3. CSV作成&KB用Markdown変換

  • position_requirements.csv(position_id, title, department, required_skills…)
  • team_policies.csv(team_id, min_experience, tech_stack…)
python csv_to_kb.py
aws s3 sync kb_out/ s3://talent-match-poc-2025/kb/

4. Knowledge Base作成&同期

Bedrockコンソールからデータソースを指定してSync。 ここは権限問題ではまった。一時的に最強権限付与して乗り切る。

5. DynamoDBテーブル作成

  • agent_runs
  • match_results

6. LangGraphでマルチエージェント実装

S1〜S5ノードで並列にカテゴリ採点 → JOIN → A5カバレッジ計算。

7. 結果をS3に保存しAthenaで可視化

ndjson形式を直接クエリ可能。

8. AgentCore Runtimeにデプロイ

実行ロール付与、環境変数(KB_ID、MODEL_ARNなど)設定、Invokeで動作確認。

■詰まったポイント

  • 権限不足でKB同期が失敗:埋め込みモデルアクセス権を付けた後、手動で再Ingestionが必要。→一時的にAdmin権限を付けてゴリ押しで進めた
  • AgentCoreが立ち上がらない:app.pyのコードの問題、環境変数の保持の問題

■1日ガチャガチャ触った後のコスト

意外と高かった。合計で**$12.48**。無料クレジットから使われるはず。

  • OpenSearch Service:$11.98
  • CodeBuild:$0.30
  • Claude 3 Haiku (Bedrock Edition):$0.19
  • S3:$0.01
  • EC2 Container Registry (ECR):$0.00
  • その他:$0.00

OpenSearchが大半を占めているが、これは起動しっぱなしだったからか?どうやって課金停止するんだ?

■学びと次の展望

AWS上でサーバーレスのマルチエージェントシステムが作れた。

これ、GPT-5にサポートしてもらえれば作れるかな?と思っていたが、論文の設計を大枠で実装に落とし込み、実際にマッチングまでできて満足。サーバレスでできたのが嬉しい。

ただ、構築できたけど理解は深くないので、基礎的な理解を怠らないようにしないといけない。これからの時代、おそらく非効率な方法で自らに負荷を掛けていく必要がある。

■蛇足

話はそれるけど、この前ぬこぬこさん(@schroneko)主催のClaude MAX会に参加させてもらったが、普通にみんな論文読んでるのよね。私は教育・セキュリティ・アライメント系の論文を日課でLLMで解析して読んでいるが、あまり論文を読む人はいないと思っていた。完全な思い上がりだった。

そして、たまにGPT-5がバグって文脈を無視したり記憶喪失になったり、不意にプロジェクトナレッジについて語りだしたりしたのはなあぜ?