您需要在数据库中直接将文本转化为向量时,RDS PostgreSQL的rds_embedding插件为您提供了自定义模型配置和模型调用能力,使文本到向量的转换变得简单快捷,从而满足特定的数据处理需求。
背景
嵌入(embedding)是指将高维数据映射为低维表示的过程。在机器学习和自然语言处理中,嵌入通常用于将离散的符号或对象表示为连续的向量空间中的点。
在生成嵌入时,向量数据的值取决于所参照的模型数据,RDS PostgreSQL支持使用rds_embedding插件,将数据库中的文本内容,基于引入的外部模型,生成对应的向量数据,还支持使用向量相似度运算符,计算数据库内文本与模型中指定文本的相似度,实现更多业务场景。
前提条件
实例大版本为RDS PostgreSQL 14或以上。
说明暂不支持RDS PostgreSQL 17。
如实例大版本已满足要求,但仍提示不支持,请升级内核小版本,具体操作,请参见升级内核小版本。
本文使用的模型为开源OpenAI提供的Embeddings模型,请确保您具备
API Key
,并且RDS PostgreSQL实例所处地域支持访问OpenAI,本文示例实例所处地域为新加坡。RDS PostgreSQL数据库默认不具备访问外部网络的能力,因此,需要为RDS PostgreSQL实例所属的VPC配置NAT网关,使其允许访问外部模型。NAT网关相关信息,请参见使用公网NAT网关SNAT功能访问互联网。
插件开启与关闭
请使用高权限账号执行如下命令。
开启插件。
开启
rds_embedding
插件前,需要先开启vector
插件,vector
插件提供了必要的向量数据类型支持和基础向量操作能力(计算向量之间的距离、相似度等),rds_embedding
插件专注于将高维文本数据转化为向量。CREATE EXTENSION vector; CREATE EXTENSION rds_embedding;
关闭插件。
DROP EXTENSION rds_embedding; DROP EXTENSION vector;
使用示例
创建测试表(test)。
CREATE TABLE test(info text, vec vector(1536) NOT NULL);
添加模型。
SELECT rds_embedding.add_model('text-embedding-ada-002','https://api.openai.com/v1/embeddings','Authorization: Bearer sk-****P','{"input":{"texts":["%s"]},"model":"text-embedding-v1"}','->"data"->0->>"embedding"');
说明本文使用的模型为开源OpenAI提供的Embeddings模型,请确保您具备
API Key
,并且RDS PostgreSQL实例所处地域支持访问OpenAI,本文示例实例所处地域为新加坡。本示例使用的函数rds_embedding.add_model()具体使用方法,请参见rds_embedding.add_model()。
插入文本和其对应的向量数据。
INSERT INTO test SELECT '风急天高猿啸哀', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '风急天高猿啸哀')::real[]; INSERT INTO test SELECT '渚清沙白鸟飞回', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '渚清沙白鸟飞回')::real[]; INSERT INTO test SELECT '无边落木萧萧下', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '无边落木萧萧下')::real[]; INSERT INTO test SELECT '不尽长江滚滚来', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '不尽长江滚滚来')::real[];
说明本示例使用的函数rds_embedding.get_embedding_by_model()具体使用方法,请参见rds_embedding.get_embedding_by_model()。
计算文本
不尽长江滚滚来
与test表中各文本的向量相似度。SELECT info, vec <=> rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '不尽长江滚滚来')::real[]::vector AS distance FROM test ORDER BY vec <=> rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '不尽长江滚滚来')::real[]::vector;
返回结果示例:
info | distance ----------------+-------------------- 不尽长江滚滚来 | 0 无边落木萧萧下 | 0.6855717919553399 风急天高猿啸哀 | 0.7423166439170339 渚清沙白鸟飞回 | 0.7926204045363088 (4 rows)