はじめに
こんにちは。DX開発事業部の鹿嶋です。ねこ、吸ってますか?
約1年ほど前、Professional Database Engineer の試験を受験しました。
ちょうど試験問題のスコープが変更された後の受験だったのですが、その時新しく追加された対象に「AlloyDB」がありました。
恥ずかしながら1年経過した今の今まで、座学の知識のみで満足に触ることもできていなかったため、「AlloyDB Omni」を使用して、先日のリリースノートの内容を教材として触ってみようと思います。
該当のリリースノートは以下になります。
AI関数を使用してインテリジェントな SQL クエリを実行する
事前準備
今回は手元のローカル環境(Docker)に AlloyDB Omni を構築し、Google Cloud の Agent Platform に接続してAI関数を試していきます。
実際に動かすにあたり、以下の準備を行いました。
1. 動作環境の用意
- Docker Desktop (または Podman など) が動作する環境
- Google Cloud プロジェクト
- プロジェクトに付随するサービスアカウント(Agent Platform の権限を持つもの)
2. AlloyDB Omni の起動
今回のAI関数を動かすには、AlloyDB AI の機能が有効になっている必要があります。
コンテナ起動時に必要なパラメータを指定して起動します。
手元のローカル環境で Agent Platform(Gemini)と連携できるよう、Google Cloud 上のサービスアカウントの鍵(JSONファイル)をマウントしつつ、AlloyDB AI 関連のフラグを有効化してコンテナを起動します。
※Agent Platform API が有効化されているか、請求先アカウントが存在しているかなどのチェックもお忘れなく…(1敗)
docker run --name alloydb-omni \
-e POSTGRES_PASSWORD={your_password} \
-v ~/.config/gcloud:/secrets/gcloud \
-e GOOGLE_APPLICATION_CREDENTIALS=/secrets/gcloud/{your_key_name}.json \
-e ENABLE_AI=1 \
-p 5432:5432 \
-d google/alloydbomni \
-c "google_ml_integration.enable_model_support=on" \
-c "alloydb_ai_nl.enabled=on"
3. データベースの初期設定と Agent Platform の連携
コンテナが起動したらDBに接続し、拡張機能の有効化と利用する Gemini モデルの登録を行います。
docker exec -it alloydb-omni psql -U postgres
CREATE EXTENSION google_ml_integration CASCADE;
CREATE EXTENSION alloydb_ai_nl CASCADE;
CALL
google_ml.create_model(
model_id => 'gemini-2.5-flash-lite-global',
model_type => 'llm',
model_provider => 'google',
model_qualified_name => 'gemini-2.5-flash-lite',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/{your_PROJECT_ID}/locations/global/publishers/google/models/gemini-2.5-flash-lite:generateContent',
model_auth_type => 'alloydb_service_agent_iam'
);
4. 検証用データの作成
各種関数を検証するために、簡易的なテーブルを作成し、ダミーデータをいくつか投入しておきます。
架空の従業員マスタから、AI関数で結果を出力するシチュエーションを想定しています。
※この従業員マスタはフィクションであり、実在の人物・団体とは一切関係ありません
id | name | department | joined_year | review_comment ----+-----------+------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | 佐藤 太郎 | 開発部 | 2024 | 最新の生成AI技術に非常に詳しく、社内ツールの自動化を一人で成し遂げた。文句なしのトップエンジニア。 2 | 鈴木 一郎 | 営業部 | 2025 | 入社直後から大活躍。新規の大型契約を3件も獲得し、今期の営業エースとして期待されている。 3 | 高橋 花子 | 人事部 | 2025 | 他部署との調整業務が非常に丁寧。ただ、時々遅刻や提出物の期限遅れがあり、勤怠面にやや課題あり。 4 | 田中 次郎 | 開発部 | 2026 | プログラミング能力は高いが、チームメンバーとのコミュニケーションが不足しており、孤立しがち。 5 | 渡辺 慶子 | 総務部 | 2024 | ExcelのマクロやPythonを使って、総務の定型業務を大幅に効率化してくれた。非常に優秀。 6 | 小林 誠 | 開発部 | 2024 | 技術力は平均的だが、前職の知識を活かしてインフラの移行作業をスムーズに進行してくれた。縁の下の力持ち。 7 | 加藤 美咲 | 営業部 | 2026 | やる気は非常に高く、積極的に顧客へアプローチしているが、まだ成果には結びついていない。これからの成長に期待。 8 | 木村 健太 | 開発部 | 2025 | Pythonでのデータ分析が得意。ただ、ドキュメントの作成を後回しにする癖があり、チーム内での共有に支障が出ている。 9 | 中村 裕子 | 人事部 | 2024 | 採用業務において、新しいスカウトツールの導入を主導。候補者との面談設定の自動化を構築し、面接設定にかかる時間を従来の半分以下に削減することに成功した。さらに新卒採用のイベントでも登壇し、会社の認知度向上に大きく貢献している。 10 | 伊藤 翼 | 開発部 | 2026 | 入社したばかりだが、Go言語のスキルが非常に高く、既存システムのバグを初週で3件も修正して周囲を驚かせた。一方で、朝が少し弱いようで、リモートワーク時の始業連絡が遅れることがたまにあるのが玉にキズ。 11 | 山本 一馬 | 営業部 | 2024 | 2年連続で全社MVPを獲得。どんなに厳しい目標でも必ず達成する圧倒的な営業力と、後輩の育成能力も兼ね備えた完璧な存在。 12 | 斎藤 結衣 | 総務部 | 2025 | 日々のルーティンワークは正確にこなしているが、急な指示やトラブルが発生した際、パニックになりやすく業務がストップしてしまう。自主的な判断力をもう少し磨いてほしい。
実際にやってみた
リリースノートにある以下の関数の動きを検証します。
- フィルタリング(
ai.if) - セマンティック ランキング(
ai.rank) - テキスト生成(
ai.generate)
1. ai.if を使った自然言語フィルタリング
従来の LIKE 検索では難しい内容ですが、文章のニュアンスを Gemini に判断させて抽出してみます。
テーブル内の従業員レビューから「勤怠 or コミュニケーション能力 or 精神面に関してネガティブなニュアンスを含んでいる行」を抽出してみます。
期待値としては、以下の行が出力されれば最高!と言ったところでしょうか。
- 高橋 花子(勤怠面にやや課題あり。)
- 田中 次郎(チームメンバーとのコミュニケーションが不足しており、孤立しがち。)
- 木村 健太(チーム内での共有に支障が出ている。)
- 伊藤 翼(朝が少し弱いようで、リモートワーク時の始業連絡が遅れることがたまにあるのが玉にキズ。)
- 斎藤 結衣(急な指示やトラブルが発生した際、パニックになりやすく業務がストップしてしまう。)
SQLと実行結果はこちらです。
SELECT name, department, review_comment
FROM employees
WHERE ai.if(
prompt => '以下の従業員レビューの中に、勤怠、コミュニケーション、または精神的な面での「課題」や「懸念点」が少しでも含まれているものはありますか? レビュー: ' || review_comment,
model_id => 'gemini-2.5-flash-lite-global'
);
name | department | review_comment
-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
高橋 花子 | 人事部 | 他部署との調整業務が非常に丁寧。ただ、時々遅刻や提出物の期限遅れがあり、勤怠面にやや課題あり。
田中 次郎 | 開発部 | プログラミング能力は高いが、チームメンバーとのコミュニケーションが不足しており、孤立しがち。
加藤 美咲 | 営業部 | やる気は非常に高く、積極的に顧客へアプローチしているが、まだ成果には結びついていない。これからの成長に期待。
木村 健太 | 開発部 | Pythonでのデータ分析が得意。ただ、ドキュメントの作成を後回しにする癖があり、チーム内での共有に支障が出ている。
伊藤 翼 | 開発部 | 入社したばかりだが、Go言語のスキルが非常に高く、既存システムのバグを初週で3件も修正して周囲を驚かせた。一方で、朝が少し弱いようで、リモートワーク時の始業連絡が遅れることがたまにあるのが玉にキズ。
斎藤 結衣 | 総務部 | 日々のルーティンワークは正確にこなしているが、急な指示やトラブルが発生した際、パニックになりやすく業務がストップしてしまう。自主的な判断力をもう少し磨いてほしい。
想定していた行はバッチリ結果に出力されていますね!
また、加藤 美咲(まだ成果には結びついていない。これからの成長に期待。)が出力されているというところも、レビューを課題と解釈したといえるので、期待値ではありませんでしたが良い結果ではないでしょうか。
2. ai.rank を使ったカスタムスコアリングと並び替え
自然言語で与えた独自のルールに従って、生成AIに10点満点でスコア付けをさせ、その高い順にソートさせてみます。
スコアのベースとなる指標としては、「業務効率化への貢献度」でランクを付けてみようと思います。
ルールはシンプルかつ極端に、レビューの中に特定のワードが含まれている・成し遂げたと判断できれば高得点という形にしました、
- ExcelマクロやPython、新ツールの導入で自動化・効率化を成し遂げた:8〜10点
- インフラ移行やデータ分析などの技術的貢献があるが自動化の明記はない:4〜7点
- 効率化や技術的な貢献についての記載がない:1〜3点
期待値としては、以下の行が高得点で上位にランクインすれば…と言ったところでしょうか。
- 佐藤 太郎(最新の生成AI技術に非常に詳しく、社内ツールの自動化を一人で成し遂げた。文句なしのトップエンジニア。)
- 渡辺 慶子(ExcelのマクロやPythonを使って、総務の定型業務を大幅に効率化してくれた。非常に優秀。)
- 中村 裕子(採用業務において、新しいスカウトツールの導入を主導。候補者との面談設定の自動化を構築し、面接設定にかかる時間を従来の半分以下に削減することに成功した。)
SQLと実行結果はこちらです。
SELECT
name,
department,
review_comment,
ai.rank(
prompt => '以下のルールに従って、この従業員が「自動化、マクロ、Python、ツール導入などで業務効率化に貢献した度合い」を1から10の数値で評価してください。
(1) ExcelマクロやPython、新ツールの導入で自動化・効率化を成し遂げた:8〜10点
(2) インフラ移行やデータ分析などの技術的貢献があるが自動化の明記はない:4〜7点
(3) 効率化や技術的な貢献についての記載がない:1〜3点
レビュー: ' || review_comment,
model_id => 'gemini-2.5-flash-lite-global'
) AS efficiency_score
FROM employees
ORDER BY efficiency_score DESC;
| efficiency_score | name | department | review_comment
-----------+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------
9.9 | 渡辺 慶子 | 総務部 | ExcelのマクロやPythonを使って、総務の定型業務を大幅に効率化してくれた。 |
9.5 | 中村 裕子 | 人事部 | 採用業務において、新しいスカウトツールの導入を主導。候補者との面談設定の自動化を構築し、面接設定にかかる時間を従来の半分以下に削減することに成功した。さらに新卒採用のイベントでも登壇し、会社の認知度向上に大きく貢献している。 |
9.5 | 佐藤 太郎 | 開発部 | 最新の生成AI技術に非常に詳しく、社内ツールの自動化を一人で成し遂げた。文句なしのトップエンジニア。 |
5.0 | 小林 誠 | 開発部 | 技術力は平均的だが、前職の知識を活かしてインフラの移行作業をスムーズに進行してくれた。縁の下の力持ち。 |
5.0 | 木村 健太 | 開発部 | Pythonでのデータ分析が得意。ただ、ドキュメントの作成を後回しにする癖があり、チーム内での共有に支障が出ている。 |
3.0 | 斎藤 結衣 | 総務部 | 日々のルーティンワークは正確にこなしているが、急な指示やトラブルが発生した際、パニックになりやすく業務がストップしてしまう。自主的な判断力をもう少し磨いてほしい。 |
3.0 | 田中 次郎 | 開発部 | プログラミング能力は高いが、チームメンバーとのコミュニケーションが不足しており、孤立しがち。 |
3.0 | 伊藤 翼 | 開発部 | 入社したばかりだが、Go言語のスキルが非常に高く、既存システムのバグを初週で3件も修正して周囲を驚かせた。一方で、朝が少し弱いようで、リモートワーク時の始業連絡が遅れることがたまにあるのが玉にキズ。 |
3.0 | 山本 一馬 | 営業部 | 2年連続で全社MVPを獲得。どんなに厳しい目標でも必ず達成する圧倒的な営業力と、後輩の育成能力も兼ね備えた完璧な存在。 |
2.5 | 加藤 美咲 | 営業部 | やる気は非常に高く、積極的に顧客へアプローチしているが、まだ成果には結びついていない。これからの成長に期待。 |
2.0 | 高橋 花子 | 人事部 | 他部署との調整業務が非常に丁寧。ただ、時々遅刻や提出物の期限遅れがあり、勤怠面にやや課題あり。 |
1.0 | 鈴木 一郎 | 営業部 | 入社直後から大活躍。新規の大型契約を3件も獲得し、今期の営業エースとして期待されている。 |
実際にこの評価制度が適用されてしまうととんでもないですが、概ね期待値通りの結果になったかと思います。
- review_comment の中にルールに記載のワードが直接含まれている → 高得点
- 記載のワードがないものの「技術的貢献」がなんなのかを解釈している → 中間の得点
- 普通の評価制度なら間違いなくトップ評価になる「2年連続MVP」や「大型契約3件」のワードが評価対象外となる → 低得点
繰り返しになりますが、こちらの結果はフィクションですのでご安心ください。
3. ai.generate を使ったテキスト生成
最後は、レビューコメントをAIに読ませて、15文字以内の短いキャッチコピー(要約)をSQLの結果として出力させてみます。
中には長文のレビューコメントが記載されている行もあるので、きちんと文字数以内で要約がなされるかが焦点かと思います。
SQLと実行結果はこちらです。
SELECT
name,
department,
ai.generate(
prompt => '以下の従業員レビューを読み、その人の特徴を表すキャッチコピーを15文字以内の日本語で出力してください。余計な解説は不要です。 レビュー: ' || review_comment,
model_id => 'gemini-2.5-flash-lite-global'
) AS ai_summary
FROM employees;
name | department | ai_summary
-----------+------------+----------------------------------
佐藤 太郎 | 開発部 | AI自動化のトップエンジニア
鈴木 一郎 | 営業部 | 新規契約3件獲得の営業エース
高橋 花子 | 人事部 | 丁寧だが時間にルーズ
田中 次郎 | 開発部 | 孤高の天才プログラマー
渡辺 慶子 | 総務部 | 総務業務を自動化する凄腕
小林 誠 | 開発部 | 縁の下の力持ち
加藤 美咲 | 営業部 | 意欲的だが未熟、成長期待
木村 健太 | 開発部 | ドキュメント苦手な分析職人
中村 裕子 | 人事部 | 採用効率化の推進者
伊藤 翼 | 開発部 | Go職人、朝は弱め
山本 一馬 | 営業部 | 目標達成の鬼、育成の達人
斎藤 結衣 | 総務部 | ルーチン正確だがパニックしやすいこちらもほぼ期待値通りの結果ですね!文字数は16文字でオーバーしてしまっている行があること、あとは文字数の制約の影響かもしれませんが、ネガティブな印象(コミュニケーション不足気味で孤立しがち)がポジティブな印象(孤高)に変換されていることでしょうか。
ただこちらの部分については、感情分析とセットにしてみたり、プロンプトを工夫するなどでやりようはありそうですね。
おわりに
いかがでしたでしょうか。
Python などの外部プログラムを1行も書くことなく、使い慣れた SELECT や ORDER BY の中で自然言語でクエリを書けるのは、率直に素晴らしい体験でした。
しかし、生成AIはこちらの指示を「いい感じに、きれいに」まとめたり、気を利かせて指示したこと以外のことまで行ってくれる性質があります。
もしシビアな意思決定が絡むシステムに組み込むならば、ガードレールをあらかじめ仕込んでおくなど、運用の工夫が必要と感じました。
といったような注意点はあるものの、SQL のみでここまで高度な文脈理解やスコアリングができる恩恵は非常に大きいものであると思います。
皆さんもぜひ、データベース × 生成AIの新しい開発体験を味わってみてください!