2023年的深度学习入门指南(2) - 给openai API写前端

2023年的深度学习入门指南(2) - 给openai API写前端

上一篇我们说了,目前的大规模预训练模型技术还避免不了回答问题时出现低级错误。
但是其实,人类犯的逻辑错误也是层出不穷。

比如,有人就认为要想学好chatgpt,就要先学好Python。
其隐含的推理过程可能是这样的:

  • TensorFlow需要使用Python

  • PyTorch需要使用Python

  • Scikit-Learn需要使用Python

  • Hugging Face需要使用Python

  • 它们都是机器学习相关的库,它们都使用Python

=>

  • chatgpt也是机器学习相关的库,所以也需要使用Python

所以,需要学习Python

Python

诚然,使用传统深度学习框架基本上都要跟Python打交道。而且Python只是一层皮,为了训练和推理更头疼的是安装各种加速框架和库,比如CUDA和cudnn等库。而且这些库一般都不支持最新的Python版本和CUDA版本。为了避免库打架,基本针对每一种主要框架就要搭一套Python虚拟环境。这些框架之间的CUDA库的需求不同的话还得装多个版本。

甚至如果你单机用的是相对小众的设备比如3090,4090之类的卡,通用的框架库还不见得支持你的高端设备,还得自己从源码重新编译一个。

如果你还要搞跟CV相关的算法的话,那么你要装的库更多,很多本地库还冲突。还要安装适合CPU的并行计算库和数学库。Intel的相对成熟,如果你还买的是AMD的CPU,那继续适配吧。

诸如此类。

但是,现在所有的计算都是跑在openai的服务器上,你不管懂多少TensorFlow, PyTorch, JAX, Torch Dynamo, Torch Inductor, Trition, OpenMP, CUDA, Vulkan, TVM, LLVM MLIR等等通天本领都用不上。

现在能做的事情,基本上就是按照openai API的格式拼几个字符串和json串,发给openai的服务器,然后解析从openai服务器返回的状态码和结果的json串。

没错,这跟深度学习框架没有任何相似之处,这就是纯纯的前端干的活儿。任何语言只要有HTTP客户端库,再配上一个输入框和一个显示的文本框,就齐活了。

前端

正因为只是HTTP API的封装,所以调用chatgpt不仅有官方的python库和node.js库,还有Java,Go,Kotlin,Swift,R,C#等各种语言的封装,很多语言还不只一个版本。不管是在命令行,网页里,小程序里,Android应用,iOS应用,Windows桌面应用,Unity游戏里等各种客户端里使用都非常方便。

伪装成Python库:10行搞定一切

chatgpt

openai将它们的API封装在了一个Python库里面,我们可以像调用Python库一样去调用。这样也是有意义的,可以用来跟本地的其他框架进行协作。

安装老一套,pip:pip install openai
不需要conda,没有版本的强需求。不需要CUDA,不需要MKL,Windows下不需要MinGW,… :)

然后去openai注册一个API key。

import openai
openai.api_key = '你的API key'

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "生成用Python调用openai API的示例代码"}
  ]
)
print(completion.choices[0].message.content)

然后运行就可以了,只要你的网络连接没问题,就可以像网页一样看到chatgpt一样的结果了。

运行结果如下:

import openai
import pprint

# 设置你的 API 密钥,这里需要调用 API 才能正常运行
openai.api_key = "YOUR_API_KEY"

# 创建一个 OpenAI GPT-3 模型实例
model_engine = "text-davinci-002"
model = openai.Model(model_engine)

# 定义一个prompt(即生成文本的起点)
prompt = "The quick brown fox"

# 调用 openai API 生成文本
response = model.generate(
  prompt=prompt,
  temperature=0.5,
  max_tokens=100,
  n=1,
  stop=None,
)

# 将返回的结果打印出来
pprint.pprint(response.choices[0].text)

截至本文写作的2023年4月4日,gpt-3.5-turbo是最强大而且最划算的模型。其它的API,模型和方法,效果和费用都不如这一个。所以,要不要学习用text-davinci-003等其它模型全看兴趣了,它们不能提供更强的能力了。

有的同学表示,上面的语句看不懂,怎么办?
太好办了,把上面的代码发给openai的API,让chatgpt来给我们讲解:

import openai
openai.api_key = '你的API key'

str1 = """
解释一下下面的代码是作什么用的?
completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "生成用Python调用openai API的示例代码"}
  ]
)
print(completion.choices[0].message.content)
"""

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": str1}
  ]
)

print(completion.choices[0].message.content)

这是openai api给我们返回的讲解:

这段代码是使用OpenAI API中的Chat API来生成一个自然语言对话的示例。它指定了要使用的训练模型为"gpt-3.5-turbo",并且设置了一个包含一条用户消息的对话历史记录。这个对话历史记录是一个字典,其中包含两个键:"role"和"content"。这个对话历史记录被传递
给ChatCompletion.create()方法,以生成一条完整的对话。最后,代码打印出了OpenAI返回的答复的内容。

具体玩法的例子

跨语言程序翻译

translate

比如我们想把刚才调用openai的代码翻译成kotlin的,以便在Android应用里用。就让openai API帮我们翻译:

import openai
openai.api_key = '你的API Key'

str1 = """
翻译成Kotlin
completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "生成用Python调用openai API的示例代码"}
  ]
)
print(completion.choices[0].message.content)
"""

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": str1}
    ]
)

print(completion.choices[0].message.content)

生成代码如下:

var completion = ChatCompletion.create(
  model = "gpt-3.5-turbo",
  messages = listOf(
    Message(role = "user", content = "生成用Python调用openai API的示例代码")
  )
)
println(completion.choices[0].message.content)

翻译成Swift,大家自己改语句,我就不写了,结果如下:

var completion = try! openai.ChatCompletion.create(
  model: "gpt-3.5-turbo",
  messages: [
    .init(role: "user", content: "生成用Python调用openai API的示例代码")
  ]
)
print(completion.choices[0].message.content)

让它帮我们翻译成Go语言:

package main

import (
        "fmt"
        "github.com/openai/go-api"
)

func main() {
        client := openai.NewClient("YOUR_API_KEY")

        prompt := []openai.ChatMessage{
                {Role: "user", Text: "生成用Python调用openai API的示例代码"},
        }

        chatOpts := &openai.ChatOpts{
                Model:       "davinci",
                Prompt:      &prompt,
                MaxTokens:   openai.Int(64),
                Temperature: openai.Float32(0.6),
        }

        resp, err := client.CreateChat(chatOpts)
        if err != nil {
                fmt.Println(err)
                return
        }

        message := resp.Choices[0].Text
        fmt.Println(message)
}

我们发现,Go的翻译它用的是老模型davnici,我们教它一下新的python API用法,然后让它翻译成Go的:

str1 = """
调用openai chat api的官方例子如下:

import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)
chat api的API地址为:https://api.openai.com/v1/chat/completions

请根据此生成用Go语言调用的例程
"""

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": str1}
  ]
)
print(completion.choices[0].message.content)
```python

生成的代码结果如下:
```go
package main

import (
        "bytes"
        "encoding/json"
        "fmt"
        "net/http"
)

type Message struct {
        Role    string `json:"role"`
        Content string `json:"content"`
}

type ChatRequest struct {
        Model    string    `json:"model"`
        Messages []Message `json:"messages"`
}

type ChatResponse struct {
        ID      string `json:"id"`
        Created int64  `json:"created"`
        Model   string `json:"model"`
        Object  string `json:"object"`
}

func main() {
        url := "https://api.openai.com/v1/chat/completions"
        req := ChatRequest{
                Model: "gpt-3.5-turbo",
                Messages: []Message{
                        {Role: "system", Content: "You are a helpful assistant."},
                        {Role: "user", Content: "Who won the world series in 2020?"},
                        {Role: "assistant", Content: "The Los Angeles Dodgers won the World Series in 2020."},
                        {Role: "user", Content: "Where was it played?"},
                },
        }

        payloadBytes, err := json.Marshal(req)
        if err != nil {
                fmt.Println("Error:", err)
                return
        }

        body := bytes.NewReader(payloadBytes)

        req, err := http.NewRequest("POST", url, body)
        if err != nil {
                fmt.Println("Error:", err)
                return
        }

        req.Header.Set("Content-Type", "application/json")
        req.Header.Set("Authorization", "Bearer [API_KEY]") // Replace [API_KEY] with your OpenAI API key

        client := http.Client{}
        resp, err := client.Do(req)
        if err != nil {
                fmt.Println("Error:", err)
                return
        }

        defer resp.Body.Close()

        var chatResp ChatResponse

        decoder := json.NewDecoder(resp.Body)
        if err := decoder.Decode(&chatResp); err != nil {
                fmt.Println("Error:", err)
                return
        }

        fmt.Println("ID:", chatResp.ID)
}

修复代码bug

在这里插入图片描述

还是老办法,prompt就写修复代码bug:

str1 = """
修复下面代码的bug:
```javas
    private StringBuffer encoder(String arg) {
        if (arg == null) {
            arg = "";
        }
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            md5.update(arg.getBytes(SysConstant.charset));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return toHex(md5.digest());
    }

“”"

completion = openai.ChatCompletion.create(
model=“gpt-3.5-turbo”,
messages=[
{“role”: “user”, “content”: str1}
]
)

print(completion.choices[0].message.content)


输出如下:

===========================================

以下是修复后的代码:

```java
private StringBuffer encoder(String arg) {
    if (arg == null) {
        arg = "";
    }
    StringBuffer hexString = new StringBuffer();
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] messageDigest = md5.digest(arg.getBytes(StandardCharsets.UTF_8));
        for (byte b : messageDigest) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return hexString;
}

修复的bug如下:

  1. 使用了StringBuffer,在多线程下是线程安全的;
  2. 在处理字节数组转换为16进制字符串时,采用了更简单的方式;
  3. 采用了Java 7中引入的StandardCharsets.UTF_8替代原有的SysConstant.charset,使用Java标准库中的字符集;
  4. 捕捉NoSuchAlgorithmException异常,以免发生错误。

==========================================

写摘要

在这里插入图片描述

还是老办法,写prompt.

str1 = """
下面一段文字的主要观点是什么:
I have a dream that one day this nation will rise up and live out the true meaning of its creed: "We hold these truths to be self-evident, that all men are created equal."
I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood.
I have a dream that one day even the state of Mississippi, a state sweltering with the heat of injustice, sweltering with the heat of oppression, will be transformed into an oasis of freedom and justice.
I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character.
I have a dream today!
I have a dream that one day, down in Alabama, with its vicious racists, with its governor having his lips dripping with the words of "interposition" and "nullification" -- one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers.
I have a dream today!
I have a dream that one day every valley shall be exalted, and every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight; "and the glory of the Lord shall be revealed and all flesh shall see it together."
"""

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": str1}
    ]
)

print(completion.choices[0].message.content)

输出如下:

The main point of this text is that the speaker has a dream for racial equality and justice, where people of different races can come together, and discrimination is eradicated.

还可以找关键字:

str1 = """
下面一段话的关键字:
We introduce LLaMA, a collection of foundation language models ranging from 7B to 65B parameters. We train our models on trillions of tokens, and show that it is possible to train state-of-the-art models using publicly available datasets exclusively, without resorting to proprietary and inaccessible datasets. In particular, LLaMA-13B outperforms GPT-3 (175B) on most benchmarks, and LLaMA- 65B is competitive with the best models, Chinchilla-70B and PaLM-540B. We release all our models to the research community.
"""

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": str1}
    ]
)

print(completion.choices[0].message.content)

输出如下:

LLaMA, language models, parameters, trillions of tokens, state-of-the-art models, publicly available datasets, GPT-3, benchmarks, Chinchilla-70B, PaLM-540B, research community.

数学推导

比如我们给出皮亚诺公理的5条公理,让gpt 3.5帮我们定义加法和乘法两种操作:

str1 = """
根据下面5条公理,定义加法和乘法两种操作:
第一,0是一个自然数
第二,任何自然数n都有一个自然数Suc(n)作为它的后继
第三,0不是任何自然数的后继
第四,后继函数是单一的,即,如果Suc(m)=Suc(n),则m=n.
第五,令Q为关于自然数的一个性质。如果0具有性质Q,并且 如果自然数n具有性质Q,则Suc(n)也具有性质Q,那么所有自然数n都有性质Q
"""

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": str1}
    ]
)

print(completion.choices[0].message.content)

输出如下:

加法定义:
对于任何自然数n,定义加法操作+如下:
n+0=n (根据第一公理)
n+Suc(m)=Suc(n+m) (根据第二、四公理)

乘法定义:
对于任何自然数n,定义乘法操作*如下:
n*0=0 (根据第一公理)
n*Suc(m)=n*m+n (根据第二、四公理)

补全API - Completion

补全API的能力本质上跟Chat API没有太大的区别。因为不用指令角色了,比起Chat API能够更简洁一点。

我们来看一个例子:

code1 = '请给林肯传记列一个提纲'

completion = openai.Completion.create(
    model="text-davinci-003",
    prompt=code1,
    max_tokens=2048,
    temperature=1
)

print(completion.choices[0].text)

输出如下:

一、林肯的童年经历
(1)出身环境
(2)家庭教育和兄弟姐妹
(3)小时候的生活

二、林肯的教育发展
(1)接受过的教育
(2)取得的成就

三、林肯的政治生涯
(1)职务和重大成果
(2)有影响力的言论

四、林肯受追捧的原因
(1)实践诠释真理
(2)立场稳健无私
(3)拥护奴隶解放

text-davinci-003是基于最新的gpt 3.5的,能力较强而速度较慢的一个模型,如果想用更快但是质量差一点的可以采用更弱一些的基于gpt 3的text-curie-001,text-babbage-001和text-ada-001。他们的能力依次递减。

在目前这个时刻,text-davinci-003是比gpt-3.5-turbo要贵一点的,请注意关注下预算。

另外,gpt4目前只有在Chat API上才有。所以就是让大家知道有Completion这个API就好。目前不管是能力上(gpt4)还是预算上(gpt-3.5-turbo)都是Chat API占优。

小结

从目前这个时点看,基本上只学习ChatCompletion一个API就足够用了。功能全靠Prompt来指定。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI JUST AI】Stable Disffusion | 配合Chrome插件,与Notion API完美联动

【AI JUST AI】Stable Disffusion | 配合Chrome插件,与Notion API完美联动第一步、Stable Diffusion 链接 CMS开发Chrome插件在合适的位置增加一个发送至Notion的按钮编写按钮的逻辑部分使用GitHub作为图床图片上传 API第二步,使用Chat GPT优化样式Stabl…

超详细WindowsJDK1.8与JDK11版本切换教程

文章目录一、JDK生效原理二、安装配置JDK11三、切换JDK11版本四、查看切换JDK11版本是否成功五、再次切换至JDK8版本六、查看切换JDK8版本是否成功一、JDK生效原理 想必大家都在为如何流畅的切换JDK版本问题而来,那么在此篇文章开始之前,首先我们来思考一…

网络传输层

目录传输层再谈端口号端口号范围划分认识知名端口号netstatpidofUDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项使用udp协议 的应用层协议其它TCP协议TCP协议段格式如何理解链接如何理解三次握手如何理解四次挥手概念TIME_WAIT/CLOSE_WAITTCP策略确认应答…

【wps】【毕业论文】三线表的绘制

目录 一、三线表 二、制作步骤 (1)点击“插入”——点击“表格”创建一个表格 (2)选中整个表格——鼠标右键选择“边框和底纹”,“表格属性”再点击“边框和底纹”——点击“自定义”——选择表格的边的宽度——如图…

北京筑龙智能寻源 |助力企业一站式智能采购,降本增效

智能寻源——精准匹配,让采购更高效 智能寻源系统是北京筑龙为采购人搭建的一款全链路高效协同的采购寻源和供应商管理平台。助力采购人快速完成采购计划,提升采购效率,降低采购风险。 基于智能寻源系统,将全面打通供应商数据壁…

VR数字政务,VR全景技术,探索数字化治理新路径

近年来,随着虚拟现实(VR)技术的不断发展,VR数字政务也逐渐成为行政数字化转型的重要组成部分。VR数字政务可以为行政部门提供全新的数字化解决方案,使行政部门的工作更加高效、便捷和安全。 一、VR数字政务的定义和概述…

ABBYY FineReader PDF15下载安装教程

刚刚,老板给我一堆扫描文件(图片和pdf文件),拿不到源文件,让我把客户发的扫描文件搞成word文档,密密麻麻,这些文件100多页,这要手工敲能把手敲费。 这时候,让我想到了这…

小白的git入门教程(三)

书接上文,我们讲到如何进行版本日志回退,根据这个,我们可以返回到任意状态 今天让我们接着讲完git的基本指令操作教程以及其余分支 删除文件操作 前提:要被删除的文件已经存储在本地库中 这里我们可以创建一个文件(待…

ActiViz.NET 9.2.2023 Crack

适用于 .Net C# 和 Unity 的 3D 可视化库 释放可视化工具包的强大功能,在 C#、.Net 和 Unity 软件中为您的 3D 内容服务。 ActiViz 允许您轻松地将 3D 可视化集成到您的应用程序中。 Kitware 围绕 ActiViz 和 3D 应用程序提供支持和自定义开发 活动可视化功能 C…

【Java代码审计】表达式注入

1 前置知识 1.1 EL表达式 EL表达式主要功能: 获取数据:可以从JSP四大作用域中获取数据执行运算:执行一些关系运算,逻辑运算,算术运算获取web开发常用对象:通过内置 的11个隐式对象获取想要的数据调用jav…

STL容器之initializer_list与set

STL容器之initializer_list与setinitializer_list案例二(实现n个数的加法)set单集合有序性唯一性删除元素多重集合less与greater自定义类型initializer_list initializer_list创建的对象,初始值可以有很多个,像vector 一样 想多少…

第05章_排序与分页

第05章_排序与分页 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在…

SPI、I2C、CAN通信的简单介绍和笔记

标题中的三种通信方式(协议)是比较常见的一些通信协议,对于它们有一定的了解对于我们学习嵌入式单片机的学习有着非常重要的作用。于是我们对此有一些信息给到各位读者,这也是笔者自己巩固知识点的方式。如果觉得有帮到各位&#…

551、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

目录一、Elasticsearch创建/查看/删除索引、创建/查看/修改/删除文档、映射关系1.1 Elasticsearch中的数据格式1.2 索引操作1.2.1 创建索引1.2.2 查看指定索引1.2.3 查看全部索引1.2.4 删除索引1.3 文档操作1.3.1 创建文档1.3.2 查看单个文档:主键查询1.3.3 查看所有…

不敲代码用ChatGPT开发一个App

先说下背景,有一天我在想 ChatGPT 对于成熟的开发者来说已经是一个非常靠谱的助手了,身边也确实有很多同事把它作为一个离不开的助理担当。 但是如果我只是略微懂一点前端知识的新人,了解 HTML、CSS、JS 相关的知识,想开发一个安…

什么是UEFI签名认证?UEFI签名有什么好处?

为了防御恶意软件攻击,目前市面上所有电脑设备启动时默认开启安全启动(Secure Boot)模式。安全启动(Secure Boot)是UEFI扩展协议定义的安全标准,可以确保设备只使用OEM厂商信任的软件启动。UEFI签名认证就是对运行在 UEFI 系统下的 efi 驱动和通过 UEFI …

第10章_创建和管理表

第10章_创建和管理表 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前…

OpenCloudOS 9.0发布,腾讯闯入底层基础软件“深水区”

3月22日,腾讯发布了2022第四季度及全年业绩,ToB业务成为腾讯的核心引擎。与此同时,ToB的腾讯在近年来持续加码自研投入,提升底层技术实力,2022年研发投入达到614亿元,2018年至今在研发上的投入已经超过2056…

Mockito单测之道

Mockito单测之道 去年写过一篇《TestNG单元测试实战》文章,严格来讲算集成测试。 没看的小伙伴可直接看本篇即可,本质是单元测试框架不同,写法不一样。 单测定义 单元测试定义: 对软件中最小可测单元进行验证,可理解…

【数据结构】链表练习题(2)

链表练习题1.相交链表(LeetCode160)2.环形链表(LeetCode141)3.环形链表Ⅱ(LeetCode142)1.相交链表(LeetCode160) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。题目数据 保…