Skip to content
章节导航

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
      }
    }
  ]
}

相应日志