セマンティック検索または検索拡張生成 (RAG) パイプラインを構築する際、テキスト埋め込みの生成には、通常、データベース外部の個別サービスが必要になります。rds_embedding 拡張機能を使用すると、ApsaraDB RDS for PostgreSQL から直接外部の埋め込みモデルを呼び出し、結果のベクトルをデータと共に保存し、コサイン類似度クエリを実行するという、これらすべてをデータベース内で完結させることができます。セキュリティリスクのため、この拡張機能はすべてのバージョンで作成が制限されています。このトピックの内容は、拡張機能がすでに作成されているインスタンスにのみ適用されます。
セキュリティリスクのため、RDS PostgreSQL のすべてのメジャーおよびマイナーエンジンバージョンで rds_embedding 拡張機能の作成が制限されています。マイナーエンジンバージョンをアップグレードしても、この制限は解除されません。拡張機能がすでに作成されているインスタンスは影響を受けず、引き続き使用できます。このトピックの内容は、このようなインスタンスにのみ適用されます。
前提条件
開始する前に、以下が準備できていることを確認してください:
PostgreSQL 14 以降を実行している RDS インスタンス
rds_embedding拡張機能がすでに作成されているインスタンス。この拡張機能はすべてのバージョンで作成が制限されており、マイナーエンジンバージョンをアップグレードしてもこの制限は解除されませんAlibaba Cloud Model Studio の API キー。取得方法については、「API キーの取得」をご参照ください
RDS インスタンスが実行されている Virtual Private Cloud (VPC) に設定された NAT ゲートウェイ。RDS PostgreSQL インスタンスはデフォルトでインターネットにアクセスできないため、外部の埋め込みモデルを呼び出すには NAT ゲートウェイが必要です
拡張機能の有効化
特権アカウントを使用して、次のコマンドを実行します。まず vector を有効にします。これは、rds_embedding が依存する vector データ型と操作を提供します。rds_embedding 拡張機能は、すべてのバージョンで作成が制限されています。次のステートメントは、拡張機能がすでに作成されているインスタンスにのみ適用されます。
CREATE EXTENSION vector;
CREATE EXTENSION rds_embedding;拡張機能を無効にするには:
DROP EXTENSION rds_embedding;
DROP EXTENSION vector;埋め込みの生成とクエリ
次の例では、Alibaba Cloud Model Studio の text-embedding-v3 モデルを使用して 1024 次元ベクトルを生成し、コサイン類似度クエリを実行します。 モデルの詳細については、「モデルの紹介」をご参照ください。
ステップ 1:テーブルの作成
コンテンツ用の text 列と、埋め込み用の vector(1024) 列を持つテーブルを作成します。
CREATE TABLE test(info text, vec vector(1024) NOT NULL);ステップ 2:埋め込みモデルの登録
エンドポイント URL、認証ヘッダーテンプレート、リクエストボディテンプレート、およびレスポンスから埋め込みを抽出するための JSON パスを指定して、text-embedding-v3 を登録します。
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'''
);sk-****をご自身の API キーに置き換えます。
ステップ 3:テキストと埋め込みの挿入
rds_embedding.get_embedding_by_model() をインラインで呼び出して各行を挿入します。この関数はモデル API を呼び出し、指定されたテキストに対する埋め込みベクトルを返します。
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[];sk-**** をお使いの API キーに置き換えます。
ステップ 4:ベクトル類似度によるクエリ
<=> 演算子 (コサイン距離) を使用して、クエリ文字列とのセマンティック類似性で行をランク付けします。距離 0 はベクトルが同一であることを意味し、値が小さいほど類似性が高くなります。
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;sk-**** をお客様の API キーに置き換えてください。
期待される出力:
info | distance
-----------------------------------------+--------------------
Endless Yangtze River rolls on | 0
Boundless falling leaves rustle down | 0.42740682200152647
Clear islet, white sand, birds fly back | 0.5161883811726116
Windy high sky, apes cry sadly | 0.5247695147991147
(4 rows)クエリは最初に "Endless Yangtze River rolls on" (距離 0、完全一致) を返し、次にセマンティック的に最も近い "Boundless falling leaves rustle down" を返します。



