本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2023-03-04 | 骚操作,编程技术 | 7973 次阅读 | 等你评论 | 0 次点赞 | 繁体

OpenAI 这两天发布了 ChatGPT API,基于 gpt-3.5-turbo 模型,这是一个 GPT-3.5 的优化版本,用于支持开发者把 ChatGPT 集成到自己的产品中,同时把 API 调用价格降到 $0.002 每千 token,意味着处理 100 万字符的文本只需要 2 美元,也就是差不多十几块钱人民币,效果更好、价格更低,这让 ChatGPT API 更具性价比,因此这两天基于 ChatGPT API 的各种套壳应用如雨后春笋般大量冒出。

今天就来实现一个命令行版 ChatGPT 应用。

图片alt

代码如下:

package main

import (
    "context"
    "fmt"
    "github.com/charmbracelet/glamour"
    "github.com/common-nighthawk/go-figure"
    gpt3 "github.com/sashabaranov/go-gpt3"
    "strings"
)

func main() {
    // 获取 OpenAI API Key
    //apiKey := os.Getenv("OPENAI_API_KEY")
    apiKey := "你自己的 OPENAI_API_KEY"
    if apiKey == "" {
        fmt.Println("请设置 OPENAI_API_KEY 环境变量")
        return
    }
    // 初始化 Glamour 渲染器
    renderStyle := glamour.WithEnvironmentConfig()
    mdRenderer, err := glamour.NewTermRenderer(
        renderStyle,
    )
    if err != nil {
        fmt.Println("初始化 Markdown 渲染器失败")
        return
    }
    // 输出欢迎语(命令行应用启动界面)
    myFigure := figure.NewFigure("ChatGPT", "", true)
    myFigure.Print()
    fmt.Println("ChatGPT 启动成功,输入您的问题回车即可,输入 quit 可退出应用")
    // 创建 ChatGPT 客户端
    client := gpt3.NewClient(apiKey)
    if err != nil {
        fmt.Printf("创建客户端失败: %s\n", err.Error())
        return
    }
    messages := []gpt3.ChatCompletionMessage{
        {
            Role:    "system",
            Content: "你是ChatGPT, OpenAI训练的大型语言模型, 请尽可能简洁地回答我的问题",
        },
    }
    // 读取用户输入并交互
    var userInput string
    fmt.Println("--问题---------------------\n")
    for {
        fmt.Scanln(&userInput)
        if strings.ToLower(userInput) == "quit" {
            fmt.Println("ChatGPT 已退出")
            return
        } else if userInput != "" {
            messages = append(
                messages, gpt3.ChatCompletionMessage{
                    Role:    "user",
                    Content: userInput,
                },
            )
            // 调用 ChatGPT API 接口生成回答
            resp, err := client.CreateChatCompletion(
                context.Background(),
                gpt3.ChatCompletionRequest{
                    Model:       gpt3.GPT3Dot5Turbo,
                    Messages:    messages,
                    MaxTokens:   1024,
                    Temperature: 0,
                    N:           1,
                },
            )
            if err != nil {
                fmt.Printf("ChatGPT 接口调用失败: %s\n", err.Error())
                continue
            }
            // 格式化输出结果
            output := resp.Choices[0].Message.Content
            mdOutput, err := mdRenderer.Render(output)
            if err != nil {
                fmt.Printf("Markdown 渲染失败: %s\n", err.Error())
                continue
            }
            fmt.Println("")
            fmt.Println("--回答---------------------")
            fmt.Println(mdOutput)
            messages = append(
                messages, gpt3.ChatCompletionMessage{
                    Role:    "assistant",
                    Content: output,
                },
            )
            fmt.Println("--问题---------------------\n")
        }
    }
}

标签: 源码骚操作GolangchatGPT

猜你喜欢
[Go]包依赖管理工具go mod使用详解
go module 是 Go 语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go 1.13 版本开始,go module 成为了 Go 语言默认的依赖管理工具。Modules 官方定...
薅京东羊毛必备抓取Cookies教程
本文只介绍如何利用安卓手机浏览器获取京东 cookie 教程,具体为什么要获取 cookie 以及如何薅羊毛请查看:闲置服务器薅京东的羊毛—青龙面板部署与京东签到20230704 新增抓包 JD...
白嫖移动,联通,电信手机短信通知
无论在生活中或者工作中,对于一些比较紧急的事情,可能需要发送个通知!比如:自建的服务器突然宕机,如何自动发短信通知运维主管?后台服务日志大量报错如何第一时间发短信通知码农geigei?类似的情景...
通用的检测到广告屏蔽插件进行弹窗提示实现方法
用的 js 方法来检测,按理说所有博客都能使用,就是在打开网页的时候进行一次判断。如果发现没有加载广告代码,就会出来一个弹窗来提示浏览者将本站加到广告拦截插件的白名单里面。别喷我,个人站长经营实...
如何找回微信已过期文件教程
现在基本人人都会使用微信,微信里面保存着很多文件。但是过段时间去看,你可能由于当时没有保存或者根本就没有点开过,微信文件名称显示红色,这表示已经过期了。难道我们要再问别人重发一遍吗?这可能会有点...
crond 引发大量 sendmail 进程的解决办法
# 发现问题 这两天看到几台服务器比较异常,平常流量跑满,突然就没有了流量,TCP 连接也没了。于是登录上服务器查看,首先想重启 nginx 服务,结果报错,大致意思就是磁盘空间已满。通过 `d
Python 内存分配时的小秘密
Python 中的 sys 模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解释器强交互的函数。 本文将会频繁地使用该模块的 getsizeof() 方法,因此,
loguru 简单方便的 Python 日志记录管理模块
# 这是个啥? 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 Handler、Formatter 来进行一
(首次提交评论需审核通过才会显示,请勿重复提交)