src/views/dmx/knowledgeLib/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/dmx/knowledgeLib/test.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/dmx/knowledgeLib/tool.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/dmx/knowledgeLib/index.vue
@@ -6,34 +6,25 @@ <div class="lf-container-top"> <a-input-search :placeholder="$t('cardList.searchInput.placeholder')" style="width: 130px" style="width: 130px;" /> <addKnow @knowledgeData="knowledgeData"></addKnow> </div> <div class="lf-container-down"> <a-scrollbar style="height: 56rem; overflow: auto"> <a-scrollbar style="height:56rem;overflow: auto;"> <div class="tab" v-for="(tab, index) in tabs" :key="index" @click="selectTab(index, tab)" :class="{ active: selectedTab === index }" :class="{ 'active': selectedTab === index }" > {{ tab.name }} <a-popover position="bl"> <icon-more :style="{ position: 'absolute', top: '10px', right: '20px' }" /> <icon-more :style="{position: 'absolute',top:'10px',right:'20px'}"/> <template #content> <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning" > <span style="cursor: pointer; color: #0960bd; font-size: 12px" ><icon-delete />删除</span > <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning"> <span style="cursor: pointer;color: #0960bd;font-size: 12px"><icon-delete />删除</span> </a-popconfirm> </template> </a-popover> @@ -45,12 +36,7 @@ <a-tabs default-active-key="1"> <a-tab-pane key="1" :title="t('dmx.list.DataSet')"> <div class="rt-container-main"> <a-card ref="account" class="general-card" title="" style="padding-top: 20px" > <a-card ref="account" class="general-card" title="" style="padding-top: 20px"> <a-row> <a-col :flex="1" :span="12"> <a-form @@ -60,27 +46,15 @@ label-align="left" > <a-row :gutter="16"> <a-col :span="24" style=" margin-bottom: 10px; display: flex; justify-content: right; " > <a-col :span="24" style="margin-bottom: 10px;display: flex;justify-content: right"> <a-input-search :placeholder=" $t('cardList.searchInput.placeholder') " :placeholder="$t('cardList.searchInput.placeholder')" style="width: 200px; margin-right: 10px" v-model="keywords" @change="search" /> <!--新建--> <add :kbobj="kbobj" @changeFetchData="changeFetchData" /> <add :kbobj="kbobj" @changeFetchData="changeFetchData"/> </a-col> </a-row> </a-form> @@ -107,11 +81,7 @@ </a-col> <a-col :span="12" style=" display: flex; align-items: center; justify-content: end; " style="display: flex; align-items: center; justify-content: end" > <!-- <a-button>--> <!-- <template #icon>--> @@ -120,13 +90,13 @@ <!-- {{ $t('searchTable.operation.download') }}--> <!-- </a-button>--> <a-tooltip :content="$t('searchTable.actions.refresh')"> <div class="action-icon"><icon-refresh size="18" /></div> <div class="action-icon" ><icon-refresh size="18" /></div> </a-tooltip> <a-dropdown @select="handleSelectDensity"> <a-tooltip :content="$t('searchTable.actions.density')"> <div class="action-icon" ><icon-line-height size="18" /></div> <div class="action-icon"><icon-line-height size="18" /></div> </a-tooltip> <template #content> <a-doption @@ -188,7 +158,7 @@ > <template #name="{ record }"> <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> <icon-file style="margin-right: 4px" /> <icon-file style="margin-right: 4px;" /> <!-- <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> <!-- {{record.name}}--> <!-- </span>--> @@ -201,108 +171,59 @@ <!-- <span>{{ parser_ids[record.parser_id]}}</span>--> <!-- </template>--> <template #status="{ record }"> <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)" /> <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)"/> </template> <template #run="{ record }"> <div style="display: flex; align-items: center"> <div style="display: flex;align-items: center;"> <div style="width: 100px"> <a-popover title="Title" v-if="record.run == '3'"> <a-tag :loading="record.loading" :color="'blue'" border >{{ $t('dmx.list.complete') }}</a-tag > <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '1'"> <a-tag :loading="record.loading" :color="'blue'" border >{{ $t('dmx.list.complete') }}</a-tag > <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '2'"> <a-tag :loading="record.loading" :color="'gold'" border >{{ $t('dmx.list.cancel') }}</a-tag > <a-tag :loading="record.loading" :color="'gold'" border>{{$t('dmx.list.cancel')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '0'"> <a-tag :loading="record.loading" :color="'green'" border >{{ $t('dmx.list.NotStarted') }}</a-tag > <a-tag :loading="record.loading" :color="'green'" border>{{$t('dmx.list.NotStarted')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> </div> <div> <a-button type="text" size="large" @click="run(record)" :loading="record.loading" > <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> <template #icon> <icon-sync v-if="record.run == '3'" /> <icon-sync v-if="record.run == '2'" /> <icon-sync style="color: green" v-if="record.run == '1'" /> <icon-play-circle style="color: green" v-if="record.run == '0'" /> <icon-sync style="color: green" v-if="record.run == '1'"/> <icon-play-circle style="color: green" v-if="record.run == '0'"/> </template> </a-button> </div> </div> </template> <template #action="{ record }"> <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> <edit :item="record" @upTabdateItem="upTabdateItem" /> <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)" > <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)"> <a-button type="text" size="small"> <template #icon> <icon-delete /> </template> </a-button> </a-popconfirm> <a-button type="text" size="small" @click="onDownloadDocument(record)" > <a-button type="text" size="small" @click="onDownloadDocument(record)"> <template #icon> <icon-download /> </template> @@ -313,6 +234,7 @@ <icon-eye /> </template> </a-button> </template> </a-table> </a-card> @@ -325,11 +247,7 @@ </a-tab-pane> <a-tab-pane key="3" :title="t('dmx.list.disposition')"> <div class="rt-container-main"> <config ref="configForm" :kbtenantInfo="kbtenantInfo" :kbobj="kbobj" ></config> <config ref="configForm" :kbtenantInfo="kbtenantInfo" :kbobj="kbobj"></config> </div> </a-tab-pane> </a-tabs> @@ -369,7 +287,7 @@ <!-- </div>--> <!-- <a-divider style="margin-top: 10px" />--> <!-- </div>--> <!-- </div> --> </div> </div> <a-modal title=" " v-model:visible="visible" :footer="false" fullscreen> <!-- <docx v-if="documenttype=='docx'" previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> @@ -378,19 +296,10 @@ <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf> </a-modal> </div> </div> </template> <script lang="ts" setup> import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted, } from 'vue'; import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted } from "vue"; import { useI18n } from 'vue-i18n'; import useLoading from '@/hooks/loading'; import { @@ -400,32 +309,27 @@ queryKbDocumentList, deleteKnow, queryKbdetail, queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus, downloadFile, } from '@/api/kbList'; queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus,downloadFile } from "@/api/kbList"; import { Pagination } from '@/types/global'; import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface'; import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; import cloneDeep from 'lodash/cloneDeep'; import Sortable from 'sortablejs'; import add from '@/views/dmx/knowledgeLib/add.vue'; import edit from '@/views/dmx/knowledgeLib/edit.vue'; import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue'; import config from '@/views/dmx/knowledgeLib/config.vue'; import test from '@/views/dmx/knowledgeLib/test.vue'; import tool from '@/views/dmx/knowledgeLib/tool.vue'; import docx from '@/views/dmx/knowledgeLib/components/docx.vue'; import excel from '@/views/dmx/knowledgeLib/components/excel.vue'; import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue'; import { Message } from '@arco-design/web-vue'; import { parseTime } from '@/utils'; import add from '@/views/dmx/knowledgeLib/add.vue' import edit from '@/views/dmx/knowledgeLib/edit.vue' import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue' import config from '@/views/dmx/knowledgeLib/config.vue' import test from '@/views/dmx/knowledgeLib/test.vue' import tool from '@/views/dmx/knowledgeLib/tool.vue' import docx from '@/views/dmx/knowledgeLib/components/docx.vue' import excel from '@/views/dmx/knowledgeLib/components/excel.vue' import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue' import { Message } from "@arco-design/web-vue"; import { parseTime } from "@/utils"; type SizeProps = 'mini' | 'small' | 'medium' | 'large'; type Column = TableColumnData & { checked?: true }; const account = ref(null); const account = ref(null) const generateFormModel = () => { return { number: '', @@ -444,33 +348,32 @@ const showColumns = ref<Column[]>([]); const size = ref<SizeProps>('medium'); let visible = ref(false); let keywords = ref(''); let detailsShow = ref(false); let selectedTab = ref(0); let testForm = ref(null); let configForm = ref(null); let documenttype = ref('docx'); let previewSrc = ref(''); let kbId = ref(''); let kbobj = reactive({}); let kbdetail = reactive({}); let parser_ids = reactive({}); let seeObj = reactive({}); let visible = ref(false) let keywords = ref('') let detailsShow = ref(false) let selectedTab = ref(0) let testForm = ref(null) let configForm = ref(null) let documenttype = ref('docx') let previewSrc = ref('') let kbId = ref('') let kbobj = reactive({}) let kbdetail = reactive({}) let parser_ids = reactive({}) let seeObj = reactive({}) let kbtenantInfo = reactive({ asr_id: 'paraformer-realtime-8k-v1', embd_id: 'BAAI/bge-large-zh-v1.5', img2txt_id: 'qwen-vl-max', llm_id: 'qwen-plus', name: 'wanghao‘s Kingdom', parser_ids: 'naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One', rerank_id: 'BAAI/bge-reranker-v2-m3', role: 'owner', tenant_id: '948fc6fa41ab11ef8fb80242ac120004', parser_idObj: {}, }); let tabs = ref([]); "asr_id": "paraformer-realtime-8k-v1", "embd_id": "BAAI/bge-large-zh-v1.5", "img2txt_id": "qwen-vl-max", "llm_id": "qwen-plus", "name": "wanghao‘s Kingdom", "parser_ids": "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One", "rerank_id": "BAAI/bge-reranker-v2-m3", "role": "owner", "tenant_id": "948fc6fa41ab11ef8fb80242ac120004", parser_idObj:{} }) let tabs = ref([]) const selectTab = (index, item) => { selectedTab.value = index; @@ -482,9 +385,9 @@ fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); }; page_size: 20 }) } const basePagination: Pagination = { current: 1, @@ -525,7 +428,7 @@ title: t('dmx.column.UploadTime'), dataIndex: 'create_time', slotName: 'create_time', width: 200, width:200 }, { title: t('解析方法'), @@ -615,6 +518,7 @@ kbdetail = await queryKbdetail({ kb_id: params.kb_id, }); } } catch (err) { // you can report use errorHandler or other @@ -628,19 +532,21 @@ kb_id: kbobj.id, page: 1, page_size: 20, keywords: keywords.value, }); keywords:keywords.value }) }; const handleClick = () => { visible.value = true; }; } const onPageChange = (current: number) => { fetchData({ ...basePagination, current }); }; const knowledgeData = async (params = { page: 1, page_size: 20 }) => { const knowledgeData = async ( params = { page: 1, page_size: 20 } ) => { setLoading(true); try { const { data } = await queryKbList(params); @@ -648,15 +554,15 @@ tabs.value = data; console.log(tabs.value, 'tabs'); if (tabs.value.length > 0 && tabs.value[0]) { kbobj = tabs.value[0]; kbobj = tabs.value[0] kbId = kbobj.id; testForm.value.changekbid(kbId); configForm.value.changekbObj(kbobj); fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); page_size: 20 }) } // renderData.value = data.list; // console.log(renderData, 'renderData'); @@ -671,13 +577,13 @@ const deleteKnowledge = async (id) => { let data = await deleteKnow({ kb_id: id, }); kb_id:id }) if (data.code == 0) { Message.success('删除成功'); knowledgeData(); knowledgeData() } }; } const reset = () => { formModel.value = generateFormModel(); }; @@ -737,15 +643,17 @@ }; const fileClick = () => { detailsShow.value = true; }; detailsShow.value = true } const goBackClick = () => { detailsShow.value = false; }; detailsShow.value = false } function upTabdateItem(id, newName) { console.log(id, newName); const itemToUpdate = renderData.value.find((item) => item.id === id); const itemToUpdate = renderData.value.find(item => item.id === id); if (itemToUpdate) { itemToUpdate.name = newName; } @@ -753,70 +661,70 @@ const deleteItem = async (row) => { console.log(row); let data = await kbdocumentrm({ doc_id: row.id }); let data = await kbdocumentrm({doc_id: row.id}) if (data.code == 0) { Message.success('删除成功'); console.log(kbobj, 'kbobj'); fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); page_size: 20 }) } }; } const onDownloadDocument = async (record) => { console.log(record); downloadFile({ url: `/api/v1/document/get/${record.id}`, filename: record.name, }); }; } const seeload = async (row) => { Object.assign(seeObj, row); Object.assign(seeObj, row) // console.log(seeObj.name, 'seeObj'); let type = row.name.split('.')[1]; console.log(type); if (type == 'pdf') { documenttype.value = 'txtPdf'; documenttype.value = 'txtPdf' } else if (type == 'docx') { documenttype.value = 'docx'; documenttype.value = 'docx' } else if (type == 'xlsx') { documenttype.value = 'excel'; documenttype.value = 'excel' } else if (type == 'txt') { documenttype.value = 'txtPdf'; documenttype.value = 'txtPdf' } else { return false; return false } previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${ row.id }`; previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${row.id}` visible.value = true; }; } const handleChangeStatus = async (row) => { console.log(row); let data = await kbdocumentchangeStatus({ doc_id: row.id, status: row.status, }); status: row.status }) if (data.code == 0) { Message.success('操作成功'); } }; } const run = async (row) => { console.log(row); row.loading = true; let run = '1'; let run = '1' if (row.run != '2') { run = '1'; run = '1' } else { run = '2'; run = '2' } let data = await kbdocumentrun({ doc_ids: [row.id], run: run, }); run: run }) if (data.code == 0) { Message.success('解析成功'); row.run = '3'; @@ -825,15 +733,15 @@ row.run = '1'; } row.loading = false; }; } const changeFetchData = async (row) => { fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); }; page_size: 20 }) } watch( () => columns.value, (val) => { @@ -847,16 +755,21 @@ { deep: true, immediate: true } ); onBeforeMount(() => {}); onBeforeMount(()=>{ }) onMounted(() => { knowledgeData(); }); knowledgeData() }) </script> <script lang="ts"> export default { name: 'SearchTable', methods: {}, methods: { } }; </script> @@ -872,7 +785,7 @@ flex-direction: column; align-items: center; justify-content: space-evenly; background: var(--color-neutral-3); background: #ffffff; width: 200px; .lf-container-top { display: flex; @@ -884,7 +797,7 @@ box-sizing: border-box; width: 90%; //height: 56rem; border: 1px solid var(--color-neutral-3); border: 1px solid #eeeeee; //padding: 10px; margin-bottom: 10px; //.tabs{ @@ -897,7 +810,7 @@ box-sizing: border-box; margin: 10px 10px; padding: 0 10px; //color: var(--color-text-1); color: rgba(0, 0, 0, 0.88); font-size: 14px; height: 40px; line-height: 40px; @@ -909,20 +822,13 @@ } .tab:hover { border: 1px solid #ffffff; color: #000000; background: #e8e8ea; box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); } .tab.active { border: 1px solid #e8e8ea; background: #e8e8ea; color: #000000; cursor: pointer; box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); } } } @@ -941,7 +847,7 @@ left: 0; width: 100%; height: 100%; //background: #ffffff; background: #ffffff; .details-header { display: flex; justify-content: space-between; src/views/dmx/knowledgeLib/test.vue
@@ -1,51 +1,24 @@ <template> <div class="main-container"> <div class="main-container-lf"> <div class="main-container-lf-top">检索测试</div> <div class="main-container-lf-down"> <div style="color: #999" >最后一步! 成功后,剩下的就交给Infiniflow AI吧。</div > <div style="color: #999;">最后一步! 成功后,剩下的就交给Infiniflow AI吧。</div> <a-divider style="margin-top: 10px" /> <a-form ref="formRef" :model="form" :style="{ width: '100%' }" layout="vertical" @submit="handleSubmit" > <a-form ref="formRef" :model="form" :style="{width:'100%'}" layout="vertical" @submit="handleSubmit"> <a-form-item field="similarity_threshold" label="相似度阈值"> <a-slider v-model="form.similarity_threshold" /> </a-form-item> <a-form-item field="slider" label="关键字相似度权重" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-form-item field="slider" label="关键字相似度权重" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.vector_similarity_weight" /> </a-form-item> <a-form-item field="section" label="Rerank模型" :rules="[{ match: /section one/, message: '请选择' }]" > <a-form-item field="section" label="Rerank模型" :rules="[{match:/section one/,message:'请选择'}]"> <a-space direction="vertical" size="large"> <a-select :size="'large'" v-model="form.rerank_id" :style="{ width: '100%' }" placeholder="请选择 ..." allow-clear > <a-optgroup :label="index" v-for="(item, index) in modelList" :key="index" > <a-select :size="'large'" v-model="form.rerank_id" :style="{width:'100%'}" placeholder="请选择 ..." allow-clear> <a-optgroup :label="index" v-for="(item,index) in modelList" :key=index> <a-option v-for="obj in item" v-for="(obj) in item" :key="obj.fid" :disabled="!obj.available" :value="obj.llm_name" @@ -56,29 +29,14 @@ </a-select> </a-space> </a-form-item> <a-form-item field="slider" label="Top-K" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-form-item field="slider" label="Top-K" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.top_k" :min="1" :max="2048" /> </a-form-item> <a-form-item> <div class="main-container-form-item-extra"> <div class="main-container-form-item-extra-top">测试文本</div> <div class="main-container-form-item-extra-down"> <a-textarea v-model="form.question" style=" height: 10rem; border: 1px solid var(--color-fill-3); border-radius: 4px; " placeholder="" allow-clear /> <a-textarea v-model="form.question" style="height: 10rem;border: 1px solid var(--color-fill-3);border-radius: 4px" placeholder="" allow-clear/> </div> <div class="main-container-form-item-extra-btn"> <a-button type="primary" html-type="submit">测试</a-button> @@ -105,9 +63,9 @@ </template> <script lang="ts" setup> import { onMounted, onBeforeMount, reactive, ref, watch } from 'vue'; import { onMounted, onBeforeMount, reactive, ref, watch } from "vue"; import { Message } from '@arco-design/web-vue'; import { kbretrievalTest, queryModelList } from '@/api/kbList'; import { kbretrievalTest, queryModelList } from "@/api/kbList"; // const props = defineProps(['kbId']) // watch(() => props.kbId, (newValue, oldValue) => { @@ -115,6 +73,7 @@ // },{ // deep:true, // }); let visible = ref(false); let loading = ref(false); @@ -131,6 +90,7 @@ vector_similarity_weight: 30, }); const formatter = (value) => { // return String(Math.round(value / 100)) }; @@ -138,32 +98,34 @@ const handleSubmit = async ({ values, errors }) => { // console.log(props.kbobj, 'props.kbobj'); if (!form.question) { return; return } let formObj = { ...form, kb_id: kbid.value, }; } formObj.similarity_threshold = formObj.similarity_threshold / 100; formObj.vector_similarity_weight = formObj.vector_similarity_weight / 100; const data = await kbretrievalTest(formObj); }; } const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; }; } const handleOpened = (el) => { Object.assign(form, {}); Object.assign(form,{ }); formRef.value.resetFields(); }; } const changekbid = (value) => { kbid.value = value; }; } const queryModel = async (params) => { try { @@ -172,28 +134,37 @@ modelList.value = { BAAI: [data.data.BAAI[1]], Jina: data.data.Jina, youdao: data.data.youdao, youdao: data.data.youdao }; } catch (err) { // you can report use errorHandler or other } finally { } }; defineExpose({ changekbid, }); changekbid }) onBeforeMount(() => { queryModel({}); }); onMounted(() => {}); queryModel({}) }) onMounted(()=>{ }) </script> <script lang="ts"> export default { name: 'config', methods: {}, methods: { } }; </script> <style scoped lang="less"> @@ -206,7 +177,7 @@ width: 30%; height: 100%; //border: 1px solid #cccccc; //background: #ffffff; background: #ffffff; border-radius: 10px; overflow: hidden; &-top { @@ -253,7 +224,7 @@ height: 100%; //background: #626aea; //border: 1px solid #cccccc; //background: #ffffff; background: #ffffff; border-radius: 10px; } } src/views/dmx/knowledgeLib/tool.vue
@@ -1,3 +1,4 @@ <template> <a-button type="text" @click="handleClick" size="small"> <template #icon> @@ -15,125 +16,65 @@ > <a-tabs default-active-key="1"> <a-tab-pane key="1"> <template #title> <icon-calendar /> 解析方法 </template> <template #title> <icon-calendar/> 解析方法 </template> <div style="width: 100%"> <div style="display: flex; align-items: center"> <div> 解析方法: </div> <div style="display: flex;align-items: center;"> <div> 解析方法: </div> <div style="margin-left: 10px"> <a-select v-model="form.parser_id" placeholder="请选择"> <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value" ></a-option> <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value"></a-option> </a-select> </div> </div> <div class="parser"> <a-form ref="formRef" :rules="rules" :model="form" auto-label-width @submit="handleSubmit" > <a-form ref="formRef" :rules="rules" :model="form" auto-label-width @submit="handleSubmit" > <a-divider style="margin-top: 10px" /> <a-form-item field="slider" label="块token数" :rules="[ { type: 'number', min: 1, message: 'slider is min than 1' }, ]" > <a-slider v-model="form.chunk_token_num" :max="1000" show-input /> <a-form-item field="slider" label="块token数" :rules="[{type:'number', min:1,message:'slider is min than 1'}]"> <a-slider v-model="form.chunk_token_num" :max="1000" show-input /> </a-form-item> <a-divider style="margin-top: 10px" /> <a-form-item field="raptor" label="使用召回增强RAPTOR策略"> <a-space direction="vertical" size="large"> <a-switch v-model="form.use_raptor" @change="onChangeRAPTOR" /> <a-switch v-model="form.use_raptor" @change="onChangeRAPTOR" /> </a-space> </a-form-item> <div v-if="form.use_raptor"> <a-form-item field="prompt" label="提示词"> <a-textarea v-model="form.prompt" placeholder="请填写提示词" /> style="height: 10rem;border: 1px solid var(--color-fill-3);border-radius: 4px" placeholder="请填写提示词" /> </a-form-item> <a-form-item field="slider" label="最大token数" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-slider v-model="form.max_token" :min="1" :max="1000" show-input /> <a-form-item field="slider" label="最大token数" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.max_token" :min="1" :max="1000" show-input/> </a-form-item> <a-form-item field="slider" label="阈值" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-form-item field="slider" label="阈值" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.threshold" show-tooltip show-input /> </a-form-item> <a-form-item field="slider" label="最大聚类数" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-form-item field="slider" label="最大聚类数" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.max_cluster" :max="1000" show-input /> </a-form-item> <a-form-item field="slider" label="随机种子" v-model="form.random_seed" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-input-number v-model="form.random_seed" :style="{ width: '300px', marginRight: '1rem', borderRadius: '4px', }" placeholder="请输入" class="input-demo" :min="10" :max="100" /> <a-form-item field="slider" label="随机种子" v-model="form.random_seed" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-input-number v-model="form.random_seed" :style="{width:'300px',marginRight:'1rem',borderRadius:'4px'}" placeholder="请输入" class="input-demo" :min="10" :max="100" /> <a-button type="primary" @click="randomNumber"> <icon-plus /> </a-button> </a-form-item> </div> <a-form-item> <div style="width: 100%; text-align: right"> <a-button @click="visible = false">取消</a-button> <a-button style="margin-left: 10px" type="primary" html-type="submit" >确定</a-button > <a-button style="margin-left: 10px" type="primary" html-type="submit">确定</a-button> </div> </a-form-item> </a-form> @@ -141,40 +82,21 @@ </div> </a-tab-pane> <a-tab-pane key="2"> <template #title> <icon-clock-circle /> 创建解析块 </template> <template #title> <icon-clock-circle/> 创建解析块 </template> <div class="details"> <div class="details-header"> <div style=" display: flex; align-items: center; justify-content: flex-end; " > <a-radio-group v-model="radio" type="button" style="margin-right: 10px" @change="onRadioChange" > <div style="display: flex; align-items: center;justify-content: flex-end;"> <a-radio-group v-model="radio" type="button" style="margin-right: 10px" @change="onRadioChange"> <a-radio value="1">全文</a-radio> <a-radio value="2">省略</a-radio> </a-radio-group> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px" >批量<icon-down style="margin-left: 4px" /></a-button> <a-button type="outline" class="button" style="margin-right: 10px;">批量<icon-down style="margin-left: 4px" /></a-button> <template #content> <a-space direction="vertical"> <a-checkbox :model-value="checkedAll" :indeterminate="indeterminate" @change="handleChangeAll" style="margin-left: 10px" > <a-checkbox :model-value="checkedAll" :indeterminate="indeterminate" @change="handleChangeAll" style="margin-left: 10px"> 选择所有 </a-checkbox> </a-space> @@ -206,29 +128,15 @@ </p> </template> </a-popover> <a-button type="outline" class="button" style="margin-right: 10px" > <a-button type="outline" class="button" style="margin-right: 10px"> <template #icon> <icon-search /> </template> </a-button> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px" ><icon-sort /></a-button> <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button> <template #content> <a-radio-group v-model="available_int" direction="vertical" size="large" @change="onChangeavailable" > <a-radio-group v-model="available_int" direction="vertical" size="large" @change="onChangeavailable"> <a-radio value="">所有</a-radio> <a-radio value="1">启用</a-radio> <a-radio value="0">禁用</a-radio> @@ -241,16 +149,9 @@ <a-divider style="margin-top: 10px" /> <div class="groupMain"> <a-checkbox-group v-model="data" @change="handleChange"> <div class="groupList" :style="{ background: keyBg == '1' ? '#eff8ff' : 'white' }" > <div class="groupList" :style="{background:keyBg=='1'?'#eff8ff':'white'}"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)" > <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)"> 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 @@ -259,71 +160,22 @@ 且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </div> </a-checkbox-group> </div> <a-divider style="margin-top: 10px" /> <div class="groupMain"> <a-checkbox-group v-model="data" @change="handleChange"> <div class="groupList"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)" > 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 特定旧版本的兼容性或安全性支持的用户有用,但一般不 推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能 且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()"/> </div> </div> <div class="groupList"> <div class="groupList" :style="{background:keyBg=='2'?'#eff8ff':'white'}"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('2')" @dblclick="contentClick(1)" > <div class="groupList-content" @click="groupListContentClick('2')" @dblclick="contentClick(1)"> 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()"/> </div> </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </a-checkbox-group> </div> </div> @@ -334,23 +186,23 @@ </template> <script lang="ts" setup> import { onMounted, onBeforeMount, reactive, ref, computed } from 'vue'; import { Message } from '@arco-design/web-vue'; import { kbdocumentchangeparser } from '@/api/kbList'; import addDetails from '@/views/dmx/knowledgeLib/addDetails.vue'; import eidtDetails from '@/views/dmx/knowledgeLib/eidtDetails.vue'; import { onMounted, onBeforeMount, reactive, ref, computed } from "vue"; import { Message } from "@arco-design/web-vue"; import {kbdocumentchangeparser} from "@/api/kbList"; import addDetails from '@/views/dmx/knowledgeLib/addDetails.vue' import eidtDetails from '@/views/dmx/knowledgeLib/eidtDetails.vue' const visible = ref(false); const loading = ref(false); const radio = ref('1'); const keyBg = ref(''); const eidtDil = ref(); const props = defineProps(['kbtenantInfo', 'item', 'kbdetail']); const props = defineProps(['kbtenantInfo','item','kbdetail']) // const emit = defineEmits(['upTabdateItem']) let threshold = computed(() => { return form.threshold / 100; }); }) const kbtenantInfo = props.kbtenantInfo; @@ -372,8 +224,7 @@ chunk_token_num: 128, use_raptor: false, pages: {}, prompt: '请总结以下段落。 小心数字,不要编造。 段落如下:\n' + prompt: '请总结以下段落。 小心数字,不要编造。 段落如下:\n' + ' {cluster_content}\n' + '以上就是你需要总结的内容。', }); @@ -385,9 +236,9 @@ message: '提示词不允许为空', }, ], }; } const formatter = (value) => { return value / 100; return value / 100 }; function randomNumber() { // 生成一个介于min和max之间的随机整数(包含min和max) @@ -411,9 +262,11 @@ random_seed: form.random_seed, }, chunk_token_num: form.chunk_token_num, pages: [], }, }); pages: [ ] } }) if (data.code == 0) { Message.success('配置成功'); } else { @@ -421,18 +274,18 @@ } visible.value = false; } }; } const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; }; } const contentClick = (done) => { eidtDil.value.handleClick(); }; } const handleOpened = (el) => { // console.log('props',props.kbtenantInfo); // console.log('props',props.item); @@ -446,56 +299,76 @@ // }); // formRef.value.resetFields(); console.log(props.item.id); } const onChangeRAPTOR = () => { }; const onChangeRAPTOR = () => {}; const indeterminate = ref(false); const checkedAll = ref(false); const data = ref([]); const switchType = ref(false); const available_int = ref(''); const indeterminate = ref(false) const checkedAll = ref(false) const data = ref([]) const switchType = ref(false) const available_int = ref('') const onRadioChange = () => { console.log(radio.value); }; const handleChangeAll = (value) => { indeterminate.value = false; if (value) { checkedAll.value = true; data.value = ['1', '2', '3']; data.value = ['1', '2', '3'] } else { checkedAll.value = false; data.value = []; data.value = [] } }; } const handleChange = (values) => { if (values.length === 3) { checkedAll.value = true; checkedAll.value = true indeterminate.value = false; } else if (values.length === 0) { checkedAll.value = false; checkedAll.value = false indeterminate.value = false; } else { checkedAll.value = false; checkedAll.value = false indeterminate.value = true; } }; } const groupListContentClick = (value) => { keyBg.value = value; }; } const onChangeavailable = () => { console.log(available_int.value); }; } const handleChangeStatus = () => { console.log(switchType.value); }; } onBeforeMount(() => {}); onMounted(() => {}); onBeforeMount(()=>{ }) onMounted(()=>{ }) </script> <style scoped lang="less"> @@ -515,39 +388,6 @@ overflow: auto; display: flex; justify-content: center; .groupList { display: flex; padding: 24px; border-radius: 8px; //background: #eff8ff; border: 1px solid var(--color-neutral-3); margin-bottom: 20px; overflow: auto; .groupList-content { width: 700px; //height: 100px; overflow: auto; box-sizing: border-box; margin: 0; padding: 0; color: var(--color-text-1); font-size: 14px; font-family: Inter; position: relative; } } .groupMain { width: 100%; height: 500px; overflow: auto; display: flex; justify-content: center; .groupList { display: flex; padding: 24px; @@ -556,7 +396,6 @@ border: 1px solid #f0f0f0; margin-bottom: 20px; overflow: auto; .groupList-content { width: 700px; //height: 100px; @@ -568,7 +407,8 @@ font-size: 14px; font-family: Inter; position: relative; } } } }