如何处理嵌入的不同向量维度并使用 pgvector 进行搜索?

问题描述 投票:0回答:1

我使用带有 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),例如,将应用的向量大小存储在表中以便随时识别已存储哪种维度。

主要问题是:

  1. 我应该right-pad现有的向量,其维度为1536,用零来适应3072维度吗?这会破坏任何查询机制吗?
  2. 或者我应该为每个所需的维度添加多个列,例如
    embedding_1536 vector(1536)
    embedding_3072 vector(3072)
  3. 或者我应该有多个嵌入表,每个嵌入表提供一个提供相应维度的向量列?
  4. 或者其他什么,目前不在我的脑海中

非常欢迎任何有用的想法、提示、评论或解决方案。谢谢!

postgresql vector pgvector retrieval-augmented-generation
1个回答
0
投票

你尝试过变量嵌入列吗?

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;
© www.soinside.com 2019 - 2024. All rights reserved.