当前位置: 首页 > article >正文

使用AWS Amplify AI Kit和Neon Postgres构建基于RAG的应用程序

序言

现代应用程序开发已经转变为不仅包括提供出色开发人员体验(DX)的工具,还包括简单入门和生产路径之间的合理平衡。正是这种情绪激发了Amplify AI kit的发布。这种对常见AI任务(如与大型语言模型(LLM)对话和从提示生成内容)的抽象意味着开发人员有更快的上市时间,避免编写样板代码。

在这篇文章中,我们将超越入门体验,使用来自Neon的无服务器Postgres数据库来检索产品数据,而不是来自Amplify的默认数据库模型。这样做,我们将使用检索增强生成(RAG)简化与LLM对话所需的代码。

应用概述

对应用程序消费者的一个共同吸引力是人工智能如何被用来增强现有产品,而不是与之竞争。一个简单有效的演示方法是创建一个客户可以与之交互的聊天机器人。在现实世界的场景中,这不会阻止客户自己购物,但会引导他们使用自然语言进行购买。

 从架构上讲,每当用户访问应用程序时,他们都可以与我们的LLM驱动的机器人聊天。这些模型是根据一般数据训练的,尽管在我们的用例中,我们也希望它了解我们的产品数据。产品信息可以随时更改,因此从我们数据库中的信息中提取很重要。这种在一般信息或访问特定数据之间进行选择的想法很强大,并且可以通过工具(也称为“函数调用”)来实现。

要记住的一个重要概念是,当LLM选择使用工具时,它不会代表您调用您的数据。它只是在用户提示的情况下传递哪个工具最有效。从那里,应用程序决定他们想要调用什么函数。 

然后将来自该函数的响应发送回LLM,并将其格式化为自然语言提供给最终用户。

正如人们可能想象的那样,自己编排这种模式不仅会很乏味,还会导致错误。幸运的是,这种无差别的繁重工作是Amplify AI套件默认提供的。

具体来说,本项目将使用Amazon BedRock和Claude 3.5 Haiku LLM,因为该模型带有工具支持。Amplify将允许我们指定一个与我们的数据库相对应的工具。在本例子中,这将是我们的Neon Postgres数据库,其中包含产品信息。

 

使用Neon创建无服务器Postgres数据库

连接到现有数据源的能力意味着开发人员可以在默认数据库Amazon DynamoDB之外使用Amplify的模式自省功能,以代表他们生成CRUD操作。设置Neon数据库很简单。创建帐户后,系统会提示您创建项目。

 Neon支持基于分支的项目,类似于git。这些是main分支的副本。在我的例子中,我可以选择创建一个名为dev/mtliendo的分支。这是推荐的,但不是必需的。在任何一种情况下,您都需要确保复制该分支的连接字符串,因为它在以下部分中很重要。

 

我们的默认数据库现在已经设置好,但是它还没有包含任何表。更具体地说,我们的表模式还没有定义。你会很难过地发现我不知道如何写SQL。幸运的是,霓虹灯通过他们的“用人工智能生成”功能解决了这个问题。通过与他们的法学硕士聊天,我想做什么,会为我生成一个回复。

在他们的SQL编辑器中,我写了以下内容:

创建一个名为“Products”的表模式。每个产品都有一个随机ID、一个作为日期时间的“更新时间”字段、一个作为日期时间的“创建时间”字段、一个作为数字、一个“名称”和一个“描述”的“以美分为单位的价格”字段。

 

运行提示符后,我看到以下响应:

CREATE TABLE Products (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    price_in_cents INTEGER NOT NULL,
    name VARCHAR(255) NOT NULL,
    description TEXT
);

从那里,我可以选择对代码进行更改,并在我熟悉语法后运行一次命令。

要验证一切是否按预期设置,单击侧边栏中的“表”链接将允许我们验证模式,以及填充我们的数据库。

对于这个项目,我已经向数据库中添加了几个项目。此外,请务必将连接字符串复制到我们的数据库中,因为我们在下一节中需要它。连接字符串可以在侧边栏的“概述”部分找到。

使用AI套件增强Amplify Gen 2

AWS Amplify是将您的前端应用程序连接到由AWS提供支持的后端的最简单方法。假设已经创建了使用JavaScript框架(如NextJS)的应用程序,通过在项目根目录中运行以下命令来搭建Amplify文件:

npm create amplify

这将安装Amplify的依赖项并创建一个amplify目录。在修改该目录中的代码之前,我们将安装Amplify AI套件所需的其他一些依赖项:

npm i @aws-amplify/ui-react @aws-amplify/ui-react-ai

这些是我们将很快使用的UI组件。

在此之前,我们将让Amplify使用products表自省我们的数据库,以便我们可以在后端使用它。第一步是将我们的连接字符串存储为秘密。这个秘密存储在AWS Systems Manager的参数存储中。幸运的是,Amplify提供了一种简单的方法来做到这一点。

在您的终端中,运行以下命令:

npx ampx sandbox secret set SQL_CONNECTION_STRING

这将设置一个秘密值SQL_CONNECTION_STRING并提示输入该值。从这里,粘贴从Neon复制的连接字符串,然后按回车键。

本节假设您已经在本地计算机上配置了AWS Amplify。如果您需要配置Amplify,请参阅留档了解说明。

存储秘密后,我们可以指示Amplify自省我们的数据库并创建我们可以在前端应用程序中使用的CRUD操作:

npx ampx generate schema-from-database --connection-uri-secret SQL_CONNECTION_STRING --out amplify/data/schema.sql.ts 

运行此命令将在amplify/data文件夹中创建一个schema.sql.ts文件。重要的是不要修改此文件,因为它由放大器管理。运行该命令后,该文件应类似于以下屏幕截图:

 

Amplify使用此文件将我们的Postgres数据库映射为与其a.model方法一起使用的格式。

如果你想了解放大器在幕后做了什么来完成这项工作,请查看留档。

 

import { type ClientSchema, defineData, a } from '@aws-amplify/backend'
import { schema as generatedSqlSchema } from './schema.sql'

const sqlSchema = generatedSqlSchema.setAuthorization((models) => [
    models.items.authorization((allow) => [allow.authenticated().to(['read'])]),
])
const schema = a.schema({
    chat: a
        .conversation({
            aiModel: a.ai.model('Claude 3.5 Haiku'),
            systemPrompt:
                'You are a helpful assistant, that focuses on selling and upselling merchandise',
            tools: [
                a.ai.dataTool({
                    name: 'MerchQuery',
                    description:
                        'Search for questions regarding merchandise, shopping apparel, and item prices.',
                    model: a.ref('items'), //! This refers to the name of our table
                    modelOperation: 'list',
                }),
            ],
        })
        .authorization((allow) => allow.owner()),
})

const combinedSchema = a.combine([sqlSchema, schema])

export type Schema = ClientSchema<typeof combinedSchema>

export const data = defineData({ schema: combinedSchema })

现在我们的Neon数据库在我们的应用程序中,我们可以将其导入amplify/data/resource.ts文件,并将其与放大AI套件的对话功能相结合。让我们分解一下这个文件中发生了什么:

  • 第4行:这里我们正在为Neon的products表分配授权规则。在这种情况下,只有登录用户才能对其执行read操作。
  • 第8行:我们创建一个名为chat的标识符。这是一个对话机器人,它至少接收LLM的名称,并提示它应该如何运行。模型名称是键入的并且在Intellisense中可用,这毫无价值。
  • 第13行:我们通过给它一个工具来增强我们的机器人。名称和描述由我们来定义,而model必须引用我们Neon数据库的名称。目前唯一支持的modelOperationlist
  • 第22行:此行提供了对幕后发生的事情的洞察。DynamoDB表跟踪已登录的用户对话历史记录。

通过将所有这些元素放在一起,我们有了一个完全托管的解决方案,可以安全地与了解我们数据库中项目的LLM进行对话。

为了测试我们的解决方案,我们将首先通过运行以下命令来部署我们的AWS后端:

npx ampx sandbox

部署后,我们可以导入我们的Amplify配置并配置我们的客户端应用程序以使用Amplify提供的配置、UI组件和挂钩:

import { generateClient } from 'aws-amplify/api'
import { Schema } from '@/amplify/data/resource'
import { useEffect } from 'react'
import { Amplify } from 'aws-amplify'
import awsconfig from '@/amplify_outputs.json'
import { withAuthenticator } from '@aws-amplify/ui-react'
import { AIConversation, createAIHooks } from '@aws-amplify/ui-react-ai'
import '@aws-amplify/ui-react/styles.css'

Amplify.configure(awsconfig)

const client = generateClient<Schema>()
const { useAIConversation } = createAIHooks(client)

配置后,可以在大约20行代码中设置包含聊天、对话感知、流式传输、加载状态和身份验证的整个前端:

function Home() {
    const [
        {
            data: { messages },
            isLoading,
        },
        handleSendMessage,
    ] = useAIConversation('chat')

    return (
        <div className="flex justify-center items-center m-10 max-w-screen-md">
            <AIConversation
                avatars={{ user: { username: 'Focus Otter' } }}
                messages={messages}
                handleSendMessage={handleSendMessage}
                isLoading={isLoading}
                variant="bubble"
                welcomeMessage="Hello! I'm your helpful storefront assistant. Feel free to ask me questions about my merch!"
            />
        </div>
    )
}

export default withAuthenticator(Home)

请随意将上面的代码与本文中的第一个屏幕截图进行比较。Amplify AI套件的新AIConversation组件提供了完整的聊天UI,同时仍公开各种道具以进一步定制您的特定需求。

结论

在这篇文章中,我们讨论了构建支持使用检索增强生成(RAG)与LLM对话的全栈应用程序的一些复杂性。然后,我们看到了AWS Amplify的新AI套件如何通过抽象样板文件来极大地简化这种体验,从而允许开发人员专注于真正使应用程序与众不同的部分。正如我们所看到的,这种轻松的设置不会以牺牲可扩展性为代价。我们通过从Neon创建Postgres数据库并将其与我们的工具一起使用来证明这一点。


http://www.kler.cn/a/554969.html

相关文章:

  • 点击表格的最后一行的下拉框,会出现横向滚动条
  • 网络编程套接字之UDP
  • ArcGIS Pro制作人口三维地图教程
  • Linux初体验:从零开始掌握操作系统的发展与多样性
  • Ubuntu安装PostgreSQL
  • Webpack 基础入门
  • <iframe>标签嵌入pdf文件在谷歌浏览器中无法显示
  • ZLMediaKit Windows 编译指南
  • linux 搭建nfs服务(共享文件夹)
  • 从Majorana 1芯片看微软量子计算路径及竞品对比分析
  • android怎么卸载系统应用
  • 强化学习笔记之引论
  • 【数据分析】3 数据分析成长之路
  • three.js之特殊材质效果
  • VMware虚拟机打不开Ubuntu22.04,是否从库中移出Ubuntu_22.04_bak_1 64位.vmx 解决方法
  • Unity面板介绍_Project工程面板(23.1.1)
  • 深度学习在医疗影像分析中的革命性应用
  • [DeepSeek]一、DeepSeek+Dify创建工作流
  • python-leetcode 39.二叉树的直径
  • HTTP常见状态码和HTTP的发展