利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro,Gemini 1.5 Pro不仅能够生成创意文本和代码,还能理解、总结上传的图片、视频和音频内容,并且支持高达100万tokens的上下文。在多个基准测试中表现优异,性能超越了ChatGPT 4。

Gemini 1.5 Pro既然功能这么强大,那如何将Gemini 1.5 Pro集成到在谷歌云上或者本地运行的AI软件应用中呢?今天小李哥给大家带来的是一个非常简单的场景,利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro 1,5 对外暴露的API。首先小李哥带大家了解一些关于谷歌云的背景信息。

背景信息:

1. Vertex AI

Vertex AI 是一个谷歌云托管的机器学习平台,利用该服务可以训练和部署机器学习模型,以及基础模型(foundation Model)和自定义大型语言模型 (LLM)构建 生成式AI 应用。Vertex AI 集成了多种机器学习工具和服务,赋能开发者整个机器学习生命周期,让开发人员和数据科学家能够专注于应用程序的开发。

该平台包含许多重要功能。比较特色的如 AutoML 功能,这项功能可以通过低代码/无代码的形式来创建机器学习模型,降低AI/ML模型训练门槛。此外还有Vertex AI Studio,可以让开发者在其上直接使用多模态的Google Gemini大语言模型并且对模型进行微调,目前Vertex AI支持以下4种基础模型。在Google AI Studio开发平台中,用户可以免费试用Gemini 1.5 Pro,并且它支持中文提示,可以更好的构建中文语言的生成式AI应用。

2. Cloud Functions

Cloud Functions是由谷歌云托管的,运行代码的serverless(无服务器)服务。相对于传统的服务器如compute engine, 开发者无需维护底层基础设施,比如谷歌云会根据请求量自动扩容底层基础设施,让开发者将精力专注于应用程序开发,提升开发的效率。同时使用Cloud Functions还可以节约成本,Cloud Functions采用即用即付的付费模式,通过API技术和应用运行时间收费,避免传统的长期开启服务器产生的费用浪费。

利用Cloud Function构建Gemini 1.5 Pro公网API的步骤

1. 首先我们进入谷歌云Vertex AI中,获取调用Gemini 1.5 Pro的API调用代码。Vertex AI服务中可以给开发者自动生成调用大模型的API示例代码,大家点击图1中的”Get Code“,然后复制代码,后续我们会直接把他写到Cloud Functions里。

参考代码如下:

import base64
import vertexai
from vertexai.generative_models import GenerativeModel, Part, FinishReason
import vertexai.preview.generative_models as generative_modelsdef generate():vertexai.init(project="mystic-fountain-365517", location="us-central1")model = GenerativeModel("gemini-1.5-pro-001",system_instruction=["""Write system prompt here"""])responses = model.generate_content(["""Write user prompt here"""],generation_config=generation_config,safety_settings=safety_settings,stream=True,)for response in responses:print(response.text, end="")generation_config = {"max_output_tokens": 8192,"temperature": 1,"top_p": 0.95,
}safety_settings = {generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
}generate()

2.创建一个Cloud Functions。进入Cloud Functions中,并开启Cloud Functions创建需要的谷歌云API(会自动弹出,直接点击enable即可)。

3. 接下来配置Cloud Functions的参数。为其选择一个服务用户所在地的区域,并且选择API的类型HTTPS。由于我们的测试环境,在请求验证的选项就点击不对请求验证(Allow Unauthenticated Invocations),但是在真实的应用安全设计中,我们需要对访问请求通过API Key进行验证。之后点击左下角的Next。

同时我们要使用GCP上的service account对Cloud Functions进行授权以访问Vertex AI上的Gemini pro大模型。Cloud Functions默认使用的权限是创建GCP账户时自带的service account:Compute Engine default service accoun,内含账户层级的基础权限,可以访问Vertex AI。但是小李哥强烈建议在真正开发应用时,新创建一个自定义的service account,并只添加应用所需的最小权限,以满足应用安全。

4. 进入Code编辑界面,选择Python版本号(建议3.12),并且将刚复制的Vertex AI代码替换掉下方红框部分。并且大家需要根据自己请求体和响应体格式,对应修改参考代码中的19和24行(已标注)。如果大家希望通过取键值”name“的方式从请求体中取出字符,记得在客户端侧的请求体中加入name的键和值。

参考代码如下:

import functions_frameworkfrom markupsafe import escape
@functions_framework.http
def hello_http(request):"""HTTP Cloud Function.Args:request (flask.Request): The request object.<https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data>Returns:The response text, or any set of values that can be turned into aResponse object using `make_response`<https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>."""request_json = request.get_json(silent=True)request_args = request.argsif request_json and "name" in request_json:name = request_json["name"] #根据前端调用的请求体修改的key值获取请求数据elif request_args and "name" in request_args:name = request_args["name"]else:name = "World"return f"Hello {escape(name)}!" #根据前端可以接收的响应体格式修改此处响应数据

5.如果大家需要从前端UI中调用该Cloud Function API,需要如下图添加跨源资源共享CORS的配置代码。

参考代码:

import functions_framework@functions_framework.http
def cors_enabled_function(request):# For more information about CORS and CORS preflight requests, see:# https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request# Set CORS headers for the preflight requestif request.method == "OPTIONS":# Allows GET requests from any origin with the Content-Type# header and caches preflight response for an 3600sheaders = {"Access-Control-Allow-Origin": "*","Access-Control-Allow-Methods": "GET","Access-Control-Allow-Headers": "Content-Type","Access-Control-Max-Age": "3600",}return ("", 204, headers)# Set CORS headers for the main requestheaders = {"Access-Control-Allow-Origin": "*"}return ("Hello World!", 200, headers)

6.最后点击左下方的deploy就完成Gemini 1.5 pro API的创建了。

7. 大家可以通过在Cloud Functions中”TRIGGER“页面获取API的URL, 我们可以在客户端利用POST方法调用API

和AWS的serverless代码运行服务Lambda的使用心得比较

1. 开发体验

小李哥使用的语言是Python,两款产品的编辑器UI基本是相同的没有什么太大的区别,谷歌云的优势是可以直接可以把需要安装的依赖写到编辑器内的requirement.txt文件中,部署代码的时候自动下载,简化了安装依赖的操作难度。AWS需要自己提前在本地封装,上传到云端,这里谷歌云使用更便利。

由于开发GenAI应用过程中,都会写很长的提示词Prompt,需要把编辑器中的文字自动换行,可以更容易的修改提示词。AWS Lambda提供了word wrap的功能(下图),在编辑代码的编辑器里可以自动换行。

但是谷歌云的Cloud Functions里暂时没找到这个功能,修改提示词目前只能在VSCode里修改后,粘贴到Cloud Functions编辑器里,不能把开发流程沉浸在GCP环境中。

2. 部署速度

对于相同的代码部署到AWS Lambda和GCP Cloud Functions中,小李哥做了测试。AWS Lambda基本是几秒内就可以完成。但是对于GCP Cloud Functions,整个代码build构建和部署的时间加在一起要1分钟。在部署速度上AWS体验更好。我觉得这个也是谷歌云用requirement.txt简化依赖安装带来的副作用,AWS的本地封装上传可以大大降低部署的时间。

3. CORS配置

在AWS Lambda中CORS的配置是通过在控制台上配置的,采用无代码的形式,帮助开发者简化代码开发的工作量。

对于谷歌云来说,CORS的配置是写到代码中的,更接近利用Flask框架开发web server的本地开发的习惯。两家的CORS配置方式各有优势,针对不同人群。

4.测试stdout输出延时

在部署代码功能测试的阶段,谷歌云stdout输出日志的速度可以明显感觉到延迟,一般要在Cloud Logging中刷新几次才能找到刚刚测试运行的结果。AWS的日志输出速度基本上是感觉不到延迟的,优化的更好。

以上就是关于利用谷歌云Cloud Functions开发服务端Gemini Pro 1.5对外API的整体流程和步骤,未来小李哥也将分享更多关于谷歌云和AWS上的应用开发方案和生成式AI架构设计场景,欢迎大家持续关注。

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

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

相关文章

node 下载文件到网络共享目录

1、登录网络共享计算器 2、登录进入后复制要存储文件的目录路径 例如&#xff1a; \\WIN-desktop\aa\bb\cc 3、node 下载后写入网络共享目录 注意&#xff08;重要&#xff09;:在使用UNC路径时&#xff0c;请确保你正确转义了反斜杠&#xff08;使用两个反斜杠来表示一个&…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

跑冒滴漏智能识别摄像机

对于现代城市管理来说&#xff0c;跑冒滴漏智能识别摄像机正逐渐成为解决水管漏水问题和保护城市供水安全的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;能够有效监测和识别城市管道系统中的漏水现象&#xff0c;对于提升供水系统效率和保障城市居民生活…

探寻操作系统文件名字符限制的规则和历史

引言 从最早的电脑系统到现代的操作系统&#xff0c;文件命名的规则一直在不断发展&#xff0c;这些规则体现了不同操作系统设计哲学的差异。作为开发者&#xff0c;了解这些差异和背后的历史渊源非常有价值&#xff0c;本文将详细探讨Windows、macOS和Linux三大主流操作系统在…

栈实现队列与队列实现堆

ok呀&#xff0c;上一篇博客写了队列的相关知识&#xff0c;接下来就是我们提及过的&#xff0c;栈与队列的相互实现了。堆与这个问题咧&#xff0c;其实大家完全可以当一个知识扩展因为&#xff0c;这个问题也是没有太多的实践意义的&#xff0c;更多的是教学意义。所以咧。大…

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境&#xff1a; 某单位一台某品牌DS5300存储&#xff0c;1个机头4个扩展柜&#xff0c;50块硬盘组建2组RAID5磁盘阵列&#xff08;一组raid5阵列有27块成员盘&#xff0c;存放Oracle数据库文件&#xff1b;另外一组raid5阵列有23块成员盘&#xff09;。存储…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时&#xff0c;用json extractor 2.提取多个值时&#xff0c;默认值必填&#xff0c;否则读不到变量

c进阶篇(四):内存函数

内存函数以字节为单位更改 1.memcpy memcpy 是 C/C 中的一个标准库函数&#xff0c;用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中&#xff0c;其作用是将一块内存中的数据复制到另一块内存中。 函数原型&#xff1a;void *memcpy(void *dest, const void…

长难句打卡7.4

But policymakers who refocus efforts on improving well-being rather than simply worrying about GDP figures could avoid the forecasted doom and may even see progress. 但政策制定者们应重新集中精力于提升&#xff08;社会&#xff09;幸福感&#xff0c;而非仅仅担…

Unity 资源 之 Sweet Cakes Icon套装,110个高品质蛋糕图标分享

Sweet Cakes Icon 套装 - 为 Unity 开发者带来甜蜜惊喜 前言资源包内容领取兑换码 前言 亲爱的 Unity 开发者们&#xff0c;今天要向你们介绍一款令人心动的图标套装 - Sweet Cakes Icon。 Sweet Cakes Icon 套装包含了超过 110 种高品质的蛋糕和纸杯蛋糕图标&#xff0c;这无…

鸿蒙开发HarmonyOS NEXT (三) 熟悉ArkTs

一、自定义组件 1、自定义组件 自定义组件&#xff0c;最基础的结构如下&#xff1a; Component struct Header {build() {} } 提取头部标题部分的代码&#xff0c;写成自定义组件。 1、新建ArkTs文件&#xff0c;把Header内容写好。 2、在需要用到的地方&#xff0c;导入…

去中心化 RAG 先行者,KIP Protocol 如何保护数据所有权、激活 AI 资产

AI 时代&#xff0c;人人都应实现 KnowledgeFi 的梦想或许并不遥远&#xff0c;KIP Protocol 正在生动践行这一价值理念&#xff0c;带动去中心化数字产权的创建与盈利&#xff0c;面向 CryptoAI 的蓝海市场迈出创新探索的技术步伐&#xff0c;朝着 Web3 行业打造去中心化 AI 的…

30斤用什么快递便宜?大件物品怎么寄划算省钱?

大学生小李最近因为毕业要搬家&#xff0c;不得不把一堆书籍、衣服和一些生活用品寄回家。作为一个精打细算的“穷学生”&#xff0c;小李可是不愿意在快递费上花冤枉钱的。于是&#xff0c;他开始研究各种寄快递省钱的方法&#xff0c;今天我们就来看看小李是怎么操作的。一、…

一款纯 js 实现的大模型应用服务 FastGPT 解读

背景介绍 最近被不同的人安利了 FastGPT 项目&#xff0c;实际上手体验了一下&#xff0c;使用流程类似之前调研过的 Dify, 包含的功能主要是&#xff1a;任务流的编排&#xff0c;知识库管理&#xff0c;另外还有一些外部工具的调用能力。使用页面如下所示&#xff1a; 实际…

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用&#xff08;Undefined Reference&#xff09;是 C 编程中常见的错误之一&#xff0c;通常在链接阶段出现。当编译器无法找到函数或变量的定义时&#xff0c;就会引发未定义引用错误。这种错误会阻止生成可执行文件&#xff0c;影响程序的正常构建。本…

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

ETCD 基本介绍与常见命令的使用

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/140171610 文章目录 一、基本介绍1.1 参考1.2 什么是ETCD1.3 ETCD的特点1.4 ETCD的主要功能1.5 ETCD的整体架构1.6 什么时候用ETCD&#xff0c;什么时候用redis 二、安装三、使用3.1 etcdctl3.2 常用…

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…

KEYSIGHT N1092系列,DCA-M系列采样示波器连接与自检?

KEYSIGHT N1092系列 采样示波器&#xff0c;虽然省去了屏幕和操作系统&#xff0c;但根据不同的型号&#xff0c;可以配备不同数量的光口和电口&#xff0c;满足各种测试需求。本次介绍的具体型号为N1092D&#xff0c;它拥有4个光口&#xff0c;能够进行多种测试。 测试步骤详解…