fix: improve memory token tracking and logging

This commit is contained in:
Bo26fhmC5M
2025-01-12 13:17:56 +09:00
parent 50361d7aa2
commit 85bdf1d544

View File

@@ -283,26 +283,14 @@ export async function hypaMemoryV3(
}; };
} }
const emptyMemoryTokens = await tokenizer.tokenizeChat({
role: "system",
content: encapsulateMemoryPrompt(""),
});
const memoryTokens = maxContextTokens * db.hypaV3Settings.memoryTokensRatio;
const availableMemoryTokens = memoryTokens - emptyMemoryTokens;
const recentMemoryRatio =
1 -
db.hypaV3Settings.similarMemoryRatio -
db.hypaV3Settings.randomMemoryRatio;
let startIdx = 0;
let data: HypaV3Data = {
summaries: [],
};
// Initial token correction // Initial token correction
currentTokens -= db.maxResponse; currentTokens -= db.maxResponse;
// Load existing hypa data if available // Load existing hypa data if available
let data: HypaV3Data = {
summaries: [],
};
if (room.hypaV3Data) { if (room.hypaV3Data) {
data = toHypaV3Data(room.hypaV3Data); data = toHypaV3Data(room.hypaV3Data);
} }
@@ -313,6 +301,8 @@ export async function hypaMemoryV3(
} }
// Determine starting index // Determine starting index
let startIdx = 0;
if (data.summaries.length > 0) { if (data.summaries.length > 0) {
const lastSummary = data.summaries.at(-1); const lastSummary = data.summaries.at(-1);
const lastChatIndex = chats.findIndex( const lastChatIndex = chats.findIndex(
@@ -331,14 +321,34 @@ export async function hypaMemoryV3(
} }
// Reserve memory tokens // Reserve memory tokens
const emptyMemoryTokens = await tokenizer.tokenizeChat({
role: "system",
content: encapsulateMemoryPrompt(""),
});
const memoryTokens = Math.floor(
maxContextTokens * db.hypaV3Settings.memoryTokensRatio
);
const shouldReserveEmptyMemoryTokens = const shouldReserveEmptyMemoryTokens =
data.summaries.length === 0 && data.summaries.length === 0 &&
currentTokens + emptyMemoryTokens <= maxContextTokens; currentTokens + emptyMemoryTokens <= maxContextTokens;
const availableMemoryTokens = shouldReserveEmptyMemoryTokens
? 0
: memoryTokens - emptyMemoryTokens;
if (shouldReserveEmptyMemoryTokens) { if (shouldReserveEmptyMemoryTokens) {
currentTokens += emptyMemoryTokens; currentTokens += emptyMemoryTokens;
console.log(
"[HypaV3] Reserved empty memory tokens:",
"\nTokens:",
emptyMemoryTokens
);
} else { } else {
currentTokens += memoryTokens; currentTokens += memoryTokens;
console.log(
"[HypaV3] Reserved max memory tokens:",
"\nTokens:",
memoryTokens
);
} }
// If summarization is needed // If summarization is needed
@@ -383,6 +393,8 @@ export async function hypaMemoryV3(
startIdx, startIdx,
"\nEnd Index:", "\nEnd Index:",
endIdx, endIdx,
"\nChat Count:",
endIdx - startIdx,
"\nMax Chats Per Summary:", "\nMax Chats Per Summary:",
db.hypaV3Settings.maxChatsPerSummary db.hypaV3Settings.maxChatsPerSummary
); );
@@ -429,8 +441,8 @@ export async function hypaMemoryV3(
"[HypaV3] Attempting summarization:", "[HypaV3] Attempting summarization:",
"\nAttempt:", "\nAttempt:",
summarizationFailures + 1, summarizationFailures + 1,
"\nChat Count:", "\nTarget:",
toSummarize.length toSummarize
); );
const summaryResult = await summary(stringifiedChats); const summaryResult = await summary(stringifiedChats);
@@ -468,14 +480,21 @@ export async function hypaMemoryV3(
currentTokens, currentTokens,
"\nMax Context Tokens:", "\nMax Context Tokens:",
maxContextTokens, maxContextTokens,
"\nMax Memory Tokens:", "\nAvailable Memory Tokens:",
memoryTokens availableMemoryTokens
); );
const selectedSummaries: Summary[] = []; const selectedSummaries: Summary[] = [];
// Select recent summaries // Select recent summaries
let availableRecentMemoryTokens = availableMemoryTokens * recentMemoryRatio; const recentMemoryRatio =
1 -
db.hypaV3Settings.similarMemoryRatio -
db.hypaV3Settings.randomMemoryRatio;
const reservedRecentMemoryTokens = Math.floor(
availableMemoryTokens * recentMemoryRatio
);
let consumedRecentMemoryTokens = 0;
if (recentMemoryRatio > 0) { if (recentMemoryRatio > 0) {
const selectedRecentSummaries: Summary[] = []; const selectedRecentSummaries: Summary[] = [];
@@ -488,12 +507,15 @@ export async function hypaMemoryV3(
content: summary.text + summarySeparator, content: summary.text + summarySeparator,
}); });
if (summaryTokens > availableRecentMemoryTokens) { if (
summaryTokens + consumedRecentMemoryTokens >
reservedRecentMemoryTokens
) {
break; break;
} }
selectedRecentSummaries.push(summary); selectedRecentSummaries.push(summary);
availableRecentMemoryTokens -= summaryTokens; consumedRecentMemoryTokens += summaryTokens;
} }
selectedSummaries.push(...selectedRecentSummaries); selectedSummaries.push(...selectedRecentSummaries);
@@ -504,21 +526,33 @@ export async function hypaMemoryV3(
selectedRecentSummaries.length, selectedRecentSummaries.length,
"\nSummaries:", "\nSummaries:",
selectedRecentSummaries, selectedRecentSummaries,
"\nTokens:", "\nReserved Recent Memory Tokens:",
availableMemoryTokens * recentMemoryRatio - availableRecentMemoryTokens reservedRecentMemoryTokens,
"\nConsumed Recent Memory Tokens:",
consumedRecentMemoryTokens
); );
} }
// Select random summaries // Select random summaries
let availableRandomMemoryTokens = let reservedRandomMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio; availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio
);
let consumedRandomMemoryTokens = 0;
if (db.hypaV3Settings.randomMemoryRatio > 0) { if (db.hypaV3Settings.randomMemoryRatio > 0) {
const selectedRandomSummaries: Summary[] = []; const selectedRandomSummaries: Summary[] = [];
// Utilize available tokens // Utilize unused token space from recent selection
if (db.hypaV3Settings.similarMemoryRatio === 0) { if (db.hypaV3Settings.similarMemoryRatio === 0) {
availableRandomMemoryTokens += availableRecentMemoryTokens; 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 // Target only summaries that haven't been selected yet
@@ -532,13 +566,16 @@ export async function hypaMemoryV3(
content: summary.text + summarySeparator, content: summary.text + summarySeparator,
}); });
if (summaryTokens > availableRandomMemoryTokens) { if (
summaryTokens + consumedRandomMemoryTokens >
reservedRandomMemoryTokens
) {
// Trying to select more random memory // Trying to select more random memory
continue; continue;
} }
selectedRandomSummaries.push(summary); selectedRandomSummaries.push(summary);
availableRandomMemoryTokens -= summaryTokens; consumedRandomMemoryTokens += summaryTokens;
} }
selectedSummaries.push(...selectedRandomSummaries); selectedSummaries.push(...selectedRandomSummaries);
@@ -549,21 +586,37 @@ export async function hypaMemoryV3(
selectedRandomSummaries.length, selectedRandomSummaries.length,
"\nSummaries:", "\nSummaries:",
selectedRandomSummaries, selectedRandomSummaries,
"\nTokens:", "\nReserved Random Memory Tokens:",
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio - reservedRandomMemoryTokens,
availableRandomMemoryTokens "\nConsumed Random Memory Tokens:",
consumedRandomMemoryTokens
); );
} }
// Select similar summaries // Select similar summaries
if (db.hypaV3Settings.similarMemoryRatio > 0) { if (db.hypaV3Settings.similarMemoryRatio > 0) {
let reservedSimilarMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio
);
let consumedSimilarMemoryTokens = 0;
const selectedSimilarSummaries: Summary[] = []; const selectedSimilarSummaries: Summary[] = [];
let availableSimilarMemoryTokens =
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio;
// Utilize available tokens // Utilize unused token space from recent and random selection
availableSimilarMemoryTokens += const unusedRecentTokens =
availableRecentMemoryTokens + availableRandomMemoryTokens; 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 // Target only summaries that haven't been selected yet
const unusedSummaries = data.summaries.filter( const unusedSummaries = data.summaries.filter(
@@ -626,8 +679,8 @@ export async function hypaMemoryV3(
"[HypaV3] Attempting summarization:", "[HypaV3] Attempting summarization:",
"\nAttempt:", "\nAttempt:",
summarizationFailures + 1, summarizationFailures + 1,
"\nChat Count:", "\nTarget:",
recentChats.length recentChats
); );
const summaryResult = await summary(stringifiedRecentChats); const summaryResult = await summary(stringifiedRecentChats);
@@ -691,12 +744,15 @@ export async function hypaMemoryV3(
); );
*/ */
if (summaryTokens > availableSimilarMemoryTokens) { if (
summaryTokens + consumedSimilarMemoryTokens >
reservedSimilarMemoryTokens
) {
break; break;
} }
selectedSimilarSummaries.push(summary); selectedSimilarSummaries.push(summary);
availableSimilarMemoryTokens -= summaryTokens; consumedSimilarMemoryTokens += summaryTokens;
} }
selectedSummaries.push(...selectedSimilarSummaries); selectedSummaries.push(...selectedSimilarSummaries);
@@ -707,9 +763,10 @@ export async function hypaMemoryV3(
selectedSimilarSummaries.length, selectedSimilarSummaries.length,
"\nSummaries:", "\nSummaries:",
selectedSimilarSummaries, selectedSimilarSummaries,
"\nTokens:", "\nReserved Similar Memory Tokens:",
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio - reservedSimilarMemoryTokens,
availableSimilarMemoryTokens "\nConsumed Similar Memory Tokens:",
consumedSimilarMemoryTokens
); );
} }