我使用带有 pgvector 扩展名的 Postgres 来存储来自 OpenAI 的嵌入作为我的 RAG 管道的数据源。
到目前为止,最佳实践是使用嵌入模型
text-embedding-ada-002
提供维度为 1536 的向量。
今天,OpenAI 发布了 2 个新模型,
text-embedding-3-small
和 text-embedding-3-large
,提供各种尺寸 512 和 1536,分别为 256、1024 和 3072。
我的问题是,如何处理提供相同查询的同一张表上的多个向量维度。
目前,我的桌子是这样的:
create table if not exists public.embeddings
(
id serial primary key,
embedding vector(1536) not null
// ... some more columns, but irrelevant for the given context
)
create index if not exists embeddings_embedding_idx
on public.embeddings using ivfflat (embedding public.vector_cosine_ops);
为了查询,我使用存储函数:
create or replace function match_embeddings(
query_embedding vector(1536),
match_threshold float,
match_count int
)
RETURNS table(j json)
AS
$$
BEGIN
RETURN QUERY
select row_to_json(r)
from (select e.id,
1 - (e.embedding <=> query_embedding) as similarity
from embeddings e
where
1 - (e.embedding <=> query_embedding) > match_threshold
order by similarity desc
limit match_count) r;
END
$$ language plpgsql;
目前,完整的设置基于向量的固定尺寸:1536。 不幸的是,
pgvector
不提供可变尺寸。如果我有一个列 vector(1536)
,它必须填充一个由 1536 个值组成的数组。提供较少的值将导致错误。
我想知道,我是否可以轻松地增加向量存储直到当前所需的最大值(3072),例如,将应用的向量大小存储在表中以便随时识别已存储哪种维度。
主要问题是:
embedding_1536 vector(1536)
、embedding_3072 vector(3072)
?非常欢迎任何有用的想法、提示、评论或解决方案。谢谢!
你尝试过变量嵌入列吗?
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector);
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5]');
SELECT * FROM items WHERE vector_dims(embedding) = 3 ORDER BY embedding <-> '[3,1,2]' LIMIT 5;