この記事ではDb2 for LUW v12.1.5で実装されたDb2 SQLを使った生成AI機能を概説しています。
下記Blogの抄訳です。今回はDb2 SQLを使ってエンベディングとセマンティック検索を行います。
"Db2 12.1.x EAP: Call Language Models Directly from SQL"
https://community.ibm.com/community/user/blogs/shaikh-quader/2025/11/04/db2-eap-llm-integration
(上記英語オリジナルBlog内でベータ扱いの機能はv12.1.5では正式にリリースされています)
セマンティック検索用の埋め込み(embedding)を生成するには、通常、Pythonスクリプト、REST API、そしてシステム間で情報を移動させるデータパイプラインが必要となります。
Db2 12.1.5以降は、こうした複雑さを解消します。
データベース開発者は、SQLから直接、外部の言語モデルを呼び出せるようになりました。
クラウドでホストされているモデルであれ、ローカルにデプロイされたモデルであれ、埋め込みモデルをデータベースオブジェクトとして登録可能です。
そのため、モデルを呼び出すためにデータベース外のスクリプトやデータパイプラインを用意する必要はもうありません。
Db2 v12.1.5では、watsonx.aiの埋め込みモデルや、Ollamaのようなローカル環境にデプロイされたOpenAI互換の推論エンジンがサポートされています。
v12.1.5ではテキスト生成モデルもサポートされています。
モデルを異なるプラットフォーム上で実行できる設計になっているため、チームは言語モデルの配置場所を自由に選択できます。
今回のアップデートは、Db2 12.1.2で導入されたVECTORデータ型を基盤としています。
以前からベクトルの保存やクエリ実行は可能でしたが、埋め込みの生成にはPythonスクリプトやREST API、あるいは何らかのカスタムコーディングやシステム間のデータ移動が必要でした。
新しいTO_EMBEDDING関数により、埋め込み生成をSQL自体の中で行えるようになります。
本記事で紹介するユースケースでは、watsonx.aiのモデルを使用してセマンティック検索を行うITヘルプデスクのナレッジベースを例に、この機能の活用方法を説明します。
なぜこれが重要なのか、そしてワークフローがどのように変化するのか
言語モデルは、単なるキーワードではなく「意味」を理解します。
「プリンターが動かない(Printer won't work)」というクエリと「印刷ジョブがキューで止まっている(Print job stuck in queue)」というクエリは、使用されている単語が異なっていても、同じ結果を返すのが理想的です。
ベクトル埋め込みは、こうした意味的な類似性を捉え、検索を可能にします。
従来の埋め込み生成ワークフローには、複数のステップが必要でした。
まずデータベースからテキストを抽出し、次にPythonやNode.jsなどの言語から埋め込みAPIを呼び出し、最後に生成されたベクトルをデータベースに書き戻す、といった手順です。
各ステップにおいて保守すべきコードが増え、障害が発生する可能性のある箇所も増えていました。
従来のワークフロー:
データベースからのデータ抽出 → 外部APIの呼び出し → ベクトルの読み込み → 検索の実行
Db2での新しいワークフロー:
モデルの登録(1回のみ) → TO_EMBEDDINGを使用したSQL INSERT → ベクトル検索を行うSQL SELECT
Db2は、こうした中間ステップを不要にします。
外部モデルを認証情報やエンドポイントと共にデータベースオブジェクトとして登録することで、データベース内のモデルオブジェクトに対する標準的な認可制御を通じたアクセス管理が可能になります。
Db2に組み込まれたTO_EMBEDDING関数は、モデルを直接呼び出して埋め込み(ベクトル)を生成します。
生成された埋め込みの保存は、単純なSQLのINSERTやUPDATEで行えます。
検索クエリでは、テキストの埋め込みとベクトルの比較を単一のSELECT文で実行できます。
その結果、構成要素が減り、デプロイや保守が容易になります。
SQL開発者は、APIクライアントライブラリを習得することなく、埋め込みデータを扱えるようになります。
トレードオフとして、クエリはAPI呼び出しの完了を待つ必要がありますが、これにより、夜間バッチ処理による埋め込み生成から、リアルタイム性を備えた柔軟な運用へと移行できます。
クイックスタート:30秒で動作を確認する
必要なもの:
・Db2 for LUW v12.1.5以降
・API認証情報を含む、外部モデルプロバイダーのアカウント
・プロジェクトIDまたはスペースID(クラウドプロバイダーの場合)
・モデルID
すぐに動作を確認したいですか? こちらが最小限のコードです:
ステップ1:埋め込みモデルを登録する
CREATE EXTERNAL MODEL slate30m
PROVIDER WATSONX KEY 'your-watsonx-api-key-here'
ID 'ibm/slate-30m-english-rtrvr'
TYPE TEXT_EMBEDDING RETURNING VECTOR(384, FLOAT32)
URL 'https://us-south.ml.cloud.ibm.com/ml/v1/text/embeddings?version=2023-10-25'
PROJECT_ID 'your-project-id-1234-5678-9abc';
ステップ2: 埋め込みを生成する
VALUES TO_EMBEDDING('Hello world' USING slate30m);
以上です。
すぐに384次元のベクトルが返されます。
それでは、この機能を使って本格的なセマンティック検索システムを構築してみましょう。
ユースケース例:セマンティック検索システムの構築
ステップ 1:モデルの登録(初回のみのセットアップ)
watsonx.ai の外部埋め込みモデルを登録します:
CREATE EXTERNAL MODEL slate30m
PROVIDER WATSONX KEY 'your-watsonx-api-key-here'
ID 'ibm/slate-30m-english-rtrvr'
TYPE TEXT_EMBEDDING RETURNING VECTOR(384, FLOAT32)
URL 'https://us-south.ml.cloud.ibm.com/ml/v1/text/embeddings?version=2023-10-25'
PROJECT_ID 'your-project-id-1234-5678-9abc';
上記のパラメータの説明:
PROVIDER WATSONX: LLMプロバイダーとしてIBMのWatsonx.aiを使用
KEY: プロバイダーのAPI認証トークン
ID: プロバイダーにおける特定のモデル識別子
TYPE TEXT_EMBEDDING: 言語モデルのタイプ
RETURNING VECTOR(384, FLOAT32): 出力形式(次元数は埋め込みモデルの出力次元数と一致させる必要があります)
URL: モデルのAPIエンドポイント
PROJECT_ID: Watsonx.aiにおけるユーザーのプロジェクトID
TO_EMBEDDINGを最初に呼び出した際に、認証情報やパラメータの値が誤っているとエラーが発生します。
ステップ2:表を作成します
CREATE TABLE ANSWERS (
id INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
content CLOB(500),
embedding VECTOR(384, FLOAT32),
PRIMARY KEY (id)
);
ステップ3:データを挿入し、埋め込みを生成する(ワンステップで実行)
INSERT INTO ANSWERS (content, embedding) VALUES
('Printer issue: Restart the spooler service, clear pending print jobs, and verify printer connectivity.', TO_EMBEDDING('Printer issue: Restart the spooler service, clear pending print jobs, and verify printer connectivity.' USING slate30m)),
('No internet access: Check network cables, restart router, and renew IP using ipconfig /renew.', TO_EMBEDDING('No internet access: Check network cables, restart router, and renew IP using ipconfig /renew.' USING slate30m)),
('Email sync problem: Verify Outlook settings, clear cache, and test connectivity to mail server.', TO_EMBEDDING('Email sync problem: Verify Outlook settings, clear cache, and test connectivity to mail server.' USING slate30m)),
('User login failed: Reset the password, verify account status in Active Directory, and unlock the user.', TO_EMBEDDING('User login failed: Reset the password, verify account status in Active Directory, and unlock the user.' USING slate30m)),
('Slow performance: Check CPU and memory usage, close background applications, and restart the system.', TO_EMBEDDING('Slow performance: Check CPU and memory usage, close background applications, and restart the system.' USING slate30m)),
('VPN not connecting: Verify credentials, restart VPN client, and check firewall or proxy settings.', TO_EMBEDDING('VPN not connecting: Verify credentials, restart VPN client, and check firewall or proxy settings.' USING slate30m));
ステップ 4: セマンティック検索でクエリを実行する
SELECT id, content,
ROUND(VECTOR_DISTANCE(
embedding,
TO_EMBEDDING('Document stuck in print queue, printer not working' USING slate30m),
COSINE
), 4) AS score
FROM ANSWERS
ORDER BY score ASC
FETCH FIRST 2 ROWS ONLY;
TO_EMBEDDINGの呼び出しは、外部モデルへのネットワークリクエストを行います。
距離スコアが低いほど、類似度が高いことを意味します。
ユーザーの表現は保存されている回答の文言とは異なりますが、ベクトルは意味的な関係性を捉えることができます。
別の検索(「ウェブサイトの閲覧やインターネットへのアクセスができない」など)を行った場合、使用されている用語が異なっていても、インターネット接続のトラブルシューティングに関する回答が提示されるはずです。
Db2における登録済みモデルへのアクセス管理:
-- Grant usage
GRANT USAGE ON EXTERNAL MODEL slate30m TO USER helpdesk_agent;
-- Check permissions
SELECT * FROM SYSCAT.EXTERNALMODELAUTH WHERE EXTERNALMODELNAME = 'SLATE30M';
-- Revoke access
REVOKE USAGE ON EXTERNAL MODEL slate30m FROM USER helpdesk_agent;
モデルの削除(DROP):
DROP EXTERNAL MODEL slate30m;
TO_EMBEDDINGを呼び出すには、ユーザーにUSAGE権限が必要です。
この権限は、ユーザー、グループ、ロール、またはPUBLICに対して付与できます。
呼び出しを行うたびに、モデルプロバイダーのAPIクォータが消費されます。
TO_EMBEDDING関数を呼び出すと、Db2はテキストを伴うHTTPSリクエストを外部モデルプロバイダーに送信し、埋め込み(embedding)を受け取ります。
このデータフローがお客様のセキュリティ要件を満たしているかどうかをご検討ください。
この機能は、SQLを介して外部の言語モデルとデータベースを連携させます。
ヘルプデスクの例では、登録、埋め込みの生成、類似性検索の手順が示されています。
この機能がお客様のアーキテクチャに適しているかどうかは、埋め込みロジックをどこに配置したいか、および外部APIへの依存関係をどのように管理するかによって決まります。
まとめ
この機能は、データベース開発者がAIアプリケーションを構築する方法を大きく変えるものです。
従来は複数の言語、フレームワーク、デプロイメントパイプラインを必要としていた処理が、今やネイティブSQLとして実行可能になります。
ヘルプデスクの例がこれを明確に示しており、約50行に及ぶPythonコード、APIクライアント、同期ロジックが、わずか6行のSQLに置き換わっています。
今後、テキスト生成モデル(補足:v12.1.5で実装済)やその他のプロバイダーへの対応を拡大していくことで、データベースは完全なAIアプリケーションプラットフォームへと進化する予定です。
更に、ALTER EXTERNAL MODEL文のサポート(補足:v12.1.5で実装済)、カタログビューの強化、モデル機能の拡張などが予定されています。
さわってみよう Db2 AIエディション・シリーズのご紹介
過去記事のご紹介
#1から#5まではAIアシスタント機能についてご紹介しています。
#6と#7はモニタリング機能についてご紹介しています。
#8は耐量子暗号化機能についてご紹介しています。
#9は耐量子暗号化機能を含むv12.1.5の新機能についてご紹介しています。
#10はDb2 SQLで生成AI機能を使う方法をご紹介しています。
#1では、Db2入門者、初心者には作成が難しいと思われる複雑なSQLをAIアシスタントを使って作成しています。加えて、Db2 Genius Hub概要、無料評価版のダウンロードサイトやマニュアルURLもご紹介しています。#1からお読みいただくことをお勧めいたします。
さわってみよう Db2 AI エディション #1 〜エージェント型AIアシスタント編 Part#1〜
https://qiita.com/ibm_tk/items/e763bbea3fcf5e8a27a9
#2では、AIアシスタントでデータベースの稼働状況のサマリーを表示しています。
さわってみよう Db2 AI エディション #2 〜エージェント型AIアシスタント編 Part#2〜
https://qiita.com/ibm_tk/items/e11986879f6eca23c249
#3では、AIアシスタントでデータベースの応答時間の履歴を表示しています。
さわってみよう Db2 AI エディション #3 〜エージェント型AIアシスタント編 Part#3〜
https://qiita.com/ibm_tk/items/24647bc2db6a3a266d7c
#4では、AIアシスタントでデータベースのバックアップ履歴とプロセッサー利用状況の履歴を表示しています。
さわってみよう Db2 AI エディション #4 〜エージェント型AIアシスタント編 Part#4〜
https://qiita.com/ibm_tk/items/8d11c4e9fd39740d923d
#5では、AIアシスタントでクエリのスループットを表示しています。
さわってみよう Db2 AI エディション #5 〜エージェント型AIアシスタント編 Part#5〜
https://qiita.com/ibm_tk/items/e2583b00f624e351ce02
#6となる"さわってみよう Db2 AIエディション#6 〜モニタリング編 Part#1〜"ではモニタリング機能をご紹介しています。
https://qiita.com/ibm_tk/items/cdedc3a878998199cfee
#7となる"さわってみよう Db2 AIエディション#7 〜モニタリング編 Part#2〜"では監視(モニター)レポート作成機能をご紹介しています。
https://qiita.com/ibm_tk/items/81608900a0e2c89c18fc
#8となる"さわってみよう Db2 AIエディション#8 〜耐量子暗号化機能編 Part#1〜"では耐量子暗号化機能と登場した背景などについて記述しています。
https://qiita.com/ibm_tk/items/57a115c0d284697dd147
#9となる"さわってみよう Db2 AIエディション#9 〜v12.1.5新機能編 Part#1〜"ではv12.1.5の新機能のハイライトをご紹介しています。
https://qiita.com/ibm_tk/items/daabdf8215b430e804d8
#10となる"さわってみよう Db2 AIエディション#10 〜SQLで生成AI編 Part#1〜"ではv12.1.5以降で利用できるようになったSQLから使える生成AI機能(TEXT_GENERATION関数など)をご紹介しています。
https://qiita.com/ibm_tk/items/54a169cffcfbb9be0fed

