
源内 AI アプリリポジトリの Google Cloud 法制度AIアプリ(Lawsy)テンプレートをデプロイし源内 Web から ExApp として使ってみた
いわさです。
先日 OSS 化された源内ですが、本日時点では源内 Web と 源内 AI アプリの2つのリポジトリで構成されています。
後者の源内 AI アプリは AWS と Azure と Google Cloud の3つのパブリッククラウドのアプリが用意されており、それぞれ役割が異なっています。上記の記事では AWS のアプリをデプロイしクエリ拡張 RAG を試しています。
今回は Google Cloud 版の「法制度AIアプリ(Lawsy-Custom-BQ)」テンプレートをデプロイして、ExApp として源内 Web に接続してみましたのでその方法や様子を紹介します。
Lawsy-Custom-BQ の概要
Lawsy-Custom-BQ は、法令に関する質問を受け取り、AI が意図を解析して最適化されたレポートを動的に生成するサーバーレス API システムです。
BigQuery ML のベクトル検索と Gemini 2.5 Flash を組み合わせ、e-Gov 法令データを対象とした検索・回答生成を行います。
e-Gov 法令検索は、総務省行政管理局が運営する日本の法令(憲法・法律・政令・省令等)のデータベースで、全法令の XML データが一括ダウンロード可能です。
Lawsy はこの XML データを BigQuery に取り込み、ベクトル検索の対象としています。
Gemini 2.5 Flash は Google の軽量かつ高性能な推論モデルで、100万トークンのコンテキストウィンドウと思考(thinking)機能を備えています。
Vertex AI 経由で利用でき、本テンプレートでは法令名の推定や条文の分析、レポート生成に使われています。
デジタル庁で2025年に行われた「法令」×「デジタル」ハッカソンの最優秀賞に選ばれた Lawsy を基に開発されたもので、ガバメントクラウド完結のためにエンハンスが進められた結果、中身は元のハッカソン作品とは全くの別物になっているとのこと。
処理の流れは以下の通りです。
- 法令名推定・検索 — Gemini の Web grounding で関連法令名を推定(3段階フォールバック付き)。施行令・施行規則を補完して検索対象を拡張し、BigQuery ML ベクトル検索で条文を取得(並列で Web 検索も実行)
- 条文選択とレポート生成 — AI が関連条文を選択し全文を取得。クエリの意図から6パターン(定義確認型、手続き確認型、比較検討型、解釈適用型、政策研究型、包括分析型)の最適な構造を自動選択し、Markdown レポートを1回で生成
- 出典フィルタリングと後処理 — 実際に引用された参考情報のみを抽出し、e-Gov へのクリック可能なリンク形式で整理
Cloud Functions のソースコードは以下で確認できます。
アーキテクチャ構成

構成は大きく2つのデプロイ方法に分かれています。
Terraform でデプロイされる部分(青枠):
- API Gateway(x-api-key 認証 + IP 制限)
- Cloud Functions(Python 3.12)
preprocess スクリプトでセットアップされる部分(黄枠):
- Vertex AI(Gemini 2.5 Flash + Web Grounding)
- BigQuery ML(ベクトル検索 + 法令データ)
- Cloud Storage(法令 JSONL)
手動操作:
- e-Gov からの法令 XML 一括ダウンロード
- BigQuery Connection の作成
源内 Web のバックエンド Lambda が VPC 内から NAT Gateway 経由で Google Cloud の API Gateway にリクエストを送ります。
API Gateway では x-api-key ヘッダーによる認証と、IP アドレスによるホワイトリスト制限が設定されています。
デプロイして ExApp に登録してみる
Terraform デプロイ
リポジトリをクローンして環境設定ファイルを作成します。
git clone https://github.com/digital-go-jp/genai-ai-api.git
cd genai-ai-api/google-cloud/lawsy-custom-bq
cp -r envs/sample envs/dev
envs/dev/backend.tf に Terraform state 用の GCS バケットを指定し、envs/dev/locals.tf にプロジェクト ID や Gemini の設定を記述します。
locals {
api_name = "lawsy-bq"
api_id = "lawsy-bq-api"
project_id = "your-project-id"
project_number = "your-project-number"
dataset_id = "e_laws_search"
gemini_settings = {
model_id = "gemini-2.5-flash"
inference_project_id = "your-project-id"
inference_location = "asia-northeast1"
// ...
}
allowed_ip_addresses = [
"xxx.xxx.xxx.xxx/32", // 源内 Web の NAT Gateway EIP
]
}
デプロイを実行します。
cd envs/dev
terraform init
terraform apply -auto-approve
デプロイには5〜6分程度かかりました。
API Gateway、Cloud Functions、サービスアカウント、IAM バインディングなどが作成されます。
なお、API Key の作成は Terraform のユーザー認証情報では API Keys API を呼べない問題があり、gcloud CLI で別途作成しました。
gcloud alpha services api-keys create \
--display-name="lawsy-bq-api-key" \
--api-target=service=<managed-service-name> \
--allowed-ips="xxx.xxx.xxx.xxx/32" \
--project=your-project-id
API Gateway のコンソール画面です。OpenAPI 仕様で Cloud Functions へのルーティングが定義されています。
データ準備
Terraform デプロイだけでは API は動きません。BigQuery にデータがないためです。
BigQuery Connection の作成
BigQuery ML で Vertex AI の embedding モデルを使用するための Connection を作成します。
bq mk --connection --location=asia-northeast1 --project_id=your-project-id \
--connection_type=CLOUD_RESOURCE vertex-ai-connection
生成されたサービスアカウントに Vertex AI ユーザーロールを付与します。
e-Gov から法令 XML をダウンロード
e-Gov 法令データの一括ダウンロードページから全法令の XML を ZIP でダウンロードします。
今回ダウンロードしたファイルは 272MB でした。
解凍すると 10,195 件の法令 XML が含まれています。
データパイプラインの実行
./preprocess/run_entire_pipeline.sh \
your-project-id \
e_laws_search \
./xml_files \
your-bucket-name \
laws.jsonl \
asia-northeast1 \
vertex-ai-connection \
20260506
10,195 件の法令 XML のパースは約18秒で完了し、BigQuery には 505,346 行がロードされました。
BigQuery コンソールで確認すると、以下のテーブルが作成されています。

source_laws_20260506: ソース層(生データ)dwh_laws: DWH 層(全バージョン履歴)app_laws_master: App 層(法令マスタ + embedding)app_laws_for_indexing: App 層(条文検索用)
なお、ベクトルインデックス(IVF)の構築は非同期で行われます。
INFORMATION_SCHEMA.VECTOR_INDEXES で coverage_percentage が 100 になるまで待つ必要があります。
今回は数分で完了しました。
ExApp として源内 Web に登録
API Key の IP 制限に源内 Web の NAT Gateway Elastic IP を追加します。

源内 Web のチーム管理画面から ExApp を登録します。

- 名前: 法令レポート生成
- APIエンドポイントのURL:
https://lawsy-bq-api-gateway-xxxxx.an.gateway.dev/invoke - APIキー: Google Cloud Console で取得した API キーの値
- APIリクエストのデータ形式(JSON):
{"input_text": {"type": "textarea", "title": "法令に関する質問", "desc": "法令に関する質問を入力してください。例:「デジタル社会形成基本法における『デジタル社会』の定義を教えてください」", "required": true}}
登録後、ExApp を開いて質問を入力し「実行」を押すと、Google Cloud 上の Lawsy API が呼び出されてレポートが生成されます。

源内 Web の UI から、裏側の Google Cloud(Gemini 2.5 Flash + BigQuery ML ベクトル検索)を使った法令レポート生成が動いている状態です。
法令の条文を正確に引用した構造化されたレポートが返ってきました。
ランニングコストの試算
Google Cloud 版のランニングコストを試算してみます。
Google Cloud 版は完全サーバーレス構成のため、利用していない時間のコストがほぼゼロです。良いですね。
構成要素ごとの料金
| サービス | 料金体系 | 月額目安(低利用時) |
|---|---|---|
| Cloud Functions | CPU/メモリ/リクエスト従量課金 | ほぼ無料(無料枠内) |
| API Gateway | $3/100万コール(最初200万コール無料) | $0(検証レベル) |
| BigQuery | ストレージ: $0.023/GB、クエリ: $6.25/TB | $1〜5 |
| Vertex AI (Gemini 2.5 Flash) | 入力: $0.15/100万トークン、出力: $0.60/100万トークン | $1〜10 |
| Vertex AI (Web Grounding) | リクエスト従量課金 | $1〜5 |
| Cloud Storage | $0.023/GB + オペレーション | $0.1未満 |
さいごに
本日は源内 AI アプリリポジトリの Google Cloud 版テンプレート「Lawsy-Custom-BQ」をデプロイして、ExApp として源内 Web に接続してみました。
AWS 版と比べると、完全サーバーレス構成で固定費がほぼ発生しないのが良いですね。
検証用途では月額 $5〜15 程度で運用できるので気軽に試せます。
一方で、デプロイの手順は AWS 版より複雑でした。
Terraform だけでは完結せず、BigQuery Connection の手動作成、e-Gov からの法令 XML ダウンロード、Python パイプラインの実行が別途必要です。
源内を使いたいという時、この法令検索アプリを使いたいケース多いと聞いています。
そのためOSS化されたテンプレートどおりに源内をセルフデプロイして使おうとするとマルチクラウド(最低でも AWS + Google Cloud)は必須になってきてしまいそうですね。Lawsy-Custom-BQ の AWS 版が用意できれば AWS だけで簡潔できそうですが。









