Skip to content
Snippets Groups Projects
Select Git revision
  • efbc330e2de3cc0eb652a65eda7f7a0ff84e81cf
  • master default protected
2 results

worker.js

Blame
  • 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};
        })
      );
    }