postgresql 带有自定义过滤器的pgvector

rn0zuynd  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(153)

如何在一个使用pgvector存储嵌入的supplier数据库中添加一个自定义过滤器到一个sql函数。

create table documents (
  id bigserial primary key,
  content text,
  embedding vector(1536),
custom_id text // Custom id for each company
);

大概是这样的:

create or replace function match_documents (
  query_embedding vector(1536),
  match_threshold float,
  match_count int,
  custom_id text
)
returns table (
  id bigint,
  content text,
  similarity float
)
language sql stable
as $$
  select
    documents.id,
    documents.content,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where documents.custom_id == custom_id
  order by similarity desc
  limit match_count;
$$;

这个函数的问题是,如果我询问关于x custom_id的信息,它会从所有文档中返回数据,它不尊重where。在检查嵌入相似性之前,我需要通过custom_id过滤文档。
谢谢你!

0pizxfdo

0pizxfdo1#

我看到两个问题。首先,Postgres使用=,而不是==进行相等性检查。其次,由于有一个名为custom_id的列和一个名为custom_id的函数参数,因此需要消除这两者的歧义。您可以通过在过滤器中的custom_id之前添加函数名和一个点(在本例中为match_documents.)来实现。

create or replace function match_documents (
  query_embedding vector(1536),
  match_threshold float,
  match_count int,
  custom_id text
)
returns table (
  id bigint,
  content text,
  similarity float
)
language sql stable
as $$
  select
    documents.id,
    documents.content,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where documents.custom_id = match_documents.custom_id
  order by similarity desc
  limit match_count;
$$;

相关问题