文章内容
2023/4/25 14:11:47,作 者: 黄兵
如何部署一套ChatGPT项目
如果你觉得 ChatGPT 官网注册过于繁琐,可以看看这篇文章。
作者在自己的服务器上部署了一套服务,通过调用 ChatGPT-Api 实现。本篇文章将讲解 Api 的调用过程。
Api
打开官方地址:https://openai.com/api/ 登陆并查看相关 API 文档。
如上,对于消息的推送其实只需要调用这一个接口即可实现。调用 JS 伪代码:
const response = await axios.post('https://api.openai.com/v1/completions', { prompt: this.inputText, model: "text-davinci-003", max_tokens: 100, n: 1, stop: null, temperature: 0.5, }, { headers: { 'Authorization': `Bearer`, 'Content-Type': 'application/json', }, });
API_KEY
怎么拿到?
同样还是刚才的地址,可以创建本账户的 API KEY。目前而言,每个账户有免费的调用额度,超过额度后此账户就无法进行会话了(选择充值 20 美元/月、或者重新注册账号)。
关于如何注册账号,在这几篇文章中都有介绍,需要的可以看看:
免费的额度目前是 18 美元,在 5 月 1 号之前是免费的。
ChatGpt-Api
上面仅仅介绍了简单实用 JS 如何实现直接调用接口进行会话。
但是,我们知道,官网的会话其实是能识别上下文语境的,而使用上述直接掉接口的方式,是无法做到上下文语句的功能的,每次推送的消息都将是一个新的 ConversationId。
这里就要介绍一个比较著名的开源项目了:https://github.com/transitive-bullshit/chatgpt-api
此项目实现了会话上下文的支持,主要涉及两个参数:
{ conversationId, //此次会话的conversationId parentMessageId //上次会话的messageId }
提一嘴,官方的 API 文档中,并未出现这两个参数,但是 ConversationId 是确实存在的
但是官方 API 接口中并未暴露太多相关参数。
如何使用
注意:
此项目是基于 Node.js 的服务端项目,且 Node Version >= 18 此项目只能是作为 Node 服务端独立运行,不能在 Vite、Webpack 等 Web 组件中调用相关函数 不能在 Vue 组件中调用此项目的相关函数(因为 Vue 是 Web 组件)
安装:
npm install chatgpt
使用:
import { ChatGPTAPI } from 'chatgpt' async function example() { const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY }) const res = await api.sendMessage('Hello World!', { conversationId: res.conversationId, //可选 parentMessageId: res.id //可选 }) console.log(res.text) }
消息存储
同样,ChatGPT 官方并未提供获取 Conversation 下所有历史会话信息的接口,因此想要存储历史会话消息,必须本地做数据存储。
幸运的是,chatgpt-api
项目作为一个 Node 后端服务,也封装了数据存储接口。代码如下:
import KeyvRedis from '@keyv/redis' import Keyv from 'keyv' import { ChatGPTAPI } from 'chatgpt' async function example() { // 选择存储在Redis中 const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379' const store = new KeyvRedis(redisUrl) const messageStore = new Keyv({ store, namespace: 'chatgpt-demo' }) const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY, messageStore }) const res = await api.sendMessage('Hello World!', { conversationId: res.conversationId, //可选 parentMessageId: res.id //可选 }) console.log(res.text) }
但是,此 API 对 Redis 操作的支持很少,仅仅支持基本 String 类型数据的 get/set。
如果想要自定义数据结构,可以使用基于 Node 的其他 DB 依赖做数据处理。
其它相关推荐:
评论列表