在亚马逊云科技AWS上利用RAG搭建一个向量库云原生AI对话机器人

news2024/11/15 3:25:38

简介:

小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。

本次介绍的是如何利用亚马逊云科技一系列热门AI和云原生服务,如Amazon Bedrock、Amazon Kendra,开发一个AI对话机器人,本文将通过真实样例和场景帮助大家0基础学会AI核心技能。本架构设计全部采用了云原生Serverless架构,提供可扩展和安全的AI解决方案。通过Amazon API Gateway、AWS Amplify和AWS Lambda将应用程序与AI模型Mistral 7B集成,并利用Amazon Titan向量模型和向量库Kendra和RAG增强对话机器人和用户交互的内容。

本方案的解决方案架构图如下:

本方案主要服务介绍:

Amazon Bedrock

Amazon Bedrock 是亚马逊云科技上的生成式AI托管平台,专为开发者打造,用于快速构建和部署AI模型。它支持多种基础模型,简化了AI应用的开发过程。Bedrock的优势在于其高度可扩展性和易用性,帮助开发者快速从概念到产品,降低AI模型的开发门槛。

Amazon Kendra

Amazon Kendra 是一款智能搜索向量库,利用机器学习技术提供精准的搜索结果。它能够集成多个数据源,提供自然语言处理功能,帮助在RAG场景下提高信息检索效率。Kendra 的优势在于其智能的语义搜索和强大的数据集成能力,为用户提供直观的搜索体验。

AWS Amplify

AWS Amplify 是一个全面的开发平台,支持Web和移动应用的构建、部署和托管。它提供了丰富的工具和服务,如认证、存储、API等,简化了应用的开发流程。Amplify 的优势在于其无缝的集成和自动化SDLC扣成能力,使开发者能够快速构建高质量的应用。

Amazon API Gateway

Amazon API Gateway 是一种托管服务,允许开发者轻松创建、发布、维护和保护API。它提供了流量控制、授权、访问控制等功能,支持RESTful和WebSocket API。API Gateway 的优势在于其高效的流量管理和安全性,适用于各种用户规模的网页应用。

Amazon Cognito

Amazon Cognito 是一款用户身份验证和管理服务,支持用户注册、登录和访问控制。它能够与社交媒体登录、企业身份验证集成,简化用户管理流程。Cognito 的优势在于其强大的安全性和可扩展性,帮助开发者轻松实现用户身份验证功能。

AWS Lambda

AWS Lambda 是一种无服务器计算服务,允许开发者在无需管理服务器(Serverless)的情况下运行代码。Lambda 自动扩展,按实际计算时间和使用的计算资源收费,支持多种编程语言。其优势在于节省运维成本、提高开发效率和灵活的扩展能力,非常适合事件驱动的应用程序。

本方案包括的内容:

使用 Amazon Kendra 为文档建立索引以实现高效检索,并通过Kendra API 进行向量检索获取相关内容。

使用 AWS Amplify 和 Amazon CloudFront 作为前端服务器,托管聊天机器人应用程序。

通过 Amazon API Gateway 调用 AWS Lambda 函数,以获取向量库检索和后端大模型推理,进行 RAG(Retrieve and Generate)和提示工程。

学习设计提示词,并利用提示词调和 Amazon Kendra API 返回的文档搜索内容调用 Amazon Bedrock 上的大模型。

项目搭建具体步骤:

1. 首先我们进入Amazon Kendra

2. 建立Index索引,用于加快搜素效率

3. 为索引起名“kendra-index”,并选择Kendra需要访问的权限,其他配置选择模型后创建索引

4.接下来我们为向量库添加数据源,点击“Add Data Source”

5. 选择S3作为数据源

6. 为数据源配置一个昵称“kendra-data-source”,并选择文档语言为英文

7. 为访问数据源配置对应IAM权限

8. 选择保存文件的S3存储桶

9. 配置读取文档并向量化的模式和频率,最后点击添加数据源

10.  接下来我们打开自己偏好的CDE,运行下述BASH脚本部署我们的前端、后端、大模型服务、向量库基础设施。

#!/bin/bash
echo "Preparing Cloud9 for project deploymnet"

sudo yum install -y jq

echo "Update node js to version 16"
source "$HOME/.nvm/nvm.sh"
nvm install 16
nvm use 16
node --version

echo "Set region"
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo "AWS Region is $AWS_REGION"

echo "Build the backend code using sam build"
sam build

echo "Export S3 bucket name and Kendra index which are created as part of Startup CFN stack"
export S3BucketName=$(aws s3api list-buckets --query "Buckets[?contains(Name, 'kendra-docs')].Name" --output text)
export LabBucketName=$(aws s3api list-buckets --query "Buckets[?contains(Name, 'lab-code')].Name" --output text)
export KendraIndexID=$(aws kendra list-indices --query "IndexConfigurationSummaryItems[?contains(Name, 'kendra-index')].Id" --output text)
export LAMBDA_ROLE_ARN=$(aws iam  list-roles --query "Roles[?contains(RoleName, 'LambdaDeploymentRole')].Arn" --output text)


export SAMStackName="sam-bedrock-stack"
echo $SAMStackName

echo "Copy toml file and replace the parameters"

cp tools/samconf.toml samconfig.toml
# Replace values in .//samconfig.toml
sed -Ei "s|<KendraIndexId>|${KendraIndexID}|g" ./samconfig.toml
sed -Ei "s|<S3BucketName>|${S3BucketName}|g" ./samconfig.toml
sed -Ei "s|<LabBucketName>|${LabBucketName}|g" ./samconfig.toml
sed -Ei "s|<SAMStackName>|${SAMStackName}|g" ./samconfig.toml
sed -Ei "s|<AWS_REGION>|${AWS_REGION}|g" ./samconfig.toml
sed -Ei "s|<LambdaRole>|${LAMBDA_ROLE_ARN}|g" samconfig.toml

echo "Deploy app with sam deploy"
sam deploy

echo "Export few more parameters"
export BedrockApiUrl=$(aws cloudformation describe-stacks --stack-name ${SAMStackName} --query "Stacks[0].Outputs[?OutputKey=='BedrockApiUrl'].OutputValue" --output text)
export UserPoolId=$(aws cognito-idp list-user-pools --query "UserPools[?contains(Name, 'ChatbotUserPool')].Id"  --max-results 1 --output text)
export UserPoolClientId=$(aws cognito-idp list-user-pool-clients --user-pool-id ${UserPoolId}  --query "UserPoolClients[?contains(ClientName, 'ChatbotUserPoolClient')].ClientId"  --output text)

echo "Gateway endpoint: $BedrockApiUrl"
echo "Cognito user pool id: $UserPoolId"
echo "Cognito client id: $UserPoolClientId"

# Replace values in ./backend/samconfig.toml
sed -Ei "s|<ApiGatewayUrl>|${BedrockApiUrl}|g" ./frontend/src/main.js
sed -Ei "s|<CognitoUserPoolId>|${UserPoolId}|g" ./frontend/src/main.js
sed -Ei "s|<UserPoolClientId>|${UserPoolClientId}|g" ./frontend/src/main.js

#Install Ampliyfy and build frontend
echo "Install Ampliyfy and build frontend"
cd ~/environment/serverless-chatbot-code/frontend
npm i -S @vue/cli-service
npm i -g @aws-amplify/cli
npm install
npm run build
cp ~/.aws/credentials ~/.aws/config

#Amplify initialization
echo "Amplify initialization"
mv dist build
amplify init --yes


echo "Add hosting, hit enter key if it prompts for action, use default"
amplify add hosting parameters.json

echo "Publish the amplify project"
amplify publish --yes

11. 在本方案中,我们使用的是AWS SAM (Serverless Application Model)代码定义基础设施(IaC)创建云端资源。我们会在控制台中看到所有创建的资源信息,在亚马逊云科技平台上会创建对应的CloudFormation Stack堆栈,CloudFormation是亚马逊云科技的IaC服务。

12.部署成功后,该脚本会返回AI机器人服务的网页URL

13. 打开URL后,我们可以看到对话机器人的前端界面

14. 接下来我们创建一个Lambda函数,可以命名为“CognitoUserCreateFunction”,复制以下代码,利用用户管理服务Cognito创建一个网页用户

import boto3
import json
import secrets
import string
import os


REGION = os.environ['AWS_REGION']
ChatbotUserPool = os.getenv("Cognito_UserPool", None)
ChatbotUserPoolClient = os.getenv("Cognito_ClientID", None)
secrets_name = os.getenv("SECRET_ID", 'ui-credentials')
user_id = os.getenv("USER_ID", 'bedrock')


cognitoidentityserviceprovider = boto3.client('cognito-idp', region_name=REGION)

def generate_random_password(length=12):
    # Define character sets
    lowercase_letters = string.ascii_lowercase
    uppercase_letters = string.ascii_uppercase
    digits = string.digits
    special_characters = '!$@'

    # Ensure that the password includes at least one special character
    special_char = secrets.choice(special_characters)

    # Calculate the remaining length of the password
    remaining_length = length - 1

    # Generate the rest of the password with a mix of characters
    password_characters = (
        secrets.choice(lowercase_letters) +
        secrets.choice(uppercase_letters) +
        secrets.choice(digits) +
        ''.join(secrets.choice(lowercase_letters + uppercase_letters + digits + special_characters) for _ in range(remaining_length - 3))
    )

    # Shuffle the characters to make the password random
    password_list = list(password_characters)
    secrets.SystemRandom().shuffle(password_list)
    shuffled_password = ''.join(password_list)

    # Add the special character back at a random position
    position = secrets.randbelow(length)
    password = shuffled_password[:position] + special_char + shuffled_password[position:]

    return password

def create_secret(password):

    # Initialize the AWS Secrets Manager client
    client = boto3.client('secretsmanager')

    # Store the user ID and password in a dictionary
    secret_data = {
        'user_id': user_id,
        'password': password
    }

    # Create or update the secret in Secrets Manager
    try:
        response = client.create_secret(
            Name=secrets_name,
            SecretString=str(secret_data)
        )
        print("Secret created successfully!")
    except client.exceptions.ResourceExistsException:
        # If the secret already exists, update it
        response = client.update_secret(
            SecretId=secrets_name,
            SecretString=str(secret_data)
        )
        print("Secret updated successfully!")


def lambda_handler(event, context):
    status_msg = 'SUCCESS'
    try:
        password = generate_random_password()
        create_secret(password)
        
        try:
            cognitoidentityserviceprovider.admin_create_user(
                UserPoolId = ChatbotUserPool,
                Username = user_id, 
                UserAttributes = [
                    {"Name": "name", "Value": user_id}
                ]
            )
        except Exception as e1:
            print('cognito user exist already')

        cognitoidentityserviceprovider.admin_set_user_password(
            UserPoolId = ChatbotUserPool,
            Username = user_id, 
            Password = password,
            Permanent=True
        )
        status_msg = 'SUCCESS'
    except Exception as e:
        print('Error: ' + str(e))
        status_msg = 'FAILED'
        

    print('Successfully created user')


15. 运行代码后,我们成功创建了一个新的用户“bedrock”,在secret manager密码管理服务中可以获取用户的密码

16. 利用账户和密码登录刚刚展示的对话机器人网页

17. 最后我们就可以在对话机器人中和大模型实现问答了,本场景是未使用RAG的场景

18. 再次测试RAG场景

我们为机器人首先预定义提示词

Human:You are an intelligent AI advisor, and provide answers to questions by using fact based information. 
Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags. 
Look for the contextual information enclosed in <context> tags.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
<context>{context}</context>
<question>{question}</question>
The response should be specific and use facts only.

Assistant:

我们在聊天框中提问“What is federal funds rate as of April 2024?”,机器人成功从文档中提取相关信息,回复了我们的问题

以上就是在亚马逊云科技上使用大语言模型、向量库和RAG技术搭建云原生AI对话机器人的解决方案。欢迎大家关注小李哥,未来获取更多国际前沿的生成式AI开发方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第16天|Diffusion扩散模型,DCGAN生成漫画头像

Diffusion扩散模型 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已经在&#xff08;无&#xff09;条件图像/音频/视频生成领域取得…

7.30 模拟赛总结 [神奇性质]+[线段树二分]

复盘 7:40 成功开题&#xff0c;艾教场 看 T1&#xff0c;感觉很神奇&#xff0c;但看数据范围没有开到 1 e 9 1e9 1e9 之类的&#xff0c;应该是得怎么搜一下&#xff1b;T2 发现做过原题&#xff0c;秒了&#xff1b;T3 第一眼没看懂题&#xff0c;推样例始终不理解其中的…

使用Leaflet GeoMan结合天地图进行自由标绘实战

目录 前言 一、Leaflet GeoMan是什么 1、关于Leaflet GeoMan 2、关于开源版和企业版 3、相关的方法介绍 二、使用Geoman来进行自由标绘实战 1、相关资源准备 2、新建html网页 3、初始化地图及绑定Geoman控件 三、自由标绘的成果 1、整体效果 2、添加空间对象 3、开…

语音交互、AI问答,等你来体验!

功能背景 在实际大屏应用中&#xff0c;用户向大屏直接下达语音指令显的越来越便捷&#xff0c;其中体现的交互感也比通过动作指令来的更加强烈&#xff0c;给用户带来更高效的服务体验。目前EasyV平台开发的自定义事件交互已经很完善&#xff0c;组件之间可以进行触发联动。 …

python 装饰器及使用场景

1. 装饰器的理解 上面这种用装饰器的效果和下面这种是一样的&#xff0c;两个圈起来的是等价的&#xff0c;只是写法不一样&#xff0c;用装饰器函数 更简洁一些。 总的来说&#xff0c;装饰器的作用是&#xff1a;当定义一个函数的时候&#xff0c;通过在其上面加上装饰器&…

C:关于位操作符:、|、^、~的一些应用

一些用来熟悉位操作符的应用 一、按位异或&#xff1a;^ 异或运算&#xff1a;相同为0&#xff0c;相异为1 应用&#xff1a;在不引入临时变量&#xff08;第三变量&#xff09;的情况下&#xff0c;实现两个整数的交换。 关于两个整数交换&#xff0c;我们有一些方法&…

Docker Compose部署项目+使用

目录结构 - suggestion/- backend/ # 我的后端项目- app.py- other_files/- docker-compose.yml- Dockerfile- requirements.txt获得requirements.txt 命令行输入&#xff1a;pip list --formatfreeze > requirements.txt 因为使用 pip freeze > requirements.txt 导出…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

漏洞打靶-tomato

这是一个很有意思的靶场&#xff0c;靶机的安装过程请参考我的文章“漏洞打靶-hackme”&#xff0c;进入靶场后&#xff0c;迎面而来的就是一个大tomato&#xff0c;然后就无从下手了&#xff0c;查目录查不出来&#xff0c;sql注入也没地方注入 这时候我们可以用kali的nmap去查…

ARM学习(29)NXP 双coreMCU MCXN94学习

笔者来介绍一下NXP 双core板子 &#xff0c;新系列的mcxn94 1、MCX 新系列介绍 恩智浦 MCU 系列产品包括 Kinetis 、LPC 系列&#xff0c;以及 i.MX RT 系列&#xff0c;现在又推出新系列产品 MCX 产品&#xff0c;包括四个系列&#xff0c;目前已经发布产品的是 MCX N 系列。…

第十四天7.25(git)

1.git 1.git功能特性 1.克隆数据库版本&#xff1a;从服务器上克隆数据库本机上 2.提交代码&#xff1a;在本机上自己创建的分支上提交代码 3.合并分支&#xff1a;在本机上合并分支 4.拉取合并分支&#xff1a;新建一个分支&#xff0c;把服务器上最新的代码Fetch下来&…

微软工具合集 | Microsoft PowerToys v0.83.0

PowerToys是由微软开发的一款免费系统工具集&#xff0c;专为Windows 10和Windows 11系统设计。它提供了一系列高效实用的工具&#xff0c;旨在帮助用户提升操作系统的使用效率和个性化程度。PowerToys工具集深受系统管理员和高级用户的喜爱&#xff0c;通过集成多种工具&#…

XXE -靶机

XXE靶机 一.扫描端口 进入xxe靶机 1.1然后进入到kali里 使用namp 扫描一下靶机开放端口等信息 1.2扫描他的目录 二 利用获取的信息 进入到 robots.txt 按他给出的信息 去访问xss 是一个登陆界面 admin.php 也是一个登陆界面 我们访问xss登陆界面 随便输 打开burpsuite抓包 发…

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式 WPF用户图形界面是树状结构 &#x1f446;wpf文档大纲 &#x1f446;winform文档大纲 wpf的用户图形界面是树状结构&#xff0c;与winform不同点在于&#xff0c;winform同样存在树状结构的控件(比如panel、gridcontrol等…

Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT

为什么打开手机的WiFi连接&#xff0c;显示的是WLAN&#xff1f; 分清Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT这些概念. 一、WLAN、WIFI、WAPI WLAN是利用无线通信技术在局部区域内构建的网络&#xff0c;家庭/办公室里的网络就是一个WLAN&#xff0c;WLAN是一…

【数据结构】Java实现二叉搜索树

二叉搜索树的基本性质 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 1. 节点结构&#xff1a;每个节点包含一个键&#xff08;key&#xff09;和值&#xff08;value&#xff09;&#xff0c;以及指…

大语言模型中的提示隐私保护

大语言模型中的提示隐私保护 一、简介&#xff1a; 大语言模型&#xff08;LLM&#xff09; 拥有庞大的规模、预先训练的知识和卓越的性能&#xff0c;被广泛应用于各种任务。提示学习(prompt learning)和指令微调(instruction tuning) 是两种重要的使得大模型能理解具体任务…

决策树基础

概述 决策树是一种树型结构&#xff0c;其中每个内部结点表示在一个属性上的测试&#xff0c;每个分支代表一 个测试输出&#xff0c;每个叶结点代表一种类别。决策树学习采用的是自顶向下的递归方法&#xff0c;其基本思想是以信息熵为度量构造一棵熵值下降最快的树&#xff…

自学Java第16Day

学习目标&#xff1a;面向对象进阶 学习内容&#xff1a;Object、Objects、BigInteger、BigDecimal、正则表达式 学习时间&#xff1a;下午 3 点-下午 6 点 学习产出&#xff1a; 1. Object类 1.1 概述 查看API文档&#xff0c;我们可以看到API文档中关于Object类的定义如下&…