mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-26 10:12:51 +00:00
feat: Related Knowledge
This commit is contained in:
parent
f7349d2b3d
commit
4948051f67
|
|
@ -21,6 +21,23 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
|
|||
return get(`${prefix}/knowledge`, data, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 知识库列表(无分页)
|
||||
* @param 参数
|
||||
* param {
|
||||
folder_id: "string",
|
||||
name: "string",
|
||||
tool_type: "string",
|
||||
desc: string,
|
||||
}
|
||||
*/
|
||||
const getKnowledgeList: (param?: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
|
||||
param,
|
||||
loading,
|
||||
) => {
|
||||
return get(`${prefix}/knowledge`, param, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 知识库分页列表
|
||||
* @param 参数
|
||||
|
|
@ -31,7 +48,7 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
|
|||
desc: string,
|
||||
}
|
||||
*/
|
||||
const getKnowledgeList: (
|
||||
const getKnowledgeListPage: (
|
||||
page: pageRequest,
|
||||
param?: any,
|
||||
loading?: Ref<boolean>,
|
||||
|
|
@ -234,14 +251,6 @@ const postWebKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<an
|
|||
return post(`${prefix}/knowledge/web`, data, undefined, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取全部知识库
|
||||
* @param 参数
|
||||
*/
|
||||
const getAllKnowledge: (loading?: Ref<boolean>) => Promise<Result<any[]>> = (loading) => {
|
||||
return get(`${prefix}`, undefined, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取飞书文档列表
|
||||
* @param knowledge_id
|
||||
|
|
@ -269,6 +278,7 @@ const importLarkDocument: (
|
|||
export default {
|
||||
getKnowledgeByFolder,
|
||||
getKnowledgeList,
|
||||
getKnowledgeListPage,
|
||||
getKnowledgeDetail,
|
||||
putKnowledge,
|
||||
delKnowledge,
|
||||
|
|
@ -284,5 +294,4 @@ export default {
|
|||
|
||||
getLarkDocumentList,
|
||||
importLarkDocument,
|
||||
getAllKnowledge,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,6 +79,23 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
|
|||
return get(`${prefix}/knowledge`, data, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 知识库列表(无分页)
|
||||
* @param 参数
|
||||
* param {
|
||||
"folder_id": "string",
|
||||
"name": "string",
|
||||
"tool_type": "string",
|
||||
desc: string,
|
||||
}
|
||||
*/
|
||||
const getKnowledgeList: (param?: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
|
||||
param,
|
||||
loading,
|
||||
) => {
|
||||
return get(`${prefix}/knowledge`, param, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 知识库分页列表
|
||||
* @param 参数
|
||||
|
|
@ -89,7 +106,7 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
|
|||
desc: string,
|
||||
}
|
||||
*/
|
||||
const getKnowledgeList: (
|
||||
const getKnowledgeListPage: (
|
||||
page: pageRequest,
|
||||
param?: any,
|
||||
loading?: Ref<boolean>,
|
||||
|
|
@ -292,14 +309,6 @@ const postWebKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<an
|
|||
return post(`${prefix}/knowledge/web`, data, undefined, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取全部知识库
|
||||
* @param 参数
|
||||
*/
|
||||
const getAllKnowledge: (loading?: Ref<boolean>) => Promise<Result<any[]>> = (loading) => {
|
||||
return get(`${prefix}/knowledge`, undefined, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取飞书文档列表
|
||||
* @param knowledge_id
|
||||
|
|
@ -327,6 +336,7 @@ const importLarkDocument: (
|
|||
export default {
|
||||
getKnowledgeByFolder,
|
||||
getKnowledgeList,
|
||||
getKnowledgeListPage,
|
||||
getKnowledgeDetail,
|
||||
putKnowledge,
|
||||
delKnowledge,
|
||||
|
|
@ -342,7 +352,6 @@ export default {
|
|||
|
||||
getLarkDocumentList,
|
||||
importLarkDocument,
|
||||
getAllKnowledge,
|
||||
getSharedWorkspaceKnowledge,
|
||||
getSharedWorkspaceKnowledgePage,
|
||||
getSharedAuthorizationKnowledgeGet,
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ function changeMenu(id: string) {
|
|||
function getDataset() {
|
||||
loading.value = true
|
||||
knowledge
|
||||
.asyncGetAllKnowledge()
|
||||
.asyncGetRootKnowledge()
|
||||
.then((res: any) => {
|
||||
list.value = res.data
|
||||
common.saveBreadcrumb(list.value)
|
||||
|
|
|
|||
|
|
@ -131,7 +131,6 @@ export default {
|
|||
addKnowledge: 'Add Related Knowledge',
|
||||
addKnowledgePlaceholder: 'The selected knowledge must use the same embedding model',
|
||||
selected: 'Selected',
|
||||
countDataset: 'Knowledge',
|
||||
|
||||
selectSearchMode: 'Retrieval Mode',
|
||||
vectorSearch: 'Vector Search',
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ export default {
|
|||
addKnowledge: '添加关联知识库',
|
||||
addKnowledgePlaceholder: '所选知识库必须使用相同的 Embedding 模型',
|
||||
selected: '已选',
|
||||
countDataset: '个知识库',
|
||||
|
||||
selectSearchMode: '检索模式',
|
||||
vectorSearch: '向量检索',
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ export default {
|
|||
addKnowledge: '新增關聯知識庫',
|
||||
addKnowledgePlaceholder: '所選知識庫必須使用相同的 Embedding 模型',
|
||||
selected: '已選',
|
||||
countDataset: '個知識庫',
|
||||
|
||||
selectSearchMode: '檢索模式',
|
||||
vectorSearch: '向量檢索',
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import {defineStore} from 'pinia'
|
||||
import type {knowledgeData} from '@/api/type/knowledge'
|
||||
import type {UploadUserFile} from 'element-plus'
|
||||
import { defineStore } from 'pinia'
|
||||
import type { knowledgeData } from '@/api/type/knowledge'
|
||||
import type { UploadUserFile } from 'element-plus'
|
||||
import knowledgeApi from '@/api/shared/knowledge'
|
||||
import {type Ref} from 'vue'
|
||||
import { type Ref } from 'vue'
|
||||
|
||||
export interface knowledgeStateTypes {
|
||||
baseInfo: knowledgeData | null
|
||||
|
|
@ -31,10 +31,13 @@ const useKnowledgeStore = defineStore('knowledg', {
|
|||
saveDocumentsFile(file: UploadUserFile[]) {
|
||||
this.documentsFiles = file
|
||||
},
|
||||
async asyncGetAllKnowledge(loading?: Ref<boolean>) {
|
||||
async asyncGetRootKnowledge(loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const params = {
|
||||
folder_id: localStorage.getItem('workspace_id'),
|
||||
}
|
||||
knowledgeApi
|
||||
.getAllKnowledge(loading)
|
||||
.getKnowledgeList(params, loading)
|
||||
.then((data) => {
|
||||
resolve(data)
|
||||
})
|
||||
|
|
@ -43,10 +46,7 @@ const useKnowledgeStore = defineStore('knowledg', {
|
|||
})
|
||||
})
|
||||
},
|
||||
async asyncGetKnowledgeDetail(
|
||||
knowledge_id: string,
|
||||
loading?: Ref<boolean>,
|
||||
) {
|
||||
async asyncGetKnowledgeDetail(knowledge_id: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
knowledgeApi
|
||||
.getKnowledgeDetail(knowledge_id, loading)
|
||||
|
|
@ -58,11 +58,7 @@ const useKnowledgeStore = defineStore('knowledg', {
|
|||
})
|
||||
})
|
||||
},
|
||||
async asyncSyncKnowledge(
|
||||
id: string,
|
||||
sync_type: string,
|
||||
loading?: Ref<boolean>,
|
||||
) {
|
||||
async asyncSyncKnowledge(id: string, sync_type: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
knowledgeApi
|
||||
.putSyncWebKnowledge(id, sync_type, loading)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import { defineStore } from 'pinia'
|
||||
import applicationApi from '@/api/application/application'
|
||||
import knowledgeAPI from '@/api/knowledge/knowledge.ts'
|
||||
import applicationXpackApi from '@/api/application/application-xpack'
|
||||
import { type Ref } from 'vue'
|
||||
import { getBrowserLang } from '@/locales/index'
|
||||
|
|
@ -36,19 +35,6 @@ const useApplicationStore = defineStore('application', {
|
|||
})
|
||||
},
|
||||
|
||||
async asyncGetApplicationKnowledge(id: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
knowledgeAPI
|
||||
.getAllKnowledge(loading)
|
||||
.then((data) => {
|
||||
resolve(data)
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async asyncGetAccessToken(id: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const user = useUserStore()
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import {defineStore} from 'pinia'
|
||||
import type {knowledgeData} from '@/api/type/knowledge'
|
||||
import type {UploadUserFile} from 'element-plus'
|
||||
import { defineStore } from 'pinia'
|
||||
import type { knowledgeData } from '@/api/type/knowledge'
|
||||
import type { UploadUserFile } from 'element-plus'
|
||||
import knowledgeApi from '@/api/knowledge/knowledge'
|
||||
import {type Ref} from 'vue'
|
||||
import { type Ref } from 'vue'
|
||||
|
||||
export interface knowledgeStateTypes {
|
||||
baseInfo: knowledgeData | null
|
||||
|
|
@ -31,10 +31,13 @@ const useKnowledgeStore = defineStore('knowledge', {
|
|||
saveDocumentsFile(file: UploadUserFile[]) {
|
||||
this.documentsFiles = file
|
||||
},
|
||||
async asyncGetAllKnowledge(loading?: Ref<boolean>) {
|
||||
async asyncGetRootKnowledge(loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const params = {
|
||||
folder_id: localStorage.getItem('workspace_id'),
|
||||
}
|
||||
knowledgeApi
|
||||
.getAllKnowledge(loading)
|
||||
.getKnowledgeList(params, loading)
|
||||
.then((data) => {
|
||||
resolve(data)
|
||||
})
|
||||
|
|
@ -43,10 +46,7 @@ const useKnowledgeStore = defineStore('knowledge', {
|
|||
})
|
||||
})
|
||||
},
|
||||
async asyncGetKnowledgeDetail(
|
||||
knowledge_id: string,
|
||||
loading?: Ref<boolean>,
|
||||
) {
|
||||
async asyncGetKnowledgeDetail(knowledge_id: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
knowledgeApi
|
||||
.getKnowledgeDetail(knowledge_id, loading)
|
||||
|
|
@ -58,11 +58,7 @@ const useKnowledgeStore = defineStore('knowledge', {
|
|||
})
|
||||
})
|
||||
},
|
||||
async asyncSyncKnowledge(
|
||||
id: string,
|
||||
sync_type: string,
|
||||
loading?: Ref<boolean>,
|
||||
) {
|
||||
async asyncSyncKnowledge(id: string, sync_type: string, loading?: Ref<boolean>) {
|
||||
return new Promise((resolve, reject) => {
|
||||
knowledgeApi
|
||||
.putSyncWebKnowledge(id, sync_type, loading)
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@
|
|||
<div class="flex align-center" style="width: 80%">
|
||||
<KnowledgeIcon
|
||||
:type="relatedObject(knowledgeList, item, 'id')?.type"
|
||||
class="mr-12"
|
||||
/>
|
||||
|
||||
<span
|
||||
|
|
@ -439,7 +440,7 @@ import { t } from '@/locales'
|
|||
import TTSModeParamSettingDialog from './component/TTSModeParamSettingDialog.vue'
|
||||
import ReasoningParamSettingDialog from './component/ReasoningParamSettingDialog.vue'
|
||||
|
||||
const { model, application } = useStore()
|
||||
const { knowledge, model, application } = useStore()
|
||||
|
||||
const route = useRoute()
|
||||
const {
|
||||
|
|
@ -628,7 +629,7 @@ function getDetail() {
|
|||
}
|
||||
|
||||
function getKnowledge() {
|
||||
application.asyncGetApplicationKnowledge(id, knowledgeLoading).then((res: any) => {
|
||||
knowledge.asyncGetRootKnowledge(knowledgeLoading).then((res: any) => {
|
||||
knowledgeList.value = res.data
|
||||
})
|
||||
}
|
||||
|
|
@ -706,8 +707,7 @@ function refresh() {
|
|||
|
||||
onMounted(() => {
|
||||
getModel()
|
||||
// todo
|
||||
// getKnowledge()
|
||||
getKnowledge()
|
||||
getDetail()
|
||||
getSTTModel()
|
||||
getTTSModel()
|
||||
|
|
|
|||
|
|
@ -35,23 +35,39 @@
|
|||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<el-scrollbar>
|
||||
<div class="max-height">
|
||||
<el-row :gutter="12" v-loading="loading">
|
||||
<el-col :span="12" v-for="(item, index) in filterData" :key="index" class="mb-16">
|
||||
<CardCheckbox value-field="id" :data="item" v-model="checkList" @change="changeHandle">
|
||||
<span class="ellipsis cursor" :title="item.name"> {{ item.name }}</span>
|
||||
</CardCheckbox>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
<LayoutContainer class="application-manage">
|
||||
<template #left>
|
||||
<folder-tree
|
||||
:data="folderList"
|
||||
:currentNodeKey="currentFolder?.id"
|
||||
@handleNodeClick="folderClickHandel"
|
||||
class="p-8"
|
||||
v-loading="folderLoading"
|
||||
/>
|
||||
</template>
|
||||
<el-scrollbar>
|
||||
<div class="max-height layout-bg p-16-24">
|
||||
<el-row :gutter="12" v-loading="loading">
|
||||
<el-col :span="12" v-for="(item, index) in filterData" :key="index" class="mb-16">
|
||||
<CardCheckbox
|
||||
value-field="id"
|
||||
:data="item"
|
||||
v-model="checkList"
|
||||
@change="changeHandle"
|
||||
>
|
||||
<span class="ellipsis cursor ml-12" :title="item.name"> {{ item.name }}</span>
|
||||
</CardCheckbox>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</LayoutContainer>
|
||||
|
||||
<template #footer>
|
||||
<div class="flex-between">
|
||||
<div class="flex">
|
||||
<el-text type="info" class="color-secondary mr-8" v-if="checkList.length > 0">
|
||||
{{ $t('views.application.dialog.selected') }} {{ checkList.length }}
|
||||
{{ $t('views.application.dialog.countDataset') }}
|
||||
</el-text>
|
||||
<el-button link type="primary" v-if="checkList.length > 0" @click="clearCheck">
|
||||
{{ $t('common.clear') }}
|
||||
|
|
@ -62,7 +78,7 @@
|
|||
{{ $t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button type="primary" @click="submitHandle">
|
||||
{{ $t('common.confirm') }}
|
||||
{{ $t('common.add') }}
|
||||
</el-button>
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -71,6 +87,8 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from 'vue'
|
||||
import KnowledgeApi from '@/api/knowledge/knowledge'
|
||||
import useStore from '@/stores'
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Array<any>,
|
||||
|
|
@ -80,12 +98,14 @@ const props = defineProps({
|
|||
})
|
||||
|
||||
const emit = defineEmits(['addData', 'refresh'])
|
||||
const { folder } = useStore()
|
||||
|
||||
const dialogVisible = ref<boolean>(false)
|
||||
const checkList = ref([])
|
||||
const currentEmbedding = ref('')
|
||||
const searchValue = ref('')
|
||||
const searchDate = ref<any[]>([])
|
||||
const loading = ref(false)
|
||||
|
||||
const filterData = computed(() => {
|
||||
return currentEmbedding.value
|
||||
|
|
@ -124,8 +144,8 @@ function clearCheck() {
|
|||
}
|
||||
|
||||
const open = (checked: any) => {
|
||||
searchDate.value = props.data
|
||||
checkList.value = checked
|
||||
getFolder()
|
||||
if (checkList.value.length > 0) {
|
||||
currentEmbedding.value = props.data.filter(
|
||||
(v) => v.id === checkList.value[0],
|
||||
|
|
@ -134,6 +154,7 @@ const open = (checked: any) => {
|
|||
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const submitHandle = () => {
|
||||
emit('addData', checkList.value)
|
||||
dialogVisible.value = false
|
||||
|
|
@ -143,6 +164,36 @@ const refresh = () => {
|
|||
emit('refresh')
|
||||
}
|
||||
|
||||
const folderList = ref<any[]>([])
|
||||
const knowledgeList = ref<any[]>([])
|
||||
const currentFolder = ref<any>({})
|
||||
const folderLoading = ref(false)
|
||||
// 文件
|
||||
function folderClickHandel(row: any) {
|
||||
currentFolder.value = row
|
||||
knowledgeList.value = []
|
||||
if (currentFolder.value.id === 'share') return
|
||||
getList()
|
||||
}
|
||||
|
||||
function getFolder() {
|
||||
const params = {}
|
||||
folder.asyncGetFolder('KNOWLEDGE', params, folderLoading).then((res: any) => {
|
||||
folderList.value = res.data
|
||||
currentFolder.value = res.data?.[0] || {}
|
||||
getList()
|
||||
})
|
||||
}
|
||||
|
||||
function getList() {
|
||||
const params = {
|
||||
folder_id: currentFolder.value?.id || localStorage.getItem('workspace_id'),
|
||||
}
|
||||
KnowledgeApi.getKnowledgeList(params, loading).then((res) => {
|
||||
searchDate.value = res.data
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
<style lang="scss">
|
||||
|
|
@ -152,11 +203,9 @@ defineExpose({ open })
|
|||
padding: 12px 20px 4px 24px;
|
||||
border-bottom: 1px solid var(--el-border-color-light);
|
||||
}
|
||||
.el-dialog__body {
|
||||
padding: 8px !important;
|
||||
}
|
||||
.el-dialog__footer {
|
||||
padding: 0 24px 16px 24px;
|
||||
padding: 12px 24px 12px 24px;
|
||||
border-top: 1px solid var(--el-border-color-light);
|
||||
}
|
||||
|
||||
.el-dialog__headerbtn {
|
||||
|
|
@ -165,7 +214,7 @@ defineExpose({ open })
|
|||
}
|
||||
.max-height {
|
||||
max-height: calc(100vh - 260px);
|
||||
padding: 0 16px;
|
||||
min-height: 300px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -10,182 +10,174 @@
|
|||
:close-on-press-escape="false"
|
||||
>
|
||||
<el-scrollbar max-height="550">
|
||||
<div class="p-16">
|
||||
<el-form label-position="top" ref="paramFormRef" :model="form" v-loading="loading">
|
||||
<el-form-item :label="$t('views.application.dialog.selectSearchMode')">
|
||||
<el-radio-group
|
||||
v-model="form.knowledge_setting.search_mode"
|
||||
class="card__radio"
|
||||
@change="changeHandle"
|
||||
>
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mb-16"
|
||||
:class="form.search_mode === 'embedding' ? 'active' : ''"
|
||||
>
|
||||
<el-radio value="embedding" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.vectorSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.vectorSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mb-16"
|
||||
:class="form.knowledge_setting.search_mode === 'keywords' ? 'active' : ''"
|
||||
>
|
||||
<el-radio value="keywords" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.fullTextSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.fullTextSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
<el-card
|
||||
shadow="never"
|
||||
:class="form.knowledge_setting.search_mode === 'blend' ? 'active' : ''"
|
||||
>
|
||||
<el-radio value="blend" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.hybridSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.hybridSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4">{{
|
||||
$t('views.application.dialog.similarityThreshold')
|
||||
}}</span>
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="$t('views.application.dialog.similarityTooltip')"
|
||||
placement="right"
|
||||
>
|
||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-input-number
|
||||
v-model="form.knowledge_setting.similarity"
|
||||
:min="0"
|
||||
:max="form.knowledge_setting.search_mode === 'blend' ? 2 : 1"
|
||||
:precision="3"
|
||||
:step="0.1"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="$t('views.application.dialog.topReferences')">
|
||||
<el-input-number
|
||||
v-model="form.knowledge_setting.top_n"
|
||||
:min="1"
|
||||
:max="10000"
|
||||
:value-on-clear="1"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item :label="$t('views.application.dialog.maxCharacters')">
|
||||
<el-slider
|
||||
v-model="form.knowledge_setting.max_paragraph_char_number"
|
||||
show-input
|
||||
:show-input-controls="false"
|
||||
:min="500"
|
||||
:max="100000"
|
||||
class="custom-slider"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
v-if="!isWorkflowType"
|
||||
:label="$t('views.application.dialog.noReferencesAction')"
|
||||
<el-form label-position="top" ref="paramFormRef" :model="form" v-loading="loading">
|
||||
<el-form-item :label="$t('views.application.dialog.selectSearchMode')">
|
||||
<el-radio-group
|
||||
v-model="form.knowledge_setting.search_mode"
|
||||
class="card__radio"
|
||||
@change="changeHandle"
|
||||
>
|
||||
<el-form
|
||||
label-position="top"
|
||||
ref="noReferencesformRef"
|
||||
:model="noReferencesform"
|
||||
:rules="noReferencesRules"
|
||||
:hide-required-asterisk="true"
|
||||
class="w-full"
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mb-16"
|
||||
:class="form.search_mode === 'embedding' ? 'active' : ''"
|
||||
>
|
||||
<el-radio-group
|
||||
v-model="form.knowledge_setting.no_references_setting.status"
|
||||
class="radio-block-avatar"
|
||||
>
|
||||
<el-radio value="ai_questioning">
|
||||
<p>
|
||||
{{ $t('views.application.dialog.continueQuestioning') }}
|
||||
</p>
|
||||
</el-radio>
|
||||
|
||||
<el-radio value="designated_answer">
|
||||
<p>{{ $t('views.application.dialog.provideAnswer') }}</p>
|
||||
<el-form-item
|
||||
v-if="
|
||||
form.knowledge_setting.no_references_setting.status === 'designated_answer'
|
||||
"
|
||||
prop="designated_answer"
|
||||
<el-radio value="embedding" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.vectorSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.vectorSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mb-16"
|
||||
:class="form.knowledge_setting.search_mode === 'keywords' ? 'active' : ''"
|
||||
>
|
||||
<el-radio value="keywords" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.fullTextSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.fullTextSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
<el-card
|
||||
shadow="never"
|
||||
:class="form.knowledge_setting.search_mode === 'blend' ? 'active' : ''"
|
||||
>
|
||||
<el-radio value="blend" size="large">
|
||||
<p class="mb-4">
|
||||
{{ $t('views.application.dialog.hybridSearch') }}
|
||||
</p>
|
||||
<el-text type="info">{{
|
||||
$t('views.application.dialog.hybridSearchTooltip')
|
||||
}}</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4">{{ $t('views.application.dialog.similarityThreshold') }}</span>
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="$t('views.application.dialog.similarityTooltip')"
|
||||
placement="right"
|
||||
>
|
||||
<el-input
|
||||
v-model="noReferencesform.designated_answer"
|
||||
:rows="2"
|
||||
type="textarea"
|
||||
maxlength="2048"
|
||||
:placeholder="defaultValue['designated_answer']"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form>
|
||||
</el-form-item>
|
||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-input-number
|
||||
v-model="form.knowledge_setting.similarity"
|
||||
:min="0"
|
||||
:max="form.knowledge_setting.search_mode === 'blend' ? 2 : 1"
|
||||
:precision="3"
|
||||
:step="0.1"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="$t('views.application.dialog.topReferences')">
|
||||
<el-input-number
|
||||
v-model="form.knowledge_setting.top_n"
|
||||
:min="1"
|
||||
:max="10000"
|
||||
:value-on-clear="1"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item @click.prevent v-if="!isWorkflowType">
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4">{{
|
||||
$t('views.application.form.problemOptimization.label')
|
||||
}}</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-switch size="small" v-model="form.problem_optimization"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="form.problem_optimization"
|
||||
:label="$t('views.application.form.prompt.label')"
|
||||
<el-form-item :label="$t('views.application.dialog.maxCharacters')">
|
||||
<el-slider
|
||||
v-model="form.knowledge_setting.max_paragraph_char_number"
|
||||
show-input
|
||||
:show-input-controls="false"
|
||||
:min="500"
|
||||
:max="100000"
|
||||
class="custom-slider"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
v-if="!isWorkflowType"
|
||||
:label="$t('views.application.dialog.noReferencesAction')"
|
||||
>
|
||||
<el-form
|
||||
label-position="top"
|
||||
ref="noReferencesformRef"
|
||||
:model="noReferencesform"
|
||||
:rules="noReferencesRules"
|
||||
:hide-required-asterisk="true"
|
||||
class="w-full"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.problem_optimization_prompt"
|
||||
:rows="6"
|
||||
type="textarea"
|
||||
maxlength="2048"
|
||||
:placeholder="defaultPrompt"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<el-radio-group
|
||||
v-model="form.knowledge_setting.no_references_setting.status"
|
||||
class="radio-block-avatar"
|
||||
>
|
||||
<el-radio value="ai_questioning">
|
||||
<p>
|
||||
{{ $t('views.application.dialog.continueQuestioning') }}
|
||||
</p>
|
||||
</el-radio>
|
||||
|
||||
<el-radio value="designated_answer">
|
||||
<p>{{ $t('views.application.dialog.provideAnswer') }}</p>
|
||||
<el-form-item
|
||||
v-if="form.knowledge_setting.no_references_setting.status === 'designated_answer'"
|
||||
prop="designated_answer"
|
||||
>
|
||||
<el-input
|
||||
v-model="noReferencesform.designated_answer"
|
||||
:rows="2"
|
||||
type="textarea"
|
||||
maxlength="2048"
|
||||
:placeholder="defaultValue['designated_answer']"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item @click.prevent v-if="!isWorkflowType">
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4">{{ $t('views.application.form.problemOptimization.label') }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-switch size="small" v-model="form.problem_optimization"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="form.problem_optimization"
|
||||
:label="$t('views.application.form.prompt.label')"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.problem_optimization_prompt"
|
||||
:rows="6"
|
||||
type="textarea"
|
||||
maxlength="2048"
|
||||
:placeholder="defaultPrompt"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
|
||||
<template #footer>
|
||||
<span class="dialog-footer p-16">
|
||||
<span class="dialog-footer">
|
||||
<el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(noReferencesformRef)" :loading="loading">
|
||||
{{ $t('common.save') }}
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ const submitHandle = () => {
|
|||
}
|
||||
|
||||
function getDataset() {
|
||||
knowledge.asyncGetAllKnowledge(loading).then((res: any) => {
|
||||
knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
|
||||
datasetList.value = res.data?.filter((v: any) => v.id !== id)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ const submitHandle = () => {
|
|||
}
|
||||
|
||||
function getDataset() {
|
||||
knowledge.asyncGetAllKnowledge(loading).then((res: any) => {
|
||||
knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
|
||||
datasetList.value = res.data?.filter((v: any) => v.id !== id)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -368,7 +368,7 @@ function getList() {
|
|||
[search_type.value]: search_form.value[search_type.value],
|
||||
}
|
||||
|
||||
KnowledgeApi.getKnowledgeList(paginationConfig, params, loading).then((res) => {
|
||||
KnowledgeApi.getKnowledgeListPage(paginationConfig, params, loading).then((res) => {
|
||||
paginationConfig.total = res.data.total
|
||||
knowledgeList.value = [...knowledgeList.value, ...res.data.records]
|
||||
})
|
||||
|
|
|
|||
|
|
@ -363,7 +363,7 @@ function getList() {
|
|||
[search_type.value]: search_form.value[search_type.value],
|
||||
}
|
||||
|
||||
KnowledgeApi.getKnowledgeList(paginationConfig, params, loading).then((res) => {
|
||||
KnowledgeApi.getKnowledgeListPage(paginationConfig, params, loading).then((res) => {
|
||||
paginationConfig.total = res.data.total
|
||||
knowledgeList.value = [...knowledgeList.value, ...res.data.records]
|
||||
})
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ function getDocument(id: string) {
|
|||
}
|
||||
|
||||
function getDataset() {
|
||||
knowledge.asyncGetAllKnowledge(loading).then((res: any) => {
|
||||
knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
|
||||
datasetList.value = res.data
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ function getDocument(id: string) {
|
|||
}
|
||||
|
||||
function getDataset() {
|
||||
knowledge.asyncGetAllKnowledge(loading).then((res: any) => {
|
||||
knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
|
||||
datasetList.value = res.data
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,67 +11,65 @@
|
|||
>
|
||||
<div>
|
||||
<el-scrollbar always>
|
||||
<div class="p-16">
|
||||
<el-form label-position="top" ref="paramFormRef" :model="form">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4"
|
||||
>Score {{ $t('views.applicationWorkflow.nodes.rerankerNode.higher') }}</span
|
||||
>
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="$t('views.applicationWorkflow.nodes.rerankerNode.ScoreTooltip')"
|
||||
placement="right"
|
||||
>
|
||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-input-number
|
||||
v-model="form.similarity"
|
||||
:min="0"
|
||||
:max="form.search_mode === 'blend' ? 2 : 1"
|
||||
:precision="3"
|
||||
:step="0.1"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="$t('views.application.dialog.topReferences')">
|
||||
<el-input-number
|
||||
v-model="form.top_n"
|
||||
:min="1"
|
||||
:max="10000"
|
||||
:value-on-clear="1"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form label-position="top" ref="paramFormRef" :model="form">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
<div class="flex align-center">
|
||||
<span class="mr-4"
|
||||
>Score {{ $t('views.applicationWorkflow.nodes.rerankerNode.higher') }}</span
|
||||
>
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="$t('views.applicationWorkflow.nodes.rerankerNode.ScoreTooltip')"
|
||||
placement="right"
|
||||
>
|
||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-input-number
|
||||
v-model="form.similarity"
|
||||
:min="0"
|
||||
:max="form.search_mode === 'blend' ? 2 : 1"
|
||||
:precision="3"
|
||||
:step="0.1"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="$t('views.application.dialog.topReferences')">
|
||||
<el-input-number
|
||||
v-model="form.top_n"
|
||||
:min="1"
|
||||
:max="10000"
|
||||
:value-on-clear="1"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item :label="$t('views.application.dialog.maxCharacters')">
|
||||
<el-slider
|
||||
v-model="form.max_paragraph_char_number"
|
||||
show-input
|
||||
:show-input-controls="false"
|
||||
:min="500"
|
||||
:max="100000"
|
||||
class="custom-slider"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<el-form-item :label="$t('views.application.dialog.maxCharacters')">
|
||||
<el-slider
|
||||
v-model="form.max_paragraph_char_number"
|
||||
show-input
|
||||
:show-input-controls="false"
|
||||
:min="500"
|
||||
:max="100000"
|
||||
class="custom-slider"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<template #footer>
|
||||
<span class="dialog-footer p-16">
|
||||
<span class="dialog-footer">
|
||||
<el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit()" :loading="loading">
|
||||
{{ $t('common.save') }}
|
||||
|
|
@ -91,7 +89,7 @@ const paramFormRef = ref<FormInstance>()
|
|||
const form = ref<any>({
|
||||
top_n: 3,
|
||||
similarity: 0,
|
||||
max_paragraph_char_number: 5000
|
||||
max_paragraph_char_number: 5000,
|
||||
})
|
||||
|
||||
const dialogVisible = ref<boolean>(false)
|
||||
|
|
@ -102,7 +100,7 @@ watch(dialogVisible, (bool) => {
|
|||
form.value = {
|
||||
top_n: 3,
|
||||
similarity: 0,
|
||||
max_paragraph_char_number: 5000
|
||||
max_paragraph_char_number: 5000,
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
import SearchDatasetVue from './index.vue'
|
||||
import { AppNode, AppNodeModel } from '@/workflow/common/app-node'
|
||||
class SearchDatasetNode extends AppNode {
|
||||
constructor(props: any) {
|
||||
super(props, SearchDatasetVue)
|
||||
}
|
||||
}
|
||||
export default {
|
||||
type: 'search-dataset-node',
|
||||
model: AppNodeModel,
|
||||
view: SearchDatasetNode
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import SearchKnowledgeVue from './index.vue'
|
||||
import { AppNode, AppNodeModel } from '@/workflow/common/app-node'
|
||||
class SearchKnowledgeNode extends AppNode {
|
||||
constructor(props: any) {
|
||||
super(props, SearchKnowledgeVue)
|
||||
}
|
||||
}
|
||||
export default {
|
||||
type: 'search-knowledge-node',
|
||||
model: AppNodeModel,
|
||||
view: SearchKnowledgeNode
|
||||
}
|
||||
|
|
@ -184,15 +184,15 @@ function openDatasetDialog() {
|
|||
}
|
||||
|
||||
function getDataset() {
|
||||
if (id) {
|
||||
application.asyncGetApplicationKnowledge(id, datasetLoading).then((res: any) => {
|
||||
datasetList.value = res.data
|
||||
})
|
||||
} else {
|
||||
knowledge.asyncGetAllKnowledge(datasetLoading).then((res: any) => {
|
||||
datasetList.value = res.data?.filter((v: any) => v.user_id === user.userInfo?.id)
|
||||
})
|
||||
}
|
||||
// if (id) {
|
||||
// application.asyncGetApplicationKnowledge(id, datasetLoading).then((res: any) => {
|
||||
// datasetList.value = res.data
|
||||
// })
|
||||
// } else {
|
||||
knowledge.asyncGetRootKnowledge(datasetLoading).then((res: any) => {
|
||||
datasetList.value = res.data?.filter((v: any) => v.user_id === user.userInfo?.id)
|
||||
})
|
||||
// }
|
||||
}
|
||||
function refresh() {
|
||||
getDataset()
|
||||
Loading…
Reference in New Issue