zhangxiao
2024-08-27 b9bfd6535e15d700f469c25008dfb323e28dbfaa
fix: 修改bug
3个文件已修改
570 ■■■■■ 已修改文件
src/views/dmx/knowledgeLib/test.vue 376 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sessionManager/components/updataFile.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sessionManager/index.vue 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/knowledgeLib/test.vue
@@ -1,202 +1,232 @@
<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>
          <a-divider style="margin-top: 10px" />
          <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" :step="0.01" :min="0" :max="1"  />
            </a-form-item>
            <a-form-item field="slider" label="关键字相似度权重" >
              <a-slider v-model="form.vector_similarity_weight" :step="0.01" :min="0" :max="1"  />
            </a-form-item>
            <a-form-item field="section" label="Rerank模型" >
              <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-option
                      v-for="(obj) in item"
                      :key="obj.fid"
                      :disabled="!obj.available"
                      :value="obj.llm_name"
                    >
                      {{obj.llm_name}}
                    </a-option>
                  </a-optgroup>
                </a-select>
              </a-space>
            </a-form-item>
            <a-form-item field="slider" label="Top-K" v-if="form.rerank_id">
              <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/>
                </div>
                <div class="main-container-form-item-extra-btn">
                  <a-button :disabled="!form.question" :loading="loading" type="primary" html-type="submit">测试</a-button>
                </div>
  <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
        >
        <a-divider style="margin-top: 10px" />
        <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"
              :step="0.01"
              :min="0"
              :max="1"
            />
          </a-form-item>
          <a-form-item field="slider" label="关键字相似度权重">
            <a-slider
              v-model="form.vector_similarity_weight"
              :step="0.01"
              :min="0"
              :max="1"
            />
          </a-form-item>
          <a-form-item field="section" label="Rerank模型">
            <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-option
                    v-for="obj in item"
                    :key="obj.fid"
                    :disabled="!obj.available"
                    :value="obj.llm_name"
                  >
                    {{ obj.llm_name }}
                  </a-option>
                </a-optgroup>
              </a-select>
            </a-space>
          </a-form-item>
          <a-form-item field="slider" label="Top-K" v-if="form.rerank_id">
            <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
                />
              </div>
            </a-form-item>
          </a-form>
        </div>
      </div>
      <div class="main-container-rt">
        <a-collapse style="width: 96%;margin-top: 1rem;margin-left: 2%">
          <a-collapse-item header="0/0 选定的文件" key="3">
            <template #extra>
              <a-tag size="small">命中数</a-tag>
              <a-tag size="small">看法</a-tag>
            </template>
            <div>
              <a-empty />
              <div class="main-container-form-item-extra-btn">
                <a-button
                  :disabled="!form.question"
                  :loading="loading"
                  type="primary"
                  html-type="submit"
                  >测试</a-button
                >
              </div>
            </div>
          </a-collapse-item>
        </a-collapse>
          </a-form-item>
        </a-form>
      </div>
    </div>
    <div class="main-container-rt">
      <a-collapse style="width: 96%; margin-top: 1rem; margin-left: 2%">
        <a-collapse-item header="0/0 选定的文件" key="3">
          <template #extra>
            <a-tag size="small">命中数</a-tag>
            <a-tag size="small">看法</a-tag>
          </template>
          <div>
            <a-empty />
          </div>
        </a-collapse-item>
      </a-collapse>
    </div>
  </div>
</template>
<script lang="ts" setup>
import { onMounted, onBeforeMount, reactive, ref, watch } from "vue";
import { Message } from '@arco-design/web-vue';
import { kbretrievalTest, queryModelList } from "@/api/kbList";
// const props = defineProps(['kbId'])
  import { onMounted, onBeforeMount, reactive, ref, watch } from 'vue';
  import { Message } from '@arco-design/web-vue';
  import { kbretrievalTest, queryModelList } from '@/api/kbList';
  // const props = defineProps(['kbId'])
// watch(() => props.kbId, (newValue, oldValue) => {
//   console.log('kbId 变化了', newValue, oldValue);
// },{
//   deep:true,
// });
  // watch(() => props.kbId, (newValue, oldValue) => {
  //   console.log('kbId 变化了', newValue, oldValue);
  // },{
  //   deep:true,
  // });
let visible = ref(false);
let loading = ref(false);
const formRef = ref(null);
const kbid = ref('');
const modelList = ref({});
let form = reactive({
  page: 1,
  question: '',
  rerank_id: '',
  similarity_threshold: 0.2,
  size: 10,
  top_k: 1024,
  vector_similarity_weight: 0.7,
});
const formatter = (value) => {
  // return String(Math.round(value / 100))
};
const handleSubmit = async ({values, errors}) => {
  // console.log(props.kbobj, 'props.kbobj');
  if (!form.question){
    return
  }
  let formObj = {
    ...form,
    kb_id:kbid.value,
    vector_similarity_weight:(1 - form.vector_similarity_weight).toFixed(2),
  }
  if(!formObj.rerank_id){
    delete formObj.top_k;
    delete formObj.rerank_id;
  }
  try {
    loading.value = true;
    const data = await kbretrievalTest(formObj);
    if(data.code == 0){
      Message.success('测试成功');
    }else{
      Message.error('测试失败');
    }
    loading.value = false;
  }catch (err){
    Message.error(err.message);
    loading.value = false;
  }
}
const handleClick = () => {
  visible.value = true;
};
const handleCancel = () => {
  visible.value = false;
}
const handleOpened =(el) => {
  Object.assign(form,{
  let visible = ref(false);
  let loading = ref(false);
  const formRef = ref(null);
  const kbid = ref('');
  const modelList = ref({});
  let form = reactive({
    page: 1,
    question: '',
    rerank_id: '',
    similarity_threshold: 0.2,
    size: 10,
    top_k: 1024,
    vector_similarity_weight: 0.7,
  });
  formRef.value.resetFields();
}
const changekbid = (value) => {
  console.log(value, 'kbid的value');
  kbid.value = value;
}
  const formatter = (value) => {
    // return String(Math.round(value / 100))
  };
const queryModel = async (params) => {
  try {
    const data = await queryModelList(params);
    // console.log(data.data, '大模型列表');
    modelList.value = {
      BAAI: [data.data.BAAI[1]],
      Jina: data.data.Jina,
      youdao: data.data.youdao
  const handleSubmit = async ({ values, errors }) => {
    // console.log(props.kbobj, 'props.kbobj');
    if (!form.question) {
      return;
    }
    let formObj = {
      ...form,
      kb_id: kbid.value,
      vector_similarity_weight: parseFloat(
        (1 - form.vector_similarity_weight).toFixed(2)
      ),
    };
  } catch (err) {
    // you can report use errorHandler or other
  } finally {
    if (!formObj.rerank_id) {
      delete formObj.top_k;
      delete formObj.rerank_id;
    }
    try {
      loading.value = true;
      const data = await kbretrievalTest(formObj);
      if (data.code == 0) {
        Message.success('测试成功');
      } else {
        Message.error('测试失败');
      }
      loading.value = false;
    } catch (err) {
      Message.error(err.message);
      loading.value = false;
    }
  };
  }
};
  const handleClick = () => {
    visible.value = true;
  };
  const handleCancel = () => {
    visible.value = false;
  };
  const handleOpened = (el) => {
    Object.assign(form, {});
    formRef.value.resetFields();
  };
defineExpose({
  changekbid
})
  const changekbid = (value) => {
    console.log(value, 'kbid的value');
    kbid.value = value;
  };
onBeforeMount(()=>{
  queryModel({})
})
onMounted(()=>{
  const queryModel = async (params) => {
    try {
      const data = await queryModelList(params);
      // console.log(data.data, '大模型列表');
      modelList.value = {
        BAAI: [data.data.BAAI[1]],
        Jina: data.data.Jina,
        youdao: data.data.youdao,
      };
    } catch (err) {
      // you can report use errorHandler or other
    } finally {
    }
  };
  defineExpose({
    changekbid,
  });
})
  onBeforeMount(() => {
    queryModel({});
  });
  onMounted(() => {});
</script>
<script lang="ts">
export default {
  name: 'config',
  methods: {
  }
};
  export default {
    name: 'config',
    methods: {},
  };
</script>
<style scoped lang="less">
  .main-container{
  .main-container {
    display: flex;
    justify-content: space-between;
    height: 100%;
    &-lf{
    &-lf {
      width: 30%;
      height: 100%;
      //border: 1px solid var(--color-fill-3);
      background: var(--color-bg-2);
      border-radius: 10px;
      overflow: auto;
      &-top{
      &-top {
        width: 100%;
        height: 60px;
        line-height: 60px;
@@ -204,38 +234,38 @@
        color: #ffffff;
        text-align: center;
      }
      &-down{
      &-down {
        padding: 20px;
        width: 100%;
      }
    }
    &-form-item-extra{
    &-form-item-extra {
      width: 100%;
      height: 20rem;
      border: 1px solid var(--color-fill-3);
      border-radius: 6px;
      overflow: hidden;
      &-top{
      &-top {
        width: 100%;
        height: 40px;
        line-height: 40px;
        border-bottom: 1px solid  var(--color-fill-3);
        border-bottom: 1px solid var(--color-fill-3);
        //background: rgb(var(--primary-6));
        color: #999999;
        text-align: center;
      }
      &-down{
      &-down {
        width: 92%;
        margin-left: 4%;
        margin-top: 30px;
      }
      &-btn{
      &-btn {
        width: 96%;
        text-align: right;
        margin-top: 1rem;
      }
    }
    &-rt{
    &-rt {
      width: 69%;
      height: 100%;
      //background: #626aea;
@@ -244,4 +274,4 @@
      border-radius: 10px;
    }
  }
</style>
</style>
src/views/sessionManager/components/updataFile.vue
@@ -364,11 +364,12 @@
  const getParseMethodsList = async () => {
    let res = await getParseMethodsListApi();
    parser_ids.value = res.data.map((item) => {
      console.log(item, item.parser_config_str, 78787);
      return {
        name: item.name,
        value: item.id,
        parser_config: '',
        parser_config_str: item.parser_config_str,
        parser_config_str: JSON.stringify(item.formats),
      };
    });
    parser_idsArr.value = res.data;
src/views/sessionManager/index.vue
@@ -78,9 +78,38 @@
                  />
                </template>
                <template #content>
                  <div :class="{ chartUserText: theme === 'light' }"
                    >{{ sessionDetail.content }}
                  <div :class="{ chartUserText: theme === 'light' }">
                    {{ sessionDetail.content }}
                    <!-- <a-input
                      :style="{ width: '100%' }"
                      v-model="sessionDetail.content"
                      v-if="isEdit"
                    />
                    <div v-else>
                      {{ sessionDetail.content }}
                    </div> -->
                  </div>
                  <!-- <div v-if="!isEdit">
                    <span
                      class="action"
                      v-if="index != 0"
                      @click="copy(sessionDetail.content)"
                    >
                      <icon-copy /> 复制
                    </span>
                    <span class="action" @click="edit()">
                      <icon-pen /> 编辑
                    </span>
                  </div>
                  <a-space v-else>
                    <a-button type="outline" size="mini" @click="cancelEdit(1)"
                      >取消</a-button
                    >
                    <a-button type="primary" size="mini" @click="cancelEdit(2)"
                      >确定</a-button
                    >
                  </a-space> -->
                </template>
              </a-comment>
              <a-comment v-else-if="sessionDetail.role === 'assistant'">
@@ -99,81 +128,82 @@
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                      style="border: none;"
                      v-for="(breakContent, breakIndex) in breakLine(sessionDetail.content)"
                      style="border: none"
                      v-for="(breakContent, breakIndex) in breakLine(
                        sessionDetail.content
                      )"
                    >
                      <div
                        :class="{ chatItemAnswer: theme === 'light' }"
                        :style="{
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                        style="border: none;"
                      v-if="isExistTip(breakContent)">
                          backgroundColor:
                            theme === 'light' ? '#ffffff' : '#000000',
                        }"
                        style="border: none"
                        v-if="isExistTip(breakContent)"
                      >
                        <div
                          :class="{ chatItemAnswer: theme === 'light' }"
                          :style="{
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                          style="border: none;"
                            backgroundColor:
                              theme === 'light' ? '#ffffff' : '#000000',
                          }"
                          style="border: none"
                          v-for="(item, tipIndex) in tipMatch(breakContent)"
                        >
                      <span v-if="tipIndex == 0">
                        {{ breakContent.substring(0, item.index) }}
                        <a-tooltip
                          background-color="#3491FA"
                          :content="
                            getTipContent(messagenList.reference, index)
                          "
                        >
                          <img
                            style="width: 20px; height: 20px"
                            :src="tipImage"
                          />
                        </a-tooltip>
                      </span>
                          <span v-else-if ="tipIndex == item.len - 1">
                        {{
                          <span v-if="tipIndex == 0">
                            {{ breakContent.substring(0, item.index) }}
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                          </span>
                          <span v-else-if="tipIndex == item.len - 1">
                            {{
                              breakContent.substring(
                                item.preIndex + item.item.length,
                                item.index
                              )
                            }}
                        <a-tooltip
                          background-color="#3491FA"
                          :content="
                            getTipContent(messagenList.reference, index)
                          "
                        >
                          <img
                            style="width: 20px; height: 20px"
                            :src="tipImage"
                          />
                        </a-tooltip>
                        {{
                              breakContent.substring(item.index+5)
                            }}
                      </span>
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                            {{ breakContent.substring(item.index + 5) }}
                          </span>
                          <span v-else>
                        {{
                            {{
                              breakContent.substring(
                                item.preIndex + item.item.length,
                                item.index
                              )
                            }}
                        <a-tooltip
                          background-color="#3491FA"
                          :content="
                            getTipContent(messagenList.reference, index)
                          "
                        >
                          <img
                            style="width: 20px; height: 20px"
                            :src="tipImage"
                          />
                        </a-tooltip>
                      </span>
                            <a-tooltip
                              background-color="#3491FA"
                              :content="
                                getTipContent(messagenList.reference, index)
                              "
                            >
                              <img
                                style="width: 20px; height: 20px"
                                :src="tipImage"
                              />
                            </a-tooltip>
                          </span>
                        </div>
                      </div>
                      <div v-else>
@@ -185,15 +215,18 @@
                    <a-textarea
                      readonly
                      auto-size
                      v-model="sessionDetail.content"
                      :default-value="chartText(sessionDetail.content)"
                      :class="{ chatItemAnswer: theme === 'light' }"
                      :style="{
                      backgroundColor:
                        theme === 'light' ? '#ffffff' : '#000000',
                    }"
                        backgroundColor:
                          theme === 'light' ? '#ffffff' : '#000000',
                      }"
                      style="border: none"
                    >
                    </a-textarea>
                    <!-- <div v-html="chartText(sessionDetail.content)">
                    </div> -->
                  </a-card>
                </template>
                <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> -->
@@ -237,6 +270,7 @@
                  >
                    <icon-refresh /> 重新生成
                  </span>
                  <!-- <span class="action"><icon-to-bottom />下载 </span> -->
                </template>
              </a-comment>
              <a-comment v-else-if="sessionDetail.role === 'last'">
@@ -502,7 +536,7 @@
  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 { is } from "immutable";
  import { is } from 'immutable';
  // const url = ref('../../assets/session/PDF.png');
@@ -589,17 +623,29 @@
  const breakLine = (message: string): string[] => {
    //按\n分割字符串
    let arr = message.split('\n');
    return arr
  }
    return arr;
  };
  const chartText = (message: string): string => {
    //去除所有的#和**
    let arr = message.replace(/\*\*|\#\#\#/g, '');
    return arr;
  };
  const tipMatch = (msg: string): any[] => {
    //match session.content中的##[0-9]$$的索引
    let indexs: any[] = [];
    let preTip = 0;
    let matches=msg.match(/##([0-9]+)\$\$/g)
    let matches = msg.match(/##([0-9]+)\$\$/g);
    matches?.map((item) => {
      let i = msg.indexOf(item);
      indexs.push({ index: i, item: item, preIndex: preTip, len: matches.length });
      indexs.push({
        index: i,
        item: item,
        preIndex: preTip,
        len: matches.length,
      });
      preTip = i;
    });
    return indexs;
@@ -713,6 +759,19 @@
    await toClipboard(text); //参数为要复制的文本
  };
  const isEdit = ref(false);
  const edit = () => {
    isEdit.value = !isEdit.value;
  };
  const cancelEdit = (val) => {
    if (val == 1) {
      isEdit.value = !isEdit.value;
    } else {
      //编辑保存
      isEdit.value = !isEdit.value;
    }
  };
  const DialogList = async () => {
    const { code, data } = await getDialogListApi();
    if (code === 200) {