Commit 80200a17 authored by mhw's avatar mhw

版本跟新

parent 56d379cc
This diff is collapsed.
......@@ -40,4 +40,7 @@ export default class PresetTemplateController {
static deleteCollect (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptTemplate/deleteCollect', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptTemplate/listForTree', 'post', params, axiosOption, httpOption);
}
}
......@@ -122,14 +122,24 @@ body .fullscreen-dialog .layui-layer-content {
}
.orange-project {
.el-button--primary {
background-color: $--color-primary !important;
border-color:$--color-primary !important;
}
.el-button.is-plain:hover, .el-button.is-plain:focus{
background: #FFFFFF;
border-color: $--color-primary;
color: $--color-primary;
}
background-color: $--color-primary;
border-color:$--color-primary ;
}
.el-button--primary.is-plain {
color: #0092FF;
background: #e6f4ff;
border-color: #99d3ff;
}
.el-button--primary.is-plain:hover, .el-button--primary.is-plain:focus {
background: #0092FF;
border-color: #0092FF;
color: #FFFFFF;
}
// .el-button.is-plain:hover, .el-button.is-plain:focus{
// background: #FFFFFF;
// border-color: $--color-primary;
// color: $--color-primary;
// }
.el-button--danger.is-plain:hover, .el-button--danger.is-plain:focus {
background: #F56C6C;
border-color: #F56C6C;
......
......@@ -34,6 +34,7 @@ import OnlineBaseCard from '@/online/components/OnlineBaseCard.vue';
import OnlineCustomTabs from '@/online/components/OnlineCustomTabs.vue';
import OnlineCustomTableContainer from '@/online/components/OnlineTableContainer/index.vue';
import VueClipboard from 'vue-clipboard2'
Vue.prototype.$SocketService = SocketService
Vue.use(VueClipboard)
Vue.component('OnlineCustomBlock', OnlineCustomBlock);
......@@ -54,7 +55,14 @@ Vue.component('user-select', UserSelect);
Vue.component('dept-select', DeptSelect);
Vue.component('table-box', TableBox);
Vue.component('right-add-btn', RightAddBtn);
var EventBus = new Vue();
Object.defineProperties(Vue.prototype, {
$bus: {
get: function () {
return EventBus
}
}
})
Vue.use(ElementUI);
Vue.use(VCharts);
......
......@@ -49,7 +49,11 @@
</vxe-column>
<vxe-column field="runCount" title="运行数量"></vxe-column>
<vxe-column field="taskDescribe" title="任务描述"></vxe-column>
<vxe-column field="createUserId" title="创建人"></vxe-column>
<vxe-column field="createUserId" title="创建人">
<template slot-scope="scope">
{{scope.row.createUserIdDictMap.name}}
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间"></vxe-column>
<vxe-column field="operation" title="操作">
<template slot-scope="scope">
......
......@@ -5,7 +5,7 @@
<el-descriptions title="基本信息" style="width: 100%;line-height: 30px;">
<el-descriptions-item label="任务名称:">{{tableItem.taskName}}</el-descriptions-item>
<el-descriptions-item label="任务ID:">{{tableItem.taskId}}</el-descriptions-item>
<el-descriptions-item label="创建人:">{{tableItem.updateUserId}}</el-descriptions-item>
<el-descriptions-item label="创建人:">{{tableItem.createUserIdDictMap.name}}</el-descriptions-item>
<el-descriptions-item label="创建时间:">{{tableItem.createTime}}</el-descriptions-item>
<el-descriptions-item label="任务描述:">{{tableItem.taskDescribe}}</el-descriptions-item>
<el-descriptions-item label="任务类型:">{{ModelType.getValue(tableItem.taskType) }}</el-descriptions-item>
......
......@@ -5,7 +5,7 @@
<el-descriptions title="基本信息">
<el-descriptions-item label="运行名称:">{{item.runName}}</el-descriptions-item>
<el-descriptions-item label="运行ID:">{{item.runId}}</el-descriptions-item>
<el-descriptions-item label="创建人:">{{ item.createUserId }}</el-descriptions-item>
<el-descriptions-item label="创建人:">{{ item.createUserIdDictMap.name }}</el-descriptions-item>
<el-descriptions-item label="创建时间:">{{item.createTime }}</el-descriptions-item>
</el-descriptions>
</el-card>
......
......@@ -171,7 +171,7 @@ export default {
particulars (item) {
this.$dialog.show('任务详情', taskOperate, {
area: ['100%', '100%']
}, {page: 'particulars', item: item }).then(res => {
}, {page: 'particulars', item: {...item, createUserIdDictMap: this.tableItem.createUserIdDictMap} }).then(res => {
this.refresh();
}).catch(e => {
this.refresh();
......
......@@ -16,7 +16,7 @@
<el-table :data="tableData">
<el-table-column prop="label" label="自动规则打分指标">
</el-table-column>
<el-table-column prop="value" :label="item.modelTask.versionName" >
<el-table-column prop="value" :label="item.modelVersionIdDictMap.name" >
</el-table-column>
</el-table>
......
......@@ -6,7 +6,7 @@
:data="myDataSetPage.tableData.impl.dataList" min-height="96">
<vxe-column title="模型名称">
<template >
{{ item.modelTask.versionName }}
{{ item.modelVersionIdDictMap.name }}
</template>
</vxe-column>
<vxe-column field="input" title="Prompt问题"></vxe-column>
......
......@@ -13,8 +13,8 @@
</el-card>
<el-card class="box-card">
<el-descriptions title="数据配置">
<el-descriptions-item label="数据集:">{{item.datasetVersionId}}</el-descriptions-item>
<el-descriptions-item label="数据模型:">{{item.modelTask.versionName}}</el-descriptions-item>
<el-descriptions-item label="数据集:">{{item.datasetVersionIdDictMap.name}}</el-descriptions-item>
<el-descriptions-item label="数据模型:">{{item.modelVersionIdDictMap.name}}</el-descriptions-item>
</el-descriptions>
</el-card>
......@@ -46,7 +46,7 @@ export default {
},
mounted () {
console.log(this.item);
},
methods: {
......
......@@ -46,7 +46,14 @@ export default {
timeImg: null
};
},
props: ['page', 'item'],
props: {
page: {
default: 'particulars'
},
item: {
default: {}
}
},
components: { particulars, assessmentReport, trainingLog },
computed: {},
......
......@@ -49,6 +49,7 @@ import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/
import { ModelTask } from '@/api/gptController.js';
// import editOrAdd from './dialog/editOrAdd';
import particulars from '@/views/gptTraining/modelManagement/modelEvaluation/dialog/particulars.vue';
import modelCompressionParticulars from '@/views/gptTraining/modelManagement/modelCompression/dialog/particulars.vue';
export default {
data () {
......@@ -136,12 +137,35 @@ export default {
})
},
particulars (item) {
console.log(item);
this.$dialog.show('详情', particulars, {
area: ['100%', '100%']
}, { item: item }).then(res => {
this.refresh();
}).catch(e => { });
// {
// id: 0,
// name: '新建版本',
// symbol: 'NewVersion'
// },
// {
// id: 1,
// name: '模型评估',
// symbol: 'modelEvaluation'
// },
// {
// id: 2,
// name: '模型压缩',
// symbol: 'ModelCompression'
// }
console.log(item, item.taskStatus);
if (item.taskStatus === 2) { // 模型压缩
this.$dialog.show('详情', modelCompressionParticulars, {
area: ['100%', '100%']
}, { item: item }).then(res => {
this.refresh();
}).catch(e => { });
} else {
this.$dialog.show('详情', particulars, {
area: ['100%', '100%']
}, { item: item }).then(res => {
this.refresh();
}).catch(e => { });
}
},
refresh (reloadData = false) {
if (reloadData) {
......
......@@ -11,6 +11,7 @@
<vxe-column field="taskType" title="任务类型">
<template slot-scope="scope">
{{ TaskType.getValue(scope.row.taskType) }}
</template>
</vxe-column>
<vxe-column field="taskStatus" title="任务状态">
......@@ -49,7 +50,7 @@ import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/
import { ModelTask } from '@/api/gptController.js';
// import editOrAdd from './dialog/editOrAdd';
import particulars from '@/views/gptTraining/modelManagement/modelEvaluation/dialog/particulars.vue';
import modelCompressionParticulars from '@/views/gptTraining/modelManagement/modelCompression/dialog/particulars.vue';
export default {
data () {
return {
......@@ -136,12 +137,20 @@ export default {
})
},
particulars (item) {
console.log(item);
this.$dialog.show('详情', particulars, {
area: ['100%', '100%']
}, { item: item }).then(res => {
this.refresh();
}).catch(e => { });
console.log(item, item.taskType);
if (item.taskType === 2) { // 模型压缩
this.$dialog.show('模型压缩详情', modelCompressionParticulars, {
area: ['100%', '100%']
}, { item: item.modelCompress}).then(res => {
this.refresh();
}).catch(e => { });
} else {
this.$dialog.show('模型评估详情', particulars, {
area: ['100%', '100%']
}, { item: item.modelEstimate }).then(res => {
this.refresh();
}).catch(e => { });
}
},
refresh (reloadData = false) {
if (reloadData) {
......
<!-- 答案内容预览 -->
<template>
<vue-markdown :source="content" v-highlight class="markdown-body" >
</vue-markdown>
</template>
<script>
import hljs from 'highlight.js' // 代码块高亮
// import 'highlight.js/styles/github.css' // 代码块高亮样式
import 'github-markdown-css' // 整体 markdown 样式
import VueMarkdown from 'vue-markdown'
export default {
data () {
return {
result: undefined
};
},
props: ['content'],
components: {VueMarkdown},
computed: {},
directives: {
highlight: {
// 指令的定义
inserted: function (el) {
let blocks = el.querySelectorAll('pre code');
blocks.forEach((block, index) => {
/** 代码高亮 */
hljs.highlightBlock(block);
/** 手动添加一个hljs类名,防止不支持的语言背景变空白 */
block.classList.add('hljs');
})
}
}
},
mounted () {
},
methods: {}
}
</script>
<style scoped>
.markdown-body{
background: none !important;
font-size: 14px !important;
}
.markdown-body pre{
background-color: #3b3d3f;
}
</style>
<!--左侧操作界面 -->
<template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" style="padding:20px">
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize"
style="padding:20px;width:400px">
<el-form-item label="请选择对话模式:">
<el-select v-model="form.pattern" placeholder="请选择">
<el-option v-for="item in ModeOfSpeaking.getList()" :key="item.id" :label="item.name" :value="item.name">
......@@ -12,45 +13,66 @@
:props='{ label: "name", value: "name", emitPath: false }' @change="changeModel"></el-cascader>
</el-form-item>
<el-form-item label="Temperature:">
<el-slider v-model="temperature" :format-tooltip="formatTooltip" @change="form.temperature=temperature / 100"></el-slider>
<el-slider v-model="temperature" :format-tooltip="formatTooltip"
@change="form.temperature = temperature / 100"></el-slider>
</el-form-item>
<el-form-item label="历史对话轮数:">
<el-input-number v-model="form.heistoryRotate" :min="0" :max="10" ></el-input-number>
<el-input-number v-model="form.heistoryRotate" :min="0" :max="10"></el-input-number>
</el-form-item>
<el-form-item label="提示词:">
<el-select v-model="promptTemplate" filterable placeholder="请选择提示词" value-key="templateId"
@change="templateControllerChange" clearable>
<el-option v-for="item in templateControllerList" :key="item.value" :label="item.label" :value="item">
</el-option>
</el-select>
<el-switch @change="changePromptTemplate" style="margin-left: 10px;" v-model="isPromptTemplate"
active-color="#13ce66" inactive-color="#ff4949">
</el-switch>
</el-form-item>
<el-form-item label-width="0px" v-if="form.prompt_template">
<div style="background-color: #f3f3f3;
padding: 10px;
border-radius: 10px;">
{{ form.prompt_template }}
</div>
</el-form-item>
<el-form-item label-width="0px" v-if="form.pattern=='知识库问答'">
<el-collapse value="1">
<el-form-item label-width="0px" v-if="form.pattern == '知识库问答'">
<el-collapse value="1">
<el-collapse-item name="1">
<template slot="title">知识库配置</template>
<el-form-item label="请选择知识库:" style="margin-bottom:30px">
<el-select ref="knowledgeSelect" v-model="form.knowledgeConfige.knowledge_base_name" placeholder="请选择" @change="changeKnowledge">
<el-option v-for="item in knowledgeList" :key="item.knowledgeId" :label="item.knowledgeName" :value="item.knowledgeName">
<el-select ref="knowledgeSelect" v-model="form.knowledgeConfige.knowledge_base_name" placeholder="请选择"
@change="changeKnowledge">
<el-option v-for="item in knowledgeList" :key="item.knowledgeId" :label="item.knowledgeName"
:value="item.knowledgeName">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="匹配知识条数:" style="margin-bottom:30px">
<el-input-number v-model="form.knowledgeConfige.top_k" :min="1" :max="20" ></el-input-number>
<el-input-number v-model="form.knowledgeConfige.top_k" :min="1" :max="20"></el-input-number>
</el-form-item>
<el-form-item label="知识匹配分数阈值:">
<el-slider v-model="form.knowledgeConfige.score_threshold" :format-tooltip="formatTooltip" @change="form.knowledgeConfige.score_threshold=knowledgeScoreThreshold / 100"></el-slider>
<el-slider v-model="knowledgeScoreThreshold" :format-tooltip="formatTooltip"
@change="form.knowledgeConfige.score_threshold = knowledgeScoreThreshold / 100"></el-slider>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form-item>
<el-form-item label-width="0px" v-if="form.pattern=='搜索引擎问答'">
<el-form-item label-width="0px" v-if="form.pattern == '搜索引擎问答'">
<el-collapse value="1">
<el-collapse-item name="1">
<template slot="title">搜索引擎配置</template>
<el-form-item label="选择搜索引擎:" style="margin-bottom:30px">
<el-select ref="searchSelect" v-model="form.searchConfige.search_engine_name" placeholder="请选择" @change="changeSe">
<el-option v-for="item in [{label:'bing',value:'bing'},{label:'duckduckgo',value:'duckduckgo'}]" :key="item.value" :label="item.label" :value="item.value">
<el-select ref="searchSelect" v-model="form.searchConfige.search_engine_name" placeholder="请选择"
@change="changeSe">
<el-option v-for="item in [{ label: 'bing', value: 'bing' }, { label: 'duckduckgo', value: 'duckduckgo' }]"
:key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="匹配搜索结果条数:">
<el-input-number v-model="form.searchConfige.top_k" :min="1" :max="20" ></el-input-number>
<el-input-number v-model="form.searchConfige.top_k" :min="1" :max="20"></el-input-number>
</el-form-item>
</el-collapse-item>
</el-collapse>
......@@ -60,10 +82,14 @@
</template>
<script>
import { KnowledgeManage, MyModel, ModelVersion } from '@/api/gptController.js';
import { KnowledgeManage, MyModel, ModelVersion, TemplateController } from '@/api/gptController.js';
import promptWordTemplate from '../promptWordTemplate';
export default {
data () {
return {
isPromptTemplate: true,
promptTemplate: '',
templateControllerList: [],
modelList: [],
activeModelList: [],
loading: undefined,
......@@ -75,6 +101,7 @@ export default {
pattern: 'LLM 对话', // 对话模式
model_name: undefined, // 模型名称
temperature: 0.7,
prompt_template: '',
heistoryRotate: 10, // 历史对话轮数
knowledgeConfige: {// 知识库配置
knowledge_base_name: '',
......@@ -107,9 +134,24 @@ export default {
mounted () {
this.getKnowledgeList()
this.getModelList()
this.getTemplateControllerList()
},
methods: {
getTemplateControllerList () {
TemplateController.listForTree(this, {}).then(res => {
this.templateControllerList = res.data.map((item) => {
return {
templateId: item.templateId,
label: item.templateName,
value: item.templateContent,
parameterFormat: item.parameterFormat
}
})
}).catch(e => {
console.log(e);
});
},
getModelList () {
MyModel.listForTree(this, {}).then(res => {
this.modelList = res.data.map((item) => {
......@@ -159,7 +201,7 @@ export default {
},
switchModel (versionId) { // 切换模型
this.openLoading('LLM模型加载中')
ModelVersion.change(this, {versionId: versionId}).then(res => {
ModelVersion.change(this, { versionId: versionId }).then(res => {
console.log(res);
this.loading.close();
}).catch(e => {
......@@ -179,13 +221,36 @@ export default {
changeSe (dtat) { // 修改模型引擎
// this.openLoading('模型引擎加载中')
// console.log(this.$refs.searchSelect);
},
templateControllerChange (data) {
if (!data) {
this.form.prompt_template = ''
return
}
this.$dialog.show(data.label, promptWordTemplate, {
area: ['50%', '40%']
}, { data: data }).then(res => {
this.form.prompt_template = res
}).catch(e => {
this.promptTemplate = undefined
});
},
changePromptTemplate () {
console.log(1, this.$bus);
this.$bus.$emit('isPromptTemplate', this.isPromptTemplate);
}
}
}
</script>
<style >
.myLoading .el-loading-spinner i{
.myLoading .el-loading-spinner i {
font-size: 24px !important;
}
.el-form-item__content{
display: flex;
flex-direction: row;
align-items: center;
}
</style>
<!-- 提示词模板 -->
<template>
<div>
<div class="promptWordTemplate">
<span v-for="(item,index) in content" :key="index">
<template v-if="item.text">
{{ item.text }}
</template>
<template v-else-if="item.placeholder">
<el-input v-model="item.value" style="display:inline-block;width: 100px;margin-left: 10px;" size="small" :placeholder="item.placeholder"></el-input>
</template>
</span>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</div>
</div>
</template>
<script>
export default {
data () {
return {
content: undefined,
text: '',
placeholders: []
};
},
props: ['data'],
components: {},
computed: {},
mounted () {
this.content = this.domRender(this.data.value, this.data.parameterFormat).map((item, index) => {
let x = this.placeholders.indexOf(item) !== -1
return {
text: x ? '' : item,
value: '',
placeholder: x ? item : ''
}
})
},
methods: {
onCancel (isSuccess, data) {
if (this.observer != null) {
this.observer.cancel(isSuccess, data);
}
},
domRender (str, parameterFormat) {
var match;
let strData = str
var regexPattern = new RegExp(`\\${parameterFormat[0]}([^}]+)\\${parameterFormat[1]}`, 'g');
while ((match = regexPattern.exec(str)) !== null) {
this.placeholders.push(match[1]);
}
var reg = new RegExp(`\\${parameterFormat[0]}(.*?)\\${parameterFormat[1]}`, 'g')
strData = strData.split(reg);
return strData
},
onSubmit () {
this.content.forEach(element => {
this.text += element.text || element.value
});
this.onCancel(true, this.text)
}
}
}
</script>
<style scoped>
.promptWordTemplate{
line-height: 30px;
}
</style>
......@@ -64,6 +64,7 @@ export default {
background: #fff;
position: relative;
transition: all 0.3s;
}
.leftBox{
......
......@@ -12,9 +12,9 @@
<div class="login-input">
<span class="title">欢迎登录</span>
<span class="desc">{{projectName}}</span>
<el-form :model="dataForm" :rules="dataRule" size="medium" ref="dataForm" @keyup.enter.native="dataFormSubmit()">
<el-form :model="dataForm" label-position="top" :rules="dataRule" size="medium" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="70px">
<el-col :span="24">
<el-form-item prop="mobilePhone" label="用户名" style="margin-bottom: 12px;">
<el-form-item prop="mobilePhone" label="用户名" >
<el-input v-model="dataForm.mobilePhone" style="width: 100%;" placeholder="帐号">
<img slot="prefix" src="@/assets/img/login_username.png" alt="">
</el-input>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment