Skip to content

Commit 5eb9f6d

Browse files
committed
refactor: qna to interface
1 parent 3cc72c7 commit 5eb9f6d

File tree

6 files changed

+52
-37
lines changed

6 files changed

+52
-37
lines changed

src/lib/ai/langchainWrapper.ts

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,6 @@
1-
import {getOpenAIChat} from 'src/lib/ai/config';
2-
import {ConversationalRetrievalQAChain} from 'langchain/chains';
3-
import {BufferMemory} from 'langchain/memory';
1+
import {useQnaStore} from '../../stores/qnaStore'
42

5-
import {useMultiFileStore} from 'stores/multiFileStore';
6-
7-
8-
9-
const memory = new BufferMemory({
10-
memoryKey: 'chat_history',
11-
inputKey: 'question',
12-
outputKey: 'text',
13-
returnMessages: true
14-
})
15-
16-
const currentVectorStore = () => {
17-
const multiFileStore = useMultiFileStore()
18-
return multiFileStore.vectorStore
19-
}
203

214
export const performVectorStoreQnaDirect = async (args: {question:string}) => {
22-
23-
const model = getOpenAIChat()
24-
const chain = ConversationalRetrievalQAChain.fromLLM(model, currentVectorStore().asRetriever(), {
25-
returnSourceDocuments: true,
26-
memory,
27-
questionGeneratorChainOptions:{
28-
llm: model
29-
}
30-
})
31-
const res = await chain.call(args)
32-
return res
5+
return useQnaStore().performVectorStoreQnaDirect(args)
336
}

src/lib/ai/openaiFacade.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,3 @@ export async function createImage(arg: {request:CreateImageRequest}): Promise<Im
4646
export async function sendChatMessage(arg:{message:string, clientOptions?:any, chatOptions?:any, cache: any}): Promise<ReturnType<typeof sendChatMessageDirect>> {
4747
return await doGeneric(arg, 'sendChatMessage', sendChatMessageDirect)
4848
}
49-
50-
export async function performVectorStoreQna(arg:{question:string}): Promise<ReturnType<typeof performVectorStoreQnaDirect>> {
51-
return await doGeneric(arg, 'performVectorStoreQnaDirect', performVectorStoreQnaDirect)
52-
}

src/pages/RetrievalQnaPage.vue

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<div style="background-color: white; height: 50px"></div>
66
</q-page>
77
<q-page-sticky position="bottom">
8-
<chat-entry v-model="newMessage" @message="sendMessage"></chat-entry>
8+
<chat-entry v-model="newMessage" @message="sendMessage" @reset="onReset"></chat-entry>
99
</q-page-sticky>
1010
</template>
1111

@@ -16,7 +16,7 @@ import {v4} from 'uuid';
1616
import MultiFileManager from 'components/MultiFileManager.vue';
1717
import ChatComponent from 'components/ChatComponent.vue';
1818
import ChatEntry from 'components/ChatEntry.vue';
19-
import {performVectorStoreQna} from 'src/lib/ai/openaiFacade';
19+
import {useQnaStore} from '../stores/qnaStore'
2020
2121
const busy = computed(() => loading.value || multiFileStore.processing)
2222
const loading = ref(false)
@@ -32,13 +32,16 @@ const sendMessage = async () => {
3232
const msg = newMessage.value.trim()
3333
3434
messages.push({id: v4(), message: msg, role: 'User'})
35-
const res = await performVectorStoreQna( {question:msg} )
35+
const res = await useQnaStore().performVectorStoreQna({question:msg})
3636
messages.push({id: v4(), message: res.text, role: 'Other'})
3737
3838
newMessage.value = ''
3939
}
4040
}
4141
42+
const onReset = () => {
43+
44+
}
4245
4346
</script>
4447

src/stores/multiFileStore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,4 @@ export const useMultiFileStore = defineStore('multiFile', {
7474
}
7575
},
7676
})
77+

src/stores/qnaStore.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import {defineStore} from 'pinia'
2+
import {BufferMemory} from 'langchain/memory'
3+
import {markRaw} from 'vue'
4+
import {ConversationalRetrievalQAChain} from 'langchain/chains'
5+
import {getOpenAIChat} from '../lib/ai/config'
6+
import {useMultiFileStore} from './multiFileStore'
7+
8+
const newBufferMemory = () => {
9+
return new BufferMemory({
10+
memoryKey: 'chat_history',
11+
inputKey: 'question',
12+
outputKey: 'text',
13+
returnMessages: true
14+
})
15+
}
16+
17+
export const useQnaStore = defineStore('qnaStore', {
18+
state: () => ({
19+
memory: markRaw(newBufferMemory())
20+
}),
21+
actions: {
22+
async performVectorStoreQna (args: {question:string}) {
23+
const vs = useMultiFileStore().vectorStore
24+
25+
const model = getOpenAIChat()
26+
const memory = this.memory
27+
const chain = ConversationalRetrievalQAChain.fromLLM(model, vs.asRetriever(), {
28+
returnSourceDocuments: true,
29+
memory,
30+
questionGeneratorChainOptions:{
31+
llm: model
32+
}
33+
})
34+
const res = await chain.call(args)
35+
return res
36+
},
37+
resetChat() {
38+
this.memory = markRaw(newBufferMemory())
39+
}
40+
}
41+
})

test/vitest/__tests__/retrieveQna.vitest.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {useMultiFileStore} from 'stores/multiFileStore';
66
import {createPinia, setActivePinia} from 'pinia';
77

88
import {anyBufferToText} from 'src/lib/ai/unstructured';
9+
import {useQnaStore} from 'stores/qnaStore'
910

1011
describe('retrieveQna', () => {
1112
setActivePinia(createPinia())
@@ -37,7 +38,7 @@ describe('retrieveQna', () => {
3738

3839
it('should answer from store', async () => {
3940
const msg = 'What is the answer to the ultimate question?'
40-
const res = await performVectorStoreQna( {question:msg} )
41+
const res = await useQnaStore().performVectorStoreQna( {question:msg} )
4142
expect (res.text).toContain('43')
4243
}, 20000)
4344

0 commit comments

Comments
 (0)