Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,14 @@ System 不传 Workspace 文件夹条件;System 共享不提供智能体选择
共享工具 API 不提供工作空间文件夹移动或批量接口;复用卡片、Action 和表单接收完整 Workspace
与 System 共享 API 的联合类型,不补造接口以匹配 Workspace 方法集合。

### 知识库召回测试

Workspace、System 资源管理和 System 共享资源均在各自 `knowledge/knowledge.ts` 中提供
`postKnowledgeHitTest(knowledgeId, payload)`,向知识库的 `/hit_test` 提交 POST,直接返回命中分段数组。
请求使用 `KnowledgeHitTestPayload`,包含 `query_text`、`image_list`、`top_number`、`similarity` 和
`search_mode`;检索模式复用 `KNOWLEDGE_SEARCH_MODE`。文本和图片至少提供一项,图片仅支持向量或混合检索。
结果使用 `KnowledgeHitTestResult`,保留分段、得分及图片命中信息。Workspace 共享暂无对应接口,不回退其他范围。

### System 共享知识库

`system/shared-resources/knowledge/knowledge.ts` 使用 `/system/shared/knowledge`,维护分页、详情、
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import { del, get, getExportFile, post, put } from '@/api/admin/core/request'
import type LogicFlow from '@logicflow/core'
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload, KnowledgeSyncType } from '@/api/types'
import type {
KnowledgeHitTestPayload,
KnowledgeHitTestResult,
Dict,
KnowledgeDetail,
KnowledgeItem,
KnowledgeGeneratePayload,
KnowledgeSyncType,
} from '@/api/types'

const prefix = '/system/resource/knowledge'

Expand Down Expand Up @@ -77,7 +85,12 @@ const putKnowledgeKeywordIndex = (knowledgeId: string) => put<undefined, void>(`
const postTransformWorkflow = (knowledgeId: string, payload: { work_flow: LogicFlow.GraphConfigData }) =>
post<{ work_flow: LogicFlow.GraphConfigData }, boolean>(`${prefix}/${knowledgeId}/transform_workflow`, payload)

/** 测试知识库检索并返回命中的分段。 */
const postKnowledgeHitTest = (knowledgeId: string, payload: KnowledgeHitTestPayload) =>
post<KnowledgeHitTestPayload, KnowledgeHitTestResult[]>(`${prefix}/${knowledgeId}/hit_test`, payload)

export default {
postKnowledgeHitTest,
postTransformWorkflow,
putKnowledgeKeywordIndex,
exportKnowledgeExcel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type LogicFlow from '@logicflow/core'
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
import type {
Dict,
KnowledgeHitTestPayload,
KnowledgeHitTestResult,
KnowledgeCreatePayload,
KnowledgeDetail,
KnowledgeGeneratePayload,
Expand Down Expand Up @@ -96,7 +98,12 @@ const putKnowledgeKeywordIndex = (knowledgeId: string) => put<undefined, void>(`
const postTransformWorkflow = (knowledgeId: string, payload: { work_flow: LogicFlow.GraphConfigData }) =>
post<{ work_flow: LogicFlow.GraphConfigData }, boolean>(`${prefix}/${knowledgeId}/transform_workflow`, payload)

/** 测试知识库检索并返回命中的分段。 */
const postKnowledgeHitTest = (knowledgeId: string, payload: KnowledgeHitTestPayload) =>
post<KnowledgeHitTestPayload, KnowledgeHitTestResult[]>(`${prefix}/${knowledgeId}/hit_test`, payload)

export default {
postKnowledgeHitTest,
postTransformWorkflow,
deleteKnowledge,
exportKnowledge,
Expand Down
7 changes: 7 additions & 0 deletions ui/src/api/admin/workspace/knowledge/knowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type LogicFlow from '@logicflow/core'
import type { ParamsPage, ResponsePage } from '../../core/types'
import type {
Dict,
KnowledgeHitTestPayload,
KnowledgeHitTestResult,
KnowledgeDetail,
KnowledgeItem,
KnowledgeGeneratePayload,
Expand Down Expand Up @@ -129,7 +131,12 @@ const putKnowledgeKeywordIndex = (knowledgeId: string) => put<undefined, void>(`
const postTransformWorkflow = (knowledgeId: string, payload: { work_flow: LogicFlow.GraphConfigData }) =>
post<{ work_flow: LogicFlow.GraphConfigData }, boolean>(`${getPrefix()}/${knowledgeId}/transform_workflow`, payload)

/** 测试知识库检索并返回命中的分段。 */
const postKnowledgeHitTest = (knowledgeId: string, payload: KnowledgeHitTestPayload) =>
post<KnowledgeHitTestPayload, KnowledgeHitTestResult[]>(`${getPrefix()}/${knowledgeId}/hit_test`, payload)

export default {
postKnowledgeHitTest,
getKnowledgeMcpConfig,
putKnowledgeKeywordIndex,
exportKnowledgeExcel,
Expand Down
51 changes: 50 additions & 1 deletion ui/src/api/types/knowledge.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
/** Workspace 知识库列表和知识库卡片共用的业务类型。 */

import type LogicFlow from '@logicflow/core'
import { KNOWLEDGE_SYNC_TYPE, KNOWLEDGE_TYPE } from '@/api/enums'
import { KNOWLEDGE_SEARCH_MODE, KNOWLEDGE_SYNC_TYPE, KNOWLEDGE_TYPE } from '@/api/enums'
import type { DefaultModelSettingPayload } from './model'
import type { DocumentTaskState } from './document'
import type { ParagraphItem } from './paragraph'

/** 生成关联问题共用的模型与提示词配置。 */
export interface RelatedQuestionsConfig {
Expand Down Expand Up @@ -153,3 +154,51 @@ export interface KnowledgeWorkflowStoreResponse {
additionalProperties: { tags: { key: string; name: string }[] }
apps: import('./workflow-template').WorkflowStoreTemplate[]
}

/** 知识库召回测试的检索模式。 */
export type KnowledgeSearchMode = (typeof KNOWLEDGE_SEARCH_MODE)[keyof typeof KNOWLEDGE_SEARCH_MODE]

/** 召回测试使用的已上传图片。 */
export interface KnowledgeHitTestImage {
file_id: string
name?: string
url?: string
}

/** 召回测试的查询内容与检索参数;文本和图片至少提供一项。 */
export interface KnowledgeHitTestPayload {
query_text?: string | null
image_list?: KnowledgeHitTestImage[]
top_number: number
similarity: number
search_mode: KnowledgeSearchMode
}

/** 召回结果命中的图片资产。 */
export interface KnowledgeHitTestAsset {
id: string
file_id: string
file_name: string
url: string
position: number
caption: string
ocr_text: string
description: string
hit_num: number
last_hit_time: string | null
}

/** 召回测试返回的分段与命中得分。 */
export interface KnowledgeHitTestResult extends ParagraphItem {
knowledge_id: string
knowledge_name: string
document_name: string
similarity: number
comprehensive_score: number
source_id: string
source_type: number
hit_unit_type: string
query_unit_type: string | null
query_unit_index: number | null
hit_asset: KnowledgeHitTestAsset | null
}
Binary file added ui/src/assets/empty/hit-test.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions ui/src/constants/CONSTANT_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ API 枚举值。例如角色类型和登录方式以 `src/api/enums` 为唯一
`knowledge.ts` 的 `KNOWLEDGE_SYNC_OPTIONS` 统一维护增量同步、替换同步和整体同步的值、文案及说明,
手动同步弹窗与定时同步设置直接复用,日志同步方式标签也从这些选项读取。

`knowledge.ts` 的 `KNOWLEDGE_SEARCH_MODE_OPTIONS` 统一维护向量、全文和混合检索的值、文案及说明,
召回测试页与工作流知识库检索节点直接复用,选项值引用 `KNOWLEDGE_SEARCH_MODE`。

`schedule.ts` 的 `SCHEDULE_OPTION` 统一提供触发器、长期记忆与知识库定时同步的周期级联选项,
包含周期文案、执行时间和间隔数值;使用方只读,配置回填与校验仍由各自组件维护。
周期类型统一使用 `api/enums/schedule.ts` 的 `SCHEDULE_TYPE`,经 `@/api/enums` 导入。
Expand Down
21 changes: 20 additions & 1 deletion ui/src/constants/knowledge.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { KNOWLEDGE_TYPE, KNOWLEDGE_SYNC_TYPE } from '@/api/enums'
import { KNOWLEDGE_TYPE, KNOWLEDGE_SYNC_TYPE, KNOWLEDGE_SEARCH_MODE } from '@/api/enums'
import type { KnowledgeType } from '@/api/types'

/** 前端知识库类型标识。 */
Expand Down Expand Up @@ -31,3 +31,22 @@ export const KNOWLEDGE_SYNC_OPTIONS = [
{ value: KNOWLEDGE_SYNC_TYPE.REPLACE, label: '替换同步', description: '重新获取来源文档并替换匹配的文档,保留未匹配的旧文档' },
{ value: KNOWLEDGE_SYNC_TYPE.COMPLETE, label: '整体同步', description: '重新获取来源文档并重建该来源的文档,保留其他来源的文档' },
] as const

/** 召回测试与工作流知识库检索共用的模式选项。 */
export const KNOWLEDGE_SEARCH_MODE_OPTIONS = [
{
value: KNOWLEDGE_SEARCH_MODE.EMBEDDING,
label: '向量检索',
description: '向量检索是一种基于向量相似度的检索方式,适用于知识库中的大数据量场景。',
},
{
value: KNOWLEDGE_SEARCH_MODE.KEYWORDS,
label: '全文检索',
description: '全文检索是一种基于文本相似度的检索方式,适用于知识库中的小数据量场景。',
},
{
value: KNOWLEDGE_SEARCH_MODE.BLEND,
label: '混合检索',
description: '混合检索是一种基于向量和文本相似度的检索方式,适用于知识库中的中等数据量场景。',
},
] as const
3 changes: 2 additions & 1 deletion ui/src/router/ROUTE_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,11 @@ Workspace 共享覆盖 resourceScope,保留 Workspace scope 及知识库 activ
| ---------- | --------------------------------------------------------------------------------------------------------------------- |
| 资料库 | 空 path 分组;document、image、tag;仅 BASE 显示图片 |
| 工作流 | workflow-entry;WORKFLOW 类型 beforeEnter 重定向对应全屏画布,其他类型显示转换页 |
| 检索优化 | retrieval/recall、retrieval/question、retrieval/dictionary |
| 检索优化 | retrieval/hit-test、retrieval/question、retrieval/dictionary |
| 授权与集成 | integration/chat-user、integration/external-retrieval |
| 设置 | BASE 单独 setting;WEB 分组含 setting/base、document-strategy、scheduled-sync;LARK/WORKFLOW 含 base、scheduled-sync |

召回测试子路由通过 `props` 传入资源范围与知识库 ID 组成的 Vue `key`,切换资源时重建该页。
分组不挂 View,直接访问重定向首个子页,保留参数、query、hash。
设置只用 detailMenuVisible 控制菜单类型,不添加类型访问守卫。资料库 View 的目录是 library/tags,URL 仍为 tag。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,14 @@ export const systemResourceKnowledgeRoutes: RouteRecordRaw[] = [
{
path: 'retrieval',
name: 'system-resource-knowledge-retrieval',
redirect: { name: 'system-resource-knowledge-recall-test' },
redirect: { name: 'system-resource-knowledge-hit-test' },
meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 },
children: [
{
path: 'recall',
name: 'system-resource-knowledge-recall-test',
component: () => import('@/views/knowledge-detail/recall-test/index.vue'),
path: 'hit-test',
name: 'system-resource-knowledge-hit-test',
component: () => import('@/views/knowledge-detail/hit-test/index.vue'),
props: (route) => ({ key: `${route.meta.resourceScope}:${route.params.knowledgeId}` }),
meta: { title: '召回测试', order: 10 },
},
{
Expand Down
9 changes: 5 additions & 4 deletions ui/src/router/admin/system/modules/knowledge-system-shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,14 @@ export const systemSharedKnowledgeRoutes: RouteRecordRaw[] = [
{
path: 'retrieval',
name: 'system-shared-knowledge-retrieval',
redirect: { name: 'system-shared-knowledge-recall-test' },
redirect: { name: 'system-shared-knowledge-hit-test' },
meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 },
children: [
{
path: 'recall',
name: 'system-shared-knowledge-recall-test',
component: () => import('@/views/knowledge-detail/recall-test/index.vue'),
path: 'hit-test',
name: 'system-shared-knowledge-hit-test',
component: () => import('@/views/knowledge-detail/hit-test/index.vue'),
props: (route) => ({ key: `${route.meta.resourceScope}:${route.params.knowledgeId}` }),
meta: { title: '召回测试', order: 10 },
},
{
Expand Down
9 changes: 5 additions & 4 deletions ui/src/router/admin/workspace/modules/knowledge-shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,14 @@ export const sharedKnowledgeRoutes: RouteRecordRaw[] = [
{
path: 'retrieval',
name: 'workspace-shared-knowledge-retrieval',
redirect: { name: 'workspace-shared-knowledge-recall-test' },
redirect: { name: 'workspace-shared-knowledge-hit-test' },
meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 },
children: [
{
path: 'recall',
name: 'workspace-shared-knowledge-recall-test',
component: () => import('@/views/knowledge-detail/recall-test/index.vue'),
path: 'hit-test',
name: 'workspace-shared-knowledge-hit-test',
component: () => import('@/views/knowledge-detail/hit-test/index.vue'),
props: (route) => ({ key: `${route.meta.resourceScope}:${route.params.knowledgeId}` }),
meta: { title: '召回测试', order: 10 },
},
{
Expand Down
9 changes: 5 additions & 4 deletions ui/src/router/admin/workspace/modules/knowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,14 @@ export const knowledgeRoutes: RouteRecordRaw[] = [
{
path: 'retrieval',
name: 'workspace-knowledge-retrieval',
redirect: { name: 'workspace-knowledge-recall-test' },
redirect: { name: 'workspace-knowledge-hit-test' },
meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 },
children: [
{
path: 'recall',
name: 'workspace-knowledge-recall-test',
component: () => import('@/views/knowledge-detail/recall-test/index.vue'),
path: 'hit-test',
name: 'workspace-knowledge-hit-test',
component: () => import('@/views/knowledge-detail/hit-test/index.vue'),
props: (route) => ({ key: `${route.meta.resourceScope}:${route.params.knowledgeId}` }),
meta: { title: '召回测试', order: 10 },
},
{
Expand Down
18 changes: 16 additions & 2 deletions ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
| `knowledge-detail/` | 四范围知识库详情、菜单与上下文 |
| `knowledge-detail/library/document/`、`tags/` | 文档及标签维护 |
| `knowledge-detail/library/image/` | 图片列表,复用文档操作 |
| `knowledge-detail/recall-test/`、`question/` | 检索优化占位页 |
| `knowledge-detail/hit-test/` | 召回测试参数、文本/图片查询及结果展示 |
| `knowledge-detail/question/` | 问题管理占位页 |
| `knowledge-detail/termbase/` | 知识库自定义分词维护 |
| `knowledge-detail/chat-user/`、`external-retrieval/` | 对话授权与外部检索配置 |
| `knowledge-detail/setting/base/`、`document-strategy/`、`scheduled-sync/` | 基础设置、文档策略、定时同步与日志 |
Expand Down Expand Up @@ -105,7 +106,7 @@

`knowledge-detail/context.ts` 仅通过 `provideKnowledgeDetailContext` 和
`useKnowledgeDetailContext` 公开详情、更新能力、ID、来源导航及完整 API。
`resourceApi.knowledge / scheduledSync / document / image / tags / termbase / chatUser / externalRetrieval` 按当前范围响应式读取,无需 `.value`,
`resourceApi.knowledge / scheduledSync / document / paragraph / image / tags / termbase / chatUser / externalRetrieval` 按当前范围响应式读取,无需 `.value`,
不要在 setup 时解构具体 API。`workflow` 当前仅普通 Workspace 提供,其他范围不回退。
共有查询方法必填,部分范围缺失的方法可选调用;未发请求时不提示成功、不关闭、不刷新或修改快照,loading 正常清理。
不增加查询/维护双入口、接口别名或专属 Context hook,也不以方法存在性新增操作显隐规则。
Expand All @@ -132,11 +133,24 @@
复用周期及同步方式常量,支持日、周、月、间隔和 Cron,间隔至少 5 分钟;完整 Cron 由后台校验。
日志页按需挂载 `SyncLogTable`,传完整 API,仅展示定时任务,不轮询;跳过执行展示原因。

### 召回测试

`hit-test/` 按截图提供参数/输入与结果两栏,复用详情标题栏。通过详情上下文选择 Workspace、
System 资源管理或 System 共享 Knowledge API 的 `postKnowledgeHitTest`;Workspace 共享缺少对应接口时
由上下文返回文档页,不回退其他范围。
默认向量检索、相似度 0.600、TOP K 6;切换全文检索重置相似度为 0,其余模式为 0.6。
文本和图片至少提供一项,空白文本不可提交;图片存在或上传中时禁选全文检索,全文模式不提供图片入口。
图片通过 Admin File API 上传为 120 分钟临时文件,最多 10 张、每张 20MB,仅提交上传成功的文件引用;
上传中或存在失败图片时禁测试,移除失败图片后可重试。移除与卸载释放本地预览并取消未完成上传。
测试期间冻结参数与输入;结果展示提交时的查询、分段、得分、文档名称及命中图片,Markdown 只读。
初始、无命中与失败分别展示空态,失败保留输入供重试。切换知识库或资源范围通过路由 key 重建召回测试页,隔离查询与结果状态。

### 文档列表与导入

`library/document/index.vue` 管理查询、分页、选择、启停及刷新;Action 管理各自请求和浮层。
`library/image/index.vue` 使用独立列表入口,复用 `document/` 的状态、展示组件及 Action,
查询与操作沿用 Document API;图片列表的查询参数差异见 [API 文档](../api/API_README.md#文档与分段)。
点击图片行通过 `resourceApi.paragraph.getParagraphPage` 查询首个分段,使用 `ParagraphDialog` 展示详情;弹窗按需挂载,关闭动画结束后卸载。
图片上传独立放在 `image/upload-image/`,`ButtonUploadImage` 管理入口与按需挂载,
`UploadImageDrawer` 分为上传图片、图片处理两步,复用 `MkDragUpload` 的多文件图片模式暂存文件;
`ImageProcessingForm` 管理视觉增强策略及模型/工具选项,不展示文档分段与索引设置。
Expand Down
Loading
Loading