zhangxiao
2024-08-07 3cda92d7477b63faf3a2e32d1ba2a92baae53321
fix: 创建解析块
2个文件已修改
503 ■■■■ 已修改文件
src/views/dmx/knowledgeLib/addDetails.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/knowledgeLib/tool.vue 496 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/knowledgeLib/addDetails.vue
@@ -72,7 +72,7 @@
  import { achunkCreate } from '@/api/kbList';
  const props = defineProps(['item']);
  const emit = defineEmits(['canplaythrough']);
  const visible = ref(false);
  const keyVisible = ref(false);
  const loading = ref(false);
@@ -93,13 +93,16 @@
  };
  const handleSubmit = async ({ values, errors }) => {
    console.log(props.item.id);
    if (!errors) {
      const res = await achunkCreate({
        content_with_weight: values.content_with_weight,
        important_kwd: values.important_kwd,
        doc_id: props.item.id,
      });
      if (res.code === 0) {
        visible.value = false;
        emit('canplaythrough');
      }
    }
  };
src/views/dmx/knowledgeLib/tool.vue
@@ -1,4 +1,3 @@
<template>
  <a-button type="text" @click="handleClick" size="small">
    <template #icon>
@@ -16,62 +15,118 @@
  >
      <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数">
                  <a-slider v-model="form.chunk_token_num" :min="0" :max="2048"  show-input />
                <a-slider
                  v-model="form.chunk_token_num"
                  :min="0"
                  :max="2048"
                  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"
                      style="height: 10rem;border: 1px solid  var(--color-fill-3);border-radius: 4px" 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数">
                    <a-slider v-model="form.max_token" :min="0" :max="2048" show-input/>
                  <a-slider
                    v-model="form.max_token"
                    :min="0"
                    :max="2048"
                    show-input
                  />
                  </a-form-item>
                  <a-form-item field="slider" label="阈值" >
                    <a-slider v-model="form.threshold"  :step="0.01" :min="0" :max="1"  show-input/>
                  <a-slider
                    v-model="form.threshold"
                    :step="0.01"
                    :min="0"
                    :max="1"
                    show-input
                  />
                  </a-form-item>
                  <a-form-item field="slider" label="最大聚类数">
                    <a-slider v-model="form.max_cluster" :min="1" :max="1024" show-input/>
                  <a-slider
                    v-model="form.max_cluster"
                    :min="1"
                    :max="1024"
                    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>
@@ -79,27 +134,51 @@
          </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>
                    <a-divider style="margin: 10px 0" />
                    <p>
                      <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(1)"
                    >
                        <template #icon>
                          <icon-check-circle />
                        </template>
@@ -107,7 +186,12 @@
                      </a-button>
                    </p>
                    <p>
                      <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(0)"
                    >
                        <template #icon>
                          <icon-close-circle />
                        </template>
@@ -116,7 +200,12 @@
                    </p>
                    <a-divider style="margin: 10px 0" />
                    <p>
                      <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(3)"
                    >
                        <template #icon>
                          <icon-delete />
                        </template>
@@ -125,55 +214,91 @@
                    </p>
                  </template>
                </a-popover>
                <a-button type="outline" class="button" style="margin-right: 10px">
              <a-space
                direction="vertical"
                size="large"
                style="margin-right: 10px"
                class="space_search"
                v-show="!isBtn"
              >
                <a-input-search
                  :style="{ width: '220px' }"
                  v-model="form.keywords"
                  @input="getList()"
                  allow-clear
                  @clear.stop="getList()"
                  placeholder="搜索"
                />
              </a-space>
              <a-button
                type="outline"
                class="button"
                style="margin-right: 10px"
                v-show="isBtn"
                @click.stop="isBtn = !isBtn"
              >
                  <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 value="">所有</a-radio>
                      <a-radio value="1">启用</a-radio>
                      <a-radio value="0">禁用</a-radio>
                  <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>
                    </a-radio-group>
                  </template>
                </a-popover>
                <addDetails :item="item"></addDetails>
              <addDetails
                :item="item"
                @canplaythrough="canplaythrough"
              ></addDetails>
              </div>
            </div>
            <a-divider style="margin-top: 10px" />
            <div class="groupMain">
            <a-spin :loading="isLoading" :tip="tip">
              <a-checkbox-group v-model="data" @change="handleChange" >
                <div class="groupList" :class="{groupActive:keyBg=='1',groupNoActive:keyBg!='1'}">
                  <a-checkbox  value="1"></a-checkbox>
                  <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)">
                    而 stable version 是最新稳定版,经过充分测试和验证,bug 较少,
                    适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions
                    则是之前发布的稳定版,对于需要
                    特定旧版本的兼容性或安全性支持的用户有用,但一般不
                    推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能
                    且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境
                <div
                  class="groupList"
                  :class="{
                    groupActive: keyBg == '1',
                    groupNoActive: keyBg != '1',
                  }"
                  v-for="(item, index) in listData"
                  :key="index"
                >
                  <a-checkbox :value="item.chunk_id"></a-checkbox>
                  <div
                    class="groupList-content emphaRed"
                    @click="groupListContentClick('1')"
                    @dblclick="contentClick(1)"
                    v-html="item.content_with_weight"
                  >
                  </div>
                  <div class="groupList-right">
                    <a-switch v-model="switchType"  checked-value="1" unchecked-value="0" @change="handleChangeStatus()"/>
                    <a-switch
                      v-model="item.available_int"
                      :checked-value="1"
                      :unchecked-value="0"
                      @change="handleChangeStatus(item)"
                    />
                  </div>
                </div>
                <div class="groupList"  :class="{groupActive:keyBg=='2',groupNoActive:keyBg!='2'}">
                  <a-checkbox  value="1"></a-checkbox>
                  <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()"/>
                  </div>
                </div>
              </a-checkbox-group>
            </a-spin>
            </div>
          </div>
          <eidtDetails ref="eidtDil"></eidtDetails>
@@ -183,23 +308,36 @@
</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,
    watch,
  } from 'vue';
  import { Message } from '@arco-design/web-vue';
  import {
    kbdocumentchangeparser,
    achunkCreate,
    queryChunkList,
    chunkSwitch,
    chunkRm,
  } 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;
@@ -211,17 +349,36 @@
  };
});
  const isBtn = ref(true);
  const closeSlelct = () => {
    window.addEventListener('click', (event) => {
      if (!event.target.closest('.space_search') && !isBtn.value) {
        isBtn.value = true;
        // form.keywords = '';
      }
    });
  };
  watch(isBtn, (val) => {
    if (!val) {
      closeSlelct();
    }
  });
const form = reactive({
  parser_id: props.item.parser_id,
  doc_id: props.item.id,
  max_token: 698,
  threshold: 0.30,
    threshold: 0.3,
  max_cluster: 233,
  random_seed: 1500,
  chunk_token_num: 128,
  use_raptor: false,
    keywords: '',
  pages: {},
  prompt: '请总结以下段落。 小心数字,不要编造。 段落如下:\n' +
    prompt:
      '请总结以下段落。 小心数字,不要编造。 段落如下:\n' +
    '      {cluster_content}\n' +
    '以上就是你需要总结的内容。',
});
@@ -233,9 +390,12 @@
      message:'提示词不允许为空',
    },
  ],
}
  };
  const listData = ref([]);
const formatter = (value) => {
  return value / 100
    return value / 100;
};
  function randomNumber() {
    // 生成一个介于min和max之间的随机整数(包含min和max)
@@ -259,11 +419,9 @@
          random_seed: form.random_seed,
        },
        chunk_token_num: form.chunk_token_num,
        pages: [
        ]
      }
    })
          pages: [],
        },
      });
    if(data.code == 0){
      Message.success('配置成功');
    }else{
@@ -271,18 +429,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);
@@ -296,82 +454,162 @@
  // });
  // 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']
      listData.value.forEach((item) => {
        data.value.push(item.chunk_id);
      });
  } else {
    checkedAll.value = false;
    data.value = []
      data.value = [];
  }
}
  };
const handleChange = (values) => {
  if (values.length === 3) {
    checkedAll.value = true
    indeterminate.value = false;
  } else if (values.length === 0) {
    checkedAll.value = false
    indeterminate.value = false;
  } else {
    checkedAll.value = false
    indeterminate.value = true;
  }
}
    data.value = values;
    // if (values.length === 3) {
    //   checkedAll.value = true;
    //   indeterminate.value = false;
    // } else if (values.length === 0) {
    //   checkedAll.value = false;
    //   indeterminate.value = false;
    // } else {
    //   checkedAll.value = false;
    //   indeterminate.value = true;
    // }
  };
  //批量启用删除禁用
  const addBlock = (type) => {
    if (data.value.length == 0) {
      Message.error('请选择要操作的数据');
      return;
    }
    if (type == 3) {
      deleteChunk();
    } else {
      let params = {
        chunk_ids: data.value,
        available_int: type,
        doc_id: props.item.id,
      };
      chunkSwitch(params).then((res) => {
        if (res.code == 0) {
          Message.success('操作成功');
          getList();
          checkedAll.value = false;
          data.value = [];
        } else {
          Message.error('操作失败');
        }
      });
    }
  };
const groupListContentClick = (value) => {
  keyBg.value = value;
}
  };
const onChangeavailable = ()=>{
  console.log(available_int.value);
    getList();
  };
  const handleChangeStatus = (val) => {
    console.log(val);
    updateChunkStatus(val);
  };
  const isLoading = ref(true);
  // 自定义加载提示文本
  const tip = '加载中,请稍候...';
  //获取列表
  const getList = () => {
    let params = {
      doc_id: props.item.id,
      keywords: form.keywords,
      page: 1,
      size: 10000,
    };
    if (available_int.value !== '') {
      params.available_int = available_int.value;
}
const handleChangeStatus = ()=>{
  console.log(switchType.value);
    queryChunkList(params).then((res) => {
      if (res.code == 0) {
        listData.value = res.data.chunks;
        isLoading.value = false;
        listData.value = listData.value.map((item) => {
          item.available_int = parseInt(item.available_int);
          return item;
        });
}
    });
  };
  //更新列表
  const canplaythrough = () => {
    getList();
  };
onBeforeMount(()=>{
  //启用禁用
  const updateChunkStatus = (val) => {
    let params = {
      chunk_ids: [val.chunk_id],
      available_int: val.available_int,
      doc_id: props.item.id,
    };
    chunkSwitch(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('更新成功');
        getList();
      } else {
        Message.error('更新失败');
      }
    });
  };
})
  //删除
  const deleteChunk = () => {
    let params = {
      chunk_ids: data.value,
      doc_id: props.item.id,
    };
    chunkRm(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('删除成功');
        getList();
      } else {
        Message.error('删除失败');
      }
    });
  };
  onBeforeMount(() => {});
onMounted(()=>{
})
    getList();
  });
</script>
<style scoped lang="less">
.parser{
  width: 100%;
  ::v-deep .arco-btn-outline:hover, .arco-btn-outline, .arco-btn-outline[type='button']{
    ::v-deep .arco-btn-outline:hover,
    .arco-btn-outline,
    .arco-btn-outline[type='button'] {
    color: #2a2a2b;
    border: 1px solid #2a2a2b;
  }
@@ -407,6 +645,10 @@
    }
  }
}
  :deep(.emphaRed em) {
    color: red !important;
  }
.groupActive{
  background: #eff8ff;
}