zhangxiao
2024-08-16 cca177a326b796608aba121cd2b2f84516b54a41
fix: 修改智能体
1个文件已修改
328 ■■■■■ 已修改文件
src/views/dmx/IntelligentAgent/components/agentConfig.vue 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/IntelligentAgent/components/agentConfig.vue
@@ -3,7 +3,8 @@
    v-if="typeAngint == 'add'"
    type="primary"
    @click="handleClick"
    style="margin-left: 10px">
    style="margin-left: 10px"
  >
    <template #icon>
      <icon-plus />
    </template>
@@ -32,10 +33,15 @@
  >
    <a-row class="">
      <a-col :span="24">
        <a-tabs type="capsule" size="large"  :active-key="activeKey" @change="handleTabChange">
        <a-tabs
          type="capsule"
          size="large"
          :active-key="activeKey"
          @change="handleTabChange"
        >
          <a-tab-pane key="1" title="助理设置">
            <a-divider style="margin-bottom: 20px;margin-top: 0" />
            <div style="width: 100%;" :style="{height:height}">
            <div style="width: 100%" :style="{ height: height }">
              <a-form
                ref="formRef"
                :rules="rules"
@@ -59,7 +65,10 @@
                  </a-space>
                </a-form-item>
                <a-form-item label="空回复">
                  <a-input v-model="form.prompt_config.empty_response" placeholder="" />
                  <a-input
                    v-model="form.prompt_config.empty_response"
                    placeholder=""
                  />
                </a-form-item>
                <a-form-item label="设置开场白">
                  <a-textarea
@@ -75,7 +84,10 @@
                </a-form-item>
                <a-form-item label="Self-RAG">
                  <a-space direction="vertical">
                    <a-switch v-model="form.prompt_config.self_rag" size="small" />
                    <a-switch
                      v-model="form.prompt_config.self_rag"
                      size="small"
                    />
                  </a-space>
                </a-form-item>
                <a-form-item field="kb_ids" label="知识库">
@@ -106,7 +118,10 @@
          </a-tab-pane>
          <a-tab-pane key="2" title="提示引擎">
            <a-divider style="margin-bottom: 20px;margin-top: 0" />
            <a-scrollbar style="width: 100%;overflow: auto" :style="{height:height}">
            <a-scrollbar
              style="width: 100%; overflow: auto"
              :style="{ height: height }"
            >
            <a-form
              ref="formRef1"
              :rules="rules"
@@ -123,20 +138,39 @@
              </a-form-item>
              <a-divider style="margin: 0;margin-bottom: 10px" />
              <a-form-item  label="相似度阈值">
                <a-slider v-model="form.similarity_threshold"  :step="0.01" :min="0" :max="1"  />
                  <a-slider
                    v-model="form.similarity_threshold"
                    :step="0.01"
                    :min="0"
                    :max="1"
                  />
              </a-form-item>
              <a-form-item  label="关键字相似度权重">
                <a-slider v-model="form.vector_similarity_weight"  :step="0.01" :min="0" :max="1"  />
                  <a-slider
                    v-model="form.vector_similarity_weight"
                    :step="0.01"
                    :min="0"
                    :max="1"
                  />
              </a-form-item>
              <a-form-item  label="Top N">
                <a-slider v-model="form.top_n" :min="0" :max="30"  />
              </a-form-item>
              <a-form-item label="Rerank模型" >
                <a-space direction="vertical" size="large">
                  <a-select :size="'large'" v-model="form.rerank_id"  placeholder="请选择 ..." allow-clear>
                    <a-optgroup  :label="index" v-for="(item,index) in rankModelList" :key=index>
                    <a-select
                      :size="'large'"
                      v-model="form.rerank_id"
                      placeholder="请选择 ..."
                      allow-clear
                    >
                      <a-optgroup
                        :label="index"
                        v-for="(item, index) in rankModelList"
                        :key="index"
                      >
                      <a-option
                        v-for="(obj) in item"
                          v-for="obj in item"
                        :key="obj.fid"
                        :disabled="!obj.available"
                        :value="obj.llm_name"
@@ -152,7 +186,13 @@
              </a-form-item>
              <a-form-item  label="变量">
                <div style="width: 100%;text-align: right" >
                  <a-button type="outline" @click="addVariable" style="" size="mini"  shape="round">
                    <a-button
                      type="outline"
                      @click="addVariable"
                      style=""
                      size="mini"
                      shape="round"
                    >
                    新建
                  </a-button>
                </div>
@@ -171,7 +211,12 @@
                    <a-switch v-model="record.optional" size="small" />
                  </template>
                  <template #action="{ record }">
                    <a-button type="text" @click="deleteParameters(record)" style="margin-left: 0" size="small">
                      <a-button
                        type="text"
                        @click="deleteParameters(record)"
                        style="margin-left: 0"
                        size="small"
                      >
                      <template #icon>
                        <icon-delete  />
                      </template>
@@ -184,7 +229,7 @@
          </a-tab-pane>
          <a-tab-pane key="3" title="模型设置">
            <a-divider style="margin-bottom: 20px;margin-top: 0" />
            <div style="width: 100%;" :style="{height:height}">
            <div style="width: 100%" :style="{ height: height }">
              <a-form
                ref="formRef2"
                :rules="rules"
@@ -194,27 +239,34 @@
              >
                <a-form-item field="llm_id" label="模型">
                  <a-space direction="vertical" size="large">
                    <a-select :size="'large'" field="llm_id" v-model="form.llm_id" style="width: 400px"  placeholder="请选择">
                      <a-optgroup
                        :label="index"
                        v-for="(item, index) in modelList"
                        :key="index"
                    <a-select
                      :size="'large'"
                      field="llm_id"
                      v-model="form.llm_id"
                      style="width: 400px"
                      placeholder="请选择"
                      >
                      <template v-for="(item, index) in modelList" :key="index">
                        <a-optgroup :label="index" v-if="item.length > 0">
                        <a-option
                          v-for="obj in item"
                          :key="obj.fid"
                          :disabled="!obj.available"
                          :value="obj.llm_id"
                            :value="obj.llm_name"
                        >
                          {{ obj.llm_name }}
                        </a-option>
                      </a-optgroup>
                      </template>
                    </a-select>
                  </a-space>
                </a-form-item>
                <a-divider style="margin-bottom: 20px;margin-top: 0" />
                <a-form-item label="自由">
                  <a-select default-value="2" :style="{width:'400px'}" placeholder="">
                  <a-select
                    default-value="2"
                    :style="{ width: '400px' }"
                    placeholder=""
                  >
                    <a-option value="1">即兴创作</a-option>
                    <a-option value="2">精确</a-option>
                    <a-option value="3">平衡</a-option>
@@ -223,31 +275,90 @@
                <a-form-item label="温度">
                  <a-switch size="small" v-model="temperature" />
                  <a-space direction="vertical" size="large">
                    <a-slider :disabled="!temperature" v-model="form.llm_setting.temperature" :step="0.01" :min="0" :max="1" :style="{ width: '350px', marginLeft: '20px',display: 'flex' }" show-input />
                    <a-slider
                      :disabled="!temperature"
                      v-model="form.llm_setting.temperature"
                      :step="0.01"
                      :min="0"
                      :max="1"
                      :style="{
                        width: '350px',
                        marginLeft: '20px',
                        display: 'flex',
                      }"
                      show-input
                    />
                  </a-space>
                </a-form-item>
                <a-form-item label="top P">
                  <a-switch  size="small" v-model="top_p"  />
                  <a-space direction="vertical" size="large">
                    <a-slider :disabled="!top_p" v-model="form.llm_setting.top_p" :step="0.01" :min="0" :max="1"  :style="{ width: '350px', marginLeft: '20px',display: 'flex' }" show-input />
                    <a-slider
                      :disabled="!top_p"
                      v-model="form.llm_setting.top_p"
                      :step="0.01"
                      :min="0"
                      :max="1"
                      :style="{
                        width: '350px',
                        marginLeft: '20px',
                        display: 'flex',
                      }"
                      show-input
                    />
                  </a-space>
                </a-form-item>
                <a-form-item label="出席处罚">
                  <a-switch size="small" v-model="presence_penalty"  />
                  <a-space direction="vertical" size="large">
                    <a-slider :disabled="!presence_penalty" v-model="form.llm_setting.presence_penalty" :step="0.01" :min="0" :max="1"  :style="{ width: '350px', marginLeft: '20px',display: 'flex' }" show-input />
                    <a-slider
                      :disabled="!presence_penalty"
                      v-model="form.llm_setting.presence_penalty"
                      :step="0.01"
                      :min="0"
                      :max="1"
                      :style="{
                        width: '350px',
                        marginLeft: '20px',
                        display: 'flex',
                      }"
                      show-input
                    />
                  </a-space>
                </a-form-item>
                <a-form-item label="频率处罚">
                  <a-switch size="small" v-model="frequency_penalty"  />
                  <a-space direction="vertical" size="large">
                    <a-slider :disabled="!frequency_penalty" v-model="form.llm_setting.frequency_penalty" :step="0.01" :min="0" :max="1"  :style="{ width: '350px', marginLeft: '20px',display: 'flex' }" show-input />
                    <a-slider
                      :disabled="!frequency_penalty"
                      v-model="form.llm_setting.frequency_penalty"
                      :step="0.01"
                      :min="0"
                      :max="1"
                      :style="{
                        width: '350px',
                        marginLeft: '20px',
                        display: 'flex',
                      }"
                      show-input
                    />
                  </a-space>
                </a-form-item>
                <a-form-item label="最大token数">
                  <a-switch size="small" v-model="max_tokens"  />
                  <a-space direction="vertical" size="large">
                    <a-slider :disabled="!max_tokens" v-model="form.llm_setting.max_tokens"  :min="0" :max="2048"  :style="{ width: '350px', marginLeft: '20px',display: 'flex' }" show-input />
                    <a-slider
                      :disabled="!max_tokens"
                      v-model="form.llm_setting.max_tokens"
                      :min="0"
                      :max="2048"
                      :style="{
                        width: '350px',
                        marginLeft: '20px',
                        display: 'flex',
                      }"
                      show-input
                    />
                  </a-space>
                </a-form-item>
              </a-form>
@@ -260,12 +371,20 @@
</template>
<script lang="ts" setup>
import { onMounted, onBeforeMount, reactive, ref, nextTick, onUnmounted, onBeforeUnmount } from "vue";
import { kbdocumentupload, queryKbList, queryModelList } from "@/api/kbList";
import useLoading from "@/hooks/loading";
import { Message } from "@arco-design/web-vue";
import { dialogSet } from "@/api/Agent";
import EventBus from "@/utils/EventBus";
  import {
    onMounted,
    onBeforeMount,
    reactive,
    ref,
    nextTick,
    onUnmounted,
    onBeforeUnmount,
  } from 'vue';
  import { kbdocumentupload, queryKbList, queryModelList } from '@/api/kbList';
  import useLoading from '@/hooks/loading';
  import { Message } from '@arco-design/web-vue';
  import { dialogSet } from '@/api/Agent';
  import EventBus from '@/utils/EventBus';
const { loading,setLoading } = useLoading(true);
const visible = ref(false);
const modelList = ref({});
@@ -277,33 +396,34 @@
const formRef2 = ref();
const activeKey = ref('1');
const form = reactive({
  name: "",
  icon: "",
  language: "English",
    name: '',
    icon: '',
    language: 'English',
  prompt_config: {
    empty_response: "",
    prologue: "你好! 我是你的助理,有什么可以帮到你的吗?",
      empty_response: '',
      prologue: '你好! 我是你的助理,有什么可以帮到你的吗?',
    quote: true,
    self_rag: false,
    system: "你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。" +
      "回答需要考虑聊天历史。\n        以下是知识库:\n        {knowledge}\n        以上是知识库。",
      system:
        '你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。' +
        '回答需要考虑聊天历史。\n        以下是知识库:\n        {knowledge}\n        以上是知识库。',
    parameters: [
      {
        index: 0,
        name: "knowledge",
        key: "knowledge",
        optional: false
      }
    ]
          name: 'knowledge',
          key: 'knowledge',
          optional: false,
        },
      ],
  },
  kb_ids: [],
  llm_id: "qwen-plus",
    llm_id: undefined,
  llm_setting: {
    temperature: 0.1,
    top_p: 0.3,
    presence_penalty: 0.4,
    frequency_penalty: 0.7,
    max_tokens: 512
      max_tokens: 512,
  },
  similarity_threshold: 0.2,
  vector_similarity_weight: 0.30000000000000004,
@@ -341,7 +461,7 @@
];
const formatter = (value) => {
  return `${(value / 100).toFixed(2)}`
    return `${(value / 100).toFixed(2)}`;
};
const uploadAction = '/api/v1/llm/upload'; // 替换为你的上传API
@@ -359,25 +479,25 @@
};
const rules = {
  name: [
    'name': [
    {
      required: true,
      message: "名称不允许为空"
    }
        message: '名称不允许为空',
      },
  ],
  "prompt_config.system": [
    'prompt_config.system': [
    {
      required: true,
      message: "系统不允许为空"
    }
        message: '系统不允许为空',
      },
  ],
  llm_id: [
    'llm_id': [
    {
      required: true,
      message: '模型不能为空',
    },
  ],
  kb_ids: [
    'kb_ids': [
    {
      required: true,
      message: '知识库不能为空',
@@ -386,9 +506,8 @@
};
const handleSubmit = ({ values, errors }) => {
  console.log("values:", values, "\nerrors:", errors);
    console.log('values:', values, '\nerrors:', errors);
  if (!errors) {
  }
};
@@ -396,7 +515,7 @@
  visible.value = true;
};
defineExpose({
  handleClick
    handleClick,
});
const handleCancel = () => {
@@ -404,7 +523,7 @@
  formRef.value.resetFields();
  formRef1.value.resetFields();
  formRef2.value.resetFields();
  form.name = "";
    form.name = '';
  emit('queryList');
};
@@ -415,38 +534,42 @@
  //   post: '',// 岗位
  //   txt: '',// 备注
  // });
  activeKey.value= '1'
    activeKey.value = '1';
  formRef.value.resetFields();
  formRef1.value.resetFields();
  formRef2.value.resetFields();
  nextTick(()=>{
    if(props.typeAngint=='add'){
      form.name = "";
      form.icon = "";
      form.prompt_config.system = "你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。" +
        "回答需要考虑聊天历史。\n        以下是知识库:\n        {knowledge}\n        以上是知识库。";
        form.name = '';
        form.icon = '';
        form.prompt_config.system =
          '你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。' +
          '回答需要考虑聊天历史。\n        以下是知识库:\n        {knowledge}\n        以上是知识库。';
    }
    console.log(form,'新建智能体弹窗');
    avatarShow.value = false;
    setTimeout(() => {
      avatarShow.value = true;
    },100);
  })
    });
};
const handleBeforeOk = async (done) => {
  formRef.value.validate().then(res => {
    formRef.value.validate().then((res) => {
    // console.log('res:', res)
  })
  formRef1.value.validate().then(res => {
    });
    formRef1.value.validate().then((res) => {
    // console.log('res:', res)
  })
  formRef2.value.validate().then(res => {
    });
    formRef2.value.validate().then((res) => {
    // console.log('res:', res)
  })
  if (form.name && form.kb_ids.length>0 && form.prompt_config.system && form.llm_id) {
    });
    if (
      form.name &&
      form.kb_ids.length > 0 &&
      form.prompt_config.system &&
      form.llm_id
    ) {
    let title = '创建成功';
    let formNew = { ...form };
    if(formNew.rerank_id){
@@ -457,12 +580,14 @@
      delete formNew.top_k;
    }
    formNew.prompt_config.parameters = form.prompt_config.parameters.map(item => {
      formNew.prompt_config.parameters = form.prompt_config.parameters.map(
        (item) => {
      return {
        ...item,
        key: item.name
            key: item.name,
          };
      }
    })
      );
    console.log(formNew,'formNew');
@@ -472,7 +597,7 @@
      delete formNew.off;
      title = '修改成功';
    }
    setLoading(true)
      setLoading(true);
    try {
      const data = await dialogSet(formNew);
      // console.log(data, 'data');
@@ -484,14 +609,14 @@
        Message.error(data.msg);
      }
      done(true);
      setLoading(false)
        setLoading(false);
    } catch (err) {
      // you can report use errorHandler or other
      setLoading(false)
        setLoading(false);
    }
  }else {
    Message.warning('请填写必填项');
    done(false)
      done(false);
  }
};
@@ -501,27 +626,28 @@
    // console.log(props.formData,'传入数据');
    Object.assign(form, props.formData);
    console.log(form,'表单数据');
  })
    });
};
const addVariable = () => {
  form.prompt_config.parameters.push({
    index: form.prompt_config.parameters.length,
    key: "",
    name: "",
    optional: true
      key: '',
      name: '',
      optional: true,
  });
  nextTick(() => {
    formRef.value.validate();
  });
}
  };
const deleteParameters = (record) => {
  // console.log(record, 'record');
  // console.log(form.prompt_config.parameters);
  form.prompt_config.parameters = form.prompt_config.parameters.filter(item => item.index !== record.index);
}
    form.prompt_config.parameters = form.prompt_config.parameters.filter(
      (item) => item.index !== record.index
    );
  };
function handleTabChange(key) {
  // 处理标签改变事件
@@ -531,19 +657,24 @@
const queryModel = async (params) => {
  try {
    const data = await queryModelList(params);
    // console.log(data.data, '大模型列表');
    modelList.value = data.data;
      const arrObj = {};
      for (const key in data.data) {
        if (Object.hasOwnProperty.call(data.data, key)) {
          const element = data.data[key];
          arrObj[key] = element.filter((item) => item.available === true);
        }
      }
      modelList.value = arrObj;
    rankModelList.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 {
  }
};
const knowledgeData = async (params = { page: 1, page_size: 20 }) => {
  setLoading(true);
@@ -567,14 +698,7 @@
});
onMounted(() => {});
onBeforeUnmount(()=>{
})
  onBeforeUnmount(() => {});
</script>
<style lang="less" scoped>
:deep(.arco-tabs-nav-tab-list) {