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

利用亚马逊云科技云原生Serverless代码托管服务开发OpenAI ChatGPT-4o应用

今天小李哥继续介绍国际上主流云计算平台亚马逊云科技AWS上的热门生成式AI应用开发架构。上次小李哥分享​了利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API​,这次我将介绍如何利用亚马逊的云原生服务Lambda调用OpenAI的最新模型ChatGPT 4o。由于我人在海外,平时都是利用国际上主流云计算平台帮助企业设计AI应用架构,我的文章也将集中在亚马逊、微软、谷歌和甲骨文云计算平台,目的是帮助大家打开视野,了解世界上最前沿的AI和云原生技术。

架构方案

首先我们简单介绍本方案的细节。本方案采用全托管Serverless云原生架构,涵盖了前端页面、API网关端点、后端应用和AI大语言模型托管平台。总体方案架构图如下:

前端页面:

前端页面方案使用了亚马逊云科技对象存储桶S3,我们使用S3托管前端的HTML, CSS, JS静态网页,在接收到用户请求时,S3会调用JS文件访问后端的API。

优势:使用S3的优势主要是低成本、和高扩展性,同时我们不需要维护前端基础设施。我们可以使用 S3 存储 EB 数量级的数据。S3 由亚马逊云科技托管,可以随着您增减数据的操作自动扩展和收缩。而且无需提前采购云资源,只需按实际使用量付费,具有极高性价比。同时S3具有极低的访问延迟和高吞度带宽,适用于大用户量访问。

API网关端点:

我们使用了亚马逊云科技的API Gateway作为后端API端点,用于接收前端发来的HTTPs访问请求,调用后端AI大模型生成回复,并加载到前端页面上。

优势: API Gateway支持高并发、具有高扩展性、安全性好、有效降低开发和运营成本。它同样是亚马逊云科技全托管的云原生服务,支持RESTful API和WebSocket API,特别适用于获取大模型流式响应。同时有效简化了API的创建、发布、监控、保护等。而且后端支持云原生Serverless代码托管服务lambda和容器服务ECS,帮助构建云上全云原生服务。

后端计算:

后端代码部署我们选择了大名鼎鼎的明星服务Amazon Lambda,用于接收API Gateway转发到后端的请求体,解析后调用AI大模型API,并生成响应体返回给客户端。

优势:无服务器Serverless简化运维,高扩展性、降低成本、低延时。小李哥目前在亚马逊云科技上已经不使用传统服务器开发应用了,目前只使用Lamda。主要原因就是Lambda采用全托管模式,开发人员只需要将代码上传即可运行代码,无需运维。他也可以自己作为一个网页服务器,无需搭建服务器也可以运行代码。同时采用即用即付的计费模式,根据API调用次数、运行时间和消耗资源计费。

AI大语言模型:

AI大语言模型我们使用了Open AI 5月最新发布的多模态模型 ChatGPT 4o,5月这次的发布会可谓震惊了世界,4o速度是GPT-4(特别是GPT-4 Turbo)的两倍,但价格只有一半,而且可以处理文本、视觉和音频多类型数据。

在国际上的主流基准测试中可谓是遥遥领先同类模型,如Claude Ops、Gemini 1.5等。可以完美应用于知识问答客服、文字生成、代码生成、智能助手、教育与培训多个场景。

Amazon Bedrock大语言模型平台

亚马逊云科技同时拥有自己的呀语言模型托管平台--Amazon Bedrock,它同样有非常多的优势。比如支持30多种不同AI模型厂商的大语言模型,如Amazon自家的Titan、Anthropic的Claude 3系列(Opus, Sonnet 3.5, Haiku)、AI21 Labs、Cohere多款向量模型、Meta Llama 2/3、Mistral AI、Stability AI Diffusion等,通过统一的Converse API就可以集中调用、集中管理。

另外Amazon Bedrock也提供了模型测试、知识库(RAG)、智慧体Agent、安全防护栏等多种原生服务,简化云上AI软件服务的集成和开发。同时保障企业内部数据的隐私性、安全性和合规性,训练数据、请求数据都不会用于模型的训练,支持创建企业内部的自定义私有模型,模型全生命周期加密并不会和其他用户共享。同时Amazon Bedrock 实施了自动检测滥用机制,输入不合规,如暴力、违法、仇恨、侮辱的内容,将会阻止回复和使用。

但是目前Amazon Bedrock上还没有支持OpenAI的模型,所以本次AI应用方案,小李哥没有使用该平台上的大语言模型。

2. 利用亚马逊云科技Serverless代码托管服务开发AI应用流程

1. 首先我们登录亚马逊云科技AWS,创建一个Lambda

2. 我们为Lambda函数起一个名字,如“LambdaName”。并且我们规定我们使用的开发语言和版本,如“Python3.10”,最后为Lambda分配一个调用亚马逊云科技平台上其他服务(SNS, Bedrock,S3等)的权限。在选择权限时,我们要尊从最小化权限的原则,提升应用安全。

3.下一步我们为Lambda函数创建前端调用的API端点。首先点击“Enable Function URL”,由于我们是测试环境,在Auth Type选择None,但是在真正的面相服务中,我们需要通过API Gateway在请求头添加API Key验证用户请求,提升应用安全。由于我们要通过前端页面访问后端,最后我们开启跨源资源共享CORS。

我们一般会在CORS配置中,如下图添加如下响应头。

{
​"Access-Control-Allow-Origin": "*","Access-Control-Allow-Headers": "Content-Type","Access-Control-Allow-Methods": "GET, POST, OPTIONS"​
}

4. 由于我们的GenAI应用会调用OpenAI API,我们需要如下操作在代码依赖中添加OpenAI SDK。

在本地创建一个文件夹

mkdir python
cd python

安装OpenAI库

pip install openai -t .

将依赖打包成zip

cd ..
zip -r openai-lambda-package.zip python

5. 打包好后,我们将依赖上传添加到Lambda中,Lambda通过Layer管理、上传代码依赖

点击Lambda的Layer功能并创建一个Layer

上传依赖并配置Layer

创建成功后,将包含依赖的layer添加到Lambda函数中,就大功告成了!

6. 接下来我们将标准的OpenAI GPT4o的API代码,复制到Lamda中。

标准API示例代码如下:

import requests
import json
import osopenai_api_key = # put yout api key hereif openai_api_key is None:raise ValueError("OpenAI API key is not set in environment variables.")url = "https://api.openai.com/v1/chat/completions"headers = {"Content-Type": "application/json","Authorization": f"Bearer {openai_api_key}"
}data = {"model": "gpt-4o","messages": [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "Hello!"}]
}response = requests.post(url, headers=headers, json=data)# Check if the request was successful
if response.status_code == 200:print("Response from OpenAI:", response.json())print('\n')print(response.json()['choices'][0]['message']['content'])
else:print("Error:", response.status_code, response.text)

同时复制代码到Lambda函数中,首先从响应体中提取用户前端输入,存到定义的变量中。同时,将OpenAI API调用代码复制到“TODO implement”中,最后定义响应前端的API响应格式。

import jsondef lambda_handler(event, context):input_text = event['body'] #此处从请求体中提取用户输入# TODO implement    #复制OpenAI API代码到本行return {'statusCode': 200,'body': json.dumps('Hello from Lambda!')}                        #此处定义响应头和响应数据

出于应用代码安全性的考虑,此处小李哥建议大家把OpenAI API示例代码中的openai_api_key不要存放到代码中。大家需要用亚马逊云科技的密码管理服务secret manager来储存、管理所有的密码、秘钥。Secret Manager的调用代码如下。

class GetSecretWrapper:def __init__(self, secretsmanager_client):self.client = secretsmanager_clientdef get_secret(self, secret_name):"""Retrieve individual secrets from AWS Secrets Manager using the get_secret_value API.This function assumes the stack mentioned in the source code README has been successfully deployed.This stack includes 7 secrets, all of which have names beginning with "mySecret".:param secret_name: The name of the secret fetched.:type secret_name: str"""try:get_secret_value_response = self.client.get_secret_value(SecretId=secret_name #此处换成大家Secret Manager的名字)logging.info("Secret retrieved successfully.")return get_secret_value_response["SecretString"]except self.client.exceptions.ResourceNotFoundException:msg = f"The requested secret {secret_name} was not found."logger.info(msg)return msgexcept Exception as e:logger.error(f"An unknown error occurred: {str(e)}.")raise

7. 最后大家在Lambda的Function URL页面就可以获取API的URL,将URL复制到前端JS代码中,就可以搭建出基于亚马逊云科技的Open AI GenAI软件应用。

以上就是在亚马逊云科技AWS上利用OpenAI开发GenAI云服务应用的步骤和讲解,欢迎大家关注小李哥,解锁更多的人工智能和云计算结合的最新技术和解决方案,提升AI技能和职场竞争力,成为AI技术专家!

相关文章:

利用亚马逊云科技云原生Serverless代码托管服务开发OpenAI ChatGPT-4o应用

今天小李哥继续介绍国际上主流云计算平台亚马逊云科技AWS上的热门生成式AI应用开发架构。上次小李哥分享​了利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API​,这次我将介绍如何利用亚马逊的云原生服务Lambda调用OpenAI的最新模型ChatGPT 4o。…...

Selenium 切换 frame/iframe

环境: Python 3.8 selenium3.141.0 urllib31.26.19说明: driver.switch_to.frame() # 将当前定位的主体切换为frame/iframe表单的内嵌页面中 driver.switch_to.default_content() # 跳回最外层的页面# 判断元素是否在 frame/ifame 中 # 126 邮箱为例 # …...

VOI(Virtual Operating System Infrastructure,虚拟操作系统基础架构)

VOI(Virtual Operating System Infrastructure,虚拟操作系统基础架构)架构在桌面虚拟化领域具有其独特的优势,使得它在某些场景下表现尤为出色。以下是几个具体场景: 1. 重载性能需求场景 表现: 高效利用…...

迭代器模式(大话设计模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法&#xff0c;统一接口 class Iterator { public:Iterator(){};virtu…...

vue学习day04-计算属性、computed计算属性与methods方法、计算属性完整写法

10、计算属性 &#xff08;1&#xff09;概念&#xff1a; 基于现有的数据&#xff0c;计算出来的新属性。依赖于数据变化&#xff0c;自动重新计算。 &#xff08;计算属性->可以将一段求值的代码进行封装&#xff09; &#xff08;2&#xff09;语法&#xff1a; 1&a…...

关于力扣150题目——逆波兰表达式求值Java实现的三种解法

题目介绍 逆波兰表达式是一种后缀表达式&#xff0c;其运算符位于操作数之后。力扣150题目要求我们实现一个函数&#xff0c;计算给定逆波兰表达式的值。本文将介绍三种不同的Java实现方法来解决这个问题。 解法一&#xff1a;使用栈 这是最直观和常见的解法&#xff0c;使用…...

FTP与TFTP

1、TFTP&#xff08;简单文件传输协议&#xff09; TFTP是TCP/IP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。 基于UDP协议 端口号&#xff1a;69 特点&#xff1a;简单、轻量级、易于实现 传输过程&…...

【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

JAVA预编译简单理解

目录 一、JSP预编译 二、JDBC预编译 一、JSP预编译 JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术标准&#xff0c;它允许将Java代码嵌入到HTML页面中。当第一次请求一个JSP页面时&#xff0c;Web服务器&#xff08;如Tomcat&#xff09;会将JSP页面转换成一…...

nvm 管理多版本 node

1、下载 先不安装node 下载 nvm 1.1.10-setup.zip 解压&#xff1a;nvm&#xff1a;https://nvm.uihtm.com/ 新建nodejs/node、nodejs/nvm文件夹用于存放node版本和nvm安装路径 安装nvm&#xff1a;上述链接有安装教程 查看是否安装成功&#xff1a;重新打开cmd 输入 nvm nv…...

C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承

多重继承 A.横向多重继承&#xff1a; B.纵向多重继承&#xff1a; C.联合多重继承&#xff1a; 因为 single 和 waiter 都继承了一个 worker 组件&#xff0c;因此 SingingWaiter 将包含两个 worker 组件&#xff0c;那么将派生类对象的地址赋给基类指针将出现二义性 那么如何…...

利用node连接mongodb实现一个小型后端服务系统demo

http 请求 实现get请求数据库数据&#xff1b;实现添加数据实现编辑数据实现删除数据实现导出txt文件、Excel文件实现查询数据库数据并利用导出为excel文件 node 版本 16.16.0 node 版本 18.16.0 会连接 MongoDB 数据库错误。 Connected to MongoDB failed MongoServerSele…...

大数据面试题之数据库(3)

数据库有必要建索引吗? MySQL缺点? 什么是脏读?怎么解决? 为什么要有三大范式&#xff0c;建数据库时一定要遵循吗? 数据库一般对哪些列建立索引?索引的数据结构? MySOL中索引的建立需要考虑哪些问题 关系型数据库与非关系型数据库区别 MySQL与Redis区别 …...

升级之道:精通Conda的自我升级艺术

升级之道&#xff1a;精通Conda的自我升级艺术 引言 Conda是Python和其他科学计算语言的强大包管理器&#xff0c;它不仅管理着包的安装和依赖&#xff0c;还负责自身的更新。随着开源社区的不断发展&#xff0c;Conda定期发布新版本以修复已知问题、增加新功能和提高性能。本…...

领导者视角:识别系统问题的信号

作为企业的领导者&#xff0c;有时候我们面对的不仅是表面的小问题&#xff0c;而是根深蒂固的系统性问题。如果您发现以下症状&#xff0c;可能就是时候深入挖掘了&#xff1a; 1、资源消耗大&#xff1a;一个看似小的问题&#xff0c;解决起来却不断耗费大量资源。 2、反复无…...

CentOS7二进制安装和YUM安装mongodb,服务器无法安装5.0以上的 mongodb 数据库报错 Illegal instruction

文章目录 MongoDB 安装二进制安装YUM 安装 Tips:1、MongoDB安装问题2、MongoDB登录3、MongoDB排序时内存大小限制和创建索引4、创建用户5、Java yaml使用密码连接mongodb6、MongoDB增删改查 MongoDB 安装 二进制安装 [rootmysql5-7 mongodb-6.0.4]# cat start.sh #!/bin/bash…...

AI的前世今生:从理论起源到未来展望

引言 人工智能&#xff08;AI&#xff09;作为一门交叉学科&#xff0c;涵盖了计算机科学、数学、认知科学、神经科学等多个领域&#xff0c;已经成为现代科技的重要组成部分。本文将回顾AI的发展历程&#xff0c;从理论起源到当代应用&#xff0c;再到未来展望&#xff0c;为…...

C# list集合元素去重的几种方法

一、使用使用HashSet去重 List<int> dataSource new List<int>() { 1, 2, 2, 3, 4, 5, 5, 7, 8, 10 }; //源数组中共有10个元素HashSet<int> uniqueData new HashSet<int>(dataSource); //去重之后为8个//输出uniqueData元素为&#xff1a;1,2,3,4,5…...

WritableStream()写入流,将数字或字符流,写入你需要的地方

WritableStream有两个对象参数&#xff1a; 第一个必选&#xff0c;用于配置一些写入流时的钩子&#xff1b; 第二个可选&#xff0c;用于配置一些chunk入队和队列控制的策略&#xff1b; 第二个参数的策略&#xff08;利用ByteLengthQueuingStrategy【按字节计量】和CountQueu…...

RK3568平台(opencv篇)opencv处理图像视频

一.读取图像文件并展示 灰度图像&#xff1a; 灰度图需要用 8 位二进制来表示&#xff0c;取值范围是 0-255。用 0 表示 0&#xff08;黑色&#xff09;&#xff0c; 用 255 表示 1&#xff08;白色&#xff09;&#xff0c;取值越大表示该点越亮。 RGB 彩色图像&#xff1a;…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...