Initial commit

This commit is contained in:
userpu
2025-12-17 19:47:14 +08:00
commit 0d15e20780
119 changed files with 3582 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.iwe3</groupId>
<artifactId>langchain4j-ai-java</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>langchain4j-ai-tools</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--导入低阶依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.9.1-beta17</version>
</dependency>
<!--导入高阶依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.9.1-beta17</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,22 @@
package com.iwe3.langchain4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ToolsApplication {
/**
* 创建RestTemplate的实例
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ToolsApplication.class,args);
}
}

View File

@@ -0,0 +1,20 @@
package com.iwe3.langchain4j.config;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LLMConfig {
@Bean(name = "qwen")
public ChatModel chatModelQwen(){
/*大模型3件套apikey ,model-name,base-url */
return OpenAiChatModel.builder()
.apiKey(System.getenv("DASH_SCOPE_API_KEY"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
}

View File

@@ -0,0 +1,25 @@
package com.iwe3.langchain4j.config;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SeparateChatAssistantConfig {
/**
* 聊天记忆提供器
* 配置采用memoryId来完成隔离
* @return
*/
@Bean
ChatMemoryProvider chatMemoryProvider() {
return memoryId -> MessageWindowChatMemory.builder()
.id(memoryId)
.maxMessages(10).chatMemoryStore(new InMemoryChatMemoryStore())
.build();
//如果未来想自定义 -> 则自己写一个类实现 ChatMemoryStore
}
}

View File

@@ -0,0 +1,32 @@
package com.iwe3.langchain4j.service;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;
/**
* 知识出处:
* https://docs.langchain4j.dev/tutorials/spring-boot-integration/#spring-boot-starter-for-declarative-ai-services
*/
@AiService(wiringMode = AiServiceWiringMode.EXPLICIT
,chatModel = "qwen",
tools = {"weatherTools"},
chatMemoryProvider = "chatMemoryProvider")
public interface ChatAssistant {
/**
* 聊天
* @param memoryId
* @param userMessage
* @return
*/
@UserMessage("请用粤语回答问题,并且添加一些表情符号。 {{msg}}")
String chat(@MemoryId int memoryId, @V("msg") String userMessage);
/**
* 普通聊天
* @param prompt
* @return
*/
String chat(String prompt);
}

View File

@@ -0,0 +1,27 @@
package com.iwe3.langchain4j.tools;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class WeatherTools {
@Resource
private RestTemplate restTemplate;
//name 是工具描述 value是工具补充信息
@Tool(name = "查询天气",value = "根据城市编码调用高德开发平台,返回对应城市的天气情况")
public String queryWeather(@ToolMemoryId int memoryId,
@P(value = "城市编码",required = true) String citycode){
System.out.println("查询天气情况---> 开始 ---> memoryId=" + memoryId);
//高德地图:查询天气
//https://lbs.amap.com/api/webservice/guide/api-advanced/weatherinfo
var key = "cf6cb4245c630692d2f13c1cd1ad1632";
var url = "https://restapi.amap.com/v3/weather/weatherInfo?key="+key+"&city="+citycode+"&extensions=all";
return restTemplate.getForObject(url, String.class);
}
}

View File

@@ -0,0 +1,5 @@
server:
port: 9009
spring:
application:
name: langchain4j-ai-tools

View File

@@ -0,0 +1,26 @@
package com.iwe3.langchain4j;
import com.iwe3.langchain4j.service.ChatAssistant;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ToolsApplicationTest {
@Resource
private ChatAssistant chatAssistant;
@Test
public void getWeatherByMemoryId(){
var res = chatAssistant.chat(1,"成都今天天气如何城市编码510100");
System.out.println("res = " + res);
}
@Test
public void getWeather(){
var res = chatAssistant.chat("成都今天天气如何城市编码510100");
System.out.println("res = " + res);
}
}