乐趣区

关于express:我是如何让我的-GPT-长记性-的轻松实现有-记忆-的-GPT

我的项目地址:github.com/ltyzzzxxx/g…

最新进度:目前已实现 GPT 在线角色 DIY 性能,还在解决细节中 …

欢送大家 Star、提出 Issue & PR,一起高兴地用 GPT Terminal 游玩吧~

前言

明天持续来教大家如何玩转 OpenAI 接口!

自从 ChatGPT 横空出世之后,市面上就涌现了大量的类 GPT 利用(网站、公众号、小程序、App 等等),它们和 ChatGPT 提供的性能简直并驾齐驱。这一切都是源于 OpenAI 为开发者们提供了 SDKAPI 服务,使得大家可能欢乐地调用接口~

然而,如果你不懂得如何应用它提供的服务,那么做进去的 GPT 利用与市面上的相比,可能有许多缺点。明天,我就先带大家功克第一个缺点:如何让你做的 GPT 利用长长“忘性”!我会从实践与实战的角度,带大家制作出有 “ 记忆 ” 性能的 GPT

接口分析

咱们在发送音讯时,都是申请 OpenAI 提供的 createChatCompletion SDK 或 去调用 https://api.openai.com/v1/chat/completions API 从而获取 GPT 响应。想必大家如果看过我之前写的文章,肯定对这种形式不生疏。然而,如果你只是单纯地将以后用户的发问作为申请参数传递给接口中,GPT 只会给你返回以后问题的响应,它本身没有记录上下文的能力。因为,咱们对于 GPT 的每次申请与响应,都是独自的,并不会被 GPT 所存储。

然而,在实在的聊天场景,与你聊天的人肯定会晓得对话的上下文。要想使得 GPT 更加智能,必须得具备这一特点。难道 OpenAI 团队不晓得这一点吗?其实,解决方案还是老配方,答案还是藏在 createChatCompletion 接口参数中!

大家应该还记得我在上上一篇文章中,我通过以下流程实现了角色定制:

  1. Markdown 中依照模板格局,事后定义好角色信息以及具体问答 Case
  2. 将其从 Markdown 格局转为了 JSON 对象数组
  3. 申请 createChatCompletion 接口,参数 messages 即为转化好的对象数组

这时候聪慧的大家预计曾经想到了,这些事后定义好的角色信息和问答 Case,就是 GPT 能够参考的上下文啊!这样看来,要想让 GPT“长忘性”,也能够通过这一思路实现!

咱们只须要记录以后这次会话中,用户与 GPT 的聊天记录,并在下一次用户向 GPT 发送音讯时,将之前的聊天记录与这次发送的音讯一起作为 createChatCompletionmessages 参数,即可实现这一性能。

话不多说,咱们开始实战环节!

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、点个赞不过分吧(磕头!)下期再见!

退出移动版