pg_vectorize:一个适用于 Postgres 的 VectorDB
这是一个 Postgres 插件,它自动完成从文本到嵌入的转换和编排,并提供与最流行的大语言模型 (LLM) 的连接。这使您能够进行向量搜索,并通过仅需两个函数调用就能在现有数据上构建 LLM 应用。
该项目大量依赖了 pgvector 的向量相似性搜索功能、pgmq 的后台工作编排功能以及 SentenceTransformers 的工作。
pg_vectorize 为 Tembo Cloud 上的 VectorDB Stack 提供支持,并可用于所有爱好者级别实例。
API 文档:https://tembo.io/pg_vectorize/
源码:https://github.com/tembo-io/pg_vectorize
功能
- 适用于向量搜索和 RAG 的工作流
- 与 OpenAI 的 embeddings 和 chat-completion 端点以及自托管的 Hugging Face Sentence-Transformers 容器集成
- 自动创建 Postgres 触发器以保持嵌入更新
- 高级 API - 一个函数初始化嵌入转换,另一个函数用于搜索
目录
安装
最快的开始方式是运行 Tembo docker 容器和向量服务器,通过 docker compose 启动:
docker compose up -d
然后连接到 Postgres:
docker compose exec -it postgres psql
启用扩展及其依赖项:
CREATE EXTENSION vectorize CASCADE;
安装到现有的 Postgres 实例中
如果您正在现有的 Postgres 实例中安装,您将需要以下依赖项:
Rust:
Postgres 扩展:
然后在 postgresql.conf 或作为配置参数中设置以下内容:
-- 需要重启 Postgres
alter system set shared_preload_libraries = 'vectorize,pg_cron';
alter system set cron.database_name = 'postgres'
如果您正在运行 vector-serve 容器,请将以下 URL 设置为 Postgres 中的配置参数。主机可能需要根据您运行容器的位置从 localhost
更改为其他值。
alter system set vectorize.embedding_service_url = 'http://localhost:3000/v1/embeddings'
SELECT pg_reload_conf();
向量搜索示例
文本到嵌入的转换可以通过 Hugging Face 的 Sentence-Transformers 或 OpenAI 的嵌入进行。以下示例使用 Hugging Face 的 Sentence-Transformers。有关 OpenAI 示例,请参阅项目 文档。
如果尚未执行,请按照 安装 步骤进行操作。
设置产品表。复制插件提供的示例数据。
CREATE TABLE products (LIKE vectorize.example_products INCLUDING ALL);
INSERT INTO products SELECT * FROM vectorize.example_products;
SELECT * FROM products limit 2;
product_id | product_name | description | last_updated_at
------------+--------------+--------------------------------------------------------+-------------------------------
1 | Pencil | 用于书写的工具,通常在纸上效果最佳 | 2023-07-26 17:20:43.639351-05
2 | Laptop Stand | 提升笔记本电脑的平台,增强人体工学 | 2023-07-26 17:20:43.639351-05
创建一个作业来对产品表进行向量化。我们将指定表的主键 (product_id) 以及我们希望搜索的列 (product_name 和 description)。
SELECT vectorize.table(
job_name => 'product_search_hf',
"table" => 'products',
primary_key => 'product_id',
columns => ARRAY['product_name', 'description'],
transformer => 'sentence-transformers/all-MiniLM-L6-v2',
schedule => 'realtime'
);
这会在您的表中添加一个新列,在我们的例子中,它被命名为 product_search_embeddings
,然后将 product_name
和 description
列的数据转换为嵌入并填充该列。
然后进行搜索,
SELECT * FROM vectorize.search(
job_name => 'product_search_hf',
query => 'mobile devices 的配件',
return_columns => ARRAY['product_id', 'product_name'],
num_results => 3
);
search_results
---------------------------------------------------------------------------------------------
{"product_id": 13, "product_name": "Phone Charger", "similarity_score": 0.8147814132322894}
{"product_id": 6, "product_name": "Backpack", "similarity_score": 0.7743061352550308}
{"product_id": 11, "product_name": "Stylus Pen", "similarity_score": 0.7709902653575383}
RAG 示例
对示例 products
数据集中的原始文本问题提问,并从 OpenAI LLM 获得聊天回复。
如果尚未执行,请按照 安装 步骤进行操作。
设置 OpenAI API 密钥,这是使用 OpenAI 的聊天完成模型所必需的。
ALTER SYSTEM SET vectorize.openai_key TO '<your api key>';
SELECT pg_reload_conf();
如果尚未存在,请创建一个示例表。
CREATE TABLE products (LIKE vectorize.example_products INCLUDING ALL);
INSERT INTO products SELECT * FROM vectorize.example_products;
为 RAG 初始化一个表。我们将使用开源 Sentence Transformer 生成嵌入。
创建一个新列,我们希望使用它作为上下文。在这种情况下,我们将 product_name
和 description
进行拼接。
ALTER TABLE products
ADD COLUMN context TEXT GENERATED ALWAYS AS (product_name || ': ' || description) STORED;
初始化 RAG 项目。
我们将使用 sentence-transformers/all-MiniLM-L6-v2
模型生成我们的源文档嵌入。
SELECT vectorize.init_rag(
agent_name => 'product_chat',
table_name => 'products',
"column" => 'context',
unique_record_id => 'product_id',
transformer => 'sentence-transformers/all-MiniLM-L6-v2'
);
现在我们可以通过 `openai/gpt-3