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

@@ -482,11 +482,11 @@
<span class="text-textcolor">Max Chats Per Summary</span>
<NumberInput size="sm" marginBottom bind:value={DBState.db.hypaV3Settings.maxChatsPerSummary} min={1} />
<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>
<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>
<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">
<Check bind:check={DBState.db.hypaV3Settings.enableSimilarityCorrection} name="Enable Similarity Correction"/>
</div>

View File

@@ -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,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
if (db.hypaV3Settings.similarMemoryRatio > 0) {
let reservedSimilarMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio
);
let consumedSimilarMemoryTokens = 0;
if (db.hypaV3Settings.similarMemoryRatio > 0) {
const selectedSimilarSummaries: Summary[] = [];
// Utilize unused token space from recent and random selection
// Utilize unused token space from recent selection
if (randomMemoryRatio <= 0) {
const unusedRecentTokens =
reservedRecentMemoryTokens - consumedRecentMemoryTokens;
const unusedRandomTokens =
reservedRandomMemoryTokens - consumedRandomMemoryTokens;
reservedSimilarMemoryTokens += unusedRecentTokens + unusedRandomTokens;
reservedSimilarMemoryTokens += unusedRecentTokens;
console.log(
"[HypaV3] Additional available token space for similar memory:",
"\nFrom recent:",
unusedRecentTokens,
"\nFrom random:",
unusedRandomTokens,
"\nTotal added:",
unusedRecentTokens + unusedRandomTokens
unusedRecentTokens
);
}
// Target only summaries that haven't been selected yet
const unusedSummaries = data.summaries.filter(
@@ -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)

View File

@@ -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
}