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

Posted Jtag特工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023年的深度学习入门指南 - 给openai API写前端相关的知识,希望对你有一定的参考价值。

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

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

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

  • TensorFlow需要使用Python

  • PyTorch需要使用Python

  • Scikit-Learn需要使用Python

  • Hugging Face需要使用Python

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

=>

  • chatgpt也是机器学习相关的库,所以也需要使用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行搞定一切

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返回的答复的内容。

具体玩法的例子

跨语言程序翻译

比如我们想把刚才调用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来指定。

ChatGPT 冲击下,特斯拉曾留不住的 AI 大牛,再次回归 OpenAI !

整理 | 屠敏

出品 | CSDN(ID:CSDNnews)

技术圈毕竟还是一个“圈”,兜兜转转都是会遇见。

半年前,特斯拉 AI 的中坚力量,即 AI 部门的主管 Andrej Karpathy 在给自己放了 4 个月的长假之后,选择离开特斯拉的消息席卷了各大科技网站。

沉寂了一段之间后,我们再次有了他的最新消息。2 月 9 日,Andrej Karpathy 在 Twitter 上低调地宣布:

一些个人消息:我将加入 OpenAI(再一次) 。像许多其他奋斗在 AI 领域内部与外部的人一样,他们工作让我深受鼓舞,我个人也从中受益匪浅。该领域在未来暗藏的潜力尤为令人兴奋,很高兴能再次加入并开始共建!

Andrej Karpathy 首次加入 OpenAI

现如今,在 ChatGPT 风靡全球,引得无数科技巨头竞折腰之际,Andrej Karpathy 加入 OpenAI,如虎添翼。

不过容易被众人所遗忘的是,Andrej Karpathy 曾是 OpenAI 的创始团队成员之一,这也才有其推文中“再次”加入 OpenAI 的表述。

对于 Andrej Karpathy 其人,用年轻有为来形容他,一点也不为过。出生于 1986 年 10 月的 Andrej Karpathy,曾被评为《麻省理工科技评论》2020 年 35 岁以下创新者之一,也曾被马斯克视为会成为“全球最顶级的 AI 领袖”人选。能获得这样的评价,不仅需要非常厉害的技术知识加持,更需要有引领、创新的精神。

回顾其过往的学生、技术生涯,Andrej Karpathy 在 15 岁随家人搬到多伦多。2009 年,他在多伦多大学完成了计算机科学和物理学学士学位。

彼时,在本科学业完成之际,受到时任多伦多大学教授,也被外界誉为神经网络之父、人工智能教父 Geoffrey Hinton 的影响,Andrej Karpathy 首次接触到了深度学习技术,而后也参加了 Geoffrey Hinton 的课程和阅读小组。

2011 年,Andrej Karpathy 在不列颠哥伦比亚大学完成了硕士学位,他在那里与该大学计算机科学系教授 Michiel van de Panne 一起研究了物理模拟图形的学习控制器。

随后,Andrej Karpathy 进入斯坦福大学继续攻读博士学位,师从斯坦福视觉实验室的李飞飞,学术主要专注于卷积/循环神经网络及其在计算机视觉、自然语言处理及其交叉方面的应用。

在读博期间,Andrej Karpathy 没有闲着。他亲自设计斯坦福大学第一门深度学习课程「CS231n:用于视觉识别的卷积神经网络」,并担任主要讲师。这门课后来也成为斯坦福大学最受欢迎的课程之一,参与的学生规模从 2015 年的 150 名增长到 2016 年的 330 名,再到 2017 年的 750 名。此外,他还在 Google 先后进行了 3 次实习,一次是在 Google Brain 从事视频的无监督学习研究;一次是在 Google Research 部门从事 YouTube 视频的大规模监督学习研究;一次是在 DeepMind 从事深度强化学习。

基于在学生生涯积累的丰富经验,2015 年 Andrej Karpathy 获得博士学位之后,作为创始团队成员之一,加入非营利的人工智能组织 OpenAI,担任研究科学家,负责生成模型的深度学习和深度强化学习。

缘起特斯拉

可以说,从加入 OpenAI 起,Andrej Karpathy 与马斯克、特斯拉的缘分也因此到来。

众所周知,OpenAI 成立之初,便获得了超 10 亿美元的投资,资金提供方包括了 Y Combinator 总裁 Sam Altman 和特斯拉 CEO Elon Musk、PayPal 联合创始人 Peter Thiel、LinkedIn 联合创始人 Reid Hoffman、AWS、Infosys 和 YC Research 等。

正因此,马斯克也见证了 Andrej Karpathy 在 OpenAI 所体现的能力。而后,Karpathy 于五年多前加入特斯拉,担任神经网络和计算机视觉专家。他加入时,特斯拉正在从使用 Mobileye 的技术来实现驾驶辅助功能过渡到自己的计算机视觉系统。

Andrej Karpathy 因建立特斯拉的机器学习和计算机视觉团队而备受赞誉。他迅速得到了晋升,成为特斯拉自动驾驶团队和该汽车制造商开发完整自动驾驶系统的重要组成部分。

随着特斯拉内部将人工智能更为广泛地应用到自动驾驶领域,Andrej Karpathy 被提升为特斯拉人工智能的高级主管。

本以为 Andrej Karpathy 会一直这样带着特斯拉在 AI 维度越走越深,万万没想到,2022 年 3 月,Andrej Karpathy 宣布他将休假四个月。彼时,便有不少外媒猜测,Andrej Karpathy 的休假恐生变,毕竟曾经特斯拉前工程高级副总裁 Doug Field 也宣布休假,结果没多久就从特斯拉离职去了苹果公司。

万万没想到,一语成谶,四个月休假结束之后,Karpathy 在 7 月宣布,他不会回到特斯拉。

再度回归 OpenAI

离职时, Andrej Karpathy 并没有过多解释具体的缘由,马斯克也只是送上了一句,“感谢你为特斯拉所做的一切!和你一起工作是我的荣幸”。

后来,在接受麻省理工学院的研究科学家 Lex Fridman 的采访(https://www.youtube.com/watch?v=cdiD-9MMpb0)时,Andrej Karpathy 才对外透露离开特斯拉的真正原因:

在特斯拉工作的 5 年里,随着时间的推移,有点像是把自己转到了一个管理职位上。大部分的时间都用在了开会和扩大团队上。这个工作内容,有点儿像公司的高管,他相信自己可以做到称职,但他并不喜欢这样的工作内容。

对于技术人的本质,「重新审视我在 AI、开源和教育方面技术工作的长期热情」或是他彼时特别想要实现的事情。

因此,离开之后,Andrej Karpathy 并没有急着加入下一家公司或者组织,而是他活跃在一些技术社区,如 GitHub(https://github.com/karpathy):

期间他也带来了一个「Neural Networks: Zero to Hero」(https://github.com/karpathy/nn-zero-to-hero)的课程,用于教授神经网络的基础知识。

只有在做喜爱的事情的时候,眼里才常泛着光。

如今选择回归 OpenAI,Andrej Karpathy 在回复推特用户「我希望你能继续做一些开源的东西和教程......这个世界需要更多!」的希望时说道,“事实证明,OpenAI 的很多人也喜欢这些,所以我希望我也能够。”

祝福 Andrej Karpathy 在 OpenAI 开启新征程。

参考:

https://karpathy.ai/

https://github.com/karpathy

https://twitter.com/karpathy/status/1623476659369443328

https://electrek.co/2023/02/08/tesla-former-head-ai-joins-elon-musk-founded-openai/


 

☞自学编程,从月薪500到年薪150万,46岁程序员的IT成长之路
☞ChatGPT 上线 70 天,微软用它改写 Bing、Edge后,市值一夜飙涨 5450 亿元!
☞TIOBE 2 月编程语言榜:C++ 势不可挡

以上是关于2023年的深度学习入门指南 - 给openai API写前端的主要内容,如果未能解决你的问题,请参考以下文章

了解点OpenAI及深度学习研究前沿

深度学习模型陷阱:哈佛大学与OpenAI首次发现“双下降现象”

2023「炼丹」GPU选购指南来了:英伟达3080和4070Ti成性价比之王

深度学习崛起十年:“开挂”的OpenAI革新者

深度强化学习 如何训练

Sam Altman的成功学|升维指南 (2023.01.29)阅读摘要(2023.02.10)