From 49201663f3fa78e877c03f0209d0c890d6bcf61f Mon Sep 17 00:00:00 2001 From: wangbing Date: Fri, 7 Mar 2025 23:13:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++++ src/main/java/xyz/wbsite/ai/Main.java | 87 ++++++++++++++++++--------- 2 files changed, 70 insertions(+), 29 deletions(-) diff --git a/pom.xml b/pom.xml index d4b9705..ae35c2b 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,18 @@ default + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + diff --git a/src/main/java/xyz/wbsite/ai/Main.java b/src/main/java/xyz/wbsite/ai/Main.java index 15af1fb..071a1b2 100644 --- a/src/main/java/xyz/wbsite/ai/Main.java +++ b/src/main/java/xyz/wbsite/ai/Main.java @@ -2,25 +2,29 @@ package xyz.wbsite.ai; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.json.JSONUtil; -import com.fasterxml.jackson.annotation.JsonUnwrapped; -import dev.langchain4j.agent.tool.ToolExecutionRequest; -import dev.langchain4j.agent.tool.ToolSpecification; +import dev.langchain4j.agent.tool.*; +import dev.langchain4j.data.document.Document; +import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; +import dev.langchain4j.data.document.parser.TextDocumentParser; import dev.langchain4j.data.message.*; +import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.chat.StreamingChatLanguageModel; import dev.langchain4j.model.chat.request.ChatRequest; import dev.langchain4j.model.chat.request.ChatRequestParameters; -import dev.langchain4j.model.chat.request.ChatRequestParametersBuilder; -import dev.langchain4j.model.chat.request.DefaultChatRequestParameters; -import dev.langchain4j.model.chat.request.json.JsonObjectSchema; import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.chat.response.StreamingChatResponseHandler; import dev.langchain4j.model.ollama.OllamaChatModel; import dev.langchain4j.model.ollama.OllamaStreamingChatModel; -import dev.langchain4j.model.openai.OpenAiChatModel; -import dev.langchain4j.model.openai.OpenAiStreamingChatModel; +import dev.langchain4j.service.AiServices; +import dev.langchain4j.service.tool.DefaultToolExecutor; import dev.langchain4j.service.tool.ToolExecutor; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; + /** * 主函数入口 */ @@ -29,8 +33,8 @@ public class Main { public static void main(String[] args) { // testSimpleChat(args); // testStreamChat(args); -// testTool(args); - testRagChat(args); + testTool(args); +// testRagChat(args); } public static void testSimpleChat(String[] args) { @@ -116,34 +120,59 @@ public class Main { public static void testTool(String[] args) { ChatLanguageModel model = OllamaChatModel.builder() .baseUrl("http://36.138.207.178:11434") - .modelName("deepseek-r1:32B") + .modelName("qwen2.5:7b") + .logRequests(true) + .logResponses(true) .build(); - ToolSpecification build1 = ToolSpecification.builder() - .name("获取天气") - .description("返回指定城市的天气") - .parameters(JsonObjectSchema.builder().addStringProperty("城市").build()) - .build(); - ToolExecutor toolExecutor = new ToolExecutor() { - public String execute(ToolExecutionRequest toolExecutionRequest, Object o) { - System.out.println(); - return "============="; + List chatMessages = new ArrayList<>(); + chatMessages.add(UserMessage.from("请问,泰州市的天气怎么样?")); + + Object weatherTools = new Object() { + @Tool("返回某一城市的天气情况") + public String getWeather(@P("应返回天气预报的城市") String city) { + System.out.println(city); + return "天气阴转多云,1~6℃"; } }; - ChatRequestParameters build2 = DefaultChatRequestParameters.builder().toolSpecifications(build1).build(); + List toolSpecifications = ToolSpecifications.toolSpecificationsFrom(weatherTools); - ChatRequest build = ChatRequest.builder() - .messages(new ChatMessage[]{ - UserMessage.from("请问,泰州市明天的天气怎么样?"), - SystemMessage.from("请使用天气工具"), - }) - .parameters(build2) + ChatRequest chatRequest = ChatRequest.builder() + .messages(chatMessages) + .parameters(ChatRequestParameters.builder() + .toolSpecifications(toolSpecifications) + .build()) .build(); - ChatResponse chat = model.chat(build); - System.out.println(chat.aiMessage().text()); + ChatResponse chatResponse = model.chat(chatRequest); + AiMessage aiMessage = chatResponse.aiMessage(); + chatMessages.add(aiMessage); + if (aiMessage.hasToolExecutionRequests()) { + System.out.println("LLM决定调用工具"); + System.out.println(chatResponse.aiMessage()); + List toolExecutionRequests = chatResponse.aiMessage().toolExecutionRequests(); + toolExecutionRequests.forEach(new Consumer() { + @Override + public void accept(ToolExecutionRequest toolExecutionRequest) { + ToolExecutor toolExecutor = new DefaultToolExecutor(weatherTools, toolExecutionRequest); + System.out.println("Now let's execute the tool " + toolExecutionRequest.name()); + String result = toolExecutor.execute(toolExecutionRequest, UUID.randomUUID().toString()); + ToolExecutionResultMessage toolExecutionResultMessages = ToolExecutionResultMessage.from(toolExecutionRequest, result); + chatMessages.add(toolExecutionResultMessages); + } + }); + } + // STEP 4: Model generates final response + ChatRequest chatRequest2 = ChatRequest.builder() + .messages(chatMessages) + .parameters(ChatRequestParameters.builder() + .toolSpecifications(toolSpecifications) + .build()) + .build(); + ChatResponse finalChatResponse = model.chat(chatRequest2); + System.out.println(finalChatResponse.aiMessage().text()); } } \ No newline at end of file