GMO天秤AI株式会社
RAG 検索基盤をゼロから設計・実装し、IaC・CI/CD・セキュリティまで「LLM アプリの周辺」を通し切る
課題
マルチモデル対応の AI チャットサービス「天秤AI」で、利用者が持つプロジェクト資料(PDF / DOCX / PPTX / XLSX)を AI の回答の根拠にする機能が求められていました。資料の取り込みからベクトル検索、チャット経路への接続までを担う基盤が存在せず、ゼロから設計する必要がありました。
あわせて、インフラの一部が常駐サービスとして動いていてコスト構造に無理があること、CI/CD に「未適用なのに成功したように見える」経路が残っていること、テストの一部が空振りで緑になっていることなど、開発基盤側の負債も抱えていました。
やったこと
入社から約2か月で、RAG 検索基盤を抽出・投入・検索の3サービスにわたって単独で通し切りました(約250コミット)。
- 抽出層:PDF / DOCX / PPTX / XLSX を PDF 変換を経ずに直接 Markdown 化。文字化けした PDF を検知して VLM に回す、埋め込み画像を LLM で自然言語化する、2段組みの段組み崩れを補正する、といった前処理を自前で作り込み。
- 投入層:サロゲートペアや BOM を壊さないチャンク境界処理、S3 Vectors への埋め込み投入、失敗時のロールバック。
- 検索層:MCP(Model Context Protocol)で検索ツールを実装し、既存のチャット経路に内部コネクタとして接続。距離しきい値で無関係なヒットを除去。
並行して、この3サービスのリソースを Terraform で新規定義して plan / apply を CodeBuild に載せ、ECS の常駐サービスを Lambda on VPC に移設し、S3 Vectors への通信を PrivateLink 経路に限定するネットワーク境界を設計しました。ほかに、複数プロバイダの新モデル搭載(新規プロバイダの実装を含む)を server / client / admin / 基盤の各リポジトリを横断してリリースまで通しています。
設計上の意思決定
「取り込み・失敗・削除・整合性」を本体として設計した
- 判断:検索精度より先に、抽出中クラッシュ時の再配信の引き継ぎ、SQS の可視性タイムアウト延長、maxReceiveCount の食い潰し対策、削除済み資料のベクトル/原本を一掃するバッチ、プロンプトインジェクション対策を作り込んだ。
- 選択肢:まず検索が動く最小構成を出し、運用の穴は障害が起きてから塞ぐ。
- 理由:LLM アプリは「動くデモ」までは速い。差が出るのは、資料が壊れている・処理が途中で落ちる・資料が削除された、といった正常系の外側をどれだけ設計しているか。利用者の資料を預かる以上、整合性の穴は信頼の穴になる。
- 結果:運用上の問題を自分で見つけて塞ぐサイクルを回せた。周辺の設計がそのまま基盤の品質になっている。
「誤って成功したように見える」経路を CI/CD から潰した
- 判断:マイグレーションを実行するイメージを SHA タグで固定し、承認ゲートを迂回できる merge 経路を廃止した。CodeBuild のトリガーは push ではなく ECR へのイメージ登録完了に置いた。
- 理由:push を起点にするとビルド完了前にマイグレーションが走りうる。可変タグを使うと「未適用なのに成功」が起きうる。動くことより、失敗が失敗として見えることを優先した。
- 結果:マイグレーションとデプロイの順序が構成上保証され、承認なしに本番へ到達する経路がなくなった。
型安全でないテストを構造的に潰した
- 判断:
as unknownキャストによるモックを jest-mock-extended へ全面移行し(22モジュール)、develop で壊れていた型チェック 73件・落ちていた spec 100件超を復旧して全スイートを緑に戻した。 - 理由:カバレッジの数字ではなく「テストが本当に検証しているか」を見る。空振りで緑になっていたテストが複数見つかり、個別修正では再発すると判断した。
- 結果:型の穴を通したモックが書けなくなり、テストの信頼性を仕組みで担保できるようになった。
詰まったところ・失敗
- 運用の穴は一度で見つからない。再配信の引き継ぎ、可視性タイムアウト、maxReceiveCount の食い潰しは、それぞれ別のタイミングで気づいて塞いだ。最初から一覧できていたわけではない。
- レビュー指摘の量。1つの PR に 10件前後の指摘が付くことが繰り返しあり、セルフレビューで先に穴を潰すコミットを習慣にした。
学び
- LLM アプリの周辺こそが本体。取り込み・失敗・削除・整合性を設計できるかで、基盤の信頼性が決まる。
- 「動く」と「正しく失敗する」は別物。CI/CD でもテストでも、緑に見えて何も検証していない経路を潰すのが自分の仕事だった。
- 前職の「サーバーレスアプリケーション開発」から、開発基盤・プラットフォーム側へ軸足が移った。その着地点がこの基盤。