|
|
@@ -1,6 +1,6 @@
|
|
|
<template>
|
|
|
<div class="ai-search-container">
|
|
|
- <Sidebar @updateCheckedList="handleUpdateCheckedList" @initSelectedKeys="initSidebar" />
|
|
|
+ <Sidebar :modelList="modelList" @updateCheckedList="handleUpdateCheckedList" />
|
|
|
<div class="content-box" :class="{ 'search-active': searchActive }">
|
|
|
<a-input-search
|
|
|
class="input-search"
|
|
|
@@ -30,7 +30,6 @@
|
|
|
@pageChange="handlePageChange"
|
|
|
@pageSizeChange="handlePageSizeChange"
|
|
|
/>
|
|
|
-
|
|
|
<a-divider />
|
|
|
<a-card v-if="relatedQuestionsData?.length > 0" title="相关问题">
|
|
|
<a-space wrap>
|
|
|
@@ -66,8 +65,7 @@ import MarkdownContent from './MarkdownContent.vue';
|
|
|
import MindMapping from './MindMapping.vue';
|
|
|
import ChunkList from './ChunkList.vue';
|
|
|
import { IconAttachment } from '@arco-design/web-vue/es/icon';
|
|
|
-import { conversationAskPath } from '../../apis/AISearch';
|
|
|
-import { queryKbList } from '../../apis/rgflow-dify';
|
|
|
+import { QueryAllKnowledgeList } from '../../apis/permission/common';
|
|
|
import { useSendMessageWithSse, useTestChunkRetrieval, useFetchRelatedQuestions, useQueryMindmap } from './hooks';
|
|
|
import { isEmpty, trim } from 'lodash';
|
|
|
import { Message } from '../../3rd-libs/arco-vue-libs';
|
|
|
@@ -77,8 +75,6 @@ const searchActive = ref(false);
|
|
|
const drawerVisible = ref(false);
|
|
|
const drawerWidth = ref(1000);
|
|
|
const drawerTitle = ref('思维导图');
|
|
|
-const checkedList = ref([]);
|
|
|
-const checkedWithoutEmbeddingIdList = ref(['da47dcbaea9711ef94400242ac120006']);
|
|
|
const sendingLoading = ref(false);
|
|
|
const isFirstRender = ref(true);
|
|
|
const selectedDocumentIds = ref([]);
|
|
|
@@ -87,21 +83,24 @@ const pagination = reactive({
|
|
|
pageSize: 10
|
|
|
});
|
|
|
const chunkListLoading = ref(false);
|
|
|
-
|
|
|
-const queryKnowledgeList = async () => {
|
|
|
- const knowledgeList = ref([]);
|
|
|
- const {
|
|
|
- data: { kbs }
|
|
|
- } = await queryKbList();
|
|
|
- if (kbs) {
|
|
|
- knowledgeList.value = kbs;
|
|
|
- // checkedWithoutEmbeddingIdList.value = checkedList.value.filter((x) => knowledgeList.value.some((y) => y.id === x));
|
|
|
+const modelList = ref([]);
|
|
|
+const selectedKnowledgeBaseIds = ref([]);
|
|
|
+
|
|
|
+const fetchInitialData = async () => {
|
|
|
+ try {
|
|
|
+ const {
|
|
|
+ data: { rows }
|
|
|
+ } = await QueryAllKnowledgeList();
|
|
|
+ modelList.value = rows;
|
|
|
+ selectedKnowledgeBaseIds.value = rows.map((row) => row.id);
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-onMounted(queryKnowledgeList);
|
|
|
+onMounted(fetchInitialData);
|
|
|
|
|
|
-const { send, answer, done } = useSendMessageWithSse(conversationAskPath);
|
|
|
+const { send, answer, done } = useSendMessageWithSse();
|
|
|
const { chunksData, testChunk } = useTestChunkRetrieval();
|
|
|
const { fetchRelatedQuestions, data: relatedQuestionsData } = useFetchRelatedQuestions();
|
|
|
const { data: mindmapData, loading: mindmapLoading, fetchMindmap } = useQueryMindmap();
|
|
|
@@ -110,11 +109,15 @@ const sendQuestion = async (question) => {
|
|
|
const q = trim(question);
|
|
|
if (isEmpty(q)) return;
|
|
|
|
|
|
+ chunksData.value = { documents: [], chunks: [] };
|
|
|
+ selectedDocumentIds.value = [];
|
|
|
+ relatedQuestionsData.value = [];
|
|
|
+
|
|
|
isFirstRender.value = false;
|
|
|
sendingLoading.value = true;
|
|
|
- send({ kb_ids: checkedWithoutEmbeddingIdList.value, question: q });
|
|
|
+ send({ kb_ids: selectedKnowledgeBaseIds.value, question: q });
|
|
|
testChunk({
|
|
|
- kb_id: checkedWithoutEmbeddingIdList.value,
|
|
|
+ kb_id: selectedKnowledgeBaseIds.value,
|
|
|
highlight: true,
|
|
|
question: q,
|
|
|
page: 1,
|
|
|
@@ -136,7 +139,7 @@ const handleTestChunk = async (documentIds, page = 1, size = 10) => {
|
|
|
|
|
|
chunkListLoading.value = true;
|
|
|
await testChunk({
|
|
|
- kb_id: checkedWithoutEmbeddingIdList.value,
|
|
|
+ kb_id: selectedKnowledgeBaseIds.value,
|
|
|
highlight: true,
|
|
|
question: q,
|
|
|
doc_ids: documentIds ?? selectedDocumentIds.value,
|
|
|
@@ -159,19 +162,11 @@ const handleDocumentClick = (docId, item) => {
|
|
|
const handleFloatingBtnClick = () => {
|
|
|
drawerTitle.value = '思维导图';
|
|
|
drawerVisible.value = true;
|
|
|
-
|
|
|
- fetchMindmap({
|
|
|
- question: searchQuery.value,
|
|
|
- kb_ids: checkedWithoutEmbeddingIdList.value
|
|
|
- });
|
|
|
+ fetchMindmap({ question: searchQuery.value, kb_ids: selectedKnowledgeBaseIds.value });
|
|
|
};
|
|
|
|
|
|
const handleUpdateCheckedList = (newCheckedList) => {
|
|
|
- checkedList.value = newCheckedList;
|
|
|
-};
|
|
|
-
|
|
|
-const initSidebar = (initCheckedList) => {
|
|
|
- checkedList.value = initCheckedList;
|
|
|
+ selectedKnowledgeBaseIds.value = newCheckedList;
|
|
|
};
|
|
|
|
|
|
const onSearch = (value) => {
|
|
|
@@ -180,11 +175,6 @@ const onSearch = (value) => {
|
|
|
Message.warning('请输入想要搜索的内容');
|
|
|
return;
|
|
|
}
|
|
|
- // 清空子组件数据
|
|
|
- chunksData.value.documents = [];
|
|
|
- chunksData.value.chunks = [];
|
|
|
- selectedDocumentIds.value = [];
|
|
|
- relatedQuestionsData.value = [];
|
|
|
|
|
|
sendQuestion(trimmedValue);
|
|
|
searchActive.value = true;
|
|
|
@@ -211,11 +201,10 @@ const handlePageSizeChange = (pageSize) => {
|
|
|
width: 100%;
|
|
|
padding: 16px;
|
|
|
overflow-y: auto;
|
|
|
- width: 100%;
|
|
|
padding: 20px 15% 10px;
|
|
|
transition: padding-top 0.3s ease;
|
|
|
- line-height: 1.6; /* 调整行间距 */
|
|
|
- letter-spacing: 0.5px; /* 调整字间距 */
|
|
|
+ line-height: 1.6;
|
|
|
+ letter-spacing: 0.5px;
|
|
|
}
|
|
|
|
|
|
.content-box.search-active {
|