From d53742948d00b6d8a5b11a8902d67fdbc71575ff Mon Sep 17 00:00:00 2001 From: Wenyan Date: Fri, 5 Dec 2025 22:07:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9F=A5=E8=AF=86=E5=BA=93=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=20retrieval=5Fmod?= =?UTF-8?q?el=20=E6=A3=80=E7=B4=A2=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 召回测试页面增加 Score 阈值参数配置 2. 知识库设置页面新增检索模型配置: - 检索方式 (向量/全文/混合/关键字检索) - Reranking 模型 (默认开启,不可关闭) - Top K 返回数量 - Score 阈值 (默认开启,可调节数值) 3. 修复 Dify API 字段名问题 (retrieval_model_dict) 4. 优化数据加载流程,使用详情接口获取完整配置 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/api/dify-dataset/api/datasetApi.ts | 26 ++- app/api/dify-dataset/type/datasetTypes.ts | 18 +- .../dify-dataset-manager/dataset-settings.tsx | 205 +++++++++++++++--- .../dify-dataset-manager/retrieve-test.tsx | 46 +++- .../dify-dataset-manager/dataset-settings.ts | 143 ++++++++++-- app/hooks/dify-dataset-manager/index.ts | 18 +- .../dify-dataset-manager/retrieve-test.ts | 22 +- .../api.dataset.datasets.$datasetId.tsx | 60 ++++- .../dify-dataset-manager/retrieve-test.ts | 4 + 9 files changed, 477 insertions(+), 65 deletions(-) diff --git a/app/api/dify-dataset/api/datasetApi.ts b/app/api/dify-dataset/api/datasetApi.ts index 036a788..fa3ebca 100644 --- a/app/api/dify-dataset/api/datasetApi.ts +++ b/app/api/dify-dataset/api/datasetApi.ts @@ -7,7 +7,7 @@ */ import axios from 'axios'; -import type { Dataset, DatasetsResponse } from '../type'; +import type { Dataset, DatasetsResponse, UpdateDatasetRequest } from '../type'; /** * API 基础 URL @@ -76,3 +76,27 @@ export async function updateDatasetName( ); return response.data; } + +/** + * 更新知识库设置(包含检索模型配置) + * + * @param datasetId - 知识库 ID + * @param settings - 更新的设置项 + * @returns 更新后的知识库详情 + */ +export async function updateDatasetSettings( + datasetId: string, + settings: UpdateDatasetRequest +): Promise { + console.log('[Dataset Client] 更新知识库设置:', { datasetId, settings }); + + const response = await axios.patch( + `${API_URL}/datasets/${datasetId}`, + settings, + { + headers: { 'Content-Type': 'application/json' }, + withCredentials: true, + } + ); + return response.data; +} diff --git a/app/api/dify-dataset/type/datasetTypes.ts b/app/api/dify-dataset/type/datasetTypes.ts index 65dd4ee..f504f9c 100644 --- a/app/api/dify-dataset/type/datasetTypes.ts +++ b/app/api/dify-dataset/type/datasetTypes.ts @@ -12,8 +12,8 @@ export interface Dataset { name: string; description: string; permission: 'only_me' | 'all_team_members'; - data_source_type: 'upload_file' | 'notion_import' | 'website_crawl'; - indexing_technique: 'high_quality' | 'economy'; + data_source_type: 'upload_file' | 'notion_import' | 'website_crawl' | null; + indexing_technique: 'high_quality' | 'economy' | null; app_count: number; document_count: number; word_count: number; @@ -21,6 +21,20 @@ export interface Dataset { created_at: number; updated_by: string; updated_at: number; + /** 嵌入模型提供商 */ + embedding_model_provider?: string | null; + /** 嵌入模型名称 */ + embedding_model?: string | null; + /** 嵌入模型是否可用 */ + embedding_available?: boolean; + /** 检索模型配置(Dify API 返回字段名为 retrieval_model_dict) */ + retrieval_model_dict?: RetrievalModel; + /** 标签 */ + tags?: string[]; + /** 文档形式 */ + doc_form?: string | null; + /** 供应商 */ + provider?: string; } /** diff --git a/app/components/dify-dataset-manager/dataset-settings.tsx b/app/components/dify-dataset-manager/dataset-settings.tsx index 05f1a90..af651ac 100644 --- a/app/components/dify-dataset-manager/dataset-settings.tsx +++ b/app/components/dify-dataset-manager/dataset-settings.tsx @@ -1,10 +1,18 @@ -import { Form, Input, Button, Card, Spin } from 'antd'; -import { SaveOutlined } from '@ant-design/icons'; -import { useDatasetSettings } from '~/hooks/dify-dataset-manager/dataset-settings'; +import { Form, Input, Button, Card, Spin, Divider, Select, Slider, InputNumber, Tooltip, Checkbox } from 'antd'; +import { SaveOutlined, QuestionCircleOutlined, CheckCircleFilled } from '@ant-design/icons'; +import { useDatasetSettings, type SearchMethod } from '~/hooks/dify-dataset-manager/dataset-settings'; import type { DatasetSettingsProps } from '~/types/dify-dataset-manager/dataset-settings'; const { TextArea } = Input; +// 检索方式选项 +const SEARCH_METHOD_OPTIONS: { label: string; value: SearchMethod; description: string }[] = [ + { label: '向量检索', value: 'semantic_search', description: '基于语义理解的智能检索,适合需要理解上下文的场景' }, + { label: '全文检索', value: 'full_text_search', description: '基于关键词匹配的传统检索方式' }, + { label: '混合检索', value: 'hybrid_search', description: '结合向量和全文检索,综合效果最佳' }, + { label: '关键字检索', value: 'keyword_search', description: '精确关键字匹配' }, +]; + /** * 知识库设置组件 * 用于修改知识库名称和描述 @@ -14,15 +22,23 @@ export default function DatasetSettings({ onDatasetUpdated, }: DatasetSettingsProps) { const [form] = Form.useForm(); - + const { saving, hasChanges, + retrievalSettings, handleValuesChange, handleSave, handleReset, + updateRetrievalSettings, } = useDatasetSettings(dataset, form, onDatasetUpdated); + // 是否需要显示 Reranking 提示(语义检索和混合检索需要,且强制开启) + const showRerankingInfo = retrievalSettings.searchMethod === 'semantic_search' || retrievalSettings.searchMethod === 'hybrid_search'; + // 权重设置:由于 Reranking 强制开启,混合检索时由 Reranking 模型决定排序,不需要手动设置权重 + // 所以这里始终不显示权重设置 + const showWeightsOption = false; + if (!dataset) { return (
@@ -81,12 +97,6 @@ export default function DatasetSettings({ {dataset.indexing_technique === 'high_quality' ? '高质量' : '经济'}
- {/*
- Embedding 模型: - - {dataset.embedding_model || '默认模型'} - -
*/}
文档数量: {dataset.document_count} @@ -102,24 +112,167 @@ export default function DatasetSettings({
- - {/* 操作按钮 */} -
- - -
+ + {/* 检索设置卡片 */} + +

+ 检索设置 + + + +

+ + {/* 检索方式 */} +
+ +