('/ai/knowledge/rerank-models');
+ return response.data;
}
};
diff --git a/schoolNewsWeb/src/types/ai/index.ts b/schoolNewsWeb/src/types/ai/index.ts
index 5d096ef..8d2f46c 100644
--- a/schoolNewsWeb/src/types/ai/index.ts
+++ b/schoolNewsWeb/src/types/ai/index.ts
@@ -75,6 +75,16 @@ export interface AiKnowledge extends BaseDTO {
embeddingModel?: string;
/** Embedding模型提供商 */
embeddingModelProvider?: string;
+ /** Rerank模型 */
+ rerankModel?: string;
+ /** Rerank模型提供商 */
+ rerankModelProvider?: string;
+ /** 是否启用Rerank */
+ rerankingEnable?: boolean;
+ /** 检索Top K(返回前K个结果) */
+ retrievalTopK?: number;
+ /** 检索分数阈值(0.00-1.00) */
+ retrievalScoreThreshold?: number;
/** 向量ID */
vectorID?: string;
/** 文档数量 */
diff --git a/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeBasic.vue b/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeBasic.vue
index 155c242..51f82ac 100644
--- a/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeBasic.vue
+++ b/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeBasic.vue
@@ -25,14 +25,32 @@
索引方式:
{{ getIndexingText(knowledge?.difyIndexingTechnique) }}
-
- Embedding模型:
- {{ knowledge?.embeddingModel || '-' }}
-
-
- 文档数量:
- {{ knowledge?.documentCount || 0 }}
-
+
+ Embedding模型:
+ {{ knowledge?.embeddingModel || '-' }}
+
+
+ Rerank状态:
+
+ {{ knowledge?.rerankingEnable ? '已启用' : '未启用' }}
+
+
+
+ Rerank模型:
+ {{ knowledge.rerankModel }}
+
+
+ 检索Top K:
+ {{ knowledge?.retrievalTopK || 2 }}
+
+
+ 检索阈值:
+ {{ knowledge?.retrievalScoreThreshold }}
+
+
+ 文档数量:
+ {{ knowledge?.documentCount || 0 }}
+
创建时间:
{{ formatDate(knowledge?.createTime) }}
@@ -138,6 +156,81 @@
+
+
+
+
+ Rerank可以对检索结果进行重新排序,提高精确度
+
+
+
+
+
+
+
+ {{ getModelLabel(model) }}
+
+ 上下文: {{ model.contextSize }}
+
+
+
+
+
+ 选择用于重新排序的Rerank模型
+
+
+
+
+
+
+
+ 返回前K个最相关的检索结果,建议范围:2-10
+
+
+
+
+
+
+ 只返回分数高于此阈值的结果(0.00-1.00),0表示不启用
+
+
+
();
const submitting = ref(false);
const modelsLoading = ref(false);
+const rerankModelsLoading = ref(false);
const embeddingModels = ref([]);
+const rerankModels = ref([]);
// 表单数据
const formData = reactive>({
@@ -209,6 +304,11 @@ const formData = reactive>({
difyIndexingTechnique: 'high_quality',
embeddingModel: '',
embeddingModelProvider: '',
+ rerankModel: '',
+ rerankModelProvider: '',
+ rerankingEnable: false,
+ retrievalTopK: 2,
+ retrievalScoreThreshold: 0.0,
difyDatasetId: '',
status: 1
});
@@ -221,6 +321,18 @@ const rules: FormRules = {
],
difyIndexingTechnique: [
{ required: true, message: '请选择索引方式', trigger: 'change' }
+ ],
+ rerankModel: [
+ {
+ validator: (rule: any, value: any, callback: any) => {
+ if (formData.rerankingEnable && !value) {
+ callback(new Error('启用Rerank后必须选择Rerank模型'));
+ } else {
+ callback();
+ }
+ },
+ trigger: 'change'
+ }
]
};
@@ -235,12 +347,25 @@ watch(() => props.knowledge, (newVal) => {
difyIndexingTechnique: newVal.difyIndexingTechnique || 'high_quality',
embeddingModel: newVal.embeddingModel,
embeddingModelProvider: newVal.embeddingModelProvider,
+ rerankModel: newVal.rerankModel,
+ rerankModelProvider: newVal.rerankModelProvider,
+ rerankingEnable: newVal.rerankingEnable ?? false,
+ retrievalTopK: newVal.retrievalTopK ?? 2,
+ retrievalScoreThreshold: newVal.retrievalScoreThreshold ?? 0.0,
difyDatasetId: newVal.difyDatasetId,
status: newVal.status ?? 1
});
}
}, { immediate: true });
+// 监听 rerankingEnable 变化,触发表单验证
+watch(() => formData.rerankingEnable, () => {
+ if (formRef.value) {
+ // 触发 rerankModel 字段的验证
+ formRef.value.validateField('rerankModel', () => {});
+ }
+});
+
// 处理头像更新
function handleAvatarUpdate(val: string) {
formData.avatar = val;
@@ -295,12 +420,43 @@ async function loadEmbeddingModels() {
}
}
+// 加载Rerank模型列表
+async function loadRerankModels() {
+ try {
+ rerankModelsLoading.value = true;
+ const result = await knowledgeApi.getAvailableRerankModels();
+ if (result.success && result.data) {
+ // 按提供商分组
+ const providers = result.data.providers || [];
+ rerankModels.value = providers.map((provider: any) => ({
+ provider: provider.provider,
+ label: provider.label?.zh_Hans || provider.label?.en_US || provider.provider,
+ models: (provider.models || []).map((model: any) => ({
+ model: model.model,
+ provider: model.provider || provider.provider,
+ label: model.label?.zh_Hans || model.label?.en_US || model.model,
+ contextSize: model.model_properties?.context_size,
+ status: model.status
+ }))
+ }));
+ } else {
+ ElMessage.warning('获取Rerank模型列表失败');
+ rerankModels.value = [];
+ }
+ } catch (error: any) {
+ console.error('加载Rerank模型列表失败:', error);
+ rerankModels.value = [];
+ } finally {
+ rerankModelsLoading.value = false;
+ }
+}
+
// 获取模型显示标签
function getModelLabel(model: any): string {
return model.label || model.model;
}
-// 处理模型变化
+// 处理Embedding模型变化
function handleModelChange(modelName: string) {
if (!modelName) {
formData.embeddingModelProvider = '';
@@ -312,7 +468,25 @@ function handleModelChange(modelName: string) {
const foundModel = providerGroup.models.find((m: any) => m.model === modelName);
if (foundModel) {
formData.embeddingModelProvider = foundModel.provider;
- console.log('选择模型:', modelName, '提供商:', foundModel.provider);
+ console.log('选择Embedding模型:', modelName, '提供商:', foundModel.provider);
+ break;
+ }
+ }
+}
+
+// 处理Rerank模型变化
+function handleRerankModelChange(modelName: string) {
+ if (!modelName) {
+ formData.rerankModelProvider = '';
+ return;
+ }
+
+ // 查找选中模型的提供商
+ for (const providerGroup of rerankModels.value) {
+ const foundModel = providerGroup.models.find((m: any) => m.model === modelName);
+ if (foundModel) {
+ formData.rerankModelProvider = foundModel.provider;
+ console.log('选择Rerank模型:', modelName, '提供商:', foundModel.provider);
break;
}
}
@@ -320,6 +494,7 @@ function handleModelChange(modelName: string) {
// 组件挂载时加载模型列表
loadEmbeddingModels();
+loadRerankModels();
// 提交表单
async function handleSubmit() {