20250330 用ollama llama3.2模型实现function call

This commit is contained in:
liangjinglin 2025-03-30 21:53:40 +08:00
parent ee3f64a5c6
commit e81caa381e
7 changed files with 158 additions and 5 deletions

29
pom.xml
View File

@ -46,6 +46,11 @@
<artifactId>langchain4j-community-zhipu-ai</artifactId> <artifactId>langchain4j-community-zhipu-ai</artifactId>
<version>1.0.0-beta1</version> <version>1.0.0-beta1</version>
</dependency> </dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>1.0.0-beta1</version>
</dependency>
<dependency> <dependency>
<groupId>dev.langchain4j</groupId> <groupId>dev.langchain4j</groupId>
@ -53,6 +58,30 @@
<version>1.0.0-beta1</version> <version>1.0.0-beta1</version>
</dependency> </dependency>
<!-- Unirest依赖 -->
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies> </dependencies>
<dependencyManagement> <dependencyManagement>

View File

@ -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();
}
}

View File

@ -2,6 +2,8 @@ package com.ai.controller;
import com.ai.service.Assist; import com.ai.service.Assist;
import com.ai.service.LangChainService; 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.dashscope.QwenChatModel;
import dev.langchain4j.community.model.zhipu.ZhipuAiImageModel; import dev.langchain4j.community.model.zhipu.ZhipuAiImageModel;
import dev.langchain4j.data.image.Image; import dev.langchain4j.data.image.Image;
@ -31,6 +33,18 @@ public class LangChainController {
@Autowired @Autowired
private ZhipuAiImageModel zhipuAiImageModel; 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 获取响应 * 处理用户输入并调用 LangChainService 获取响应
* @param input 用户输入的内容 * @param input 用户输入的内容
@ -65,6 +79,6 @@ public class LangChainController {
@GetMapping("/high/call") @GetMapping("/high/call")
public String functionCall(@RequestParam("input") String input) { public String functionCall(@RequestParam("input") String input) {
System.out.println("start highlevel memory chat..."); System.out.println("start highlevel memory chat...");
return assist.chat(input); return ollamaAssist.chat(input);
} }
} }

View File

@ -2,10 +2,31 @@ package com.ai.function;
import dev.langchain4j.agent.tool.Tool; import dev.langchain4j.agent.tool.Tool;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class MyCalculator { public class MyCalculator {
@Tool("路飞算法") private int films = 10;
public int luffy(int a, int b){
return (a + b) / (a - b); private static Map<Integer, String> 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);
}
} }
} }

View File

@ -15,4 +15,4 @@ GET http://localhost:8080/langchain/high/memory-chat?memoryId=1&input=详细介
GET http://localhost:8080/langchain/zhipu/img?input=请画一张魔兽世界里的兽人高举锤子的图 GET http://localhost:8080/langchain/zhipu/img?input=请画一张魔兽世界里的兽人高举锤子的图
### 测试 LangChainController 的 highlevel chat 接口 ### 测试 LangChainController 的 highlevel chat 接口
GET http://localhost:8080/langchain/high/call?input=我的两个数分别是9和3,请用路飞算法计算结果 GET http://localhost:8080/langchain/high/call?input=用5个菲林抽取5个代理人

View File

@ -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<String> 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<String, Object> 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;
}
}

View File

@ -0,0 +1,8 @@
package com.ai.service;
import dev.langchain4j.service.SystemMessage;
public interface OllamaAssist {
@SystemMessage("你是一个助手,可以使用工具来回答问题")
String chat(String userMessage);
}