From 8c9cb6f21da222d9f40fc7ee61bfe6b4bd958c91 Mon Sep 17 00:00:00 2001 From: v-zhangjc9 Date: Wed, 28 May 2025 18:46:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(knowledge):=20=E5=AE=8C=E6=88=90=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E9=83=A8=E7=BD=B2=E7=9B=B8=E5=85=B3=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/configuration/WebConfiguration.java | 24 ++++++++ .../controller/DataFileController.java | 1 - .../src/main/resources/application.yml | 38 ++----------- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application.yml | 13 +++++ .../configuration/TestSecurityDecrypt.java | 2 +- .../src/pages/ai/knowledge/DataDetail.tsx | 35 ++---------- .../src/pages/ai/knowledge/DataImport.tsx | 55 ++++--------------- .../src/pages/ai/knowledge/DataSegment.tsx | 31 +---------- .../src/pages/ai/knowledge/Knowledge.tsx | 16 ++---- service-web/client/src/util/amis.tsx | 2 + 11 files changed, 67 insertions(+), 152 deletions(-) create mode 100644 service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebConfiguration.java diff --git a/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebConfiguration.java b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebConfiguration.java new file mode 100644 index 0000000..be6ddbd --- /dev/null +++ b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebConfiguration.java @@ -0,0 +1,24 @@ +package com.lanyuanxiaoyao.service.ai.core.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * web 配置 + * + * @author lanyuanxiaoyao + * @date 2023-04-21 + */ +@Configuration +public class WebConfiguration implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + // 避免跨域影响调试 + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowCredentials(true) + .allowedMethods("*") + .maxAge(3600); + } +} diff --git a/service-ai/service-ai-knowledge/src/main/java/com/lanyuanxiaoyao/service/ai/knowledge/controller/DataFileController.java b/service-ai/service-ai-knowledge/src/main/java/com/lanyuanxiaoyao/service/ai/knowledge/controller/DataFileController.java index 3d8b743..d2be7c9 100644 --- a/service-ai/service-ai-knowledge/src/main/java/com/lanyuanxiaoyao/service/ai/knowledge/controller/DataFileController.java +++ b/service-ai/service-ai-knowledge/src/main/java/com/lanyuanxiaoyao/service/ai/knowledge/controller/DataFileController.java @@ -90,7 +90,6 @@ public class DataFileController { @PostMapping("/start") public AmisResponse start(@RequestBody StartRequest request) { - log.info("Request: {}", request); Long id = dataFileService.initialDataFile(request.filename); return AmisResponse.responseSuccess(new StartResponse(id.toString())); } diff --git a/service-ai/service-ai-knowledge/src/main/resources/application.yml b/service-ai/service-ai-knowledge/src/main/resources/application.yml index 21ede65..41a042a 100644 --- a/service-ai/service-ai-knowledge/src/main/resources/application.yml +++ b/service-ai/service-ai-knowledge/src/main/resources/application.yml @@ -2,31 +2,7 @@ spring: application: name: service-ai-knowledge profiles: - include: common,metrics,forest - cloud: - zookeeper: - enabled: true - connect-string: b1m2.hdp.dc:2181,b1m3.hdp.dc:2181,b1m4.hdp.dc:2181,b1m5.hdp.dc:2181,b1m6.hdp.dc:2181 - discovery: - enabled: ${spring.cloud.zookeeper.enabled} - root: /hudi-services - instance-id: ${spring.application.name}-127.0.0.1-${random.uuid}-20250514 - metadata: - discovery: zookeeper - ip: 127.0.0.1 - hostname: localhost - hostname_full: localhost - start_time: 20250514112750 - datasource: - url: jdbc:mysql://localhost:3307/ai?useSSL=false - username: test - password: test - driver-class-name: com.mysql.cj.jdbc.Driver - security: - meta: - authority: ENC(GXKnbq1LS11U2HaONspvH+D/TkIx13aWTaokdkzaF7HSvq6Z0Rv1+JUWFnYopVXu) - username: ENC(moIO5mO39V1Z+RDwROK9JXY4GfM8ZjDgM6Si7wRZ1MPVjbhTpmLz3lz28rAiw7c2LeCmizfJzHkEXIwGlB280g==) - darkcode: ENC(0jzpQ7T6S+P7bZrENgYsUoLhlqGvw7DA2MN3BRqEOwq7plhtg72vuuiPQNnr3DaYz0CpyTvxInhpx11W3VZ1trD6NINh7O3LN70ZqO5pWXk=) + include: random-port,common,discovery,metrics,forest ai: openai: base-url: http://132.121.206.65:10086 @@ -39,16 +15,10 @@ spring: model: 'Bge-m3-vllm' vectorstore: qdrant: - api-key: lanyuanxiaoyao -jasypt: - encryptor: - password: 'r#(R,P"Dp^A47>WSn:Wn].gs/+"v:q_Q*An~zF*g-@j@jtSTv5H/,S-3:R?r9R}.' -server: - port: 8080 + host: 132.121.206.65 + port: 29463 + api-key: ENC(0/0UkIKeAvyV17yNqSU3v04wmm8CdWKe4BYSSJa2FuBtK12TcZRJPdwk+ZpYnpISv+KmVTUrrmFBzAYrDR3ysA==) liteflow: rule-source: config/flow.xml print-banner: false check-node-exists: false -knowledge: - download-prefix: "http://localhost:8080" - upload-path: /Users/lanyuanxiaoyao/Project/IdeaProjects/hudi-service/service-ai/temp \ No newline at end of file diff --git a/service-ai/service-ai-knowledge/src/main/resources/logback-spring.xml b/service-ai/service-ai-knowledge/src/main/resources/logback-spring.xml index 01bad8b..d686c9c 100644 --- a/service-ai/service-ai-knowledge/src/main/resources/logback-spring.xml +++ b/service-ai/service-ai-knowledge/src/main/resources/logback-spring.xml @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/service-cli/service-cli-runner/src/main/resources/application.yml b/service-cli/service-cli-runner/src/main/resources/application.yml index 2dd825a..0db5475 100644 --- a/service-cli/service-cli-runner/src/main/resources/application.yml +++ b/service-cli/service-cli-runner/src/main/resources/application.yml @@ -168,3 +168,16 @@ deploy: source-jar: service-ai-chat-1.0.0-SNAPSHOT.jar jdk: "jdk17" replicas: 1 + service-ai-knowledge: + order: 6 + groups: + - "ai" + source-jar: service-ai-knowledge-1.0.0-SNAPSHOT.jar + jdk: "jdk17" + replicas: 1 + arguments: + "[knowledge.upload-path]": ${deploy.runtime.data-path}/knowledge + "[spring.datasource.url]": ${deploy.runtime.database.config.url} + "[spring.datasource.username]": ${deploy.runtime.database.config.username} + "[spring.datasource.password]": ${deploy.runtime.database.config.password} + "[spring.datasource.driver-class-name]": ${deploy.runtime.database.config.driver-class-name} diff --git a/service-configuration/src/test/java/com/lanyuanxiaoyao/service/configuration/TestSecurityDecrypt.java b/service-configuration/src/test/java/com/lanyuanxiaoyao/service/configuration/TestSecurityDecrypt.java index 3dda84b..215b1e1 100644 --- a/service-configuration/src/test/java/com/lanyuanxiaoyao/service/configuration/TestSecurityDecrypt.java +++ b/service-configuration/src/test/java/com/lanyuanxiaoyao/service/configuration/TestSecurityDecrypt.java @@ -21,6 +21,6 @@ public class TestSecurityDecrypt { config.setStringOutputType("base64"); encryptor.setConfig(config); - System.out.println(encryptor.decrypt("GXKnbq1LS11U2HaONspvH+D/TkIx13aWTaokdkzaF7HSvq6Z0Rv1+JUWFnYopVXu")); + System.out.println(encryptor.encrypt("jdHyKdp9qxNqCK3c")); } } diff --git a/service-web/client/src/pages/ai/knowledge/DataDetail.tsx b/service-web/client/src/pages/ai/knowledge/DataDetail.tsx index ba891a5..dd1cb41 100644 --- a/service-web/client/src/pages/ai/knowledge/DataDetail.tsx +++ b/service-web/client/src/pages/ai/knowledge/DataDetail.tsx @@ -1,6 +1,6 @@ import React from 'react' import {useNavigate, useParams} from 'react-router' -import {amisRender, crudCommonOptions, mappingField, mappingItem} from '../../../util/amis.tsx' +import {amisRender, commonInfo, crudCommonOptions, mappingField, mappingItem} from '../../../util/amis.tsx' const statusMapping = [ mappingItem('解析中', 'RUNNING', 'bg-warning'), @@ -24,16 +24,7 @@ const DataDetail: React.FC = () => { { type: 'service', className: 'inline', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/knowledge/name', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - id: knowledge_id, - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/knowledge/name?id=${knowledge_id}`, body: { type: 'tpl', tpl: '${name}', @@ -47,16 +38,7 @@ const DataDetail: React.FC = () => { body: [ { type: 'crud', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/group/list', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - knowledge_id, - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/group/list?knowledge_id=${knowledge_id}`, ...crudCommonOptions(), headerToolbar: [ 'reload', @@ -128,16 +110,7 @@ const DataDetail: React.FC = () => { level: 'link', size: 'sm', actionType: 'ajax', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/group/delete', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - id: '${id}', - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/group/delete?id=\${id}`, confirmText: '确认删除', confirmTitle: '删除', }, diff --git a/service-web/client/src/pages/ai/knowledge/DataImport.tsx b/service-web/client/src/pages/ai/knowledge/DataImport.tsx index 96a3f5d..a6b436d 100644 --- a/service-web/client/src/pages/ai/knowledge/DataImport.tsx +++ b/service-web/client/src/pages/ai/knowledge/DataImport.tsx @@ -1,7 +1,7 @@ import React from 'react' import {useParams} from 'react-router' import styled from 'styled-components' -import {amisRender} from '../../../util/amis.tsx' +import {amisRender, commonInfo} from '../../../util/amis.tsx' const ImportDataDiv = styled.div` .antd-EditorControl { @@ -23,16 +23,7 @@ const DataImport: React.FC = () => { { type: 'service', className: 'inline', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/knowledge/name', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - id: knowledge_id, - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/knowledge/name?id=${knowledge_id}`, body: { type: 'tpl', tpl: '${name}', @@ -112,35 +103,17 @@ const DataImport: React.FC = () => { autoUpload: false, drag: true, multiple: true, - useChunk: true, accept: '*', // 5MB 5242880 // 100MB 104857600 // 500MB 524288000 // 1GB 1073741824 - maxSize: '', - maxLength: 0, - startChunkApi: { - method: 'post', - url: 'http://127.0.0.1:8080/upload/start', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - }, - chunkApi: { - method: 'post', - url: 'http://127.0.0.1:8080/upload/slice', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - }, - finishChunkApi: { - method: 'post', - url: 'http://127.0.0.1:8080/upload/finish', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - }, + maxSize: 104857600, + receiver: `${commonInfo.baseAiKnowledgeUrl}/upload` + // useChunk: true, + // startChunkApi: `post:${commonInfo.baseAiKnowledgeUrl}/upload/start`, + // chunkApi: `post:${commonInfo.baseAiKnowledgeUrl}/upload/slice`, + // finishChunkApi: `post:${commonInfo.baseAiKnowledgeUrl}/upload/finish`, }, { className: 'text-right', @@ -148,7 +121,7 @@ const DataImport: React.FC = () => { buttons: [ { type: 'reset', - label: '重置' + label: '重置', }, { type: 'submit', @@ -157,10 +130,7 @@ const DataImport: React.FC = () => { level: 'secondary', api: { method: 'post', - url: 'http://127.0.0.1:8080/knowledge/preview_text', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, + url: `${commonInfo.baseAiKnowledgeUrl}/knowledge/preview_text`, dataType: 'form', data: { mode: '${mode|default:undefined}', @@ -178,10 +148,7 @@ const DataImport: React.FC = () => { actionType: 'ajax', api: { method: 'post', - url: 'http://127.0.0.1:8080/knowledge/submit_text', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, + url: `${commonInfo.baseAiKnowledgeUrl}/knowledge/submit_text`, dataType: 'form', data: { id: knowledge_id, diff --git a/service-web/client/src/pages/ai/knowledge/DataSegment.tsx b/service-web/client/src/pages/ai/knowledge/DataSegment.tsx index c17421e..041d1a2 100644 --- a/service-web/client/src/pages/ai/knowledge/DataSegment.tsx +++ b/service-web/client/src/pages/ai/knowledge/DataSegment.tsx @@ -1,6 +1,6 @@ import React from 'react' import {useParams} from 'react-router' -import {amisRender, crudCommonOptions} from '../../../util/amis.tsx' +import {amisRender, commonInfo, crudCommonOptions} from '../../../util/amis.tsx' const DataDetail: React.FC = () => { const {knowledge_id, group_id} = useParams() @@ -18,16 +18,7 @@ const DataDetail: React.FC = () => { { type: 'service', className: 'inline', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/knowledge/name', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - id: knowledge_id, - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/knowledge/name?id=${knowledge_id}`, body: { type: 'tpl', tpl: '${name}', @@ -41,17 +32,7 @@ const DataDetail: React.FC = () => { body: [ { type: 'crud', - api: { - method: 'get', - url: 'http://127.0.0.1:8080/segment/list', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - data: { - knowledge_id, - group_id, - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/segment/list?knowledge_id=${knowledge_id}&group_id=${group_id}`, ...crudCommonOptions(), headerToolbar: [ 'reload', @@ -110,12 +91,6 @@ const DataDetail: React.FC = () => { level: 'link', size: 'sm', actionType: 'ajax', - api: { - method: 'get', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - }, confirmText: '删除后无法恢复,确认删除该记录?', confirmTitle: '删除', }, diff --git a/service-web/client/src/pages/ai/knowledge/Knowledge.tsx b/service-web/client/src/pages/ai/knowledge/Knowledge.tsx index 969e5f1..f503daf 100644 --- a/service-web/client/src/pages/ai/knowledge/Knowledge.tsx +++ b/service-web/client/src/pages/ai/knowledge/Knowledge.tsx @@ -1,6 +1,6 @@ import React from 'react' import {useNavigate} from 'react-router' -import {amisRender, crudCommonOptions, mappingField, mappingItem} from '../../../util/amis.tsx' +import {amisRender, commonInfo, crudCommonOptions, mappingField, mappingItem} from '../../../util/amis.tsx' const strategyMapping = [ mappingItem('文本', 'Cosine'), @@ -25,12 +25,7 @@ const Knowledge: React.FC = () => { body: [ { type: 'crud', - api: { - url: 'http://127.0.0.1:8080/knowledge/list', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, - }, + api: `${commonInfo.baseAiKnowledgeUrl}/knowledge/list`, ...crudCommonOptions(), headerToolbar: [ 'reload', @@ -47,11 +42,8 @@ const Knowledge: React.FC = () => { body: { type: 'form', api: { - url: 'http://127.0.0.1:8080/knowledge/add', + url: `${commonInfo.baseAiKnowledgeUrl}/knowledge/add`, dataType: 'form', - headers: { - 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', - }, }, body: [ { @@ -156,7 +148,7 @@ const Knowledge: React.FC = () => { actionType: 'ajax', api: { method: 'get', - url: 'http://127.0.0.1:8080/knowledge/delete', + url: `${commonInfo.baseAiKnowledgeUrl}/knowledge/delete`, headers: { 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', }, diff --git a/service-web/client/src/util/amis.tsx b/service-web/client/src/util/amis.tsx index f2e9139..eeb7715 100644 --- a/service-web/client/src/util/amis.tsx +++ b/service-web/client/src/util/amis.tsx @@ -8,6 +8,8 @@ import axios from 'axios' export const commonInfo = { baseUrl: 'http://132.126.207.130:35690/hudi_services/service_web', + baseAiChatUrl: 'http://132.126.207.130:35690/hudi_services/ai_chat', + baseAiKnowledgeUrl: 'http://132.126.207.130:35690/hudi_services/ai_knowledge', // baseUrl: '/hudi_services/service_web', clusters: { // hudi同步运行集群和yarn队列名称