惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
D
Docker
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
爱范儿
爱范儿
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
Recent Announcements
Recent Announcements
U
Unit 42
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
量子位
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog

膨胀自留地

使用CloudFlare标记管理功能优雅的使用谷歌分析 四天轻松版北京旅游攻略 Adsense税务居住地证明申请教程:如何申请中国税收居民身份证明以及Google Adsense更新新加坡税务信息教程 常见的 VPS 优化措施 HTML实现table表格移动端自动转为卡片样式 个人网站接入 Google 登录 如何从 GitHub 永久删除泄露的 .env 文件 Cloudflare设置www的域名跳转到不带www的域名 顶级iOS神器!全面解开App Store限制,AssPP Pro保姆级教程 BroadcastChannel将你的 Telegram Channel 转为微博客 Medama开源轻量级网站统计(分析)系统 白嫖一个网站监控面板:uptime-kuma 部署TraffMonetizer利用闲置VPS挂机赚钱 Counterscale-使用CloudflareWorkers部署的免费网站数据统计工具,界面类似umami 封装一个最简单的Axios,避免过度封装! 如何使用Cloudflare Email Routing创建域名邮箱免费发送邮件 使用Cron定时更新Hosts解决Gihub无法访问问题 容器化MariaDB/Mysql实现定时备份 JetBrains全家桶许可证服务器怎么找,JetBrains激活教程 图片加速接口:缓存图片,加速访问,解决防盗链 MySQL模糊查询再也不用like+%了,全文索引介绍及使用简介 为什么这么多人推荐你办理流量卡?流量卡怎么赚钱?怎么避坑? 借助Cloudflare Worker实现Google Analytics反代加速,规避广告屏蔽插件的拦截 etcd入门之在Centos上安装部署 Grafana在linux下安装和基本使用入门 Prometheus介绍、安装和基本功能快速入门 无需加速器,油猴插件解锁xbox云游戏 阿里云盘自动每日签到,无需部署,无需服务器 自定义VSCode终端主题样式 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局
Go | 基于最新的 ChatGPT API 实现命令行版 ChatGPT
2023-03-04 · via 膨胀自留地

#编程技术 2023-03-04 16:16:14 | 全文 744 字,阅读约需 2 分钟 | 加载中... 次浏览

👋 相关阅读


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")
		}
	}
}

×