From e81caa381e2727bfbad1a0542ab2d29cccfe1cc6 Mon Sep 17 00:00:00 2001 From: liangjinglin Date: Sun, 30 Mar 2025 21:53:40 +0800 Subject: [PATCH] =?UTF-8?q?20250330=20=E7=94=A8ollama=20llama3.2=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=AE=9E=E7=8E=B0function=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 29 ++++++++++ src/main/java/com/ai/config/OllamaConfig.java | 28 ++++++++++ .../ai/controller/LangChainController.java | 16 +++++- .../java/com/ai/function/MyCalculator.java | 27 ++++++++-- src/main/java/com/ai/http/chat.http | 2 +- .../com/ai/service/NormalRequestService.java | 53 +++++++++++++++++++ .../java/com/ai/service/OllamaAssist.java | 8 +++ 7 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/ai/config/OllamaConfig.java create mode 100644 src/main/java/com/ai/service/NormalRequestService.java create mode 100644 src/main/java/com/ai/service/OllamaAssist.java diff --git a/pom.xml b/pom.xml index 6dfb09d..16afdb3 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,11 @@ langchain4j-community-zhipu-ai 1.0.0-beta1 + + dev.langchain4j + langchain4j-ollama + 1.0.0-beta1 + dev.langchain4j @@ -53,6 +58,30 @@ 1.0.0-beta1 + + + + com.mashape.unirest + unirest-java + 1.4.9 + + + + com.fasterxml.jackson.core + jackson-core + 2.15.2 + + + com.fasterxml.jackson.core + jackson-databind + 2.15.2 + + + com.fasterxml.jackson.core + jackson-annotations + 2.15.2 + + diff --git a/src/main/java/com/ai/config/OllamaConfig.java b/src/main/java/com/ai/config/OllamaConfig.java new file mode 100644 index 0000000..446ba40 --- /dev/null +++ b/src/main/java/com/ai/config/OllamaConfig.java @@ -0,0 +1,28 @@ +package com.ai.config; + +import com.ai.function.MyCalculator; +import com.ai.service.OllamaAssist; +import dev.langchain4j.memory.chat.MessageWindowChatMemory; +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.ollama.OllamaChatModel; +import dev.langchain4j.service.AiServices; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OllamaConfig { + + @Bean + public OllamaAssist ollamaAssist() { + ChatLanguageModel ollamaModel = OllamaChatModel.builder() + .baseUrl("http://localhost:11434") + .modelName("llama3.2:3b") + .build(); + return AiServices.builder(OllamaAssist.class) + .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(10)) + .chatLanguageModel(ollamaModel) + .tools(new MyCalculator()) + .build(); + } + +} diff --git a/src/main/java/com/ai/controller/LangChainController.java b/src/main/java/com/ai/controller/LangChainController.java index 4553726..9ff1a31 100644 --- a/src/main/java/com/ai/controller/LangChainController.java +++ b/src/main/java/com/ai/controller/LangChainController.java @@ -2,6 +2,8 @@ package com.ai.controller; import com.ai.service.Assist; import com.ai.service.LangChainService; +import com.ai.service.NormalRequestService; +import com.ai.service.OllamaAssist; import dev.langchain4j.community.model.dashscope.QwenChatModel; import dev.langchain4j.community.model.zhipu.ZhipuAiImageModel; import dev.langchain4j.data.image.Image; @@ -31,6 +33,18 @@ public class LangChainController { @Autowired private ZhipuAiImageModel zhipuAiImageModel; + @Autowired + private OllamaAssist ollamaAssist; + + @Autowired + private NormalRequestService normalRequestService; + + @GetMapping("/normal/chat") + public String normalChat(@RequestParam("input") String input) { + System.out.println("start normal chat..."); + return normalRequestService.chat(input); + } + /** * 处理用户输入并调用 LangChainService 获取响应 * @param input 用户输入的内容 @@ -65,6 +79,6 @@ public class LangChainController { @GetMapping("/high/call") public String functionCall(@RequestParam("input") String input) { System.out.println("start highlevel memory chat..."); - return assist.chat(input); + return ollamaAssist.chat(input); } } diff --git a/src/main/java/com/ai/function/MyCalculator.java b/src/main/java/com/ai/function/MyCalculator.java index 751677f..a92abf5 100644 --- a/src/main/java/com/ai/function/MyCalculator.java +++ b/src/main/java/com/ai/function/MyCalculator.java @@ -2,10 +2,31 @@ package com.ai.function; import dev.langchain4j.agent.tool.Tool; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + public class MyCalculator { - @Tool("路飞算法") - public int luffy(int a, int b){ - return (a + b) / (a - b); + private int films = 10; + + private static Map agentMap = new HashMap<>(); + + static{ + agentMap.put(1, "艾莲乔"); + agentMap.put(2, "星见雅"); + agentMap.put(3, "妮可"); + agentMap.put(4, "安比"); + agentMap.put(5, "耀佳音"); + } + + @Tool("用若干菲林抽若干代理人") + public void raffle(int raffleNum){ + Random random = new Random(); + for(int i = 0; i < raffleNum; i++){ + int randomNumber = random.nextInt(5) + 1; + String agent = agentMap.get(randomNumber); + System.out.println("获得代理人:" + agent); + } } } diff --git a/src/main/java/com/ai/http/chat.http b/src/main/java/com/ai/http/chat.http index a95fa9b..2306d78 100644 --- a/src/main/java/com/ai/http/chat.http +++ b/src/main/java/com/ai/http/chat.http @@ -15,4 +15,4 @@ GET http://localhost:8080/langchain/high/memory-chat?memoryId=1&input=详细介 GET http://localhost:8080/langchain/zhipu/img?input=请画一张魔兽世界里的兽人高举锤子的图 ### 测试 LangChainController 的 highlevel chat 接口 -GET http://localhost:8080/langchain/high/call?input=我的两个数分别是9和3,请用路飞算法计算结果 +GET http://localhost:8080/langchain/high/call?input=用5个菲林抽取5个代理人 diff --git a/src/main/java/com/ai/service/NormalRequestService.java b/src/main/java/com/ai/service/NormalRequestService.java new file mode 100644 index 0000000..a443df2 --- /dev/null +++ b/src/main/java/com/ai/service/NormalRequestService.java @@ -0,0 +1,53 @@ +package com.ai.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class NormalRequestService { + + public String chat(String userMessage) { + try { + HttpResponse response = Unirest.post("https://api.deepseek.com/chat/completions") + .header("Authorization", "Bearer sk-3043bb4777404970a22c7544dd30aaa2") + .header("Content-Type", "application/json") + .body("{\n" + + " \"model\": \"deepseek-chat\",\n" + + " \"messages\": [\n" + + " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n" + + " {\"role\": \"user\", \"content\": \"" + userMessage + "\"}\n" + + " ],\n" + + " \"stream\": false\n" + + " }") + .asString(); + + // 检查响应状态码 + if (response.getStatus() == 200) { + try { + // 使用 Jackson 解析 JSON 响应 + ObjectMapper mapper = new ObjectMapper(); + Map jsonResponse = mapper.readValue(response.getBody(), Map.class); + + // 假设响应中包含一个名为 "content" 的字段 + String content = (String) jsonResponse.get("content"); + if (content != null) { + System.out.println("响应内容: " + content); + } else { + System.out.println("响应中未找到 'content' 字段。"); + } + } catch (Exception e) { + System.err.println("解析响应时出错: " + e.getMessage()); + } + } else { + System.err.println("请求失败,状态码: " + response.getStatus()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return "你好," + userMessage; + } +} diff --git a/src/main/java/com/ai/service/OllamaAssist.java b/src/main/java/com/ai/service/OllamaAssist.java new file mode 100644 index 0000000..89ce502 --- /dev/null +++ b/src/main/java/com/ai/service/OllamaAssist.java @@ -0,0 +1,8 @@ +package com.ai.service; + +import dev.langchain4j.service.SystemMessage; + +public interface OllamaAssist { + @SystemMessage("你是一个助手,可以使用工具来回答问题") + String chat(String userMessage); +}