Refactor chat formatting and fix Harunai Memory

This commit is contained in:
kwaroran
2024-04-23 22:50:44 +09:00
parent 2abd3bf15a
commit 45acd4b6d8
4 changed files with 26 additions and 17 deletions

View File

@@ -721,6 +721,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
content: '', content: '',
} as const } as const
} }
else{
v.content = `<Previous Conversation>${v.content}</Previous Conversation>`
}
return v return v
}).filter((v) => { }).filter((v) => {
return v.content !== '' return v.content !== ''

View File

@@ -13,9 +13,10 @@ export async function hanuraiMemory(chats:OpenAIChat[],arg:{
}){ }){
const db = get(DataBase) const db = get(DataBase)
const tokenizer = arg.tokenizer const tokenizer = arg.tokenizer
const processer = new HypaProcesser('nomic') const processer = new HypaProcesser('MiniLM')
let addTexts:string[] = [] let addTexts:string[] = []
chats.map((chat) => { chats.map((chat) => {
if(!chat?.content?.trim()){ if(!chat?.content?.trim()){
return return
} }
@@ -28,12 +29,14 @@ export async function hanuraiMemory(chats:OpenAIChat[],arg:{
addTexts.push(`search_document: ${split.trim()}`) addTexts.push(`search_document: ${split.trim()}`)
} }
} }
else{
addTexts.push(`search_document: ${chat.content?.trim()}`) addTexts.push(`search_document: ${chat.content?.trim()}`)
}
}) })
processer.addText(addTexts) await processer.addText(addTexts)
let scoredResults:{[key:string]:number} = {} let scoredResults:{[key:string]:number} = {}
for(let i=1;i<5;i++){ for(let i=1;i<4;i++){
const chat = chats[chats.length-i] const chat = chats[chats.length-i]
if(!chat?.content){ if(!chat?.content){
continue continue
@@ -49,37 +52,39 @@ export async function hanuraiMemory(chats:OpenAIChat[],arg:{
} }
} }
} }
const vectorResult = Object.entries(scoredResults).sort((a,b)=>a[1]-b[1]) const vectorResult = Object.entries(scoredResults).sort((a,b)=>b[1]-a[1])
let tokens = arg.currentTokens + db.hanuraiTokens let tokens = arg.currentTokens + db.hanuraiTokens
while(tokens < arg.maxContextTokens){ while(tokens > arg.maxContextTokens){
const poped = chats.pop() const poped = chats.pop()
if(!poped){ if(!poped){
alertError(language.errors.toomuchtoken + "\n\nRequired Tokens: " + tokens) alertError(language.errors.toomuchtoken + "\n\nRequired Tokens: " + tokens)
return false return false
} }
tokens -= await tokenizer.tokenizeChat(chats[0]) tokens -= await tokenizer.tokenizeChat(poped)
} }
tokens -= db.hanuraiTokens tokens -= db.hanuraiTokens
let resultTexts:string[] = [] let resultTexts:string[] = []
for(const vector of vectorResult){ for(const vector of vectorResult){
const chat = chats.find((chat) => chat.content === vector[0].substring(14)) const chat = chats.find((chat) => chat.content === vector[0].substring(16))
if(chat){ if(chat){
continue continue
} }
const tokenized = await tokenizer.tokenizeChat(chat) + 2 const tokenized = await tokenizer.tokenizeChat({
role: 'system',
memo: 'supaMemory',
content: vector[0].substring(16)
}) + 2
tokens += tokenized tokens += tokenized
if(tokens >= arg.maxContextTokens){ if(tokens >= arg.maxContextTokens){
tokens -= tokenized tokens -= tokenized
break break
} }
resultTexts.push(vector[0].substring(14)) resultTexts.push(vector[0].substring(16))
} }
console.log(resultTexts)
chats.unshift({ chats.unshift({
role: "system", role: "system",
memo: "supaMemory", memo: "supaMemory",

View File

@@ -1,5 +1,4 @@
import localforage from "localforage"; import localforage from "localforage";
import { similarity } from "ml-distance";
import { globalFetch } from "src/ts/storage/globalApi"; import { globalFetch } from "src/ts/storage/globalApi";
import { runEmbedding } from "../transformers"; import { runEmbedding } from "../transformers";
@@ -144,7 +143,7 @@ export class HypaProcesser{
const memoryVectors = this.vectors const memoryVectors = this.vectors
const searches = memoryVectors const searches = memoryVectors
.map((vector, index) => ({ .map((vector, index) => ({
similarity: similarity.cosine(query, vector.embedding), similarity: similarity(query, vector.embedding),
index, index,
})) }))
.sort((a, b) => (a.similarity > b.similarity ? -1 : 0)) .sort((a, b) => (a.similarity > b.similarity ? -1 : 0))
@@ -158,10 +157,12 @@ export class HypaProcesser{
} }
similarityCheck(query1:number[],query2: number[]) { similarityCheck(query1:number[],query2: number[]) {
return similarity.cosine(query1, query2) return similarity(query1, query2)
} }
} }
function similarity(a:number[], b:number[]) {
return a.reduce((acc, val, i) => acc + val * b[i], 0);
}
type memoryVector = { type memoryVector = {
embedding:number[] embedding:number[]

View File

@@ -395,7 +395,7 @@ export function setDatabase(data:Database){
data.openrouterProvider ??= '' data.openrouterProvider ??= ''
data.useInstructPrompt ??= false data.useInstructPrompt ??= false
data.hanuraiEnable ??= false data.hanuraiEnable ??= false
data.hanuraiSplit ??= true data.hanuraiSplit ??= false
data.hanuraiTokens ??= 1000 data.hanuraiTokens ??= 1000
changeLanguage(data.language) changeLanguage(data.language)