使用Openai-Chatgpt API创建Golang CLI
#教程 #go #cli #chatgpt

在本教程中,我们将创建一个简单的Golang命令行计划,该程序使用OpenAI API重新创建了Chatgpt Web的类似拟合。
https://chat.openai.com/chat

我们将看到这个

  • OpenAi Apikey设置
  • 设置基础Golland项目
  • 从终端获取输入
  • 将问题发送到OpenAI API
  • 显示结果

这是应用程序的最终结果

alt text

此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