diff --git a/pom.xml b/pom.xml index d1933f0..511e2ce 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ UTF-8 17 17 + 1.0.0 UTF-8 @@ -53,6 +54,13 @@ + + org.springframework.ai + spring-ai-bom + ${spring-ai.version} + pom + import + org.mybatis.spring.boot mybatis-spring-boot-starter diff --git a/visual-novel-server-app/pom.xml b/visual-novel-server-app/pom.xml index 1797b8f..8e1c22d 100644 --- a/visual-novel-server-app/pom.xml +++ b/visual-novel-server-app/pom.xml @@ -12,6 +12,15 @@ jar + + org.springframework.ai + spring-ai-ollama + + + + org.springframework.ai + spring-ai-starter-model-deepseek + org.springframework.boot spring-boot-starter-web diff --git a/visual-novel-server-app/src/main/resources/application-dev.yml b/visual-novel-server-app/src/main/resources/application-dev.yml index cc20ba7..c0254c0 100644 --- a/visual-novel-server-app/src/main/resources/application-dev.yml +++ b/visual-novel-server-app/src/main/resources/application-dev.yml @@ -30,6 +30,15 @@ spring: connection-test-query: SELECT 1 type: com.zaxxer.hikari.HikariDataSource + ai: + deepseek: + api-key: your-api-key + base-url: https://api.deepseek.com # DeepSeek 的请求 URL, 可不填,默认值为 api.deepseek.com + chat: + options: + model: deepseek-reasoner # 使用深度思考模型 + temperature: 0.8 # 温度值 + # MyBatis 配置【如需使用记得打开】 #mybatis: # mapper-locations: classpath:/mybatis/mapper/*.xml @@ -39,4 +48,5 @@ spring: logging: level: root: info - config: classpath:logback-spring.xml \ No newline at end of file + config: classpath:logback-spring.xml + diff --git a/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java b/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java index 8c33fcc..a11a145 100644 --- a/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java +++ b/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java @@ -1,19 +1,81 @@ package com.touka.test; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.ai.chat.model.ChatResponse; + +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.ai.chat.prompt.PromptTemplate; +import org.springframework.ai.deepseek.DeepSeekChatModel; + +import org.springframework.ai.ollama.api.OllamaOptions; + import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; + @Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class ApiTest { + @Resource + private DeepSeekChatModel chatModel; + + /** + * 测试同步生成响应 + */ @Test - public void test() { - log.info("测试完成"); + public void testGenerate() { + String message = "Tell me a joke"; + + // 方式1: 直接传入字符串 + String response1 = chatModel.call(message); + System.out.println("Response1: " + response1); + + // 方式2: 使用 Prompt + ChatResponse response2 = chatModel.call(new Prompt(message)); + System.out.println("Response2: " + response2.getResult().getOutput().getText()); + } + + /** + * 测试流式生成响应 + */ + @Test + public void testGenerateStream() { + String message = "Tell me a joke"; + + // 使用 PromptTemplate 构建提示词 + Prompt prompt = new PromptTemplate(message).create(); + + // 流式输出 + Flux responseFlux = chatModel.stream(prompt); + + // 订阅并打印流式响应 + responseFlux.doOnNext(response -> { + System.out.println("Stream Response: " + response.getResult().getOutput().getText()); + }).blockLast(); // 在测试中阻塞等待完成 + } + + /** + * 测试使用特定模型选项 + */ + @Test + public void testGenerateWithModelOptions() { + String message = "1+1=?"; + String model = "deepseek-r1:1.5b"; + + ChatResponse response = chatModel.call(new Prompt( + message, + OllamaOptions.builder() + .model(model) + .build() + )); + + System.out.println("Response with model options: " + response.getResult().getOutput().getText()); } }