fix: adjust memory selection order

This commit is contained in:
Bo26fhmC5M
2025-01-13 14:09:18 +09:00
parent cfdd5d6bf5
commit a1158ebdb1
3 changed files with 90 additions and 89 deletions

View File

@@ -478,15 +478,15 @@
<span class="text-textcolor">Memory Tokens Ratio</span> <span class="text-textcolor">Memory Tokens Ratio</span>
<SliderInput marginBottom min={0} max={1} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.memoryTokensRatio}/> <SliderInput marginBottom min={0} max={1} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.memoryTokensRatio}/>
<span class="text-textcolor">Extra Summarization Ratio</span> <span class="text-textcolor">Extra Summarization Ratio</span>
<SliderInput marginBottom min={0} max={1-DBState.db.hypaV3Settings.memoryTokensRatio} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.extraSummarizationRatio}/> <SliderInput marginBottom min={0} max={1 - DBState.db.hypaV3Settings.memoryTokensRatio} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.extraSummarizationRatio}/>
<span class="text-textcolor">Max Chats Per Summary</span> <span class="text-textcolor">Max Chats Per Summary</span>
<NumberInput size="sm" marginBottom bind:value={DBState.db.hypaV3Settings.maxChatsPerSummary} min={1} /> <NumberInput size="sm" marginBottom bind:value={DBState.db.hypaV3Settings.maxChatsPerSummary} min={1} />
<span class="text-textcolor">Recent Memory Ratio</span> <span class="text-textcolor">Recent Memory Ratio</span>
<NumberInput size="sm" marginBottom value={parseFloat((1 - DBState.db.hypaV3Settings.similarMemoryRatio - DBState.db.hypaV3Settings.randomMemoryRatio).toFixed(2))} disabled/> <SliderInput marginBottom min={0} max={1} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.recentMemoryRatio}/>
<span class="text-textcolor">Similar Memory Ratio</span> <span class="text-textcolor">Similar Memory Ratio</span>
<SliderInput marginBottom min={0} max={1} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.similarMemoryRatio}/> <SliderInput marginBottom min={0} max={1 - DBState.db.hypaV3Settings.recentMemoryRatio} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.similarMemoryRatio}/>
<span class="text-textcolor">Random Memory Ratio</span> <span class="text-textcolor">Random Memory Ratio</span>
<SliderInput marginBottom min={0} max={1} step={0.01} fixed={2} bind:value={DBState.db.hypaV3Settings.randomMemoryRatio}/> <NumberInput size="sm" marginBottom value={parseFloat((1 - DBState.db.hypaV3Settings.recentMemoryRatio - DBState.db.hypaV3Settings.similarMemoryRatio).toFixed(2))} disabled/>
<div class="flex mb-2"> <div class="flex mb-2">
<Check bind:check={DBState.db.hypaV3Settings.enableSimilarityCorrection} name="Enable Similarity Correction"/> <Check bind:check={DBState.db.hypaV3Settings.enableSimilarityCorrection} name="Enable Similarity Correction"/>
</div> </div>

View File

@@ -228,14 +228,14 @@ export async function hypaMemoryV3(
// Validate settings // Validate settings
if ( if (
db.hypaV3Settings.similarMemoryRatio + db.hypaV3Settings.randomMemoryRatio > db.hypaV3Settings.recentMemoryRatio + db.hypaV3Settings.similarMemoryRatio >
1 1
) { ) {
return { return {
currentTokens, currentTokens,
chats, chats,
error: 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 selectedSummaries: Summary[] = [];
const randomMemoryRatio =
1 -
db.hypaV3Settings.recentMemoryRatio -
db.hypaV3Settings.similarMemoryRatio;
// Select recent summaries // Select recent summaries
const recentMemoryRatio =
1 -
db.hypaV3Settings.similarMemoryRatio -
db.hypaV3Settings.randomMemoryRatio;
const reservedRecentMemoryTokens = Math.floor( const reservedRecentMemoryTokens = Math.floor(
availableMemoryTokens * recentMemoryRatio availableMemoryTokens * db.hypaV3Settings.recentMemoryRatio
); );
let consumedRecentMemoryTokens = 0; let consumedRecentMemoryTokens = 0;
if (recentMemoryRatio > 0) { if (db.hypaV3Settings.recentMemoryRatio > 0) {
const selectedRecentSummaries: Summary[] = []; const selectedRecentSummaries: Summary[] = [];
// Add one by one from the end // Add one by one from the end
@@ -493,90 +493,27 @@ export async function hypaMemoryV3(
); );
} }
// Select random summaries
let reservedRandomMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio
);
let consumedRandomMemoryTokens = 0;
if (db.hypaV3Settings.randomMemoryRatio > 0) {
const selectedRandomSummaries: Summary[] = [];
// Utilize unused token space from recent selection
if (db.hypaV3Settings.similarMemoryRatio === 0) {
const unusedRecentTokens =
reservedRecentMemoryTokens - consumedRecentMemoryTokens;
reservedRandomMemoryTokens += unusedRecentTokens;
console.log(
"[HypaV3] Additional available token space for random 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 // Select similar summaries
if (db.hypaV3Settings.similarMemoryRatio > 0) {
let reservedSimilarMemoryTokens = Math.floor( let reservedSimilarMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio
); );
let consumedSimilarMemoryTokens = 0; let consumedSimilarMemoryTokens = 0;
if (db.hypaV3Settings.similarMemoryRatio > 0) {
const selectedSimilarSummaries: Summary[] = []; const selectedSimilarSummaries: Summary[] = [];
// Utilize unused token space from recent and random selection // Utilize unused token space from recent selection
if (randomMemoryRatio <= 0) {
const unusedRecentTokens = const unusedRecentTokens =
reservedRecentMemoryTokens - consumedRecentMemoryTokens; reservedRecentMemoryTokens - consumedRecentMemoryTokens;
const unusedRandomTokens =
reservedRandomMemoryTokens - consumedRandomMemoryTokens;
reservedSimilarMemoryTokens += unusedRecentTokens + unusedRandomTokens; reservedSimilarMemoryTokens += unusedRecentTokens;
console.log( console.log(
"[HypaV3] Additional available token space for similar memory:", "[HypaV3] Additional available token space for similar memory:",
"\nFrom recent:", "\nFrom recent:",
unusedRecentTokens, unusedRecentTokens
"\nFrom random:",
unusedRandomTokens,
"\nTotal added:",
unusedRecentTokens + unusedRandomTokens
); );
}
// Target only summaries that haven't been selected yet // Target only summaries that haven't been selected yet
const unusedSummaries = data.summaries.filter( const unusedSummaries = data.summaries.filter(
@@ -697,10 +634,10 @@ export async function hypaMemoryV3(
"[HypaV3] Trying to add similar summary:", "[HypaV3] Trying to add similar summary:",
"\nSummary Tokens:", "\nSummary Tokens:",
summaryTokens, summaryTokens,
"\nAvailable Tokens:", "\nReserved Tokens:",
availableSimilarMemoryTokens, reservedSimilarMemoryTokens,
"\nWould exceed:", "\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) // Sort selected summaries chronologically (by index)
selectedSummaries.sort( selectedSummaries.sort(
(a, b) => data.summaries.indexOf(a) - data.summaries.indexOf(b) (a, b) => data.summaries.indexOf(a) - data.summaries.indexOf(b)

View File

@@ -474,8 +474,8 @@ export function setDatabase(data:Database){
memoryTokensRatio: data.hypaV3Settings?.memoryTokensRatio ?? 0.2, memoryTokensRatio: data.hypaV3Settings?.memoryTokensRatio ?? 0.2,
extraSummarizationRatio: data.hypaV3Settings?.extraSummarizationRatio ?? 0.2, extraSummarizationRatio: data.hypaV3Settings?.extraSummarizationRatio ?? 0.2,
maxChatsPerSummary: data.hypaV3Settings?.maxChatsPerSummary ?? 4, maxChatsPerSummary: data.hypaV3Settings?.maxChatsPerSummary ?? 4,
recentMemoryRatio: data.hypaV3Settings?.recentMemoryRatio ?? 0.4,
similarMemoryRatio: data.hypaV3Settings?.similarMemoryRatio ?? 0.4, similarMemoryRatio: data.hypaV3Settings?.similarMemoryRatio ?? 0.4,
randomMemoryRatio: data.hypaV3Settings?.randomMemoryRatio ?? 0.2,
enableSimilarityCorrection: data.hypaV3Settings?.enableSimilarityCorrection ?? false, enableSimilarityCorrection: data.hypaV3Settings?.enableSimilarityCorrection ?? false,
preserveOrphanedMemory: data.hypaV3Settings?.preserveOrphanedMemory ?? false preserveOrphanedMemory: data.hypaV3Settings?.preserveOrphanedMemory ?? false
} }
@@ -886,8 +886,8 @@ export interface Database{
memoryTokensRatio: number memoryTokensRatio: number
extraSummarizationRatio: number extraSummarizationRatio: number
maxChatsPerSummary: number maxChatsPerSummary: number
recentMemoryRatio: number
similarMemoryRatio: number similarMemoryRatio: number
randomMemoryRatio: number
enableSimilarityCorrection: boolean enableSimilarityCorrection: boolean
preserveOrphanedMemory: boolean preserveOrphanedMemory: boolean
} }