2023年3月1日,也就是今天,OpenAI终于发布了ChatGPT API。这也意味着,手痒的小伙伴,有使用这个API的机会了。
我尝试了一下,用微软云Azure上的Python Azure Function, 调用了ChatGPT 的API。最终在本地运行成功: 可以在浏览器地址栏中输入各种问题,然后再显示ChatGPT的答案。
我在网址里输入了去年的一道物理高考题, 程序本身运行没问题。不过ChatGPT看来还需要加油,据说标准答案是C,而不是它认为的A。
这个软件项目是个很简单的实验,只是为了看看ChatGPT的接口是否能调用成功。不过这个尝试也是接下来做其他实验的一个基础,所以总结一下,有兴趣的小伙伴可以往下看。
以下主要有这几个部分:
1. 介绍,含OpenAI更新的数据管理政策
2. 开发步骤
3. Python Azure Function: 调用ChatGPT API的核心代码
1. 介绍
Python Azure Function可以理解为一段跑在云上的程序,也就是所谓的无服务。它运行起来后就能提供一个网址,用户访问这个网址,就能得到相关的服务了。这次实验只需要修改两个文件,一个是Python代码,另一个是关于Python包的定义文件。剩下的都是配置安装。
在Python文件中, 我调用了ChatGPT API。也就是说,当用户在网址中输入问题后,这段程序能读取地址栏中编码后的问题,然后将问题传给ChatGPT API, 获得答案后,将答案再返回给了用户。
如果以后要把这个功能扩展,除了要将本地代码发布到云上外,还需在客户端设计一个输入框页面,用户就不需要在网址中输入问题,只需在输入框输入问题,点击按钮后把问题传到这个网址,这样更加人性化。或者使用别的软件,直接调用这个Python Azure Function提供的网址,或者说是Endpoint。例如整合在小程序,公众号等等,如果允许的话。或者通过一些附加的数据处理,拓展一些用户场景,也许更靠谱些。至于整个应用在性能,安全等方面的提升,那以后再聊了。
这次伴随ChatGPT API发布的,还有他们对数据管理的更新。感觉这个信息还很重要的,不知道这个条件是否已经满足在微信生态或其他国内应用上做开发呢。
OpenAI 官方信息 https://platform.openai.com/docs/guides/chat:
As of March 1st, 2023, we retain your API data for 30 days but no longer use your data sent via the API to improve our models.
2. 开发步骤
Create a python Azure Function from scratch
Install OpenAI packages
Generate an API-KEY of OpenAI API
Use OpenAI API In Python Azure Function
Start Azure Function locally
Invoke OpenAI API from browser
技术细节在我的英文博客中有讲,学有余力的同学可以移步到那边:
https://medium.com/@datatec.studio/guide-invoke-openai-api-with-python-azure-functions-1c128974c49
3. Python Azure Function: 调用ChatGPT API的核心代码
项目的结构图如下, 其中function_app.py 以及 requirements.txt是之前提到的两个文件。
function_app.py 的代码如下。这段代码有兴趣的同学可以继续扩展,因为ChatGPT API支持同时接收多个message,代码中,你可以看到它是一个数组。
import azure.functions as func
import openai
openai.api_key = "your-openai-api-key"
app = func.FunctionApp()
@app.function_name(name="HttpTrigger1")
@app.route(route="hello") # HTTP Trigger
def test_function(req: func.HttpRequest) -> func.HttpResponse:
prompt = req.params.get('prompt')
if not prompt:
return func.HttpResponse(
"Please provide a prompt.",
status_code=400
)
completions = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": prompt}
]
)
message = completions.choices[0].message.content.strip()
return func.HttpResponse(message)
今天就到这里啦。
文章首发公众号德国数据圈,欢迎关注。
链接:
2. 2022高考物理题: 2022年3月,中国航天员翟志刚、王亚平、叶光富在离地球表面约的“天宫二号”空间站上通过天地连线,为同学们上了一堂精彩的科学课。通过直播画面可以看到,在近地圆轨道上飞行的“天宫二号”中,航天员可以自由地漂浮,这表明他们( )
A. 所受地球引力的大小近似为零
B. 所受地球引力与飞船对其作用力两者的合力近似为零
C. 所受地球引力的大小与其随飞船运动所需向心力的大小近似相等
D. 在地球表面上所受引力的大小小于其随飞船运动所需向心力的大小
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在
我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class
昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA
Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬
我有一个模型依赖于一个单独的、联合的模型。classMagazine图像是多态的,可以附加到许多对象(页面和文章),而不仅仅是杂志。杂志需要在相关图像发生任何变化时自行更新该杂志还保存了一张自己的截图,可用于宣传:classMagazine现在如果图像发生变化,杂志也需要更新其截图。所以杂志真的需要知道图片什么时候出了问题。所以我们可以天真地直接从封面图片触发屏幕截图更新classImage...但是图片不应该代表杂志做事然而,图片可以用于许多不同的对象,实际上不应该对杂志进行特定的操作,因为这不是图片的责任。该图像也可能附加到页面或文章,并且不需要为它们做各种事情。“正常”的rail
我现在正在努力学习Ruby和RubyonRails。我正在学习LearningRails,第1版,但我很难理解其中的一些代码。我通常使用C、C++或Java工作,因此Ruby对我来说是一个很大的改变。我目前对数据库迁移器的以下代码块感到困惑:defself.upcreate_table:entriesdo|t|t.string:namet.timestampsendendt变量来自哪里?它实际上代表什么?它有点像for(i=0;i另外,:entries是在什么地方定义的?(entries是我的Controller的名称,但是这个函数怎么知道的?) 最佳答案