您需要在数据库中直接将文本转化为向量时,RDS PostgreSQL的rds_embedding插件为您提供了自定义模型配置和模型调用能力,使文本到向量的转换变得简单快捷,从而满足特定的数据处理需求。
背景
嵌入(embedding)是指将高维数据映射为低维表示的过程。在机器学习和自然语言处理中,嵌入通常用于将离散的符号或对象表示为连续的向量空间中的点。
在生成嵌入时,向量数据的值取决于所参照的模型数据,RDS PostgreSQL支持使用rds_embedding插件,将数据库中的文本内容,基于引入的外部模型,生成对应的向量数据,还支持使用向量相似度运算符,计算数据库内文本与模型中指定文本的相似度,实现更多业务场景。
前提条件
实例大版本为RDS PostgreSQL 14或以上。
如实例大版本已满足要求,但仍提示不支持,请升级内核小版本,具体操作,请参见升级内核小版本。
本文使用的模型为阿里云大模型服务平台百炼提供的通用文本向量模型,请先前往百炼开通服务,并获取API-KEY。具体操作,请参见获取API Key。
说明除了本文使用的通用文本向量模型外,您还可以使用rds_embedding插件提供的函数添加其他模型,具体请参见rds_embedding插件提供的函数。
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;
使用示例
本文以阿里云大模型服务平台百炼提供的通用文本向量模型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 '风急天高猿啸哀', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '风急天高猿啸哀')::real[]; INSERT INTO test SELECT '渚清沙白鸟飞回', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '渚清沙白鸟飞回')::real[]; INSERT INTO test SELECT '无边落木萧萧下', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '无边落木萧萧下')::real[]; INSERT INTO test SELECT '不尽长江滚滚来', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '不尽长江滚滚来')::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-v3', 'sk-****', '不尽长江滚滚来' )::real[]::vector AS distance FROM test ORDER BY vec <=> rds_embedding.get_embedding_by_model( 'text-embedding-v3', 'sk-****', '不尽长江滚滚来' )::real[]::vector;
返回结果示例:
info | distance ----------------+-------------------- 不尽长江滚滚来 | 0 无边落木萧萧下 | 0.42740682200152647 风急天高猿啸哀 | 0.5247695147991147 渚清沙白鸟飞回 | 0.5161883811726116 (4 rows)