在亚马逊云科技上搭建云原生生成式AI教育学习平台

项目简介:

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

本次介绍的是如何利用亚马逊云科技大模型托管服务Amazon Bedrock和云原生容器管理服务,将生成式AI和亚马逊Titan大模型应用到教育和学习场景,利用Titan大模型的向量化、文字和图片生成能力构建云端教育平台为学生创建课程作业和答案,本架构设计全部采用了云原生Serverless架构,提供可扩展和安全的AI解决方案。通过Application Load Balancer和AWS ECS将应用程序与AI模型集成。本方案的解决方案架构图如下:

方案所需基础知识 

什么是 Amazon Bedrock?

Amazon Bedrock 是亚马逊云科技提供的一项服务,旨在帮助开发者轻松构建和扩展生成式 AI 应用。Bedrock 提供了访问多种强大的基础模型(Foundation Models)的能力,支持多种不同大模型厂商的模型,如AI21 Labs, Anthropic, Cohere, Meta, Mistral AI, Stability AI, 和Amazon,用户可以使用这些模型来创建、定制和部署各种生成式 AI 应用程序,而无需从头开始训练模型。Bedrock 支持多个生成式 AI 模型,包括文本生成、图像生成、代码生成等,简化了开发流程,加速了创新。

什么是 Amazon Titan 模型?

Amazon Titan 是亚马逊云科技推出的基础AI大语言模型,专为处理复杂生成任务而设计。Titan 模型经过大规模数据训练,具备强大的自然语言理解和生成能力,适用于多种应用场景,包括文本创作、对话生成、代码生成、向量生成和图片生成等。

向量生成

Titan 模型还能够将文本或其他数据转化为高维向量表示,支持相似性搜索、推荐系统和其他基于向量的任务。通过生成向量,Titan 模型可以帮助开发者在大规模数据集中高效地进行数据检索和分类,提升智能应用的性能和用户体验。

图片生成

除了文本和向量生成,Titan 模型还具备图片生成能力。利用 Titan 模型,开发者可以从文本描述生成高质量的图像,或通过输入图片进行风格转换和图像增强。这个功能使 Titan 模型在教育学习、创意设计、广告制作、游戏开发等领域具有广泛的应用前景。

本方案包括的内容

1. 管理Amazon Bedrock上托管的生成式AI大模型访问权限。

2. 评估和选择适合教育平台应用的AI大模型

3. 利用ECS容器管理服务部署教育平台容器化应用

4. 在教育平台应用中利用生成式AI为学生创建课程作业

项目搭建具体步骤:

1. 进入亚马逊云科技控制台,打开Amazon Bedrock大模型托管服务主页

2. 确认以下三个大模型是在开启状态,Titan Embeddings G1 - Text, Titan Text G1 - Premier, and Titan Image Generator G1,分别是向量化、文字生成和图片生成模型。

 3.我们可以在Amazon Bedrock的模型介绍界面的API Request样例示范中得到以上3个大模型的ID,分别是“amazon.titan-embed-text-v1”,“amazon.titan-text-premier-v1:0”,"amazon.titan-image-generator-v1"。

4. 在亚马逊云科技上打开云端IDE Cloud9,创建一个python文件,命名为:“1_Create_Assignments.py”,复制以下代码到文件中,注意这里我们刚刚获取的AI大模型ID,“amazon.titan-text-premier-v1:0”和"amazon.titan-image-generator-v1"。该代码用于在Streamlit应用中生成课程作业。

import json
import logging
import math
import random
import re
import time
import base64
from io import BytesIOimport boto3
import numpy as np
import streamlit as st
from PIL import Image
from botocore.exceptions import ClientError
from components.Parameter_store import S3_BUCKET_NAMEdynamodb_client = boto3.resource("dynamodb")
bedrock_client = boto3.client("bedrock-runtime")
questions_table = dynamodb_client.Table("assignments")
user_name = "Demo-user"titan_text_model_id = "amazon.titan-text-premier-v1:0"
titan_image_model_id = "amazon.titan-image-generator-v1"if "input-text" not in st.session_state:st.session_state["input-text"] = Noneif "question_answers" not in st.session_state:st.session_state["question_answers"] = Noneif "reading_material" not in st.session_state:st.session_state["reading_material"] = None# Method to call the Titan text foundation model 
def query_generate_questions_answers_endpoint(input_text):prompt = f"{input_text}\n Using the above context, please generate five questions and answers you could ask students about this information"input_body = json.dumps({"inputText": prompt,"textGenerationConfig": {"maxTokenCount": 3072,"stopSequences": [],"temperature": 0.7,"topP": 0.9}})titan_qa_response = bedrock_client.invoke_model(modelId=titan_text_model_id,contentType="application/json",accept="application/json",body=input_body,)response_body = json.loads(titan_qa_response.get("body").read())response_text = ""for result in response_body['results']:response_text = f"{response_text}\n{result['outputText']}"return parse_text_to_lines(response_text)# method to call the Titan image foundation model
def query_generate_image_endpoint(input_text):seed = np.random.randint(1000)input_body = json.dumps({"taskType": "TEXT_IMAGE","textToImageParams": {"text": f"An image of {input_text}"},"imageGenerationConfig": {"numberOfImages": 1,"height": 1024,"width": 1024,"cfgScale": 8.0,"seed": 0}})if titan_image_model_id == "<model-id>":return Noneelse:titan_image_api_response = bedrock_client.invoke_model(body=input_body,modelId=titan_image_model_id,accept="application/json",contentType="application/json",)response_body = json.loads(titan_image_api_response.get("body").read())base64_image = response_body.get("images")[0]base64_bytes = base64_image.encode('ascii')image_bytes = base64.b64decode(base64_bytes)image = Image.open(BytesIO(image_bytes))return imagedef generate_assignment_id_key():# Milliseconds since epochepoch = round(time.time() * 1000)epoch = epoch - 1670000000000rand_id = math.floor(random.random() * 999)return (epoch * 1000) + rand_id# create a function to load a file to S3 bucket
def load_file_to_s3(file_name, object_name):# Upload the files3_client = boto3.client("s3")try:s3_client.upload_file(file_name, S3_BUCKET_NAME, object_name)except ClientError as e:logging.error(e)return Falsereturn True# create a function to insert a record to DynamoDB table created_images
def insert_record_to_dynamodb(assignment_id, prompt, s3_image_name, question_answers
):questions_table.put_item(Item={"assignment_id": assignment_id,"teacher_id": user_name,"prompt": prompt,"s3_image_name": s3_image_name,"question_answers": question_answers,})# Parse a string of text to get a line at a time
def parse_text_to_lines(text):st.write(text)lines = text.split('\n')lines = [line.strip() for line in lines]# Loop through each line and check if it's a questionquestion_answers = []question = Noneanswer = Nonequestion_id = 0for i in range(len(lines)):# regular expression pattern for Q: or Q1: or Q2question_pattern = re.compile("Q[0-9]?:|Question[\s]?[0-9]?:|QUESTION[\s]?[0-9]?:")answer_pattern = re.compile("A[0-9]?:|Answer[\s]?[0-9]?:|ANSWER[\s]?[0-9]?:")question_match = question_pattern.search(lines[i])answer_match = answer_pattern.search(lines[i])if question_match:# Get the substring after the matching patternquestion = lines[i][question_match.end() + 1:]if answer_match:# Get the substring after the matching patternanswer = lines[i][answer_match.end() + 1:]if question and answer:question_answer = {'id': question_id, 'question': question, 'answer': answer}question_answers.append(question_answer)question_id += 1question = Noneanswer = Nonereturn question_answers# Page configuration
st.set_page_config(page_title="Create Assignments", page_icon=":pencil:", layout="wide")# Sidebar
st.sidebar.header("Create Assignments")# Rest of the page
st.markdown("# Create Assignments")
st.sidebar.header("Input text to create assignments")text = st.text_area("Input Text")
if text and text != st.session_state.get("input-text", None) and text != "None":try:if titan_image_model_id != "<model-id>":image = query_generate_image_endpoint(text)image.save("temp-create.png")st.session_state["input-text"] = text# generate questions and answerquestions_answers = query_generate_questions_answers_endpoint(text)# st.write(questions_answers)st.session_state["question_answers"] = questions_answersexcept Exception as ex:st.error(f"There was an error while generating question. {ex}")if st.session_state.get("question_answers", None):st.markdown("## Generated Questions and Answers")questions_answers = st.text_area("Questions and Answers",json.dumps(st.session_state["question_answers"], indent=4),height=320,label_visibility="collapsed")if st.button("Generate Questions and Answers"):st.session_state["question_answers"] = query_generate_questions_answers_endpoint(text)st.experimental_rerun()if st.session_state.get("input-text", None):if titan_image_model_id != "<model-id>":images = Image.open("temp-create.png")st.image(images, width=512)if titan_image_model_id != "<model-id>":if st.button("Generate New Image"):image = query_generate_image_endpoint(text)image.save("temp-create.png")st.experimental_rerun()st.markdown("------------")
if st.button("Save Question"):if titan_image_model_id != "<model-id>":# load to s3assignment_id = str(generate_assignment_id_key())object_name = f"generated_images/{assignment_id}.png"validation_object_name = f"generated_images/temp-create.png"load_file_to_s3("temp-create.png", object_name)load_file_to_s3("temp-create.png", validation_object_name)st.success(f"Image generated and uploaded successfully: {object_name}")questions_answers = json.dumps(st.session_state["question_answers"], indent=4)insert_record_to_dynamodb(assignment_id, text, object_name, questions_answers)else:assignment_id = str(generate_assignment_id_key())object_name = "no image created"insert_record_to_dynamodb(assignment_id, text, object_name, questions_answers)st.success(f"An assignment created and saved successfully")hide_streamlit_style = """<style>#MainMenu {visibility: hidden;}footer{ visibility: hidden;}</style>"""st.markdown(hide_streamlit_style, unsafe_allow_html=True)

5. 接下来我们将应用代码封装成容器镜像,上传到亚马逊云科技容器镜像库ECR上,我们运行以下Bash命令。

#授权Docker客户端访问ECR镜像库
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 903982278766.dkr.ecr.us-east-1.amazonaws.com
#构建Docker镜像learning-system-repo
docker build -t learning-system-repo .
#为容器镜像打标记
docker tag learning-system-repo:latest 903982278766.dkr.ecr.us-east-1.amazonaws.com/learning-system-repo:latest
#将容器镜像上传到ECR中
docker push 903982278766.dkr.ecr.us-east-1.amazonaws.com/learning-system-repo:latest

6. 接下来我们进入到亚马逊云科技容器管理服务ECS,创建一个容器管理集群“Learning-System-cluster”和微服务,将上传的容器镜像部署上去。部署成功后会创建一个对外暴露的负载均衡器,用于实现微服务内部多个任务的高可用,我们复制这个对外暴露的负载均衡器的URL。

7. 打开后就可以登录到我们的AI学习平台中,我们点击左侧的Create Assignments, 并输入文组新奥尔良作为标准答案,点击利用生成式AI生成课程作业问题。

8. 我们可以看到课程学习平台通过生成式AI生成了多个课程作业问题,我们再点击SAVE保存问题到亚马逊云科技NoSQL数据库DynamoDB中。

9. 当学生登录该学习平台的测试界面时,就可以看到之前我们生成的问题,并输入答案完成作业测试了。

以上就是在亚马逊云科技上利用生成式AI构建云端教育平台,为学生创建课程作业并提供学习测试界面的全部步骤。欢迎大家未来与我一起,未来获取更多国际前沿的生成式AI开发方案。

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

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

相关文章

1.2 C 语言环境:MinGW 与 CLion 的安装与配置

目录 1 C 语言的由来 2 安装 MinGW 编译器 3 Windows 中安装 CLion 开发环境 3.1 安装 CLion 开发环境 3.2 运行试用 30 天 3.3 新建项目​ 3.4 汉化 4 Mac 中安装 Clion 开发环境 4.1 安装 CLion 开发环境 4.2 运行试用 30 天 4.3 新建项目 ​4.4 汉化 5 向日葵的…

突破百度网盘的下载限速,两种方法教会你【超详细】

一、前言 Hello&#xff0c;大家后&#xff0c;我是博主英杰&#xff0c;前几天&#xff0c;我在使用百度网盘过程中&#xff0c;下载速度极慢&#xff0c;自己作为一个白嫖党&#xff0c;开会员也是心疼那点钱&#xff0c;所以在网上找了几个有效解决百度网盘限速问题的教程&a…

arcgis-坡度坡向分析

坡向的描述有定性和定量两种方式&#xff0c;定量是以东为0&#xff0c;顺时针递增&#xff0c;南为90&#xff0c;西为180&#xff0c;北为270等&#xff0c;范围在0&#xff5e;35959′59″之间。 定性描述有8方向法和4方向法. 8 方向为东、东南、南、西南、西、西北、北、东…

JavaWeb-01(Java进阶内容详解,Html、CSS、JS)

一、前端技术结构分析 网页的结构&#xff08;HTML&#xff09;、表现(CSS)、行为(JS) 1.HTML定义界面整体结构 2.CSS定义页面样式 3.JS实现动态效果 二、HTML 2.1安装VS Code及前端开发插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code Code Spe…

golang并发控制

常见的并发控制 常见的并发控制 channel:通过无缓冲的channel进行同步调用&#xff0c;有缓冲的channel进行异步调用&#xff0c;也可限制并发数量 waitgroup:可以通过add来动态调整&#xff0c;释放的时间需要使用defer 进行wg.done操作 context&#xff1a;通过在协程之间…

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志&#xff1a;常规更新Cinebench R23、PassMark笔记本CPU天梯图&#xff0c;新增Geekbench 6.2单核多核天梯图&…

inner join, left join, right join, full join 的区别

1. 初始化表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for t_city -- ---------------------------- DROP TABLE IF EXISTS t_city; CREATE TABLE t_city (id varchar(255) CHARACTER SET utf8mb4 COLLATE utf…

Windows Server修改远程桌面端口

新建入站规则 填写端口 允许连接 修改远程桌面端口 winR打开注册表 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp修改PortNumber为新端口 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wi…

根据 IP 地址配置子网示例(下挂 hub 接不同 vlan 终端)

我们一般根据端口配置子网比较简单&#xff0c;但是如果换接口&#xff0c;就又要到交换机上重新配置端口所属 vlan 了&#xff0c;紧急情况下&#xff0c;还是比较耽误时间的。但如果根据IP地址配置 vlan&#xff0c;则可以插在交换机上任意端口&#xff0c;排障时比较节省时间…

深入理解Linux线程:从基础到进阶的全面指南

目录 一.线程概念1.理解Linux下的线程2.线程优缺点与异常3.线程VS进程4.再谈进程地址空间 二.线程控制1.线程的创建使用2.线程在进程地址空间的结构3.初窥多线程4.多线程抢票 三.线程互斥1.进程线程间的互斥相关背景概念2.互斥锁 四.线程安全1.线程安全和可重入函数2.死锁3.线程…

人工智能时代:程序员的核心竞争力重塑之旅

人工智能时代&#xff1a;程序员的核心竞争力重塑之旅 在人工智能&#xff08;AI&#xff09;技术日新月异的今天&#xff0c;程序员的角色与职责正经历着前所未有的变革。随着自动化、智能化工具的普及&#xff0c;许多传统编程任务被高效替代&#xff0c;这不禁让人思考&…

【基础算法总结】BFS 解决 FloodFill 算法

BFS 解决 FloodFill 算法 1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; FloodFill 算…

【基础算法总结】BFS 解决最短路径问题

BFS 解决最短路径问题 1.最短路径问题简介2.迷宫中离入口最近的出口3.最小基因变化4.单词接龙4.为高尔夫比赛砍树 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1…

Day17 枚举、typedef、位运算、堆空间的学习

目录 枚举 typedef 位运算 堆上的空间 枚举 一个一个列举出来&#xff0c;是指将变量的值一一列举出来&#xff0c;变量的值只限于列举出来的值的范围内。 作用&#xff1a; 1、为了提高代码的可读性 2、提高代码的安全性 枚举类型 基本语法&#xff1a; enum 枚举名 { …

根据toml编译生成whl

1、安装build pip install build如果已经安装build, 那就执行一下升级命令 python3 -m pip install --upgrade build2、在pyproject.toml所在的文件夹那一层执行 # -w:生成whl文件 -v:显示python编译过程 python3 -m build -w -v2.1 当出现以下输出&#xff0c;需要耐心等待…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践&#xff0c;并辅以实际示例。 随着软件系统变得越来越大、越来越复杂&#xff0c;组件和服务以错综复杂的方式交互&#xff0c;集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…

入门岛2-python实现wordcount并进行云端debug

书生大模型学习 任务&#xff1a; 1.实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS&#xff1a;记得先去掉标点符号,然后把每个单词…

Mybatis学习-day19

Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素&#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况&#xff0c;可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…

解決android Studio在导入已有的工程 build 时出现的错误

最近在学习andriod方面的知识&#xff0c;第一次使用android Studio导入别人的项目&#xff0c;从导入到build出现了几个问题&#xff0c;在这里记录以下解决过程。 SDK location not found 如下图报错所示&#xff0c;看网上教程有的说是SDK未安装&#xff0c;这里我是明确自…

两个AI关小黑屋:Llama3.1把Claude Opus聊自闭了

把Llama 3.1 405B和Claude 3超大杯Opus双双送进小黑屋&#xff0c;你猜怎么着—— Llama把Claude整得精神崩溃了&#xff0c;Claude明确拒绝继续聊天&#xff0c;还要再被Llama PUA的那种。 在一场AI和AI对话的安全词模拟实验中&#xff0c;X上的这位人类监督者记录下了一出好…