diff --git a/pom.xml b/pom.xml index 83db33ae..30abbfd0 100644 --- a/pom.xml +++ b/pom.xml @@ -56,11 +56,20 @@ 2.2.5 8.5.7 4.9.0 + 1.0.3 + + io.springboot.ai + spring-ai-bom + ${springboot.ai} + pom + import + + org.springframework.cloud spring-cloud-starter-bootstrap diff --git a/virtual-patient-common/pom.xml b/virtual-patient-common/pom.xml index c9f86858..8727129f 100644 --- a/virtual-patient-common/pom.xml +++ b/virtual-patient-common/pom.xml @@ -36,6 +36,12 @@ knife4j-openapi3-jakarta-spring-boot-starter + + + io.springboot.ai + spring-ai-ollama-spring-boot-starter + + org.springframework.boot diff --git a/virtual-patient-common/src/main/java/com/supervision/util/AiChatUtil.java b/virtual-patient-common/src/main/java/com/supervision/util/AiChatUtil.java new file mode 100644 index 00000000..f578be45 --- /dev/null +++ b/virtual-patient-common/src/main/java/com/supervision/util/AiChatUtil.java @@ -0,0 +1,106 @@ +package com.supervision.util; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.chat.ChatResponse; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.ai.ollama.OllamaChatClient; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.*; + +@Slf4j +public class AiChatUtil { + + public static final ExecutorService chatExecutor = ThreadUtil.newFixedExecutor(5, 0, "chat", new ThreadPoolExecutor.CallerRunsPolicy()); + + public static final OllamaChatClient chatClient = SpringBeanUtil.getBean(OllamaChatClient.class); + + /** + * 单轮对话 + * + * @param chat 对话的内容 + * @return jsonObject + */ + public Optional chat(String chat) { + Prompt prompt = new Prompt(List.of(new UserMessage(chat))); + Future submit = chatExecutor.submit(new ChatTask(chatClient, prompt)); + try { + return Optional.of(JSONUtil.parseObj(submit.get())); + } catch (ExecutionException | InterruptedException e) { + log.error("调用大模型生成失败"); + } + return Optional.empty(); + } + + /** + * 支持多轮对话,自定义消息 + * + * @param messageList 消息列表 + * @return jsonObject + */ + public Optional chat(List messageList) { + Prompt prompt = new Prompt(messageList); + Future submit = chatExecutor.submit(new ChatTask(chatClient, prompt)); + try { + return Optional.of(JSONUtil.parseObj(submit.get())); + } catch (ExecutionException | InterruptedException e) { + log.error("调用大模型生成失败"); + } + return Optional.empty(); + } + + /** + * 支持序列化的方式 + * + * @param messageList 消息列表 + * @param clazz 需要序列化的对象 + * @param 需要序列化的对象的泛型 + * @return 对应对象类型, 不支持列表类型 + */ + public Optional chat(List messageList, Class clazz) { + Prompt prompt = new Prompt(messageList); + Future submit = chatExecutor.submit(new ChatTask(chatClient, prompt)); + try { + String s = submit.get(); + return Optional.ofNullable(JSONUtil.toBean(s, clazz)); + } catch (ExecutionException | InterruptedException e) { + log.error("调用大模型生成失败"); + } + return Optional.empty(); + } + + /** + * 支持序列化的方式的对话 + * + * @param chat 对话的消息 + * @param clazz 需要序列化的对象 + * @param 需要序列化的对象的泛型 + * @return 对应对象类型, 不支持列表类型 + */ + public Optional chat(String chat, Class clazz) { + Prompt prompt = new Prompt(List.of(new UserMessage(chat))); + Future submit = chatExecutor.submit(new ChatTask(chatClient, prompt)); + try { + String s = submit.get(); + return Optional.ofNullable(JSONUtil.toBean(s, clazz)); + } catch (ExecutionException | InterruptedException e) { + log.error("调用大模型生成失败"); + } + return Optional.empty(); + } + + private record ChatTask(OllamaChatClient chatClient, Prompt prompt) implements Callable { + @Override + public String call() { + ChatResponse call = chatClient.call(prompt); + return call.getResult().getOutput().getContent(); + } + } + +} diff --git a/virtual-patient-graph/pom.xml b/virtual-patient-graph/pom.xml index b3b9038a..c5ec6ced 100644 --- a/virtual-patient-graph/pom.xml +++ b/virtual-patient-graph/pom.xml @@ -32,6 +32,11 @@ + + org.springframework.cloud + spring-cloud-starter-bootstrap + + org.springframework.cloud diff --git a/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaGraphProperties.java b/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaGraphProperties.java index 62356097..cff38346 100644 --- a/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaGraphProperties.java +++ b/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaGraphProperties.java @@ -4,6 +4,7 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; /** * @author fulin @@ -12,6 +13,7 @@ import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "nebula") @EnableConfigurationProperties(NebulaGraphProperties.class) @Data +@Primary public class NebulaGraphProperties { private String username; diff --git a/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaSession.java b/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaSession.java index 05fb80e2..0b453438 100644 --- a/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaSession.java +++ b/virtual-patient-graph/src/main/java/com/supervision/nebula/config/NebulaSession.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class NebulaSession { + private final NebulaGraphProperties nebulaGraphProperties; @Bean diff --git a/virtual-patient-graph/src/main/resources/bootstrap-dev.yml b/virtual-patient-graph/src/main/resources/bootstrap-dev.yml index b43e8800..8463777d 100644 --- a/virtual-patient-graph/src/main/resources/bootstrap-dev.yml +++ b/virtual-patient-graph/src/main/resources/bootstrap-dev.yml @@ -2,9 +2,9 @@ spring: cloud: nacos: config: - server-addr: 192.168.10.137:8848 + server-addr: 192.168.10.138:8848 file-extension: yml - namespace: b9eea377-79ec-4ba5-9cc2-354f7bd5181e + namespace: 0a75e42d-26fe-4ee6-a460-f1738845cf4d discovery: - server-addr: 192.168.10.137:8848 - namespace: b9eea377-79ec-4ba5-9cc2-354f7bd5181e + server-addr: 192.168.10.138:8848 + namespace: 0a75e42d-26fe-4ee6-a460-f1738845cf4d diff --git a/virtual-patient-manage/pom.xml b/virtual-patient-manage/pom.xml index 5fbb47ba..0893d8b8 100644 --- a/virtual-patient-manage/pom.xml +++ b/virtual-patient-manage/pom.xml @@ -37,6 +37,7 @@ + org.bytedeco diff --git a/virtual-patient-web/pom.xml b/virtual-patient-web/pom.xml index ec5797b6..5b122db4 100644 --- a/virtual-patient-web/pom.xml +++ b/virtual-patient-web/pom.xml @@ -34,11 +34,6 @@ - - org.springframework.cloud - spring-cloud-starter-bootstrap - - com.alibaba.cloud @@ -116,18 +111,6 @@ - - - - io.springboot.ai - spring-ai-bom - 1.0.3 - pom - import - - - -