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

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