Impact-Site-Verification: 578d421e-1081-463d-918b-ec5e29c5b9db
<戻る

AIエージェント意思決定支援システム

業務委託

概要

経営意思決定の質を引き上げるため,賛成(Pro)と反対(Con)の両視点から独立に論証するAIエージェントをB2B SaaSとして設計・開発.LangGraph上の11ノードのステートフルワークフローで,社内ナレッジ検索(Vertex AI Search)とWeb検索(Tavily)を条件付きで駆動し,企業/ユーザー/スレッド単位にメモリを分離するマルチテナント構成とした.

アーキテクチャ

LLMの曖昧性が許される推論ステップ(Pro / Con推論)と,決定的に制御したい前処理・後処理(メモリロード/検索要否判定/コンテキスト統合/メモリ保存)を明確に分離.グラフは条件分岐付きで,`judge_search_need`が先に検索の要否を判定し,不要な呼び出しで時間とトークンを浪費しないよう設計した.

Pro / Con デュアルエージェントは `backend/src/agent/react_agent.py` でReAct(Reasoning + Acting)パターンを実装.同じコンテキストを両者が独立に読み,必要に応じてVertex AI SearchやGemini組み込みツールを呼び出しながら,Citation付きの主張を構築する.

状態は `TypedDict(total=False)` で OverallState / UserMemory / CompanyInfo / Citation を厳密に型付け.ノード間の型不整合をPythonの型チェックで検知できるようにしてあり,グラフが増えても回帰コストが上がりにくい.

  1. load_user_memory: ユーザー・スレッド・企業別の履歴とプロファイルをロード
  2. judge_search_need: 質問内容から外部検索の要否を事前判定
  3. rag_search / web_search / merge_context: Vertex AI Search と Tavily を必要時のみ並列実行しコンテキスト統合
  4. set_prompt → route_agents: コンテキストに応じて Pro / Con 各々のプロンプトを構築
  5. pro_agent / con_agent(並列): ReAct で独立に論証を生成
  6. merge_responses → assign_variables → finalize_answer: 応答統合・変数束縛・最終整形
  7. save_user_memory: 会話・決定履歴・変更された嗜好を永続化

マルチテナントとメモリ管理

Vertex AI Searchへのクエリに`company_id`をメタデータフィルタとして付与し,企業単位でナレッジとアクセスを分離.同一ユーザーが複数企業に関連づく N:N 構造に対応し,企業スイッチ時に検索対象と参照ドキュメントを安全に切り替えられる.

会話履歴は LangGraph の MemorySaver と InMemoryStore をユーザー/スレッド単位で使い分け,`trimming.py` が 80 万トークンを上限に古いメッセージから自動削除.長期スレッドでもコンテキスト破綻を起こさない.

`BANSO_` プレフィックス付き環境変数で `backend/src/agent/config.py` を上書きでき,テナントごとの設定差分を実行時にのみ注入できる構成.Citationは情報源URLを正規化して応答に添付し,根拠に辿れる状態を維持している.

開発環境・品質管理

Dev Container(Ubuntu Noble + Zsh + uv + Node.js v24)で開発環境を統一.pytest / pytest-asyncio / pytest-cov による単体・非同期・カバレッジテストと,LangSmith によるLLMトレーシング・モニタリングを組み合わせ,グラフの変更が意図どおりに伝播することをCIで保証している.

使用技術

PythonLangGraphLangChainFastAPIGoogle Gemini 2.5 FlashGoogle Vertex AI SearchTavily APIReAct PatternMulti-AgentLangGraph MemorySaverInMemoryStorePydantic TypedDictLangSmithpytestDev Containeruv