目录

用程序调用ChatGPT API

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

准备

登陆 OpenAI

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

API key

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

查看官方文档

打开官方文档后发现在 get started -> Models 中已经可以看到GPT-3.5版本的模型 了。这 里面的 turbo 就是 chatgpt 对应的模型,文档上写道 turbo 是一个擅长对话和文本 生成的模型,比 text-davinci-003 更便宜(只有 10% 的花费,每 1000 token 0.002 美 元),同时他们会持续迭代更新这个 API 对应的模型。说实话价格比 text-davinci-003 便宜这么多我是真没想到。这简直是明目张胆搞价格垄断啊,OpenAI 因为 chatGPT 得到的 先发优势确实太大了。

API 调用

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

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

用 golang 调用 ChatGPT API

如果你想了解更多 API 的细节,可以查看在API 参数介绍

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

按照 go-gpt3 的例子我创建了 main.go 文件,并改成 chat 对应的版本:

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 token 改成之前申请的 API key. 因为程序本身很直观了,这里我就 不再做解释,使用中只需要更改其中的 Messages 部分。里面的 "system", "user" 以及没有出现的 "assistant" 分别代表系统引导词,用户的对话信息和 API 的返回信息。这 三部分都是可以在程序里认为设置的,而 ChatGPT 只会生成 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 是我的 http 代理地址。看,go 添加代理及网络操作就是这么方便!好,让我们再来执行一下

go build && ./api

得到的结果如下:

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

完成收工!