feat(ai): 增加大模型对话测试
This commit is contained in:
@@ -20,6 +20,21 @@
|
|||||||
<groupId>org.springframework.ai</groupId>
|
<groupId>org.springframework.ai</groupId>
|
||||||
<artifactId>spring-ai-starter-model-deepseek</artifactId>
|
<artifactId>spring-ai-starter-model-deepseek</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.ai</groupId>
|
||||||
|
<artifactId>spring-ai-starter-model-openai</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.noear</groupId>
|
||||||
|
<artifactId>solon-ai</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.noear</groupId>
|
||||||
|
<artifactId>solon-ai-dialect-openai</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -1,71 +1,155 @@
|
|||||||
package com.lanyuanxiaoyao.service.ai.chat;
|
package com.lanyuanxiaoyao.service.ai.chat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.time.LocalDateTime;
|
import java.util.Arrays;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.util.List;
|
||||||
|
import org.noear.solon.ai.rag.Document;
|
||||||
|
import org.noear.solon.ai.reranking.RerankingModel;
|
||||||
import org.springframework.ai.chat.client.ChatClient;
|
import org.springframework.ai.chat.client.ChatClient;
|
||||||
import org.springframework.ai.deepseek.DeepSeekChatModel;
|
import org.springframework.ai.document.MetadataMode;
|
||||||
import org.springframework.ai.deepseek.DeepSeekChatOptions;
|
import org.springframework.ai.embedding.EmbeddingModel;
|
||||||
import org.springframework.ai.deepseek.api.DeepSeekApi;
|
import org.springframework.ai.openai.OpenAiChatModel;
|
||||||
import org.springframework.ai.tool.ToolCallback;
|
import org.springframework.ai.openai.OpenAiChatOptions;
|
||||||
import org.springframework.ai.tool.definition.ToolDefinition;
|
import org.springframework.ai.openai.OpenAiEmbeddingModel;
|
||||||
|
import org.springframework.ai.openai.OpenAiEmbeddingOptions;
|
||||||
|
import org.springframework.ai.openai.api.OpenAiApi;
|
||||||
|
import org.springframework.core.io.FileSystemResource;
|
||||||
import org.springframework.http.client.JdkClientHttpRequestFactory;
|
import org.springframework.http.client.JdkClientHttpRequestFactory;
|
||||||
import org.springframework.http.client.reactive.JdkClientHttpConnector;
|
import org.springframework.http.client.reactive.JdkClientHttpConnector;
|
||||||
|
import org.springframework.util.MimeTypeUtils;
|
||||||
import org.springframework.web.client.RestClient;
|
import org.springframework.web.client.RestClient;
|
||||||
import org.springframework.web.reactive.function.client.WebClient;
|
import org.springframework.web.reactive.function.client.WebClient;
|
||||||
import reactor.core.Disposable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author lanyuanxiaoyao
|
* @author lanyuanxiaoyao
|
||||||
* @version 20250514
|
* @version 20250514
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("NullableProblems")
|
|
||||||
public class TestSpringAIToolChat {
|
public class TestSpringAIToolChat {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws IOException {
|
||||||
ChatClient client = ChatClient.builder(
|
testChatModel();
|
||||||
DeepSeekChatModel.builder()
|
testVisualModel();
|
||||||
.deepSeekApi(
|
// testEmbeddingModel();
|
||||||
DeepSeekApi.builder()
|
// testRerankingModel();
|
||||||
.baseUrl("http://132.121.206.65:10086/v1")
|
}
|
||||||
|
|
||||||
|
private static void testChatModel() {
|
||||||
|
for (String model : List.of(
|
||||||
|
"Qwen3/qwen3-0.6b",
|
||||||
|
"Qwen3/qwen3-1.7b",
|
||||||
|
"Qwen3/qwen3-4b",
|
||||||
|
"Qwen3/qwen3-4b-q4km",
|
||||||
|
"Qwen3/qwen3-8b-q4km"
|
||||||
|
)) {
|
||||||
|
ChatClient client = chatClient(model);
|
||||||
|
String content = client.prompt()
|
||||||
|
.user("你好")
|
||||||
|
.call()
|
||||||
|
.content();
|
||||||
|
System.out.println(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void testVisualModel() {
|
||||||
|
for (String model : List.of(
|
||||||
|
"Qwen2.5/qwen2.5-vl-7b",
|
||||||
|
"Qwen2.5/qwen2.5-vl-7b-q4km",
|
||||||
|
"Qwen2.5/qwen2.5-vl-3b-instruct",
|
||||||
|
"Qwen2.5/qwen2.5-vl-3b-instruct-awq",
|
||||||
|
"Qwen2.5/qwen2.5-vl-7b-instruct",
|
||||||
|
"Qwen2.5/qwen2.5-vl-7b-instruct-awq",
|
||||||
|
"MiniCPM/minicpm-o-2.6-7.6b",
|
||||||
|
"MiniCPM/minicpm-o-2.6-7.6b-q4km"
|
||||||
|
|
||||||
|
)) {
|
||||||
|
ChatClient client = chatClient(model);
|
||||||
|
String content = client.prompt()
|
||||||
|
.user(spec -> spec.text("图片中有什么").media(MimeTypeUtils.IMAGE_PNG, new FileSystemResource("/Users/lanyuanxiaoyao/Pictures/deepseek.png")))
|
||||||
|
.call()
|
||||||
|
.content();
|
||||||
|
System.out.println(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void testEmbeddingModel() {
|
||||||
|
for (String model : List.of(
|
||||||
|
"Qwen3/qwen3-embedding-0.6b",
|
||||||
|
"Qwen3/qwen3-embedding-4b",
|
||||||
|
"Qwen3/qwen3-embedding-4b-q4km",
|
||||||
|
"Qwen3/qwen3-embedding-8b-q4km",
|
||||||
|
"BGE/bge-m3",
|
||||||
|
"BGE/bge-m3-q4km",
|
||||||
|
"MiniCPM/minicpm-embedding",
|
||||||
|
"MiniCPM/minicpm-embedding-light"
|
||||||
|
)) {
|
||||||
|
EmbeddingModel embeddingModel = embeddingModel(model);
|
||||||
|
float[] worlds = embeddingModel.embed("Hello world");
|
||||||
|
System.out.println(Arrays.toString(worlds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void testRerankingModel() throws IOException {
|
||||||
|
for (String model : List.of(
|
||||||
|
"BGE/beg-reranker-v2",
|
||||||
|
"MiniCPM/minicpm-reranker",
|
||||||
|
"MiniCPM/minicpm-reranker-light",
|
||||||
|
"BGE/beg-reranker-v2",
|
||||||
|
"BGE/beg-reranker-v2-q4km"
|
||||||
|
)) {
|
||||||
|
RerankingModel rerankingModel = rerankingModel(model);
|
||||||
|
List<Document> list = rerankingModel.rerank(
|
||||||
|
"你好",
|
||||||
|
List.of(
|
||||||
|
new Document("go go go,滚犊子"),
|
||||||
|
new Document("我是tom,你最近过得好吗?"),
|
||||||
|
new Document("666,你就是大聪明")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
list.forEach(System.out::println);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ChatClient chatClient(String model) {
|
||||||
|
return ChatClient.builder(
|
||||||
|
OpenAiChatModel.builder()
|
||||||
|
.openAiApi(
|
||||||
|
OpenAiApi.builder()
|
||||||
|
.baseUrl("http://132.121.206.65:10086")
|
||||||
.apiKey("*XMySqV%>hR&v>>g*NwCs3tpQ5FVMFEF2VHVTj<MYQd$&@$sY7CgqNyea4giJi4")
|
.apiKey("*XMySqV%>hR&v>>g*NwCs3tpQ5FVMFEF2VHVTj<MYQd$&@$sY7CgqNyea4giJi4")
|
||||||
.restClientBuilder(restClientBuilder())
|
.restClientBuilder(restClientBuilder())
|
||||||
.webClientBuilder(webClientBuilder())
|
.webClientBuilder(webClientBuilder())
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.defaultOptions(
|
.defaultOptions(
|
||||||
DeepSeekChatOptions.builder()
|
OpenAiChatOptions.builder()
|
||||||
.model("Qwen3-1.7-vllm")
|
.model(model)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
ToolCallback datetimeTool = new ToolCallback() {
|
}
|
||||||
@Override
|
|
||||||
public ToolDefinition getToolDefinition() {
|
|
||||||
return ToolDefinition.builder()
|
|
||||||
.name("getCurrentTime")
|
|
||||||
.description("获取当前日期和时间")
|
|
||||||
// language=JSON
|
|
||||||
.inputSchema("""
|
|
||||||
{"type": null}
|
|
||||||
""")
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
private static EmbeddingModel embeddingModel(String model) {
|
||||||
public String call(String toolInput) {
|
return new OpenAiEmbeddingModel(
|
||||||
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
OpenAiApi.builder()
|
||||||
}
|
.baseUrl("http://132.121.206.65:10086")
|
||||||
};
|
.apiKey("*XMySqV%>hR&v>>g*NwCs3tpQ5FVMFEF2VHVTj<MYQd$&@$sY7CgqNyea4giJi4")
|
||||||
Disposable disposable = client.prompt()
|
.restClientBuilder(restClientBuilder())
|
||||||
.user("当前时间?")
|
.webClientBuilder(webClientBuilder())
|
||||||
.toolCallbacks(datetimeTool)
|
.build(),
|
||||||
.stream()
|
MetadataMode.EMBED,
|
||||||
.content()
|
OpenAiEmbeddingOptions.builder()
|
||||||
.subscribe(System.out::println);
|
.model(model)
|
||||||
while (!disposable.isDisposed()) {
|
.build()
|
||||||
}
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RerankingModel rerankingModel(String model) {
|
||||||
|
return RerankingModel.of("http://132.121.206.65:10086/v1/rerank")
|
||||||
|
.model(model)
|
||||||
|
.apiKey("*XMySqV%>hR&v>>g*NwCs3tpQ5FVMFEF2VHVTj<MYQd$&@$sY7CgqNyea4giJi4")
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HttpClient httpClient() {
|
private static HttpClient httpClient() {
|
||||||
|
|||||||
Reference in New Issue
Block a user