From a1bd2b850e9f5ca993c20f33018e7cb57aaa47b7 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 12 May 2026 17:56:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=A5=E8=AF=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/package.json | 2 + .../src/locales/langs/en-US/page.json | 4 + .../src/locales/langs/zh-CN/page.json | 4 + .../src/router/routes/modules/knowledge.ts | 33 + apps/web-antd/src/views/knowledge/chat.vue | 913 ++++++++++++++++++ pnpm-lock.yaml | 34 +- 6 files changed, 983 insertions(+), 7 deletions(-) create mode 100644 apps/web-antd/src/router/routes/modules/knowledge.ts create mode 100644 apps/web-antd/src/views/knowledge/chat.vue diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index fac8415..2d457f3 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -44,7 +44,9 @@ "ant-design-vue": "catalog:", "cal-heatmap": "^4.2.4", "dayjs": "catalog:", + "dompurify": "^3.4.2", "json-editor-vue": "^0.18.1", + "marked": "^18.0.3", "pinia": "catalog:", "pixi.js": "8.11.0-main.efa7feb", "prettier-eslint": "^16.4.2", diff --git a/apps/web-antd/src/locales/langs/en-US/page.json b/apps/web-antd/src/locales/langs/en-US/page.json index cf7c980..dd69004 100644 --- a/apps/web-antd/src/locales/langs/en-US/page.json +++ b/apps/web-antd/src/locales/langs/en-US/page.json @@ -66,6 +66,10 @@ "noChangesToSave": "No changes to save", "deleteSuccess": "Delete Success" }, + "knowledge": { + "title": "Knowledge Base", + "chat": "Knowledge Q&A" + }, "operation": { "title": "Operation", "apk": "Client APK", diff --git a/apps/web-antd/src/locales/langs/zh-CN/page.json b/apps/web-antd/src/locales/langs/zh-CN/page.json index e57b9e1..9a4b72b 100644 --- a/apps/web-antd/src/locales/langs/zh-CN/page.json +++ b/apps/web-antd/src/locales/langs/zh-CN/page.json @@ -66,6 +66,10 @@ "noChangesToSave": "没有需要保存的更改", "deleteSuccess": "删除成功" }, + "knowledge": { + "title": "知识库", + "chat": "知识问答" + }, "operation": { "title": "运营管理", "apk": "客户端 APK 下载", diff --git a/apps/web-antd/src/router/routes/modules/knowledge.ts b/apps/web-antd/src/router/routes/modules/knowledge.ts new file mode 100644 index 0000000..9a7e8e9 --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/knowledge.ts @@ -0,0 +1,33 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { BasicLayout } from '#/layouts'; +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + component: BasicLayout, + meta: { + icon: 'lucide:book-open', + order: 1100, + title: $t('page.knowledge.title'), + authority: ['super'], + }, + name: 'Knowledge', + path: '/knowledge', + children: [ + { + name: 'KnowledgeChat', + path: '/knowledge/chat', + component: () => import('#/views/knowledge/chat.vue'), + meta: { + affixTab: false, + icon: 'lucide:message-square-text', + title: $t('page.knowledge.chat'), + authority: ['super'], + }, + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/views/knowledge/chat.vue b/apps/web-antd/src/views/knowledge/chat.vue new file mode 100644 index 0000000..372b25e --- /dev/null +++ b/apps/web-antd/src/views/knowledge/chat.vue @@ -0,0 +1,913 @@ + + + + + + + + + + + + + + 配置表知识库问答 + + 基于 BM25 检索与 DeepSeek 流式回答,适合快速查询配置字段、含义和上下游关系。 + + + + + + + 配置检索 + + + + 流式回答 + + + + 来源追踪 + + + + + 试试这些问题 + + + {{ question }} + + + + + + + + + + 知识库对话 + + {{ sending ? '回答中' : '就绪' }} + + + + + + + + + + + 开始一次配置检索问答 + + 例如:AdGiftData 表里有哪些字段? + + + + + + + + + {{ m.role === 'user' ? '你' : m.role === 'err' ? '错误' : '助手' }} + + + + + {{ m.text }} + + + + + + 来源片段 + {{ m.sources.length }} + + + + {{ s.score.toFixed(2) }} + {{ s.chunk_id }} + + {{ s.summary.slice(0, 60) }} + + + + + + + + + + + + + + + + + + 发送 + + + + + + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f79344..c94d142 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -639,9 +639,15 @@ importers: dayjs: specifier: 'catalog:' version: 1.11.13 + dompurify: + specifier: ^3.4.2 + version: 3.4.2 json-editor-vue: specifier: ^0.18.1 version: 0.18.1(vue@3.5.13(typescript@5.7.2)) + marked: + specifier: ^18.0.3 + version: 18.0.3 pinia: specifier: 2.2.2 version: 2.2.2(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) @@ -3608,8 +3614,8 @@ packages: resolution: {integrity: sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==} engines: {node: '>= 16'} - '@intlify/shared@11.3.0': - resolution: {integrity: sha512-LC6P/uay7rXL5zZ5+5iRJfLs/iUN8apu9tm8YqQVmW3Uq3X4A0dOFUIDuAmB7gAC29wTHOS3EiN/IosNSz0eNQ==} + '@intlify/shared@11.4.2': + resolution: {integrity: sha512-NzpHbguRCsOHDwxmlBa9qu/imc+/QWgsYUaK6FZeNC0wK8QfAbhqrktEp/haVzxU1aikH8IX4ytD+mfFEMi/9A==} engines: {node: '>= 16'} '@intlify/shared@12.0.0-alpha.3': @@ -6206,6 +6212,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -7936,6 +7945,11 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + marked@18.0.3: + resolution: {integrity: sha512-7VT90JOkDeaRWpfjOReRGPEKn0ecdARBkDGL+tT1wZY0efPPqkUxLUSmzy/C7TIylQYJC9STISEsCHrqb/7VIA==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -13089,7 +13103,7 @@ snapshots: '@intlify/shared@10.0.5': {} - '@intlify/shared@11.3.0': {} + '@intlify/shared@11.4.2': {} '@intlify/shared@12.0.0-alpha.3': {} @@ -13097,8 +13111,8 @@ snapshots: dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.0)) '@intlify/bundle-utils': 10.0.0(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.2))) - '@intlify/shared': 11.3.0 - '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2)) + '@intlify/shared': 11.4.2 + '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2)) '@rollup/pluginutils': 5.1.3(rollup@4.28.0) '@typescript-eslint/scope-manager': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) @@ -13120,11 +13134,11 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2))': + '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2))': dependencies: '@babel/parser': 7.26.2 optionalDependencies: - '@intlify/shared': 11.3.0 + '@intlify/shared': 11.4.2 '@vue/compiler-dom': 3.5.13 vue: 3.5.13(typescript@5.7.2) vue-i18n: 10.0.5(vue@3.5.13(typescript@5.7.2)) @@ -16104,6 +16118,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.4.2: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 @@ -18039,6 +18057,8 @@ snapshots: mark.js@8.11.1: {} + marked@18.0.3: {} + math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {}