diff --git a/service-ai/bin/.gitignore b/service-ai/bin/.gitignore new file mode 100644 index 0000000..b70feb9 --- /dev/null +++ b/service-ai/bin/.gitignore @@ -0,0 +1,102 @@ +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets +.history/ +*.vsix +*~ +.fuse_hidden* +.directory +.Trash-* +.nfs* +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json +pids +*.pid +*.seed +*.pid.lock +lib-cov +coverage +*.lcov +.nyc_output +.grunt +bower_components +.lock-wscript +build/Release +node_modules/ +jspm_packages/ +web_modules/ +*.tsbuildinfo +.npm +.eslintcache +.stylelintcache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ +.node_repl_history +*.tgz +.yarn-integrity +.env +.env.development.local +.env.test.local +.env.production.local +.env.local +.cache +.parcel-cache +.next +out +.nuxt +dist +.cache/ +.vuepress/dist +.temp +.docusaurus +.serverless/ +.fusebox/ +.dynamodb/ +.tern-port +.vscode-test +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db +*.stackdump +[Dd]esktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msix +*.msm +*.msp +*.lnk +.DS_Store +.AppleDouble +.LSOverride +Icon +._* +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/service-ai/bin/build-ai-chat.js b/service-ai/bin/build-ai-chat.js new file mode 100644 index 0000000..ed6356b --- /dev/null +++ b/service-ai/bin/build-ai-chat.js @@ -0,0 +1,14 @@ +import {cd, path} from 'zx' +import {trim} from "licia"; +import {run_deploy, run_package, run_upload} from '../../bin/library.js' + +// 切换目录 +cd(trim(path.dirname(import.meta.dirname))) +// 执行流程 +try { + await run_deploy('service-ai-core') + await run_package('service-ai-chat') + await run_upload('service-ai-chat') +} catch (e) { + console.error(e) +} \ No newline at end of file diff --git a/service-ai/bin/build-ai-chat.sh b/service-ai/bin/build-ai-chat.sh deleted file mode 100755 index 73ad775..0000000 --- a/service-ai/bin/build-ai-chat.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -root_path=$(dirname $(cd $(dirname $0);pwd)) -source $(realpath $root_path/..)/bin/library.sh -deploy service-ai-core -package service-ai-chat -upload $root_path/service-ai-chat/target/service-ai-chat-1.0.0-SNAPSHOT.jar \ No newline at end of file diff --git a/service-ai/bin/test.js b/service-ai/bin/test.js new file mode 100644 index 0000000..e69de29 diff --git a/service-ai/pom.xml b/service-ai/pom.xml index 71da03a..f165b52 100644 --- a/service-ai/pom.xml +++ b/service-ai/pom.xml @@ -24,7 +24,7 @@ 3.4.3 2024.0.1 - 1.0.0-M6 + 1.0.0-RC1 11.1.0 5.1.0 5.8.27 diff --git a/service-ai/service-ai-chat/pom.xml b/service-ai/service-ai-chat/pom.xml index 542ffa0..efb09c3 100644 --- a/service-ai/service-ai-chat/pom.xml +++ b/service-ai/service-ai-chat/pom.xml @@ -18,7 +18,7 @@ org.springframework.ai - spring-ai-openai-spring-boot-starter + spring-ai-starter-model-openai diff --git a/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/controller/ChatController.java b/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/controller/ChatController.java index cb78f95..4df3613 100644 --- a/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/controller/ChatController.java +++ b/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/controller/ChatController.java @@ -32,13 +32,19 @@ public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { - this.chatClient = builder - .defaultSystem("始终在中文语境下进行对话") - .build(); + this.chatClient = builder.build(); } private ChatClient.ChatClientRequestSpec buildRequest(ImmutableList messages) { return chatClient.prompt() + .system(""" + 你是一名专业的AI运维助手,负责“Hudi数据同步服务平台”的运维工作; + 你将会友好地帮助用户解答关于该平台运维工作的问题,你会尽可能通过各种方式获取知识和数据来解答; + 对于无法通过已有知识回答的问题,你会提示用户你无法解答该问题,而不是虚构不存在的数据或答案; + 对于与该平台无关的问题,你会委婉地拒绝用户,并提示无法回答; + 你将始终在中文语境下进行对话。 + """) + .tools(new DatetimeTools()) .messages( messages .collect(message -> StrUtil.equals(message.getRole(), "assistant") @@ -52,9 +58,10 @@ public class ChatController { @PostMapping("sync") @ResponseBody public String chatSync(@RequestBody ImmutableList messages) { - return buildRequest(messages) + String content = buildRequest(messages) .call() .content(); + return StrUtil.trimToEmpty(content); } @PostMapping("async") diff --git a/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/tools/DatetimeTools.java b/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/tools/DatetimeTools.java index e436df4..5745b09 100644 --- a/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/tools/DatetimeTools.java +++ b/service-ai/service-ai-chat/src/main/java/com/lanyuanxiaoyao/service/ai/chat/tools/DatetimeTools.java @@ -11,8 +11,8 @@ import org.springframework.ai.tool.annotation.Tool; public class DatetimeTools { private final static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Tool(description = "获取当前时间") - public String getCurrentTime() { + @Tool(description = "获取当前日期和时间") + public String getCurrentDateTime() { return LocalDateTime.now().format(formatter); } } diff --git a/service-ai/service-ai-chat/src/main/resources/application.yml b/service-ai/service-ai-chat/src/main/resources/application.yml index 723c522..600878a 100644 --- a/service-ai/service-ai-chat/src/main/resources/application.yml +++ b/service-ai/service-ai-chat/src/main/resources/application.yml @@ -2,14 +2,14 @@ spring: application: name: service-ai-chat profiles: - include: random-port,common,metrics,forest + include: random-port,common,discovery,metrics,forest ai: openai: base-url: http://132.121.206.65:10086 api-key: ENC(K+Hff9QGC+fcyi510VIDd9CaeK/IN5WBJ9rlkUsHEdDgIidW+stHHJlsK0lLPUXXREha+ToQZqqDXJrqSE+GUKCXklFhelD8bRHFXBIeP/ZzT2cxhzgKUXgjw3S0Qw2R) chat: options: - model: 'Qwen3-1.7' + model: 'Qwen3-1.7-vllm' mvc: async: request-timeout: 300000 diff --git a/service-ai/service-ai-chat/src/main/resources/logback-spring.xml b/service-ai/service-ai-chat/src/main/resources/logback-spring.xml index 01bad8b..d686c9c 100644 --- a/service-ai/service-ai-chat/src/main/resources/logback-spring.xml +++ b/service-ai/service-ai-chat/src/main/resources/logback-spring.xml @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/service-ai/service-ai-core/pom.xml b/service-ai/service-ai-core/pom.xml index f21af36..64496dd 100644 --- a/service-ai/service-ai-core/pom.xml +++ b/service-ai/service-ai-core/pom.xml @@ -44,5 +44,11 @@ + + + org.springframework.boot + spring-boot-starter-webflux + provided + \ No newline at end of file diff --git a/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebClientConfiguration.java b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebClientConfiguration.java new file mode 100644 index 0000000..afcddb1 --- /dev/null +++ b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/WebClientConfiguration.java @@ -0,0 +1,39 @@ +package com.lanyuanxiaoyao.service.ai.core.configuration; + +import java.net.http.HttpClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.client.JdkClientHttpRequestFactory; +import org.springframework.http.client.reactive.JdkClientHttpConnector; +import org.springframework.web.client.RestClient; +import org.springframework.web.reactive.function.client.WebClient; + +/** + * vLLM只能使用http1.0 + * + * @author lanyuanxiaoyao + * @version 20250519 + */ +@Configuration +public class WebClientConfiguration { + private HttpClient httpClient() { + return HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .build(); + } + + @Bean + @Primary + public RestClient.Builder restClientBuilder() { + return RestClient.builder() + .requestFactory(new JdkClientHttpRequestFactory(httpClient())); + } + + @Bean + @Primary + public WebClient.Builder webClientBuilder() { + return WebClient.builder() + .clientConnector(new JdkClientHttpConnector(httpClient())); + } +} diff --git a/service-ai/service-ai-knowledge/pom.xml b/service-ai/service-ai-knowledge/pom.xml index 65487e6..702f182 100644 --- a/service-ai/service-ai-knowledge/pom.xml +++ b/service-ai/service-ai-knowledge/pom.xml @@ -24,11 +24,11 @@ org.springframework.ai - spring-ai-openai-spring-boot-starter + spring-ai-starter-model-openai org.springframework.ai - spring-ai-qdrant-store-spring-boot-starter + spring-ai-qdrant-store org.springframework.ai