20250330 用ollama llama3.2模型实现function call
This commit is contained in:
parent
ee3f64a5c6
commit
e81caa381e
29
pom.xml
29
pom.xml
@ -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>
|
||||||
|
28
src/main/java/com/ai/config/OllamaConfig.java
Normal file
28
src/main/java/com/ai/config/OllamaConfig.java
Normal 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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个代理人
|
||||||
|
53
src/main/java/com/ai/service/NormalRequestService.java
Normal file
53
src/main/java/com/ai/service/NormalRequestService.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
8
src/main/java/com/ai/service/OllamaAssist.java
Normal file
8
src/main/java/com/ai/service/OllamaAssist.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package com.ai.service;
|
||||||
|
|
||||||
|
import dev.langchain4j.service.SystemMessage;
|
||||||
|
|
||||||
|
public interface OllamaAssist {
|
||||||
|
@SystemMessage("你是一个助手,可以使用工具来回答问题")
|
||||||
|
String chat(String userMessage);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user