Преглед на файлове

feat: close #864 improve long term history

Yifei Zhang преди 1 година
родител
ревизия
d75b7d49b8
променени са 2 файла, в които са добавени 51 реда и са изтрити 23 реда
  1. 5 5
      app/locales/cn.ts
  2. 46 18
      app/store/app.ts

+ 5 - 5
app/locales/cn.ts

@@ -38,12 +38,12 @@ const cn = {
     MessageFromChatGPT: "来自 ChatGPT 的消息",
     MessageFromChatGPT: "来自 ChatGPT 的消息",
   },
   },
   Memory: {
   Memory: {
-    Title: "历史记忆",
-    EmptyContent: "尚未记忆",
-    Send: "发送记忆",
-    Copy: "复制记忆",
+    Title: "历史摘要",
+    EmptyContent: "尚未总结",
+    Send: "启用总结并发送摘要",
+    Copy: "复制摘要",
     Reset: "重置对话",
     Reset: "重置对话",
-    ResetConfirm: "重置后将清空当前对话记录以及历史记忆,确认重置?",
+    ResetConfirm: "重置后将清空当前对话记录以及历史摘要,确认重置?",
   },
   },
   Home: {
   Home: {
     NewChat: "新的聊天",
     NewChat: "新的聊天",

+ 46 - 18
app/store/app.ts

@@ -102,7 +102,7 @@ export function limitNumber(
   x: number,
   x: number,
   min: number,
   min: number,
   max: number,
   max: number,
-  defaultValue: number,
+  defaultValue: number
 ) {
 ) {
   if (typeof x !== "number" || isNaN(x)) {
   if (typeof x !== "number" || isNaN(x)) {
     return defaultValue;
     return defaultValue;
@@ -217,7 +217,7 @@ interface ChatStore {
   updateMessage: (
   updateMessage: (
     sessionIndex: number,
     sessionIndex: number,
     messageIndex: number,
     messageIndex: number,
-    updater: (message?: Message) => void,
+    updater: (message?: Message) => void
   ) => void;
   ) => void;
   resetSession: () => void;
   resetSession: () => void;
   getMessagesWithMemory: () => Message[];
   getMessagesWithMemory: () => Message[];
@@ -345,12 +345,12 @@ export const useChatStore = create<ChatStore>()(
                     .slice(0, index)
                     .slice(0, index)
                     .concat([deletedSession])
                     .concat([deletedSession])
                     .concat(
                     .concat(
-                      state.sessions.slice(index + Number(isLastSession)),
+                      state.sessions.slice(index + Number(isLastSession))
                     ),
                     ),
                 }));
                 }));
               },
               },
             },
             },
-            5000,
+            5000
           );
           );
         }
         }
       },
       },
@@ -412,7 +412,7 @@ export const useChatStore = create<ChatStore>()(
               get().onNewMessage(botMessage);
               get().onNewMessage(botMessage);
               ControllerPool.remove(
               ControllerPool.remove(
                 sessionIndex,
                 sessionIndex,
-                botMessage.id ?? messageIndex,
+                botMessage.id ?? messageIndex
               );
               );
             } else {
             } else {
               botMessage.content = content;
               botMessage.content = content;
@@ -436,7 +436,7 @@ export const useChatStore = create<ChatStore>()(
             ControllerPool.addController(
             ControllerPool.addController(
               sessionIndex,
               sessionIndex,
               botMessage.id ?? messageIndex,
               botMessage.id ?? messageIndex,
-              controller,
+              controller
             );
             );
           },
           },
           filterBot: !get().config.sendBotMessages,
           filterBot: !get().config.sendBotMessages,
@@ -462,6 +462,7 @@ export const useChatStore = create<ChatStore>()(
 
 
         const context = session.context.slice();
         const context = session.context.slice();
 
 
+        // long term memory
         if (
         if (
           session.sendMemory &&
           session.sendMemory &&
           session.memoryPrompt &&
           session.memoryPrompt &&
@@ -471,9 +472,33 @@ export const useChatStore = create<ChatStore>()(
           context.push(memoryPrompt);
           context.push(memoryPrompt);
         }
         }
 
 
-        const recentMessages = context.concat(
-          messages.slice(Math.max(0, n - config.historyMessageCount)),
+        // get short term and unmemoried long term memory
+        const shortTermMemoryMessageIndex = Math.max(
+          0,
+          n - config.historyMessageCount
         );
         );
+        const longTermMemoryMessageIndex = config.lastSummarizeIndex;
+        const oldestIndex = Math.min(
+          shortTermMemoryMessageIndex,
+          longTermMemoryMessageIndex
+        );
+        const threshold = config.compressMessageLengthThreshold;
+
+        // get recent messages as many as possible
+        const reversedRecentMessages = [];
+        for (
+          let i = n - 1, count = 0;
+          i >= oldestIndex && count < threshold;
+          i -= 1
+        ) {
+          const msg = messages[i];
+          if (!msg || msg.isError) continue;
+          count += msg.content.length;
+          reversedRecentMessages.push(msg);
+        }
+
+        // concat
+        const recentMessages = context.concat(reversedRecentMessages.reverse());
 
 
         return recentMessages;
         return recentMessages;
       },
       },
@@ -481,7 +506,7 @@ export const useChatStore = create<ChatStore>()(
       updateMessage(
       updateMessage(
         sessionIndex: number,
         sessionIndex: number,
         messageIndex: number,
         messageIndex: number,
-        updater: (message?: Message) => void,
+        updater: (message?: Message) => void
       ) {
       ) {
         const sessions = get().sessions;
         const sessions = get().sessions;
         const session = sessions.at(sessionIndex);
         const session = sessions.at(sessionIndex);
@@ -510,15 +535,15 @@ export const useChatStore = create<ChatStore>()(
             (res) => {
             (res) => {
               get().updateCurrentSession(
               get().updateCurrentSession(
                 (session) =>
                 (session) =>
-                  (session.topic = res ? trimTopic(res) : DEFAULT_TOPIC),
+                  (session.topic = res ? trimTopic(res) : DEFAULT_TOPIC)
               );
               );
-            },
+            }
           );
           );
         }
         }
 
 
         const config = get().config;
         const config = get().config;
         let toBeSummarizedMsgs = session.messages.slice(
         let toBeSummarizedMsgs = session.messages.slice(
-          session.lastSummarizeIndex,
+          session.lastSummarizeIndex
         );
         );
 
 
         const historyMsgLength = countMessages(toBeSummarizedMsgs);
         const historyMsgLength = countMessages(toBeSummarizedMsgs);
@@ -526,7 +551,7 @@ export const useChatStore = create<ChatStore>()(
         if (historyMsgLength > get().config?.modelConfig?.max_tokens ?? 4000) {
         if (historyMsgLength > get().config?.modelConfig?.max_tokens ?? 4000) {
           const n = toBeSummarizedMsgs.length;
           const n = toBeSummarizedMsgs.length;
           toBeSummarizedMsgs = toBeSummarizedMsgs.slice(
           toBeSummarizedMsgs = toBeSummarizedMsgs.slice(
-            Math.max(0, n - config.historyMessageCount),
+            Math.max(0, n - config.historyMessageCount)
           );
           );
         }
         }
 
 
@@ -539,10 +564,13 @@ export const useChatStore = create<ChatStore>()(
           "[Chat History] ",
           "[Chat History] ",
           toBeSummarizedMsgs,
           toBeSummarizedMsgs,
           historyMsgLength,
           historyMsgLength,
-          config.compressMessageLengthThreshold,
+          config.compressMessageLengthThreshold
         );
         );
 
 
-        if (historyMsgLength > config.compressMessageLengthThreshold) {
+        if (
+          historyMsgLength > config.compressMessageLengthThreshold &&
+          session.sendMemory
+        ) {
           requestChatStream(
           requestChatStream(
             toBeSummarizedMsgs.concat({
             toBeSummarizedMsgs.concat({
               role: "system",
               role: "system",
@@ -561,7 +589,7 @@ export const useChatStore = create<ChatStore>()(
               onError(error) {
               onError(error) {
                 console.error("[Summarize] ", error);
                 console.error("[Summarize] ", error);
               },
               },
-            },
+            }
           );
           );
         }
         }
       },
       },
@@ -603,6 +631,6 @@ export const useChatStore = create<ChatStore>()(
 
 
         return state;
         return state;
       },
       },
-    },
-  ),
+    }
+  )
 );
 );