AWS云计算问答式知识库系统的实现

AWS平台上建立一个生成式人工智能专业文文档问答式网站,前端用Flask框架,后端用Fast API,前端调用后端的唯一API来完成大模型文档搜索的功能,使用AWS Bedrock里的Titan和Llama3模型,以及OpenAI 4.0 API来调用模型并提供内部的配置参数以供选择,向量数据库用langchain和faiss库,在Sagemaker中访问S3里PDF文件逐页导入内容,生成单独向量数据库文件搜索文档,以及用Amazon Kendra文档智能搜索服务实现搜索文档,作为另一种实现,通过配置参数来选择,最后将前端和后端用Docker打包镜像文件,上传到AWS ECS中运行。请详细地设计这样的一种应用程序的实现和部署方式,并给出关键部分的Python代码实现。

这是一个相对复杂的任务,涉及多个AWS服务、AI模型、以及前后端技术的集成。我们可以将其拆分成几个模块,逐步实现。

1. 系统架构设计

首先,我们设计一个清晰的架构:

  1. 前端: 使用 Flask 创建一个简单的Web应用,提供用户交互界面,让用户上传PDF文档并输入查询内容。
  2. 后端: 使用 FastAPI 提供API接口,处理来自前端的请求,调用各种AI模型进行推理,或者查询本地的向量数据库(FAISS)/Kendra服务。
  3. 文档存储: 使用 S3 存储PDF文件,SageMaker 中的模型和服务来提取文档内容并生成向量。
  4. 模型选择: 提供Titan和Llama3模型在AWS Bedrock中进行选择,或者调用OpenAI 4.0的API。提供一个接口让前端选择并切换模型。
  5. 向量存储与搜索: 使用 FAISSLangChain 来存储和查询文档的向量,另外通过 Kendra 提供文档智能搜索功能作为备选。
  6. 容器化与部署: 使用 Docker 打包应用并将其部署到 AWS ECS 中,保证服务的可伸缩性和高可用性。

2. 前端部分:Flask应用

Flask应用将负责向用户展示上传文件和查询输入的页面。用户输入的查询请求将通过AJAX传递给后端API。

# app.py - Flask Frontend Application
from flask import Flask, render_template, request, jsonify
import requestsapp = Flask(__name__)# FastAPI backend URL
BACKEND_URL = "http://<backend-service-url>/api/query"@app.route('/')
def index():return render_template('index.html')@app.route('/submit_query', methods=['POST'])
def submit_query():query = request.form['query']selected_model = request.form['model']response = requests.post(BACKEND_URL, json={'query': query, 'model': selected_model})data = response.json()return jsonify(data)if __name__ == '__main__':app.run(debug=True)

Flask应用提供了一个简单的HTML表单,用户输入查询并选择模型后,将请求发送到FastAPI后端进行处理。

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document Search</title>
</head>
<body><h1>Document Query Interface</h1><form id="queryForm"><label for="query">Query:</label><input type="text" id="query" name="query" required><label for="model">Choose a Model:</label><select id="model" name="model"><option value="Titan">Titan</option><option value="Llama3">Llama3</option><option value="OpenAI">OpenAI 4.0</option></select><button type="submit">Submit</button></form><div id="result"><h2>Search Results:</h2><pre id="response"></pre></div><script>document.getElementById('queryForm').onsubmit = async function(event) {event.preventDefault();const query = document.getElementById('query').value;const model = document.getElementById('model').value;const response = await fetch('/submit_query', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({query, model}),});const result = await response.json();document.getElementById('response').textContent = JSON.stringify(result, null, 2);};</script>
</body>
</html>

3. 后端部分:FastAPI应用

FastAPI应用将负责接收前端的请求,调用AWS服务(如AWS Bedrock,OpenAI,FAISS,或Kendra),并返回查询结果。

# main.py - FastAPI Backend Application
from fastapi import FastAPI, Query
from pydantic import BaseModel
import openai
import boto3
import os
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA# AWS Configurations
BEDROCK_CLIENT = boto3.client('bedrock', region_name='us-west-2')
S3_CLIENT = boto3.client('s3')# OpenAI API Key
openai.api_key = os.getenv("OPENAI_API_KEY")# Define a model selection object
class QueryRequest(BaseModel):query: strmodel: strapp = FastAPI()@app.post("/api/query")
async def query(request: QueryRequest):query = request.querymodel = request.modelif model == "OpenAI":response = openai.Completion.create(model="gpt-4",prompt=query,max_tokens=150)return {"response": response['choices'][0]['text']}elif model == "Titan":response = BEDROCK_CLIENT.invoke_model(ModelId="titan-1",Body=query)return {"response": response['Body'].read().decode()}elif model == "Llama3":# Assuming use of Llama3 in a similar fashion to Titanresponse = BEDROCK_CLIENT.invoke_model(ModelId="llama3-1",Body=query)return {"response": response['Body'].read().decode()}else:return {"error": "Model not supported."}@app.post("/api/upload_document")
async def upload_document(file: bytes):# Save to S3s3_response = S3_CLIENT.put_object(Bucket="my-bucket", Key="document.pdf", Body=file)return {"status": "success", "s3_key": s3_response["Key"]}@app.get("/api/search_vector")
async def search_vector(query: str):# Load the FAISS indexvector_store = FAISS.load_local("faiss_index")retriever = vector_store.as_retriever()# Perform vector searchresult = retriever.get_relevant_documents(query)return {"results": result}

4. FAISS 和 LangChain 集成

对于文档的向量化,我们使用 LangChainFAISS。首先,从S3获取PDF文件,使用SageMaker进行内容提取,然后将提取的文本进行嵌入向量化,最后存储到FAISS数据库中。

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.chains import RetrievalQA
import boto3# S3获取PDF文件
def load_pdf_from_s3(bucket, key):s3 = boto3.client('s3')obj = s3.get_object(Bucket=bucket, Key=key)return obj['Body'].read()# 文档向量化
def process_pdf_to_faiss(pdf_file):loader = PyPDFLoader(pdf_file)pages = loader.load_and_split()# Create embeddingsembeddings = OpenAIEmbeddings()vectorstore = FAISS.from_documents(pages, embeddings)# Save FAISS indexvectorstore.save_local("faiss_index")

5. AWS Sagemaker与PDF处理

使用 SageMaker 进行PDF文本提取。可以使用 Boto3SageMaker SDK 来调用预训练模型(如Tesseract OCR)。

import boto3def process_pdf_with_sagemaker(pdf_file_path):sagemaker_client = boto3.client('sagemaker-runtime')with open(pdf_file_path, 'rb') as f:payload = f.read()response = sagemaker_client.invoke_endpoint(EndpointName='your-endpoint-name',Body=payload,ContentType='application/pdf',Accept='application/json')return response['Body'].read().decode()

6. 部署与容器化

使用 Docker 创建容器镜像,并将其上传到 ECR,然后通过 ECS 部署。

# Dockerfile
FROM python:3.10-slimWORKDIR /app# 安装必要的依赖
COPY requirements.txt .
RUN pip install -r requirements.txt# 复制项目文件
COPY . .# 启动 Flask + FastAPI 服务
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# 构建镜像
docker build -t your-app-name .# 登录 AWS ECR
aws ecr get-login-password --region your-region | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com# 将镜像推送到ECR
docker tag your-app-name:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/your-repository:latest
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/your-repository:latest

通过 ECS 设置 Fargate 服务,确保容器自动扩展和管理。

7. 总结

上述设计实现了一个生成式人工智能文档问答系统,整合了多个AWS服务(Bedrock、SageMaker、Kendra等)以及前后端技术。关键组件包括PDF文档的处理和存储、AI模型的调用、向量搜索的实现等。

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

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

相关文章

初识Linux · 日志编写

目录 前言&#xff1a; 日志的简单说明 编写日志 前言&#xff1a; 在线程池部分我们纵观全文&#xff0c;可以发现全文有很多很多的IO流&#xff0c;看起来还是差点意思的&#xff0c;而我们今天提到的日志&#xff0c;是在今后的代码编写中会经常接触&#xff0c;或者说在…

微信小程序做电子签名功能

文章目录 最近需求要做就记录一下。 人狠话不多&#xff0c;直接上功能&#xff1a; 直接搂代码吧,复制过去就可以用&#xff0c;有其他需求自己改吧改吧。 signature.wxml <!-- 电子签名页面 --> <custom-navbar title"电子签名"show-home"{{fals…

【HarmonyOS】使用AVPlayer播放音乐,导致系统其它应用音乐播放暂停 - 播放音频焦点管理

【HarmonyOS】使用AVPlayer播放音乐&#xff0c;导致系统其它应用音乐播放暂停 - 播放音频焦点管理 一、前言 在鸿蒙系统中&#xff0c;对于音乐播放分为几种场景。音乐&#xff0c;电影&#xff0c;音效&#xff0c;闹钟等。当使用AVPlayer播放音乐时&#xff0c;如果不处理…

API接口安全:保障电商数据不被泄露的关键

在当今的数字化时代&#xff0c;电子商务&#xff08;电商&#xff09;已成为全球商业活动的重要组成部分。随着电商平台的日益增多和用户数据的海量积累&#xff0c;数据安全问题也日益凸显。API&#xff08;应用程序编程接口&#xff09;作为电商平台与外部系统交互的桥梁&am…

金融机构远程办公面临的安全挑战

当前&#xff0c;金融机构的业务模式、IT架构都发生了深刻变化。在建设远程办公系统时&#xff0c;金融机构需要面对以下几个方面的挑战&#xff1a; 如何实现“边界模糊化”网络环境下的安全接入&#xff1f; 随着金融机构基础设施云化、业务互联网化和办公移动化&#xff0…

Linux中inode、软硬连接

磁盘的空间管理 如何对磁盘空间进行管理&#xff1f; 假设在一块大小为500G的磁盘中&#xff0c;500*1024*1024524288000KB。在磁盘中&#xff0c;扇区是磁盘的基本单位&#xff08;一般大小为512byte&#xff09;&#xff0c;而文件系统访问磁盘的基本单位是4KB&#xff0c;因…

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类&#xff0c;为了提高垃圾分类模型的准确率&#xff0c;使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型&#xff0c;实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

IDEA结合GitLab使用

GitLab新建仓库 使用管理员账号创建gitlab仓库创建空白文件填写项目名称及命名空间 注意&#xff1a;取消勾选【使用自述文件初始化仓库】&#xff0c;否则IDEA中push代码报错 设置仓库权限 【设置】-【仓库】-【受保护分支】中需要添加哪些角色可以提交与合并代码&#xff0…

apisix lua插件开发记录

1 如何匹配路径中的参数 文章给出了具体的方法&#xff0c;但有隐藏的坑未提及。 router radixtree_uri_with_parameter 启用后&#xff0c;对路径上的参数名有要求&#xff0c;不能有_。否则会提示404&#xff0c;因为 router radixtree_uri_with_parameter解析不了。 2 插…

洛谷 P1179 [NOIP2010 普及组] 数字统计 C语言

题目&#xff1a; https://www.luogu.com.cn/problem/P1179 思路&#xff1a;直接暴力过 代码&#xff1a; #include<iostream> using namespace std; int cnt(int x) {int sum 0;while(x){int temp x %10;if(temp 2){sum;}x x/10;}return sum; } int main(void) …

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…

【21天学习AI底层概念】day2 机器学习基础

按照由浅入深的顺序&#xff0c;下一步学习 机器学习&#xff08;Machine Learning&#xff09; 的基础是最自然的选择。机器学习是人工智能的核心技术之一&#xff0c;很多AI系统都依赖它。以下是学习路线建议&#xff1a; 第二步&#xff1a;机器学习基础 学习目标&#xff…

在GitHub上fork 别人的仓库 到 自己的仓库,clone到本地,处理后再上传回Github请求PR的过程

如题 一、fork 别人的仓库 到 自己的仓库 这是一种完全的复刻&#xff0c;所有内容都会被拿过来。 点击fork 写信息 创建fork 二、把它clone 到本地 先回到home&#xff0c;打开刚才 我们fork 的工程。 复制地址。 然后 在我们 本地 你去创建一个文件夹 来 接受他 比如我…

MATLAB 识别色块和数量

文章目录 前言步骤 1: 读取图像步骤 2: 转换为 HSV 颜色空间步骤 3: 定义颜色范围步骤 4: 创建颜色掩码步骤 5: 应用形态学操作&#xff08;可选&#xff09;步骤 6: 标记和显示结果完整代码步骤七 返回色块坐标 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…

深入理解偏向锁、轻量级锁、重量级锁

一、对象结构和锁状态 synchronized关键字是java中的内置锁实现&#xff0c;内置锁实际上就是个任意对象&#xff0c;其内存结构如下图所示 其中&#xff0c;Mark Word字段在64位虚拟机下占64bit长度&#xff0c;其结构如下所示 可以看到Mark Word字段有个很重要的作用就是记录…

三星索引概念

三星索引概念 对于一个查询而言&#xff0c;一个三星索引&#xff0c;可能是其最好的索引。如果查询使用三星索引&#xff0c;一次查询通常只需要进行一次磁盘随机读以及一次窄索引片的 扫描&#xff0c;因此其相应时间通常比使用一个普通索引的响应时间少几个数量级。 三星索引…

文字稿 | MatrixOne2.0.0:AI向量与高可用能力的重磅升级MatrixOne 2.0.0 新特性解读

MatrixOne 2.0.0 是一款 AI 驱动的云原生超融合数据库&#xff0c;采用了存算分离的架构&#xff0c;全面优化了云上资源利用效率。 MatrixOne兼容 MySQL 协议和语法&#xff0c;具备支持混合负载场景的能力&#xff0c;并结合向量数据类型、全文检索等特性&#xff0c;为生成式…

Qt Xlsx安装教程

Qt Xlsx安装教程 安装perl 如果没有安装perl&#xff0c;请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…

记一次js Long类型精度丢失问题

背景&#xff1a; 微信小程序和后端springboot后端服务联调&#xff0c;用户id是19位的数值型&#xff0c;通过postman工具调用没有精度问题&#xff0c;小程序调用用户id和后端返回的不一致。 解决办法 网上文章很多&#xff0c;自行搜索吧&#xff0c; 这是站内的一个博客&…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…