如何在Postgres中构建可扩展的AI应用程序_PostgreSQL入门和扩展

本文介绍如何使用PostgreSQL作为向量数据库构建和扩展一个示例的Airbnb推荐服务。

PostgreSQL拥有丰富的扩展和解决方案生态系统,可以让我们将数据库用于通用AI应用。这篇指南将引导您完成使用PostgreSQL构建生成式AI应用程序所需的步骤。

首先,我们将介绍pgvector扩展,该扩展使得Postgres具备向量数据库特定的功能。然后,我们将讨论提高在PostgreSQL上运行的AI应用程序性能和可扩展性的方法。最后,我们将拥有一个完全功能的生成式AI应用程序,为那些前往旧金山的旅行者推荐Airbnb房源。

Airbnb推荐服务

这个示例应用程序是一个住宿推荐服务。想象一下,你计划访问旧金山,并希望住在靠近金门大桥的一个漂亮社区。你打开这个服务,输入你的提示信息,应用程序将会给出三个与你的提示信息最相关的住宿选择。

该应用程序支持两种不同的模式:

Airbnb推荐服务

  • OpenAI Chat模式:在这种模式下,Node.js后端利用OpenAI Chat Completion API和GPT-4模型根据用户输入生成住宿推荐。虽然本指南不专注于此模式,但鼓励您进行实验。

  • Postgres嵌入模式:初始时,后端使用OpenAI Embeddings API将用户的提示信息转换为嵌入向量(文本数据的向量化表示)。接下来,应用程序在Postgres或YugabyteDB(分布式PostgreSQL)中进行相似度搜索,以找到与用户提示相匹配的Airbnb房源。Postgres利用pgvector扩展在数据库中进行相似度搜索。本指南将深入探讨应用程序中这种特定模式的实现细节。

前提条件

  • 拥有可以访问嵌入模型的OpenAI订阅。

  • 最新版本的Node.js。

  • 最新版本的Docker。

启动带有pgvector的PostgreSQL

pgvector扩展为Postgres添加了向量数据库的所有基本功能。它使您能够存储和处理具有数千个维度的向量,计算向量化数据之间的欧氏距离和余弦距离,并执行准确和近似的最近邻搜索。

1. 在Docker中启动一个带有pgvector的Postgres实例:

docker run --name postgresql \
    -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password \
    -p 5432:5432 \
    -d ankane/pgvector:latest

2. 连接到数据库容器并打开psql会话:

docker exec -it postgresql psql -h 127.0.0.1 -p 5432 -U postgres

3. 启用pgvector扩展:

create extension vector;

4. 确认vector扩展在扩展列表中存在:

select * from pg_extension;

  oid  | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------+----------+--------------+----------------+------------+-----------+--------------
 13561 | plpgsql |       10 |           11 | f              | 1.0        |           |
 16388 | vector  |       10 |         2200 | t              | 0.5.1      |           |
(2 rows)

加载Airbnb数据集

该应用程序使用了一个包含超过7,500个在旧金山出租的房产的Airbnb数据集。每个房源都提供详细的属性描述,包括房间数量、设施类型、位置和其他特点。这些信息非常适合与用户提示进行相似度搜索。

按照以下步骤将数据集加载到已启动的Postgres实例中:

1. 克隆应用程序存储库:

git clone https://github.com/YugabyteDB-Samples/openai-pgvector-lodging-service.git

2. 将Airbnb模式文件复制到Postgres容器中(将{app_dir}替换为应用程序目录的完整路径):

docker cp {app_dir}/sql/airbnb_listings.sql postgresql:/home/airbnb_listings.sql

3. 从下面的Google Drive位置下载带有Airbnb数据的文件。文件大小为174MB,并且已经包含了使用OpenAI嵌入模型为每个Airbnb房产的描述生成的嵌入向量。

4. 将数据集复制到Postgres容器中(将{data_file_dir}替换为应用程序目录的完整路径):

docker cp {data_file_dir}/airbnb_listings_with_embeddings.csv postgresql:/home/airbnb_listings_with_embeddings.csv

5. 创建Airbnb模式并将数据加载到数据库中:

# 创建模式
docker exec -it postgresql \
    psql -h 127.0.0.1 -p 5432 -U postgres \
    -a -q -f /home/airbnb_listings.sql
    
# 加载数据
docker exec -it postgresql \
    psql -h 127.0.0.1 -p 5432 -U postgres \
    -c "\copy airbnb_listing from /home/airbnb_listings_with_embeddings.csv with DELIMITER '^' CSV;"

每个Airbnb的嵌入向量是一个具有1536个浮点数维度的数组。它是Airbnb房产描述的数值/数学表示。

docker exec -it postgresql \
    psql -h 127.0.0.1 -p 5432 -U postgres \
    -c "\x on" \
    -c "select name, description, description_embedding from airbnb_listing limit 1"

输出(部分截取):

name                 | Monthly Piravte Room-Shared Bath near Downtown !3
description           | In the center of the city in a very vibrant neighborhood. Great access to other parts of the city with all modes of public transportation steps away Like the general theme of San Francisco, our neighborhood is a melting pot of different people with different lifestyles ranging from homeless people to CEO''s
description_embedding | [0.0064848186,-0.0030366974,-0.015895316,-0.015803888,-0.02674906,...]

这些嵌入向量是使用OpenAI的text-embedding-ada-002模型生成的。如果你需要使用不同的模型,那么:

  • 在{app_dir}/backend/embeddings_generator.js和{app_dir}/backend/postgres_embeddings_service.js文件中更新模型。

  • 通过使用`node embeddings_generator.js`命令启动生成器来重新生成嵌入向量。

找到最相关的Airbnb房源

到此为止,Postgres已经准备好向用户推荐最相关的Airbnb房产。应用程序可以通过比较用户的提示嵌入向量和Airbnb描述的嵌入向量来获得这些推荐。

首先,启动一个Airbnb推荐服务实例:

1. 使用你的OpenAI API密钥更新`{app_dir}/application.properties.ini`文件:

OPENAI_API_KEY=<your key>

2. 启动Node.js后端:

cd {app_dir}
npm i
cd backend
npm start

3. 启动React前端:

cd {app_dir}/frontend
npm i
npm start

应用程序界面应该会自动在你的默认浏览器中打开。否则,可以在地址http://localhost:3000/打开它。

OpenAI住宿服务

现在,从应用程序界面中选择Postgres Embeddings模式,并要求应用程序根据以下提示推荐几个与之最相关的Airbnb房产:

I'm looking for an apartment near the Golden Gate Bridge with a nice view of the Bay.

该服务将推荐三个住宿选项:

OpenAI住宿服务

在内部,应用程序执行以下步骤生成推荐结果(具体请参考`{app_dir}/backend/postgres_embeddings_service.js`):

1. 应用程序使用OpenAI嵌入模型(text-embedding-ada-002)生成了用户提示的向量化表示:

const embeddingResp = await this.#openai.embeddings.create(
    {model: "text-embedding-ada-002",
    input: prompt});

2. 应用程序使用生成的向量来检索存储在Postgres中的最相关的Airbnb房产:

const res = await this.#client.query(
    "SELECT name, description, price, 1 - (description_embedding <=> $1) as similarity " +
    "FROM airbnb_listing WHERE 1 - (description_embedding <=> $1) > $2 ORDER BY description_embedding <=> $1 LIMIT $3",
    ['[' + embeddingResp.data[0].embedding + ']', matchThreshold, matchCnt]);


相似度是通过计算描述嵌入向量列和用户提示向量之间的余弦距离来计算的。

3. 推荐的Airbnb房产以JSON格式返回给React前端:

let places = [];
for (let i = 0; i < res.rows.length; i++) {
    const row = res.rows[i];
    places.push({
      "name": row.name, 
      "description": row.description, 
      "price": row.price, 
      "similarity": row.similarity });
}
return places;

扩展方式

现在,Postgres存储了超过7,500个Airbnb房产。数据库只需几毫秒就能执行精确的最近邻搜索,比较用户提示和Airbnb描述的嵌入向量。

然而,精确的最近邻搜索(全表扫描)也有其局限性。随着数据集的增长,Postgres执行多维向量的相似度搜索所需时间会变长。

为了在数据量和流量增加的情况下保持Postgres的性能和可扩展性,你可以使用专门针对向量化数据的索引,或者使用分布式版本的Postgres来水平扩展存储和计算资源。

pgvector扩展支持多种索引类型,包括性能最佳的HNSW索引(Hierarchical Navigable Small World)。该索引对向量化数据执行近似最近邻搜索(ANN),即使在大数据量下,数据库也能保持低延迟和可预测性。但是,由于搜索是近似的,搜索的召回率可能不是100%相关/准确,因为索引仅遍历数据的子集。

例如,以下是如何为Airbnb嵌入向量在Postgres中创建HNSW索引的示例:

CREATE INDEX ON airbnb_listing
USING hnsw (description_embedding vector_cosine_ops)
WITH (m = 4, ef_construction = 10);

要深入了解HNSW索引是如何构建并在Airbnb数据上执行ANN搜索的,请查看此视频:

通过分布式PostgreSQL,当单个数据库服务器的容量不再足够时,你可以轻松扩展数据库的存储和计算资源。尽管PostgreSQL最初是为单服务器部署而设计的,但它的生态系统现在包括了几个扩展和解决方案,使其能够在分布式配置中运行。其中一个解决方案是YugabyteDB,它是一种分布式SQL数据库,扩展了Postgres在分布式环境中的功能。

YugabyteDB从2.19.2版本开始支持pgvector扩展。它将数据和嵌入向量分布在一个节点集群上,便于进行大规模的相似度搜索。因此,如果你想在分布式版本的Postgres上运行Airbnb服务:

1. 部署一个多节点的YugabyteDB集群。

2. 在`{app_dir}/application.properties.ini`文件中更新数据库连接设置:

# Configuration for a locally running YugabyteDB instance with defaults.
DATABASE_HOST=localhost
DATABASE_PORT=5433
DATABASE_NAME=yugabyte
DATABASE_USER=yugabyte
DATABASE_PASSWORD=yugabyte

3. 重新加载数据(或使用YugabyteDB Voyager从正在运行的Postgres实例进行迁移),然后重启应用程序。由于YugabyteDB与Postgres在功能和运行时兼容,因此不需要进行其他代码级别的更改。

祝你在使用Postgres构建可扩展的AI应用程序时玩得开心!如果你想了解有关将Postgres作为向量数据库的更多信息,请告诉我。文章来源地址https://www.toymoban.com/diary/sql/624.html

到此这篇关于如何在Postgres中构建可扩展的AI应用程序_PostgreSQL入门和扩展的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/sql/624.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
25 个简单且免费的 SEO 工具,可立即改善您的网站性能和搜索引擎排名,提升SEO效果
上一篇 2024年04月26日 12:05
优化Python中的I/O工作负载:逐步指南以及常用分析工具和优化策略
下一篇 2023年12月27日 10:11

相关文章

  • 如何使用 MongoDB 构建采用 AI 技术的应用程序

    使用MongoDB构建采用AI技术的应用程序通常涉及以下步骤: 确定应用场景 : 首先,确定您的应用程序如何使用AI。这可以包括机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等。 确定您需要收集和处理的数据类型以及这些数据如何支持AI模型。 设计数据模型 : 根据

    2024年02月19日
    浏览(21)
  • 什么是RESTful API,以及如何它使用构建 web 应用程序(InsCode AI 创作助手)

    RESTful API 是一种基于 REST(Representational State Transfer,表征状态转移) 架构风格的 API,它使用 HTTP 协议的方法(GET,POST,PUT,DELETE)来实现资源的创建、读取、更新和删除。通过这种方式,API 可以更加简单和灵活,使得不同编程语言之间的交互更加容易。 使用 RESTful API 构建

    2024年02月09日
    浏览(29)
  • “深入了解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入了解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一款快速构建Java应用程序的开发框架,它基于Spring框架,提供了一系列的自动化配置和约定,使得开发者能够更快速、更高效地构建出高质量的应用程序。本文将深入探讨Spring Boot的核心特性和使用

    2024年02月14日
    浏览(20)
  • “深入理解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入理解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简单且高效的方式来创建独立的、生产级别的应用程序。本文将深入探讨Spring Boot的核心概念和特性,并通过示例代码展示如何使用Spring Boot构建

    2024年02月15日
    浏览(23)
  • “深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践“

    标题:深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践 摘要:Spring Boot是一个强大的框架,可以帮助开发人员快速构建独立、可扩展的企业级应用程序。本文将深入探讨Spring Boot的核心概念和最佳实践,并通过示例代码演示其用法。 正文: 什么是Spring Bo

    2024年02月14日
    浏览(19)
  • blog-engine-09-nuxt 构建快速、SEO友好和可扩展的Web应用程序变得轻松

    blog-engine-01-常见博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 对比 blog-engine-02-通过博客引擎 jekyll 构建 github pages 博客实战笔记 blog-engine-02-博客引擎jekyll-jekyll 博客引擎介绍 blog-engine-02-博客引擎jekyll-jekyll 如何在 windows 环境安装,官方文档 blog-engine-02-博客引擎jekyll

    2024年03月28日
    浏览(24)
  • Imagica.ai:无需代码即可构建 AI 应用程序

    得益于Imagica.ai等工具,构建 AI 应用程序不再完全掌握在软件专家的手中。这种无代码的实时数据工具允许用户创建应用程序,以实时解决具有惊人 AI 功能的独特问题。 借助Imagica.ai,用户无需编写任何代码即可立即制作多模式应用程序。这意味着任何了解应用程序设计模式

    2024年02月06日
    浏览(23)
  • AI 实力:利用 Docker 简化机器学习应用程序的部署和可扩展性

            利用 Docker 的强大功能:简化部署解决方案、确保可扩展性并简化机器学习模型的 CI/CD 流程。         近年来,机器学习 (ML) 出现了爆炸性增长,导致对健壮、可扩展且高效的部署方法的需求不断增加。由于训练和服务环境之间的差异或扩展的困难等因素,传

    2024年02月13日
    浏览(25)
  • 软件即服务:如何构建 SaaS 应用程序

    软件即服务 (SAAS) 是在线公司的理想商业模式。它有助于直接从服务器检索数据,无需用户获取其副本。 SaaS 开发公司为初创公司和小型供应商提供了发展企业的绝佳机会。通常,SaaS 解决方案的适应性很强。由于基于云的技术的简单性,客户被迫采用此服务。 根据业务增长

    2023年04月25日
    浏览(23)
  • 把通过autogen构建的AI agent接入到自己的应用程序中

    同志们,我很高兴的告诉大家我们有了一个比langchain更好用的构建AI agent的工具。众所周知,langchain主要就是一堆字符串提示模板构成的,这导致,当我们的模型性能不够强大(比如说gpt3.5)时会因为上下文的干扰而产生幻觉,从而无法完成我们所需要让其完成的任务(之前想让

    2024年02月04日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包