Abstract: OpenAI 终于开放了 ChatGPT 的 API 接口,我用 golang 试着对其进行调用并进行了简单测试。

准备

登陆 OpenAI

首先需要有一个 OpenAI 的账号,你可以在这里注册或登陆。

API key

注册好账号后,最重要的一步是生成 API key. 这个 API key 就是后面用程序调用 API 的身 份凭证。

查看官方文档

官方文档截图
turboturbotext-davinci-003text-davinci-003

API 调用

同时,OpenAI 网站上提供了一个Playground供人们在浏览器中试用 API. 不过我的目的是写程序调用所以这里就不介绍 playground 了。但强烈建议你在程序 调用之前先试一下 playground, 毕竟调用是一回事,如何利用 API 解决问题是另外一回事, 而 playground 就可以给你提供一个快速检验想法的平台。

关于程序化调用 API, 相信很快就会有许多通过 python 调用的例子,这里我就写一个基于 golang 的,哈哈。

用 golang 调用 ChatGPT API

go mod init api
go get github.com/sashabaranov/go-gpt3
go-gpt3main.go
package main

import (
    "context"
    "fmt"
    "net/http"
    "net/url"
    gogpt "github.com/sashabaranov/go-gpt3"
)

func main() {
    c := gogpt.NewClient("your token")
    ctx := context.Background()

    req := gogpt.ChatCompletionRequest{
        Model:       gogpt.GPT3Dot5Turbo,
        MaxTokens:   100,
        Messages: []gogpt.ChatCompletionMessage{
            gogpt.ChatCompletionMessage{Role: "system", Content: "你是一个计算器"},
            gogpt.ChatCompletionMessage{Role: "user", Content: "a=323, b=511"},
            gogpt.ChatCompletionMessage{Role: "user", Content: "(a+b)*2=?"},
        },
    }

    resp, err := c.CreateChatCompletion(ctx, req)
    if err != nil {
        return
    }
    fmt.Println("Created:    ", resp.Created)
    fmt.Println("Model:  ", resp.Model)
    fmt.Println("Message:    ", resp.Choices[0].Message.Content)
    fmt.Println("Usage:      ", resp.Usage)
}
your tokenMessages"system""user""assistant"

好,我们来执行一下!

go build && ./api

让我们耐心等待几秒钟,咦?怎么卡住了?!

这是因为 OpenAI 封锁了中国的 IP,不带咱们玩了。所以想要调用 API 需要准备梯子。我 follow 这个帖子在程序里添加了代理,最后完整的程序如下

package main

import (
    "context"
    "fmt"
    "net/http"
    "net/url"
    gogpt "github.com/sashabaranov/go-gpt3"
)

func main() {
    config := gogpt.DefaultConfig("your token")
    proxyUrl, err := url.Parse("http://localhost:8888")
    if err != nil {
        panic(err)
    }
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyUrl),
    }
    config.HTTPClient = &http.Client{
        Transport: transport,
    }

    c := gogpt.NewClientWithConfig(config)
    ctx := context.Background()

    req := gogpt.ChatCompletionRequest{
        Model:       gogpt.GPT3Dot5Turbo,
        MaxTokens:   100,
        Messages: []gogpt.ChatCompletionMessage{
            gogpt.ChatCompletionMessage{Role: "system", Content: "你是一个计算器"},
            gogpt.ChatCompletionMessage{Role: "user", Content: "a=323, b=511"},
            gogpt.ChatCompletionMessage{Role: "user", Content: "(a+b)*2=?"},
        },
    }

    resp, err := c.CreateChatCompletion(ctx, req)
    if err != nil {
        return
    }
    fmt.Println("Created:    ", resp.Created)
    fmt.Println("Model:  ", resp.Model)
    fmt.Println("Message:    ", resp.Choices[0].Message.Content)
    fmt.Println("Usage:      ", resp.Usage)

}
http://localhost:8888
go build && ./api

得到的结果如下:

Created:      1677840785
Model:    gpt-3.5-turbo-0301
Message:      (a+b)*2 = (323+511)*2 = 1688.
Usage:    {35 18 53}

完成收工!

原文: