pgai Vectorizer:在 PostgreSQL 中使用一个 SQL 命令自动执行 AI 嵌入

发布:2024-10-30 10:18 阅读:28 点赞:0

在AI系统中,如RAG、搜索和AI代理,管理嵌入工作流可能会很麻烦:需要协调多个工具,设置复杂的管道,并花费数小时同步数据,特别是如果您不是ML或AI专家。但现在,有了pgai Vectorizer,这一切都变得简单了。

一、pgai Vectorizer简介

pgai Vectorizer是一个可以在PostgreSQL中自动化向量嵌入创建的工具。它可以帮助您保持嵌入随着数据变化自动同步,并且可以轻松地使用不同的AI模型进行实验——所有这些都只需一个简单的SQL命令。

1.1 创建向量器

以下是如何在blogs表中创建一个向量器的示例,使用Open AI的text-embedding-3-small模型:

-- 创建一个向量器来嵌入blogs表中的数据
-- 使用Open AI text-embedding-3-small模型
SELECT ai.create_vectorizer(
    'public.blogs'::regclass,  -- 目标表
    embedding => ai.embedding_openai('text-embedding-3-small'1536),  -- 使用的嵌入模型
    chunking => ai.chunking_recursive_character_text_splitter('content')  -- 分割文本的方法
);

1.2 pgai Vectorizer的功能

  • 嵌入创建:只需一个SQL命令即可从多个文本列生成向量嵌入。
  • 自动同步:随着数据的变化,嵌入会自动更新。
  • 快速模型切换:可以即时测试不同的AI模型,无需重新处理数据。
  • 测试和部署:可以比较模型和分块技术,进行A/B测试,并自信地推出更新,而无需停机。

二、pgai Vectorizer系统架构

pgai Vectorizer通过使用PostgreSQL中的工作队列和配置表,自动创建和更新来自源数据表的嵌入。嵌入是在与嵌入服务(如OpenAI API)交互的外部工作者中创建的。

三、使用pgai Vectorizer的示例

3.1 创建不同的向量器

以下是如何为同一数据集创建两个不同嵌入模型的向量器的示例:

-- 使用OpenAI text-embedding-3-small的向量器
SELECT ai.create_vectorizer(
   'public.blogs'::regclass,
   destination => 'blogs_embedding_small',  -- 目标表
   embedding => ai.embedding_openai('text-embedding-3-small'1536),  -- 使用的嵌入模型
   chunking => ai.chunking_recursive_character_text_splitter('content'),  -- 分割文本的方法
   formatting => ai.formatting_python_template('Title: $title\nURL: $url\nContent: $chunk')  -- 格式化输出
);

-- 使用OpenAI text-embedding-3-large的向量器
SELECT ai.create_vectorizer(
   'public.blogs'::regclass,
   destination => 'blogs_embedding_large',  -- 目标表
   embedding => ai.embedding_openai('text-embedding-3-large'1536),  -- 使用的嵌入模型
   chunking => ai.chunking_recursive_character_text_splitter('content'),  -- 分割文本的方法
   formatting => ai.formatting_python_template('Title: $title\nURL: $url\nContent: $chunk')  -- 格式化输出
);

3.2 比较不同模型的结果

以下是如何比较两个向量器在同一RAG查询上的结果的示例:

-- 比较来自两个向量器的结果
SELECT
   'text-embedding-3-small' as model,  -- 模型名称
   generate_rag_response(
       'What is AI?',  -- 查询文本
       'public.blogs_embedding_small'  -- 使用的嵌入表
   ) as response  -- 查询结果
UNION ALL
SELECT
   'text-embedding-3-large' as model,  -- 模型名称
   generate_rag_response(
       'What is AI?',  -- 查询文本
       'public.blogs_embedding_large'  -- 使用的嵌入表
   ) as response;  -- 查询结果

四、高级配置示例

以下是一个高级向量器配置的示例,它在表中有100k行时自动创建一个StreamingDiskANN索引,并为HTML内容应用递归分块:

-- 高级向量器配置
SELECT ai.create_vectorizer(
   'public.blogs'::regclass,
   destination => 'blogs_embedding_recursive',  -- 目标表
   embedding => ai.embedding_openai('text-embedding-3-small'1536),  -- 使用的嵌入模型
   indexing => ai.indexing_diskann(min_rows => 100000, storage_layout => 'memory_optimized'),  -- 创建索引的条件
   chunking => ai.chunking_recursive_character_text_splitter(
       'content',
       chunk_size => 800,  -- 分块大小
       chunk_overlap => 400,  -- 分块重叠大小
       separator => array[
           E'</article>',  -- 分割主要文档部分
           E'</div>',  -- 分割div边界
           E'</section>',
           E'</p>',  -- 分割段落
           E'<br>',  -- 分割换行
           E'</li>',  -- 分割列表项
           E'. ',  -- 回退到句子边界
           ' '  -- 最后手段:分割空格
       ]
   ),
   formatting => ai.formatting_python_template('title: $title url: $url $chunk')  -- 格式化输出
);

五. 结论

pgai Vectorizer通过提供自动化嵌入创建和同步的工具,简化了AI开发流程。它允许开发者轻松测试不同的AI模型,并在不需要额外工具或复杂设置的情况下,保持嵌入数据的最新状态。随着数据集的增长,pgai Vectorizer也能够扩展其性能,确保即使在大型数据集上也能保持高效的搜索性能。

通过pgai Vectorizer,开发者可以节省时间和精力,专注于构建他们的下一个AI应用,而不是陷入嵌入管理的复杂性中。