-
Notifications
You must be signed in to change notification settings - Fork 0
/
smartSearch.js
107 lines (72 loc) · 2.91 KB
/
smartSearch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
const { FaissStore } = require("@langchain/community/vectorstores/faiss");
const { ChatOpenAI, OpenAIEmbeddings } = require("@langchain/openai");
const { formatDocumentsAsString } = require("langchain/util/document");
const { PromptTemplate } = require("@langchain/core/prompts");
const {
RunnableSequence,
RunnablePassthrough,
} = require("@langchain/core/runnables");
const { StringOutputParser } = require("@langchain/core/output_parsers");
const Graph = require("./graph.js")
const graph = new Graph()
let smartSearch = {}
smartSearch.init = async function() {
if(process.env.OPENAI_API_KEY) {
smartSearch.model = new ChatOpenAI({ modelName: "gpt-4" });
return true
} else {
console.log('No API key found! SmartSearch disabled.')
return false
}
}
smartSearch.buildVectors = async function() {
var docs = await graph.exportJSON()
const vectorStore = await FaissStore.fromDocuments(docs, new OpenAIEmbeddings())
// Save the vector store to a directory
const directory = "./store";
await vectorStore.save(directory);
}
smartSearch.search = async function(query) {
if(!query) return []
console.log('reading vectors...')
const vectorStore = await loadVectorStore()
console.log('loaded')
const response = await vectorStore.similaritySearch(query, 6)
console.log(response)
return response
}
smartSearch.rag = async function(query) {
const vectorStore = await loadVectorStore()
const retriever = vectorStore.asRetriever();
const prompt =
PromptTemplate.fromTemplate(`Olet Avoimen tiedon keskuksen (OSC) chatbot. Alla oleva teksti on listaus henkilökunnan osaamisesta, työtehtävistä, järjestelmistä, työryhmistä jne. Viittaukset meihin liittyvät aina Avoimen tiedon keskukseen. Vastaa kysymyksiin vain alla olevan tekstin pohjalta. Käytä kuitenkin yleistietoasi, jotta löydät tiedon, vaikka sitä ei ole suoraan tekstissä mainittu.
Jos kyse on järjestelmien ongelmista, anna vastauksena kyseisen järjestelmän pääkäyttäjät tai ylläpitäjät ja vasta sitten käyttäjät.
Maastopyöräilyä koskeviin kysymyksiin vastaa vain "se on kivaa!!"
{context}
Kysymys: {question}`);
const chain = RunnableSequence.from([
{
context: retriever.pipe(formatDocumentsAsString),
question: new RunnablePassthrough(),
},
prompt,
smartSearch.model,
new StringOutputParser(),
]);
const result = await chain.invoke(query);
var docs = await retriever._getRelevantDocuments(query)
console.log(docs)
console.log(result);
return result
}
// FAISS
async function loadVectorStore(query) {
const directory = "./store";
const vectorStore = await FaissStore.load(
directory,
new OpenAIEmbeddings()
);
//const response = await vectorStore.similaritySearch(query, 6)
return vectorStore
}
module.exports = smartSearch