SpringAI Alibaba 编写同步 AI 对话与日志记录
编写第一个 AI 对话程序
java
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 简单的 AI 控制器
*
* @author 朔风
* @date 2026-03-31 16:04
*/
@RestController
@RequestMapping("/api/ai")
@RequiredArgsConstructor
public class SimpleAiController {
private final ChatClient dashscopeChatClient;
private final ChatClient ollamaChatClient;
/**
* 同步响应
*/
@GetMapping(value = "/simple/chat", produces = "text/html;charset=utf-8")
public String simpleChat(@RequestParam("question") String question) {
// response.setCharacterEncoding("utf-8");
return dashscopeChatClient.prompt(question).call().content();
}
/**
* Ollama
*/
@GetMapping(value = "/ollamaSimpleChat/chat", produces = "text/html;charset=utf-8")
public String ollamaSimpleChat(@RequestParam("question") String question, HttpServletResponse response) {
return ollamaChatClient.prompt(question).call().content();
}
}访问
访问阿里云模型
shell
http://localhost:8080/api/ai/simple/chat?question=你是谁访问本地模型
shell
http://localhost:8080/api/ai/ollamaSimpleChat/chat?question=你是谁修改配置类
java
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* ChatConfig
*
* @author 朔风
* @date 2026-03-31 16:08
*/
@Configuration
public class ChatConfig {
/**
* 配置本地 Ollama 的 ChatClient(带日志记录)
*/
@Bean(name = "ollamaChatClient")
public ChatClient ollamaChatClient(OllamaChatModel ollamaChatModel) {
return ChatClient.builder(ollamaChatModel)
.defaultAdvisors(new SimpleLoggerAdvisor()) // 自动记录请求和响应日志
.build();
}
/**
* 配置云端 DashScope 的 ChatClient(带日志记录)
*/
@Bean(name = "dashscopeChatClient")
@Primary // 设置为默认ChatClient
public ChatClient dashscopeChatClient(DashScopeChatModel dashscopeChatModel) {
return ChatClient.builder(dashscopeChatModel)
.defaultAdvisors(new SimpleLoggerAdvisor()) // 自动记录请求和响应日志
.build();
}
}核心升级:
- 使用 SpringAI 内置的 Advisor 为 AI 对话添加日志记录。
- Advisor 模式:
- SpringAI 中的拦截器模式
- 可在 AI 请求前后自动执行特定逻辑(如日志、监控、审计)。
配置文件添加日志级别
yaml
# 日志
logging:
level:
org.springframework.ai: debug
com.github.itdachen: debug相应日志
json
{
"result": {
"output": {
"messageType": "ASSISTANT",
"metadata": {
"finishReason": "STOP",
"role": "ASSISTANT",
"id": "af736527-13ba-9b60-89ee-61a599a3956a",
"messageType": "ASSISTANT",
"reasoningContent": ""
},
"toolCalls": [],
"media": [],
"text": "你好!我是通义千问(Qwen),阿里巴巴集团旗下的超大规模语言模型。我能够回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,欢迎随时告诉我!😊"
},
"metadata": {
"finishReason": "STOP",
"contentFilters": [],
"empty": true
}
},
"metadata": {
"id": "af736527-13ba-9b60-89ee-61a599a3956a",
"model": "",
"rateLimit": {
"requestsLimit": 0,
"tokensLimit": 0,
"tokensReset": 0.0,
"requestsRemaining": 0,
"requestsReset": 0.0,
"tokensRemaining": 0
},
"usage": {
"promptTokens": 10,
"completionTokens": 66,
"totalTokens": 76,
"nativeUsage": {
"output_tokens": 66,
"input_tokens": 10,
"total_tokens": 76
}
},
"promptMetadata": [],
"empty": true
},
"results": [
{
"output": {
"messageType": "ASSISTANT",
"metadata": {
"finishReason": "STOP",
"role": "ASSISTANT",
"id": "af736527-13ba-9b60-89ee-61a599a3956a",
"messageType": "ASSISTANT",
"reasoningContent": ""
},
"toolCalls": [],
"media": [],
"text": "你好!我是通义千问(Qwen),阿里巴巴集团旗下的超大规模语言模型。我能够回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,欢迎随时告诉我!😊"
},
"metadata": {
"finishReason": "STOP",
"contentFilters": [],
"empty": true
}
}
]
}
朔风