在本教程中,我们将创建一个简单的Golang命令行计划,该程序使用OpenAI API重新创建了Chatgpt Web的类似拟合。
https://chat.openai.com/chat
我们将看到这个
- OpenAi Apikey设置
- 设置基础Golland项目 li>
- 从终端获取输入
- 将问题发送到OpenAI API
- 显示结果
这是应用程序的最终结果
此GIF是使用VHS惊人工具创建的。
https://github.com/charmbracelet/vhs
funcionality非常简单。
- 执行二进制程序。
- 问一个问题,然后按Enter。
- 该程序向OpenAI API发送问题并显示回答,全部在终端上。
Openai apikey
为了完成本教程,您必须获得一个apikey,
去openai买一个新的
https://platform.openai.com/account/api-keys
确保您将Apikey保存在某个地方,因为它们只会显示一次。
设置项目
转到您的终端,并运行此命令以创建一个文件夹并进入内部
mkdir chatgptcli && cd chatgptcli
之后,初始化一个模块
go mod init chatgptcli
创建一个main.go文件
touch main.go
从终端获取输入
在main.go文件中添加此代码。
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Ask to chat gpt: ")
text, err := reader.ReadString('\n')
if err != nil {
panic(err)
}
fmt.Println("User input:", text)
}
我们创建了一个将OS.STDIN作为参数传递的读取对象,以便从命令行获得输入。
我们使用读取输入的读取串直到找到断裂线(输入键),这是由参数'\ n'。
如果我们有错误,我们使用呼叫恐慌功能完成了程序,这不是管理此操作的最优雅方法,而是出于教程的目的是足够的。
之后,我们仅在控制台上打印用户输入文本。
将问题发送给OpenAI API
我们将使用这个很棒的库连接到OpenAPI API
https://github.com/sashabaranov/go-openai
,它为我们带来了一个不错的接口,可以连接到API,而无需知道OpenAI所需的所有参数,配置等。
如果您想看看,这是官方文档。
https://platform.openai.com/docs/api-reference/chat
将库添加到项目
go get github.com/sashabaranov/go-openai
将此代码添加到文件main.go
上的主函数
func main() {
// previous code
// [...]
c := openai.NewClient("youropenaitoken"))
resp, err := c.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: "user",
Content: text,
},
},
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
fmt.Println()
}
这个代码块使用OpenAI代币创建一个新的client,在此项目中,我们进行了硬码,但是如果您在项目中使用此值á租赁中考虑使用环境变量而不是此。
我们使用方法createChatCompletion和Model OpenAi.gpt3dot5turbo作为我们的配置。
该模型的官方定义是以下
一组改进GPT-3的模型,并且可以理解并生成自然语言或代码
还有更多选择
- dall-e
- 耳语
- codex
- etc
https://platform.openai.com/docs/models/overview
所有或至少大多数都可以与库一起使用。
使用此命令运行程序
go run main.go
效果很好,但是我们有一个问题,在终端中的API响应后,程序完成,如果我们想问另一个问题,我们必须再次打开该程序。
我们可以改变这种行为并防止这种行为,增加一些更改。
添加一个包装所有主要代码的“ for”。
func main() {
for {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Ask to chat gpt: ")
text, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading input:", err)
return
}
fmt.Println("Input text:", text)
c := openai.NewClient("youropenaitoken")
resp, err := c.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: "user",
Content: text,
},
},
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
fmt.Println()
}
}
for loops无限运行(例如其他语言中的“ true”),并且要输入文本的宣告将在查看API的结果之后出现,而不是更改,现在我们必须使用CTRL+C关闭程序。
所以,就目前而言,您可以在此要点中看到所有代码。
https://gist.github.com/ernesto27/6aadbb2ed8169294c375505733381f16
此程序效果很好,但是我们可以为将来的教程做出一些改进。
- 对话总是从头开始,我不确定是否可以与API进行对话。
- 我们可以改善终端中文本的外观。
- 我们可以配置程序以使用Env变量而不是硬码令牌。
您还可以在此存储库上找到此程序的更完整版本。
https://github.com/ernesto27/chatgpt-cli