CzRger 2 weeks ago
parent
commit
4ec3a559c4

+ 3 - 0
src/api/modules/knowledge/document.ts

@@ -29,3 +29,6 @@ export const documentNoArchive = (params) =>
 // 知识库文档删除
 export const documentDocsDelete = (params) =>
   post(`/document/docs/delete`, params, {})
+// 知识库文档分段迁移
+export const documentRemoveDocument = (params) =>
+  post(`/document/removeDocument`, params, {})

+ 44 - 23
src/views/manage/knowledge/documents/document/knowledge-select.vue

@@ -36,7 +36,10 @@ import { ElMessage, ElMessageBox } from 'element-plus'
 import { useAppStore, useDialogStore, useDictionaryStore } from '@/stores'
 import { useRouter } from 'vue-router'
 import { datasetsGetAllByPage } from '@/api/modules/knowledge'
-import { documentRemoveDataset } from '@/api/modules/knowledge/document'
+import {
+  documentRemoveDataset,
+  documentRemoveDocument,
+} from '@/api/modules/knowledge/document'
 
 const router = useRouter()
 const DictionaryStore = useDictionaryStore()
@@ -91,34 +94,52 @@ const onSubmit = () => {
     }
   }
   tips += `迁移至${state.active.name}?`
-  let documentType = ''
-  if (props.transfer.type === 'text') {
-    documentType = 'TEXT_FILE'
-  } else if (props.transfer.type === 'qa') {
-    documentType = 'QA_QUESTION'
-  } else if (props.transfer.type === 'stage') {
-  }
   if (state.active.id) {
     DialogStore.confirm({
       content: tips,
       onSubmit: () => {
         state.loading = true
-        documentRemoveDataset({
-          datasetId: state.active.id,
-          docIds: props.transfer.row
-            ? [props.transfer.row.id]
-            : props.transfer.list.map((v) => v.id),
-          documentType: documentType,
-        })
-          .then(() => {
-            ElMessage.success(`迁移成功!`)
-            emit('update:show', false)
-            emit('refresh')
-          })
-          .catch(() => {})
-          .finally(() => {
-            state.loading = false
+        if (props.transfer.type === 'stage') {
+          // documentRemoveDocument({
+          //   docId: state.active.id,
+          //   docIds: props.transfer.row
+          //     ? [props.transfer.row.id]
+          //     : props.transfer.list.map((v) => v.id),
+          //   documentType: 'TEXT_FILE',
+          // })
+          //   .then(() => {
+          //     ElMessage.success(`迁移成功!`)
+          //     emit('update:show', false)
+          //     emit('refresh')
+          //   })
+          //   .catch(() => {})
+          //   .finally(() => {
+          //     state.loading = false
+          //   })
+        } else {
+          let documentType = ''
+          if (props.transfer.type === 'text') {
+            documentType = 'TEXT_FILE'
+          } else if (props.transfer.type === 'qa') {
+            documentType = 'QA_QUESTION'
+          }
+          documentRemoveDataset({
+            datasetId: state.active.id,
+            docIds: props.transfer.row
+              ? [props.transfer.row.id]
+              : props.transfer.list.map((v) => v.id),
+            documentType: documentType,
           })
+            .then(() => {
+              ElMessage.success(`迁移成功!`)
+              emit('update:show', false)
+              emit('refresh')
+            })
+            .catch(() => {})
+            .finally(() => {
+              state.loading = false
+            })
+        }
       },
     })
   } else {

File diff suppressed because it is too large
+ 32 - 34
src/views/manage/knowledge/documents/document/stage-index.vue


+ 12 - 5
src/views/manage/knowledge/documents/index.vue

@@ -11,11 +11,18 @@
           <div
             class="menu-item __hover"
             :class="{ active: state.menu === item.value }"
-            @click="() => (state.menu = item.value)"
+            @click="
+              () => {
+                state.menu = item.value
+                $router.replace({
+                  name: '78430247-a531-4c8f-8a08-c88e93a836e2',
+                  query: { menu: item.value },
+                })
+              }
+            "
           >
-            <SvgIcon :name="item.icon" :active="state.menu === item.value" />{{
-              item.label
-            }}
+            <SvgIcon :name="item.icon" :active="state.menu === item.value" />
+            {{ item.label }}
           </div>
         </div>
       </template>
@@ -65,7 +72,7 @@ const menus = [
     icon: 'back_1',
     com: defineAsyncComponent(() => import('./test/index.vue')),
   },
-  { label: '设置', value: 'config', icon: 'config' },
+  // { label: '设置', value: 'config', icon: 'config' },
 ]
 const state: any = reactive({
   ID: route.params.id,

+ 10 - 1
src/views/manage/knowledge/documents/test/index.vue

@@ -9,7 +9,14 @@
         <div class="text-main">
           <div class="text-head">
             源文本
-            <div class="__hover">向量检索</div>
+            <el-popover :width="800" trigger="click">
+              <template #reference>
+                <div class="__hover">向量检索</div>
+              </template>
+              <div>
+                <modelConfig :index-method="false" :embedding="false" />
+              </div>
+            </el-popover>
           </div>
           <div class="text-content">
             <CzrFormColumn
@@ -98,6 +105,7 @@
 <script setup lang="ts">
 import { getCurrentInstance, onMounted, reactive, ref } from 'vue'
 import { v4 } from 'uuid'
+import modelConfig from '@/views/manage/knowledge/model-config.vue'
 
 const emit = defineEmits([])
 const props = defineProps({
@@ -162,6 +170,7 @@ const onPage = (pageNum, pageSize) => {
 onMounted(() => {
   initBack()
   onPage(1, 10)
+  console.log(props.knowledge)
 })
 </script>
 

+ 146 - 132
src/views/manage/knowledge/model-config.vue

@@ -1,5 +1,5 @@
 <template>
-  <template v-if="state.indexMethod.show">
+  <template v-if="indexMethod">
     <div class="__czr-title_1 mb-[0.5rem]">索引方式</div>
     <div class="flex w-full gap-[1rem]">
       <div
@@ -62,7 +62,7 @@
       />使用高质量模式进行嵌入后,无法切换回经济模式。
     </div>
   </template>
-  <template v-if="state.embedding.show">
+  <template v-if="embedding">
     <div class="__czr-title_1 mb-[0.5rem]">Embedding 模型</div>
     <CzrFormColumn
       required
@@ -75,7 +75,7 @@
       :clearable="false"
     />
   </template>
-  <template v-if="state.searchMethod.show">
+  <template v-if="searchMethod">
     <div class="__czr-title_1">检索方式</div>
     <div
       class="mt-[1rem] w-full cursor-pointer rounded-[var(--czr-gap)] bg-[#ffffff]"
@@ -534,7 +534,11 @@ import { ElMessage } from 'element-plus'
 
 const DictionaryStore = useDictionaryStore()
 const emit = defineEmits([])
-const props = defineProps({})
+const props = defineProps({
+  indexMethod: { default: true },
+  embedding: { default: true },
+  searchMethod: { default: true },
+})
 const { proxy }: any = getCurrentInstance()
 enum SearchMethodType {
   Vector = 'VECTOR',
@@ -545,15 +549,12 @@ const state: any = reactive({
   optionsEmbedding: [],
   optionsRerank: [],
   indexMethod: {
-    show: true,
     value: '高质量',
   },
   embedding: {
-    show: true,
     value: '',
   },
   searchMethod: {
-    show: true,
     value: SearchMethodType.Vector,
     [SearchMethodType.Vector]: {
       isRerank: 1,
@@ -595,15 +596,12 @@ const optionsRerankMapCpt = computed(() => {
 })
 const reset = () => {
   state.indexMethod = {
-    show: true,
     value: '高质量',
   }
   state.embedding = {
-    show: true,
     value: '',
   }
   state.searchMethod = {
-    show: true,
     value: SearchMethodType.Vector,
     [SearchMethodType.Vector]: {
       isRerank: 1,
@@ -630,134 +628,150 @@ const reset = () => {
   }
 }
 const getData = () => {
-  const result = {
-    indexingTechnique: state.indexMethod.value,
-    embeddingModelId: state.embedding.value,
-    embeddingModel: optionsEmbeddingMapCpt.value.get(state.embedding.value)
-      .label,
-    indexConfig: {
-      type: state.searchMethod.value,
-    },
+  const result: any = {}
+
+  if (props.indexMethod) {
+    result.indexingTechnique = state.indexMethod.value
   }
-  switch (state.searchMethod.value) {
-    case SearchMethodType.Vector:
-      {
-        result.indexConfig.isRerank =
-          state.searchMethod[SearchMethodType.Vector].isRerank
-        result.indexConfig.rerankTypeId =
-          state.searchMethod[SearchMethodType.Vector].rerank
-        result.indexConfig.rerankType = optionsRerankMapCpt.value.get(
-          state.searchMethod[SearchMethodType.Vector].rerank,
-        ).label
-        result.indexConfig.topK =
-          state.searchMethod[SearchMethodType.Vector].topK
-        result.indexConfig.isScore =
-          state.searchMethod[SearchMethodType.Vector].isScore
-        result.indexConfig.score =
-          state.searchMethod[SearchMethodType.Vector].score
-      }
-      break
-    case SearchMethodType.Global:
-      {
-        result.indexConfig.isRerank =
-          state.searchMethod[SearchMethodType.Global].isRerank
-        result.indexConfig.rerankTypeId =
-          state.searchMethod[SearchMethodType.Global].rerank
-        result.indexConfig.rerankType = optionsRerankMapCpt.value.get(
-          state.searchMethod[SearchMethodType.Global].rerank,
-        ).label
-        result.indexConfig.topK =
-          state.searchMethod[SearchMethodType.Global].topK
-        result.indexConfig.isScore =
-          state.searchMethod[SearchMethodType.Global].isScore
-        result.indexConfig.score =
-          state.searchMethod[SearchMethodType.Global].score
-      }
-      break
-    case SearchMethodType.Mix:
-      {
-        result.indexConfig.weightRerank =
-          state.searchMethod[SearchMethodType.Mix].indexMethod
-        result.indexConfig.semantics =
-          state.searchMethod[SearchMethodType.Mix].weight
-        result.indexConfig.keyword =
-          1 - state.searchMethod[SearchMethodType.Mix].weight
-        result.indexConfig.rerankTypeId =
-          state.searchMethod[SearchMethodType.Mix].rerank
-        result.indexConfig.rerankType =
-          optionsRerankMapCpt.value.get(
-            state.searchMethod[SearchMethodType.Mix].rerank,
-          )?.label || ''
-        result.indexConfig.topK = state.searchMethod[SearchMethodType.Mix].topK
-        result.indexConfig.isScore =
-          state.searchMethod[SearchMethodType.Mix].isScore
-        result.indexConfig.score =
-          state.searchMethod[SearchMethodType.Mix].score
-      }
-      break
+  if (props.embedding) {
+    result.embeddingModelId = state.embedding.value
+    result.embeddingModel = optionsEmbeddingMapCpt.value.get(
+      state.embedding.value,
+    ).label
+  }
+  if (props.searchMethod) {
+    result.indexConfig = {
+      type: state.searchMethod.value,
+    }
+    switch (state.searchMethod.value) {
+      case SearchMethodType.Vector:
+        {
+          result.indexConfig.isRerank =
+            state.searchMethod[SearchMethodType.Vector].isRerank
+          result.indexConfig.rerankTypeId =
+            state.searchMethod[SearchMethodType.Vector].rerank
+          result.indexConfig.rerankType = optionsRerankMapCpt.value.get(
+            state.searchMethod[SearchMethodType.Vector].rerank,
+          ).label
+          result.indexConfig.topK =
+            state.searchMethod[SearchMethodType.Vector].topK
+          result.indexConfig.isScore =
+            state.searchMethod[SearchMethodType.Vector].isScore
+          result.indexConfig.score =
+            state.searchMethod[SearchMethodType.Vector].score
+        }
+        break
+      case SearchMethodType.Global:
+        {
+          result.indexConfig.isRerank =
+            state.searchMethod[SearchMethodType.Global].isRerank
+          result.indexConfig.rerankTypeId =
+            state.searchMethod[SearchMethodType.Global].rerank
+          result.indexConfig.rerankType = optionsRerankMapCpt.value.get(
+            state.searchMethod[SearchMethodType.Global].rerank,
+          ).label
+          result.indexConfig.topK =
+            state.searchMethod[SearchMethodType.Global].topK
+          result.indexConfig.isScore =
+            state.searchMethod[SearchMethodType.Global].isScore
+          result.indexConfig.score =
+            state.searchMethod[SearchMethodType.Global].score
+        }
+        break
+      case SearchMethodType.Mix:
+        {
+          result.indexConfig.weightRerank =
+            state.searchMethod[SearchMethodType.Mix].indexMethod
+          result.indexConfig.semantics =
+            state.searchMethod[SearchMethodType.Mix].weight
+          result.indexConfig.keyword =
+            1 - state.searchMethod[SearchMethodType.Mix].weight
+          result.indexConfig.rerankTypeId =
+            state.searchMethod[SearchMethodType.Mix].rerank
+          result.indexConfig.rerankType =
+            optionsRerankMapCpt.value.get(
+              state.searchMethod[SearchMethodType.Mix].rerank,
+            )?.label || ''
+          result.indexConfig.topK =
+            state.searchMethod[SearchMethodType.Mix].topK
+          result.indexConfig.isScore =
+            state.searchMethod[SearchMethodType.Mix].isScore
+          result.indexConfig.score =
+            state.searchMethod[SearchMethodType.Mix].score
+        }
+        break
+    }
   }
   return result
 }
 const init = ({ indexingTechnique, embeddingModelId, indexConfig }) => {
   reset()
-  state.indexMethod.value = indexingTechnique
-  state.embedding.value = embeddingModelId
-  state.searchMethod.value = indexConfig.type
-  switch (state.searchMethod.value) {
-    case SearchMethodType.Vector:
-      {
-        state.searchMethod[SearchMethodType.Vector].isRerank = Number(
-          indexConfig.isRerank,
-        )
-        state.searchMethod[SearchMethodType.Vector].rerank =
-          indexConfig.rerankTypeId
-        state.searchMethod[SearchMethodType.Vector].topK = Number(
-          indexConfig.topK,
-        )
-        state.searchMethod[SearchMethodType.Vector].isScore = Number(
-          indexConfig.isScore,
-        )
-        state.searchMethod[SearchMethodType.Vector].score = Number(
-          indexConfig.score,
-        )
-      }
-      break
-    case SearchMethodType.Global:
-      {
-        state.searchMethod[SearchMethodType.Global].isRerank = Number(
-          indexConfig.isRerank,
-        )
-        state.searchMethod[SearchMethodType.Global].rerank =
-          indexConfig.rerankTypeId
-        state.searchMethod[SearchMethodType.Global].topK = Number(
-          indexConfig.topK,
-        )
-        state.searchMethod[SearchMethodType.Global].isScore = Number(
-          indexConfig.isScore,
-        )
-        state.searchMethod[SearchMethodType.Global].score = Number(
-          indexConfig.score,
-        )
-      }
-      break
-    case SearchMethodType.Mix:
-      {
-        state.searchMethod[SearchMethodType.Mix].indexMethod =
-          indexConfig.weightRerank
-        state.searchMethod[SearchMethodType.Mix].weight = Number(
-          indexConfig.semantics,
-        )
-        state.searchMethod[SearchMethodType.Mix].rerank =
-          indexConfig.rerankTypeId
-        state.searchMethod[SearchMethodType.Mix].topK = Number(indexConfig.topK)
-        state.searchMethod[SearchMethodType.Mix].isScore = Number(
-          indexConfig.isScore,
-        )
-        state.searchMethod[SearchMethodType.Mix].score = Number(
-          indexConfig.score,
-        )
-      }
-      break
+  if (props.indexMethod) {
+    state.indexMethod.value = indexingTechnique
+  }
+  if (props.embedding) {
+    state.embedding.value = embeddingModelId
+  }
+  if (props.searchMethod) {
+    state.searchMethod.value = indexConfig.type
+    switch (state.searchMethod.value) {
+      case SearchMethodType.Vector:
+        {
+          state.searchMethod[SearchMethodType.Vector].isRerank = Number(
+            indexConfig.isRerank,
+          )
+          state.searchMethod[SearchMethodType.Vector].rerank =
+            indexConfig.rerankTypeId
+          state.searchMethod[SearchMethodType.Vector].topK = Number(
+            indexConfig.topK,
+          )
+          state.searchMethod[SearchMethodType.Vector].isScore = Number(
+            indexConfig.isScore,
+          )
+          state.searchMethod[SearchMethodType.Vector].score = Number(
+            indexConfig.score,
+          )
+        }
+        break
+      case SearchMethodType.Global:
+        {
+          state.searchMethod[SearchMethodType.Global].isRerank = Number(
+            indexConfig.isRerank,
+          )
+          state.searchMethod[SearchMethodType.Global].rerank =
+            indexConfig.rerankTypeId
+          state.searchMethod[SearchMethodType.Global].topK = Number(
+            indexConfig.topK,
+          )
+          state.searchMethod[SearchMethodType.Global].isScore = Number(
+            indexConfig.isScore,
+          )
+          state.searchMethod[SearchMethodType.Global].score = Number(
+            indexConfig.score,
+          )
+        }
+        break
+      case SearchMethodType.Mix:
+        {
+          state.searchMethod[SearchMethodType.Mix].indexMethod =
+            indexConfig.weightRerank
+          state.searchMethod[SearchMethodType.Mix].weight = Number(
+            indexConfig.semantics,
+          )
+          state.searchMethod[SearchMethodType.Mix].rerank =
+            indexConfig.rerankTypeId
+          state.searchMethod[SearchMethodType.Mix].topK = Number(
+            indexConfig.topK,
+          )
+          state.searchMethod[SearchMethodType.Mix].isScore = Number(
+            indexConfig.isScore,
+          )
+          state.searchMethod[SearchMethodType.Mix].score = Number(
+            indexConfig.score,
+          )
+        }
+        break
+    }
   }
 }
 onMounted(() => {