From a1158ebdb13bcf56151db38c1b5e5c9034fe2bbf Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:09:18 +0900 Subject: [PATCH] fix: adjust memory selection order --- src/lib/Setting/Pages/OtherBotSettings.svelte | 8 +- src/ts/process/memory/hypav3.ts | 167 +++++++++--------- src/ts/storage/database.svelte.ts | 4 +- 3 files changed, 90 insertions(+), 89 deletions(-) diff --git a/src/lib/Setting/Pages/OtherBotSettings.svelte b/src/lib/Setting/Pages/OtherBotSettings.svelte index 032054aa..086e234a 100644 --- a/src/lib/Setting/Pages/OtherBotSettings.svelte +++ b/src/lib/Setting/Pages/OtherBotSettings.svelte @@ -478,15 +478,15 @@ Memory Tokens Ratio Extra Summarization Ratio - + Max Chats Per Summary Recent Memory Ratio - + Similar Memory Ratio - + Random Memory Ratio - +
diff --git a/src/ts/process/memory/hypav3.ts b/src/ts/process/memory/hypav3.ts index e198734a..7991d886 100644 --- a/src/ts/process/memory/hypav3.ts +++ b/src/ts/process/memory/hypav3.ts @@ -228,14 +228,14 @@ export async function hypaMemoryV3( // Validate settings if ( - db.hypaV3Settings.similarMemoryRatio + db.hypaV3Settings.randomMemoryRatio > + db.hypaV3Settings.recentMemoryRatio + db.hypaV3Settings.similarMemoryRatio > 1 ) { return { currentTokens, chats, error: - "[HypaV3] The sum of Similar Memory Ratio and Random Memory Ratio is greater than 1.", + "[HypaV3] The sum of Recent Memory Ratio and Similar Memory Ratio is greater than 1.", }; } @@ -445,18 +445,18 @@ export async function hypaMemoryV3( ); const selectedSummaries: Summary[] = []; + const randomMemoryRatio = + 1 - + db.hypaV3Settings.recentMemoryRatio - + db.hypaV3Settings.similarMemoryRatio; // Select recent summaries - const recentMemoryRatio = - 1 - - db.hypaV3Settings.similarMemoryRatio - - db.hypaV3Settings.randomMemoryRatio; const reservedRecentMemoryTokens = Math.floor( - availableMemoryTokens * recentMemoryRatio + availableMemoryTokens * db.hypaV3Settings.recentMemoryRatio ); let consumedRecentMemoryTokens = 0; - if (recentMemoryRatio > 0) { + if (db.hypaV3Settings.recentMemoryRatio > 0) { const selectedRecentSummaries: Summary[] = []; // Add one by one from the end @@ -493,91 +493,28 @@ export async function hypaMemoryV3( ); } - // Select random summaries - let reservedRandomMemoryTokens = Math.floor( - availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio + // Select similar summaries + let reservedSimilarMemoryTokens = Math.floor( + availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio ); - let consumedRandomMemoryTokens = 0; + let consumedSimilarMemoryTokens = 0; - if (db.hypaV3Settings.randomMemoryRatio > 0) { - const selectedRandomSummaries: Summary[] = []; + if (db.hypaV3Settings.similarMemoryRatio > 0) { + const selectedSimilarSummaries: Summary[] = []; // Utilize unused token space from recent selection - if (db.hypaV3Settings.similarMemoryRatio === 0) { + if (randomMemoryRatio <= 0) { const unusedRecentTokens = reservedRecentMemoryTokens - consumedRecentMemoryTokens; - reservedRandomMemoryTokens += unusedRecentTokens; + reservedSimilarMemoryTokens += unusedRecentTokens; console.log( - "[HypaV3] Additional available token space for random memory:", + "[HypaV3] Additional available token space for similar memory:", "\nFrom recent:", unusedRecentTokens ); } - // Target only summaries that haven't been selected yet - const unusedSummaries = data.summaries - .filter((e) => !selectedSummaries.includes(e)) - .sort(() => Math.random() - 0.5); // Random shuffle - - for (const summary of unusedSummaries) { - const summaryTokens = await tokenizer.tokenizeChat({ - role: "system", - content: summary.text + summarySeparator, - }); - - if ( - summaryTokens + consumedRandomMemoryTokens > - reservedRandomMemoryTokens - ) { - // Trying to select more random memory - continue; - } - - selectedRandomSummaries.push(summary); - consumedRandomMemoryTokens += summaryTokens; - } - - selectedSummaries.push(...selectedRandomSummaries); - - console.log( - "[HypaV3] After random memory selection:", - "\nSummary Count:", - selectedRandomSummaries.length, - "\nSummaries:", - selectedRandomSummaries, - "\nReserved Random Memory Tokens:", - reservedRandomMemoryTokens, - "\nConsumed Random Memory Tokens:", - consumedRandomMemoryTokens - ); - } - - // Select similar summaries - if (db.hypaV3Settings.similarMemoryRatio > 0) { - let reservedSimilarMemoryTokens = Math.floor( - availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio - ); - let consumedSimilarMemoryTokens = 0; - const selectedSimilarSummaries: Summary[] = []; - - // Utilize unused token space from recent and random selection - const unusedRecentTokens = - reservedRecentMemoryTokens - consumedRecentMemoryTokens; - const unusedRandomTokens = - reservedRandomMemoryTokens - consumedRandomMemoryTokens; - - reservedSimilarMemoryTokens += unusedRecentTokens + unusedRandomTokens; - console.log( - "[HypaV3] Additional available token space for similar memory:", - "\nFrom recent:", - unusedRecentTokens, - "\nFrom random:", - unusedRandomTokens, - "\nTotal added:", - unusedRecentTokens + unusedRandomTokens - ); - // Target only summaries that haven't been selected yet const unusedSummaries = data.summaries.filter( (e) => !selectedSummaries.includes(e) @@ -697,10 +634,10 @@ export async function hypaMemoryV3( "[HypaV3] Trying to add similar summary:", "\nSummary Tokens:", summaryTokens, - "\nAvailable Tokens:", - availableSimilarMemoryTokens, + "\nReserved Tokens:", + reservedSimilarMemoryTokens, "\nWould exceed:", - summaryTokens > availableSimilarMemoryTokens + summaryTokens + consumedSimilarMemoryTokens > reservedSimilarMemoryTokens ); */ @@ -733,6 +670,70 @@ export async function hypaMemoryV3( ); } + // Select random summaries + let reservedRandomMemoryTokens = Math.floor( + availableMemoryTokens * randomMemoryRatio + ); + let consumedRandomMemoryTokens = 0; + + if (randomMemoryRatio > 0) { + const selectedRandomSummaries: Summary[] = []; + + // Utilize unused token space from recent and similar selection + const unusedRecentTokens = + reservedRecentMemoryTokens - consumedRecentMemoryTokens; + const unusedSimilarTokens = + reservedSimilarMemoryTokens - consumedSimilarMemoryTokens; + + reservedRandomMemoryTokens += unusedRecentTokens + unusedSimilarTokens; + console.log( + "[HypaV3] Additional available token space for random memory:", + "\nFrom recent:", + unusedRecentTokens, + "\nFrom similar:", + unusedSimilarTokens, + "\nTotal added:", + unusedRecentTokens + unusedSimilarTokens + ); + + // Target only summaries that haven't been selected yet + const unusedSummaries = data.summaries + .filter((e) => !selectedSummaries.includes(e)) + .sort(() => Math.random() - 0.5); // Random shuffle + + for (const summary of unusedSummaries) { + const summaryTokens = await tokenizer.tokenizeChat({ + role: "system", + content: summary.text + summarySeparator, + }); + + if ( + summaryTokens + consumedRandomMemoryTokens > + reservedRandomMemoryTokens + ) { + // Trying to select more random memory + continue; + } + + selectedRandomSummaries.push(summary); + consumedRandomMemoryTokens += summaryTokens; + } + + selectedSummaries.push(...selectedRandomSummaries); + + console.log( + "[HypaV3] After random memory selection:", + "\nSummary Count:", + selectedRandomSummaries.length, + "\nSummaries:", + selectedRandomSummaries, + "\nReserved Random Memory Tokens:", + reservedRandomMemoryTokens, + "\nConsumed Random Memory Tokens:", + consumedRandomMemoryTokens + ); + } + // Sort selected summaries chronologically (by index) selectedSummaries.sort( (a, b) => data.summaries.indexOf(a) - data.summaries.indexOf(b) diff --git a/src/ts/storage/database.svelte.ts b/src/ts/storage/database.svelte.ts index 50208b49..3f98c824 100644 --- a/src/ts/storage/database.svelte.ts +++ b/src/ts/storage/database.svelte.ts @@ -474,8 +474,8 @@ export function setDatabase(data:Database){ memoryTokensRatio: data.hypaV3Settings?.memoryTokensRatio ?? 0.2, extraSummarizationRatio: data.hypaV3Settings?.extraSummarizationRatio ?? 0.2, maxChatsPerSummary: data.hypaV3Settings?.maxChatsPerSummary ?? 4, + recentMemoryRatio: data.hypaV3Settings?.recentMemoryRatio ?? 0.4, similarMemoryRatio: data.hypaV3Settings?.similarMemoryRatio ?? 0.4, - randomMemoryRatio: data.hypaV3Settings?.randomMemoryRatio ?? 0.2, enableSimilarityCorrection: data.hypaV3Settings?.enableSimilarityCorrection ?? false, preserveOrphanedMemory: data.hypaV3Settings?.preserveOrphanedMemory ?? false } @@ -886,8 +886,8 @@ export interface Database{ memoryTokensRatio: number extraSummarizationRatio: number maxChatsPerSummary: number + recentMemoryRatio: number similarMemoryRatio: number - randomMemoryRatio: number enableSimilarityCorrection: boolean preserveOrphanedMemory: boolean }