Ver código fonte

chore: fix memory prompt

Yifei Zhang 2 anos atrás
pai
commit
12f52bf252
2 arquivos alterados com 25 adições e 11 exclusões
  1. 24 10
      app/store.ts
  2. 1 1
      app/utils.ts

+ 24 - 10
app/store.ts

@@ -36,7 +36,7 @@ export interface ChatConfig {
 
 const DEFAULT_CONFIG: ChatConfig = {
   historyMessageCount: 4,
-  compressMessageLengthThreshold: 500,
+  compressMessageLengthThreshold: 1000,
   sendBotMessages: true as boolean,
   submitKey: SubmitKey.CtrlEnter as SubmitKey,
   avatar: "1f603",
@@ -105,6 +105,7 @@ interface ChatStore {
     updater: (message?: Message) => void
   ) => void;
   getMessagesWithMemory: () => Message[];
+  getMemoryPrompt: () => Message,
 
   getConfig: () => ChatConfig;
   resetConfig: () => void;
@@ -241,17 +242,23 @@ export const useChatStore = create<ChatStore>()(
         });
       },
 
+      getMemoryPrompt() {
+        const session = get().currentSession()
+
+        return {
+          role: 'system',
+          content: '这是 ai 和用户的历史聊天总结作为前情提要:' + session.memoryPrompt,
+          date: ''
+        } as Message
+      },
+
       getMessagesWithMemory() {
         const session = get().currentSession()
         const config = get().config
         const n = session.messages.length
         const recentMessages = session.messages.slice(n - config.historyMessageCount);
 
-        const memoryPrompt: Message = {
-          role: 'system',
-          content: '这是 ai 和用户的历史聊天总结作为前情提要:' + session.memoryPrompt,
-          date: ''
-        }
+        const memoryPrompt = get().getMemoryPrompt()
 
         if (session.memoryPrompt) {
           recentMessages.unshift(memoryPrompt)
@@ -288,17 +295,24 @@ export const useChatStore = create<ChatStore>()(
         }
 
         const config = get().config
-        const messages = get().getMessagesWithMemory()
-        const toBeSummarizedMsgs = get().getMessagesWithMemory()
+        let toBeSummarizedMsgs = session.messages.slice(session.lastSummarizeIndex)
         const historyMsgLength = toBeSummarizedMsgs.reduce((pre, cur) => pre + cur.content.length, 0)
+
+        if (historyMsgLength > 4000) {
+          toBeSummarizedMsgs = toBeSummarizedMsgs.slice(-config.historyMessageCount)
+        }
+
+        // add memory prompt
+        toBeSummarizedMsgs.unshift(get().getMemoryPrompt())
+
         const lastSummarizeIndex = session.messages.length
 
-        console.log('[Chat History] ', messages, historyMsgLength, config.compressMessageLengthThreshold)
+        console.log('[Chat History] ', toBeSummarizedMsgs, historyMsgLength, config.compressMessageLengthThreshold)
 
         if (historyMsgLength > config.compressMessageLengthThreshold) {
           requestChatStream(toBeSummarizedMsgs.concat({
             role: 'system',
-            content: '总结一下 ai 和用户的对话,用作后续的上下文提示 prompt,控制在 100 字以内,你在回复时用 ai 自称',
+            content: '简要总结一下你和用户的对话,用作后续的上下文提示 prompt,控制在 50 字以内',
             date: ''
           }), {
             filterBot: false,

+ 1 - 1
app/utils.ts

@@ -1,5 +1,5 @@
 export function trimTopic(topic: string) {
-  const s = topic.split("").slice(0, 20);
+  const s = topic.split("");
   let lastChar = s.at(-1); // 获取 s 的最后一个字符
   let pattern = /[,。!?、]/; // 定义匹配中文标点符号的正则表达式
   while (lastChar && pattern.test(lastChar!)) {