我的项目地址:github.com/ltyzzzxxx/g…
最新进度:目前已实现 GPT
在线角色 DIY
性能,还在解决细节中 …
欢送大家 Star、提出 Issue & PR,一起高兴地用 GPT Terminal
游玩吧~
前言
明天持续来教大家如何玩转 OpenAI
接口!
自从 ChatGPT
横空出世之后,市面上就涌现了大量的类 GPT 利用(网站、公众号、小程序、App 等等),它们和 ChatGPT
提供的性能简直并驾齐驱。这一切都是源于 OpenAI
为开发者们提供了 SDK
与 API
服务,使得大家可能欢乐地调用接口~
然而,如果你不懂得如何应用它提供的服务,那么做进去的 GPT
利用与市面上的相比,可能有许多缺点。明天,我就先带大家功克第一个缺点:如何让你做的 GPT
利用长长“忘性”!我会从实践与实战的角度,带大家制作出有 “ 记忆 ” 性能的 GPT
!
接口分析
咱们在发送音讯时,都是申请 OpenAI
提供的 createChatCompletion
SDK 或 去调用 https://api.openai.com/v1/chat/completions
API 从而获取 GPT
响应。想必大家如果看过我之前写的文章,肯定对这种形式不生疏。然而,如果你只是单纯地将以后用户的发问作为申请参数传递给接口中,GPT
只会给你返回以后问题的响应,它本身没有记录上下文的能力。因为,咱们对于 GPT
的每次申请与响应,都是独自的,并不会被 GPT
所存储。
然而,在实在的聊天场景,与你聊天的人肯定会晓得对话的上下文。要想使得 GPT
更加智能,必须得具备这一特点。难道 OpenAI 团队不晓得这一点吗?其实,解决方案还是老配方,答案还是藏在 createChatCompletion
接口参数中!
大家应该还记得我在上上一篇文章中,我通过以下流程实现了角色定制:
- 在
Markdown
中依照模板格局,事后定义好角色信息以及具体问答 Case - 将其从
Markdown
格局转为了JSON
对象数组 - 申请
createChatCompletion
接口,参数messages
即为转化好的对象数组
这时候聪慧的大家预计曾经想到了,这些事后定义好的角色信息和问答 Case,就是 GPT
能够参考的上下文啊!这样看来,要想让 GPT
“长忘性”,也能够通过这一思路实现!
咱们只须要记录以后这次会话中,用户与 GPT
的聊天记录,并在下一次用户向 GPT
发送音讯时,将之前的聊天记录与这次发送的音讯一起作为 createChatCompletion
的 messages
参数,即可实现这一性能。
话不多说,咱们开始实战环节!
GPT Terminal 实战
存储计划
在前文中咱们提到,须要将用户与 GPT
的聊天记录进行存储,所以咱们须要确定存储计划。
在 GPT Terminal
我的项目中,我采纳了 LocalStorage
前端存储技术以及 Pinia
状态治理框架来实现。
大家如果不相熟 Pinia 语法,能够先看看基础教程或者间接跟着我的项目做一遍,用法很简略。
如下局部代码对应我的项目门路为:
src/core/commands/gpt/messagesStore.ts
import {defineStore} from "pinia";
interface Message {
name: string;
role: string;
content: string;
}
export const useMessagesStore = defineStore("messages", {state: () => ({messages: [] as Message[]}),
getters: {},
persist: {
key: "gpt-messages",
storage: window.localStorage,
},
actions: {addMessage(msg: Message) {const {messages} = this.$state
if (messages.length >= 20) {messages.shift()
}
messages.push(msg)
},
clearMessages() {this.$state.messages = []
}
}
})
在下面这段代码中,我定义了 messages
状态,增加了两个 action
,别离为增加音讯与革除音讯,并确定了 LocalStorage
的长久化形式。
其中,为了避免上下文沉积,我限度了 messages
数组的最大长度,也就是说最多只能存储 20 条聊天记录。如果超出 20 条之后,首元素就会被移除(相似于固定长度的双端队列)。
申请 GPT 服务
确定好存储计划后,咱们须要在对应的 Vue3
组件中引入 useMessagesStore
。
如下局部代码对应我的项目门路为:
src/core/commands/gpt/subCommands/chat/ChatBox.vue
// 引入 useMessagesStore
import {useMessagesStore} from "../../messagesStore"
// 用于将 messages 状态转为 Vue3 的 响应式数据
import {storeToRefs} from "pinia";
// 取出 messages
const messagesStore = useMessagesStore();
// 转化为 messages 响应式数据
const {messages} = storeToRefs(messagesStore);
引入之后,咱们须要扭转原先申请中传入的 body
参数,咱们须要将 messages
历史聊天记录增加到 body
中。
const response = await fetch('http://127.0.0.1:7345/api/gpt/get', {
method: "POST",
headers: {"Content-Type": "application/json",},
// 投喂历史音讯
body: JSON.stringify({message: [...(messages.value.map(({ role, content}) => ({role, content}))), {
role: "user",
content: message.value
}],
role: role.value,
}),
});
原有的后端服务不须要发生变化,其只需承受参数,并申请 GPT
服务即可。
请肯定要记得,在咱们申请完结后,将这次申请的对话记录到 messages
状态中!
// 记录历史音讯
messagesStore.addMessage({
name: role.value,
role: "user",
content: message.value
})
messagesStore.addMessage({
name: role.value,
role: "assistant",
content: output.value
})
通过以上简略的革新,咱们便轻松地实现了有状态的 GPT
!
成绩
让咱们测验一下咱们实战的成绩吧!
此外,我还引入了查问历史对话记录的性能,即便你清屏或者敞开以后终端,也可能找回最近的对话记录(最多记录 20 条)。这里的计划也是通过 Pinia
实现的,咱们只须要获取 messages
状态即可。上面简略为大家演示一下!具体实现计划,大家能够进入 GPT Terminal 查看具体代码实现细节哦!
总结
明天给大家展现了我在 GPT Terminal
中,是如何实现让 GPT
具备上下文的“记忆”性能。原理非常简单,只须要在申请接口的参数中传入历史聊天记录即可。
最初再小小地提一下,GPT Terminal
目前曾经根本实现了主体性能啦,还有一些 Bug 须要批改,如果大家想要理解 GPT Terminal 我的项目的更多细节与解锁更多玩法的话,请到其主页查看哦。对了,如果各位小伙伴对于文章或我的项目有什么不懂的中央,间接提出 Issue
,我会在 24 小时内回复!
看在我这么认真的份上,大家点个 Star、点个赞不过分吧(磕头!)下期再见!