From 4485807465ec4f9231d3514f0237d2264f60dc47 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Tue, 15 Jul 2025 13:32:06 +0800 Subject: [PATCH] =?UTF-8?q?ai=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC=E5=88=B0?= =?UTF-8?q?1.0.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- long-image-search-mcp-server/pom.xml | 36 ++- pom.xml | 245 ++++++++++-------- .../aiagent/LongAiAgentApplication.java | 3 +- .../aiagent/Service/impl/AiServiceImpl.java | 11 +- .../aiagent/Service/impl/RagServiceImpl.java | 4 +- .../aiagent/agent/ToolCallAgent.java | 2 +- .../aiagent/config/MyLoggerAdvisor.java | 61 ++--- .../aiagent/config/ToolRegistration.java | 2 +- .../aiagent/rag/MyKeywordEnricher.java | 2 +- .../aiagent/rag/MyMultiQueryExpander.java | 2 +- 10 files changed, 216 insertions(+), 152 deletions(-) diff --git a/long-image-search-mcp-server/pom.xml b/long-image-search-mcp-server/pom.xml index 2bd5ba2..fa6ec11 100644 --- a/long-image-search-mcp-server/pom.xml +++ b/long-image-search-mcp-server/pom.xml @@ -29,6 +29,17 @@ 21 + + + + org.springframework.ai + spring-ai-bom + 1.0.0 + pom + import + + + org.springframework.boot @@ -47,11 +58,32 @@ org.springframework.ai - spring-ai-mcp-server-webmvc-spring-boot-starter - 1.0.0-M6 + spring-ai-starter-mcp-server-webmvc + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + Central Portal Snapshots + central-portal-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + false + + + true + + + + diff --git a/pom.xml b/pom.xml index 46ae2c2..ea7908a 100644 --- a/pom.xml +++ b/pom.xml @@ -23,21 +23,117 @@ 21 + + + + com.baomidou + mybatis-plus-bom + 3.5.12 + pom + import + + + com.alibaba.cloud.ai + spring-ai-alibaba-bom + 1.0.0.2 + pom + import + + + org.springframework.ai + spring-ai-bom + 1.0.0 + pom + import + + + org.springframework.boot spring-boot-starter-web - + - org.projectlombok - lombok - true - 1.18.38 + com.alibaba + dashscope-sdk-java + 2.20.0 + + + com.alibaba.cloud.ai + spring-ai-alibaba-starter-dashscope + + + + org.springframework.ai + spring-ai-starter-model-ollama + + + + org.springframework.ai + spring-ai-markdown-document-reader + + org.springframework.boot - spring-boot-starter-test + spring-boot-starter-jdbc + + + org.postgresql + postgresql + runtime + + + org.springframework.ai + spring-ai-pgvector-store + + + + org.springframework.ai + spring-ai-starter-mcp-client + + + org.springframework.ai + spring-ai-advisors-vector-store + + + + dev.langchain4j + langchain4j-community-dashscope + 1.0.0-beta2 + + + + com.github.victools + jsonschema-generator + 4.38.0 + + + + com.esotericsoftware + kryo + 5.6.2 + + + + org.jsoup + jsoup + 1.20.1 + + + + + com.itextpdf + itext-core + 9.1.0 + pom + + + + com.itextpdf + font-asian + 9.1.0 test @@ -52,6 +148,17 @@ knife4j-openapi3-jakarta-spring-boot-starter 4.4.0 + + org.projectlombok + lombok + true + 1.18.38 + + + org.springframework.boot + spring-boot-starter-test + test + com.mysql @@ -69,104 +176,8 @@ com.baomidou mybatis-plus-jsqlparser - - - com.alibaba - dashscope-sdk-java - 2.20.0 - - - - com.alibaba.cloud.ai - spring-ai-alibaba-starter - 1.0.0-M6.1 - - - - org.springframework.ai - spring-ai-ollama-spring-boot-starter - 1.0.0-M6 - - - - com.github.victools - jsonschema-generator - 4.38.0 - - - - org.springframework.ai - spring-ai-markdown-document-reader - 1.0.0-M6 - - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.postgresql - postgresql - runtime - - - org.springframework.ai - spring-ai-pgvector-store - 1.0.0-M6 - - - - org.jsoup - jsoup - 1.20.1 - - - - com.itextpdf - itext-core - 9.1.0 - pom - - - - com.itextpdf - font-asian - 9.1.0 - test - - - - org.springframework.ai - spring-ai-mcp-client-spring-boot-starter - 1.0.0-M6 - - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - - - - com.baomidou - mybatis-plus-bom - 3.5.12 - pom - import - - - @@ -202,4 +213,34 @@ + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + Central Portal Snapshots + central-portal-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + false + + + true + + + + diff --git a/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java b/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java index c9d81e1..6181653 100644 --- a/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java +++ b/src/main/java/com/huangge1199/aiagent/LongAiAgentApplication.java @@ -1,13 +1,12 @@ package com.huangge1199.aiagent; -import org.springframework.ai.autoconfigure.vectorstore.pgvector.PgVectorStoreAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author hyy */ -@SpringBootApplication(exclude = PgVectorStoreAutoConfiguration.class) +@SpringBootApplication public class LongAiAgentApplication { public static void main(String[] args) { diff --git a/src/main/java/com/huangge1199/aiagent/Service/impl/AiServiceImpl.java b/src/main/java/com/huangge1199/aiagent/Service/impl/AiServiceImpl.java index 520d440..fc7de33 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/impl/AiServiceImpl.java +++ b/src/main/java/com/huangge1199/aiagent/Service/impl/AiServiceImpl.java @@ -5,13 +5,11 @@ import com.huangge1199.aiagent.config.MyLoggerAdvisor; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; -import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY; -import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY; - /** * AiServiceImpl * @@ -31,11 +29,11 @@ public class AiServiceImpl implements AiService { ChatResponse chatResponse = chatClient .prompt() .user(message) - .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) - .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)) + .advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId)) .advisors(new MyLoggerAdvisor()) .call() .chatResponse(); + assert chatResponse != null; return chatResponse.getResult().getOutput().getText(); } @@ -44,8 +42,7 @@ public class AiServiceImpl implements AiService { return chatClient .prompt() .user(message) - .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) - .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)) + .advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId)) .stream() .content(); } diff --git a/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java b/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java index 5b1305e..1d33e32 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java +++ b/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java @@ -5,15 +5,15 @@ import com.huangge1199.aiagent.config.MyLoggerAdvisor; import com.huangge1199.aiagent.rag.MyMultiQueryExpander; import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor; -import org.springframework.ai.chat.client.advisor.RetrievalAugmentationAdvisor; import org.springframework.ai.chat.client.advisor.api.Advisor; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.rag.Query; +import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor; import org.springframework.ai.rag.generation.augmentation.ContextualQueryAugmenter; import org.springframework.ai.rag.preretrieval.query.transformation.CompressionQueryTransformer; import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer; diff --git a/src/main/java/com/huangge1199/aiagent/agent/ToolCallAgent.java b/src/main/java/com/huangge1199/aiagent/agent/ToolCallAgent.java index a1bec00..5c96aee 100644 --- a/src/main/java/com/huangge1199/aiagent/agent/ToolCallAgent.java +++ b/src/main/java/com/huangge1199/aiagent/agent/ToolCallAgent.java @@ -51,7 +51,7 @@ public class ToolCallAgent extends ReActAgent { this.toolCallingManager = ToolCallingManager.builder().build(); // 禁用 Spring AI 内置的工具调用机制,自己维护选项和消息上下文 this.chatOptions = DashScopeChatOptions.builder() - .withProxyToolCalls(true) + .withInternalToolExecutionEnabled(false) .build(); } diff --git a/src/main/java/com/huangge1199/aiagent/config/MyLoggerAdvisor.java b/src/main/java/com/huangge1199/aiagent/config/MyLoggerAdvisor.java index 5f22029..ec77dad 100644 --- a/src/main/java/com/huangge1199/aiagent/config/MyLoggerAdvisor.java +++ b/src/main/java/com/huangge1199/aiagent/config/MyLoggerAdvisor.java @@ -1,15 +1,16 @@ package com.huangge1199.aiagent.config; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import reactor.core.publisher.Flux; -import org.springframework.ai.chat.client.advisor.api.AdvisedRequest; -import org.springframework.ai.chat.client.advisor.api.AdvisedResponse; -import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisor; -import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisorChain; -import org.springframework.ai.chat.client.advisor.api.StreamAroundAdvisor; -import org.springframework.ai.chat.client.advisor.api.StreamAroundAdvisorChain; -import org.springframework.ai.chat.model.MessageAggregator; +import org.springframework.ai.chat.client.ChatClientMessageAggregator; +import org.springframework.ai.chat.client.ChatClientRequest; +import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.client.advisor.api.CallAdvisor; +import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain; +import org.springframework.ai.chat.client.advisor.api.StreamAdvisor; +import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain; /** * MyLoggerAdvisor @@ -20,8 +21,9 @@ import org.springframework.ai.chat.model.MessageAggregator; * @since 2025/5/24 9:12:54 */ @Slf4j -public class MyLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor { +public class MyLoggerAdvisor implements CallAdvisor, StreamAdvisor { + @NotNull @Override public String getName() { return this.getClass().getSimpleName(); @@ -32,35 +34,28 @@ public class MyLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor { return 0; } - private AdvisedRequest before(AdvisedRequest request) { - log.info("AI Request: {}", request.userText()); - return request; - } + private ChatClientRequest before(ChatClientRequest request) { + log.info("AI Request: {}", request.prompt()); + return request; + } - private void observeAfter(AdvisedResponse advisedResponse) { - log.info("AI Response: {}", advisedResponse.response().getResult().getOutput().getText()); - } + private void observeAfter(ChatClientResponse chatClientResponse) { + log.info("AI Response: {}", chatClientResponse.chatResponse().getResult().getOutput().getText()); + } + @NotNull @Override - public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) { - - advisedRequest = before(advisedRequest); - - AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest); - - observeAfter(advisedResponse); - - return advisedResponse; - } + public ChatClientResponse adviseCall(@NotNull ChatClientRequest chatClientRequest, CallAdvisorChain chain) { + ChatClientResponse chatClientResponse = chain.nextCall(chatClientRequest); + observeAfter(chatClientResponse); + return chatClientResponse; + } + @NotNull @Override - public Flux aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) { - - advisedRequest = before(advisedRequest); - - Flux advisedResponses = chain.nextAroundStream(advisedRequest); - - return new MessageAggregator().aggregateAdvisedResponse(advisedResponses, this::observeAfter); - } + public Flux adviseStream(@NotNull ChatClientRequest chatClientRequest, StreamAdvisorChain chain) { + Flux chatClientResponseFlux = chain.nextStream(chatClientRequest); + return (new ChatClientMessageAggregator()).aggregateChatClientResponse(chatClientResponseFlux, this::observeAfter); + } } diff --git a/src/main/java/com/huangge1199/aiagent/config/ToolRegistration.java b/src/main/java/com/huangge1199/aiagent/config/ToolRegistration.java index cd2aaec..fbe912b 100644 --- a/src/main/java/com/huangge1199/aiagent/config/ToolRegistration.java +++ b/src/main/java/com/huangge1199/aiagent/config/ToolRegistration.java @@ -1,8 +1,8 @@ package com.huangge1199.aiagent.config; import com.huangge1199.aiagent.tools.*; +import org.springframework.ai.support.ToolCallbacks; import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.ToolCallbacks; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/huangge1199/aiagent/rag/MyKeywordEnricher.java b/src/main/java/com/huangge1199/aiagent/rag/MyKeywordEnricher.java index c2af543..4a91a53 100644 --- a/src/main/java/com/huangge1199/aiagent/rag/MyKeywordEnricher.java +++ b/src/main/java/com/huangge1199/aiagent/rag/MyKeywordEnricher.java @@ -3,7 +3,7 @@ package com.huangge1199.aiagent.rag; import jakarta.annotation.Resource; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.document.Document; -import org.springframework.ai.transformer.KeywordMetadataEnricher; +import org.springframework.ai.model.transformer.KeywordMetadataEnricher; import org.springframework.stereotype.Component; import java.util.List; diff --git a/src/main/java/com/huangge1199/aiagent/rag/MyMultiQueryExpander.java b/src/main/java/com/huangge1199/aiagent/rag/MyMultiQueryExpander.java index 26be770..a8112d8 100644 --- a/src/main/java/com/huangge1199/aiagent/rag/MyMultiQueryExpander.java +++ b/src/main/java/com/huangge1199/aiagent/rag/MyMultiQueryExpander.java @@ -6,7 +6,7 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.rag.preretrieval.query.expansion.QueryExpander; -import org.springframework.ai.util.PromptAssert; +import org.springframework.ai.rag.util.PromptAssert; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;