RDS PostgreSQL の rds_embedding 拡張機能は、データベース内で直接テキストをベクトルに変換します。この拡張機能は、カスタムモデル設定とモデル呼び出し機能を提供します。これにより、テキストからベクトルへの変換が簡素化および高速化され、データ処理のニーズに対応します。
背景
埋め込みとは、高次元データを低次元表現にマッピングするプロセスです。機械学習と Natural Language Processing (NLP) では、埋め込みは離散的な記号やオブジェクトを連続的なベクトル空間の点として表現します。
埋め込みを生成する際、ベクトルデータの値は参照されるモデルのデータに依存します。RDS PostgreSQL は rds_embedding 拡張機能をサポートしており、インポートされた外部モデルに基づいてデータベース内のテキストからベクトルデータを生成します。この拡張機能は、ベクトル類似性オペレーターを使用して、データベース内のテキストとモデル内の指定されたテキストとの類似性を計算することもサポートしています。この機能により、より多くのビジネスシナリオが可能になります。
前提条件
RDS インスタンスは PostgreSQL 14 以降を実行していること。
メジャーエンジンバージョンが要件を満たしているが、拡張機能がサポートされていない場合は、マイナーエンジンバージョンをアップグレードしてください。たとえば、PostgreSQL 17 を実行する RDS インスタンスの場合、マイナーエンジンバージョンは 20241030 以降である必要があります。詳細については、「マイナーエンジンバージョンをアップグレードする」をご参照ください。
このトピックでは、Alibaba Cloud Model Studio の text embedding model を使用します。Alibaba Cloud Model Studio をアクティブ化し、API キーを取得します。詳細については、「API キーを取得する」をご参照ください。
説明このトピックで使用される text embedding model に加えて、rds_embedding 拡張機能が提供する関数を使用して他のモデルを追加できます。詳細については、「rds_embedding 拡張機能が提供する関数」をご参照ください。
デフォルトでは、RDS PostgreSQL データベースはインターネットにアクセスできません。外部モデルへのアクセスを許可するには、RDS PostgreSQL インスタンスが存在する VPC に NAT Gateway を設定します。NAT Gateway の詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用してインターネットにアクセスする」をご参照ください。
拡張機能の有効化と無効化
特権アカウントを使用して次のコマンドを実行します。
拡張機能を有効にします。
rds_embedding拡張機能を有効にする前に、vector拡張機能を有効にする必要があります。vector拡張機能は、必要なベクトルデータ型のサポートと、ベクトル間の距離と類似性の計算などの基本的なベクトル操作を提供します。rds_embedding拡張機能は、高次元のテキストデータをベクトルに変換することに重点を置いています。CREATE EXTENSION vector; CREATE EXTENSION rds_embedding;拡張機能を無効にします。
DROP EXTENSION rds_embedding; DROP EXTENSION vector;
使用例
このトピックでは、Alibaba Cloud Model Studio が提供する text-embedding-v3 モデルを例として使用します。テキスト埋め込みモデルの詳細については、「モデル紹介」をご参照ください。
test という名前のテストテーブルを作成します。
CREATE TABLE test(info text, vec vector(1024) NOT NULL);モデルを追加します。
SELECT rds_embedding.add_model( 'text-embedding-v3', 'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding', 'Authorization: Bearer sk-****', '{"input":{"texts":["%s"]},"model":"text-embedding-v3","parameters":{"text_type":"query"}}', '->''output''->''embeddings''->0->>''embedding''' );説明rds_embedding.add_model() 関数の詳細については、「rds_embedding.add_model()」をご参照ください。
テキストとそれに対応するベクトルデータを挿入します。
INSERT INTO test SELECT 'Windy high sky, apes cry sadly', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Windy high sky, apes cry sadly')::real[]; INSERT INTO test SELECT 'Clear islet, white sand, birds fly back', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Clear islet, white sand, birds fly back')::real[]; INSERT INTO test SELECT 'Boundless falling leaves rustle down', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Boundless falling leaves rustle down')::real[]; INSERT INTO test SELECT 'Endless Yangtze River rolls on', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Endless Yangtze River rolls on')::real[];説明rds_embedding.get_embedding_by_model() 関数の詳細については、「rds_embedding.get_embedding_by_model()」をご参照ください。
テキスト
Endless Yangtze River rolls onと test テーブルの各テキストエントリとの間のベクトル類似性を計算します。SELECT info, vec <=> rds_embedding.get_embedding_by_model( 'text-embedding-v3', 'sk-****', 'Endless Yangtze River rolls on' )::real[]::vector AS distance FROM test ORDER BY vec <=> rds_embedding.get_embedding_by_model( 'text-embedding-v3', 'sk-****', 'Endless Yangtze River rolls on' )::real[]::vector;結果の例:
info | distance ------------------------------------+-------------------- Endless Yangtze River rolls on | 0 Boundless falling leaves rustle down | 0.42740682200152647 Windy high sky, apes cry sadly | 0.5247695147991147 Clear islet, white sand, birds fly back | 0.5161883811726116 (4 rows)
