Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
worker.js 1.84 KiB
import {
initializeModel,
calcFAQEmbeddings,
precalcTokenEmbeddings,
semanticSearch,
findBestToken,
getEmbeddingCache,
getTokenEmbeddingCache,
setCaches
} from './modules/semanticSearch.js';
let textData = [];
let faqEmbeddings = [];
self.onmessage = async function (event) {
const { act, query, textData: newtextData, embeddingStack, tokenEmbeddingStack } = event.data;
switch (act) {
case 'initialize':
console.time("calcEmbeddings");
await initializeModel();
textData = newtextData;
setCaches(embeddingStack, tokenEmbeddingStack);
faqEmbeddings = await calcFAQEmbeddings(textData, "qPlusA");
await precalcTokenEmbeddings(textData);
console.timeEnd("calcEmbeddings");
postMessage({ act: 'initialized', embeddingCache: getEmbeddingCache() });
postMessage({ act: 'tokeninit', tokenEmbeddingCache: getTokenEmbeddingCache() });
console.log("Ready");
break;
case 'semanticSearch':
const faqResults = await semanticSearch(query, textData, faqEmbeddings);
const resultsTokenChat = await getResultsWithTokens(faqResults, query);
postMessage({ act: 'searchResults', results: resultsTokenChat, query });
break;
case 'resultsSemantic':
const faqResult = await semanticSearch(query, textData, faqEmbeddings);
const resultsTokenResults = await getResultsWithTokens(faqResult, query);
postMessage({ act: 'topResults', results: resultsTokenResults, query });
break;
}
};
/** extract the best token in side the answer of a panel for a given query */
async function getResultsWithTokens(faqResults, query) {
return await Promise.all(
faqResults.map(async (result) => {
const { bestToken } = await findBestToken(query, result.answer);
return { ...result, bestToken};
})
);
}