1. 第一阶段:调用智谱模型api实现对话

创建一个支持 Spring AI 的 Spring Boot 的项目

  • Maven类型
  • 依赖:Spring Web 构建web接口,Lombok 简化代码

配置智谱模型API key

src/main/resources/application.yml 中配置:

spring:
  ai:
    zhipuai:
      api-key: ec5a6063b1ca43978c645a8ce4d8f34b.2xaMYImCVdSnl9SL
      chat:
        options:
          model: glm-4.7

在src/main/java/com.example/aiassistant/ 创建一个新Calss,TestAiController

package com.example.aiassistant;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestAiController {

    private final ChatClient chatClient;

    // Spring AI 会自动帮你配置好 ChatClient.Builder
    public TestAiController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/test")
    public String testAi(@RequestParam(defaultValue = "你好,介绍一下你自己") String message) {
        // 这一行就是最简单的 AI 调用
        return chatClient.prompt().user(message).call().content();
    }
}

声明这是一个REST控制器,会自动将返回结果序列化为JSON/文本

@RestController
public class TestAiController {

声明一个final的ChatClient实例,通过构造器注入

Spring AI会自动帮你配置好ChatClient.Builder

private final ChatClient chatClient;

Spring AI会自动帮你配置好ChatClient.Builder,这里通过构造函数注入ChatClient.Builder

    public TestAiController(ChatClient.Builder builder) {
        // 使用builder构建ChatClient实例
        this.chatClient = builder.build();
    }

定义一个GET接口,路径为"/test"

RequestParam表示从URL参数获取message,默认值为"你好,介绍一下你自己"

@GetMapping("/test")
    public String testAi(@RequestParam(defaultValue = "你好,介绍一下你自己") String message) {

        return chatClient.prompt().user(message).call().content();
    }
}

使用链式调用与大模型交互:

  • chatClient.prompt(): 开始构建对话
  • .user(message): 设置用户输入内容
  • .call(): 发送请求到大模型
  • .content(): 获取模型返回的文本内容

详细的执行流程

// 完整调用链:
chatClient         // ChatClient实例
    .prompt()      // 创建一个Prompt对象
    .user(message) // 设置用户角色消息
    .call()        // 发送请求到AI模型,返回Response
    .content()     // 从Response中提取文本内容

分析:

  • Spring MVC 是 Spring Boot 处理 Web 请求的核心模块
  • Spring Boot 内置的 Tomcat 具有线程池机制。每一个 HTTP 请求进入后,Tomcat 都会分配一个独立的线程去处理

在浏览器中输入http://localhost:8080/test,按下回车,message会被打包为一个HTTP请求报文

通过TCP/IP协议,请求报文投递到了本机8080端口,Tomcat服务器监听到,将其转化为Java对象

报文对象进入Java程序后,Spring MVC将其分发给/test,分发,匹配,注入message参数

通过ChatClient调用Spring AI框架里的 ZhiPuAiChatModel

当执行下面这行代码的时候

chatClient.prompt().user(message).call().content();

后台发生了以下通信过程

  • Spring AI核心组件将message包装成智谱要求的JSON格式
  • 鉴权模块利用你提供的api-key自动计算一个JWT Token 放在请求头里
  • HTTP客户端发起一个HTTP POST请求到智谱的公网URL

Java程序伪装成了一个高级浏览器,去访问了智谱的API接口

智谱云端接收到你的加密请求,验证 Token 正确后,把文本输入到 GLM 模型中,算出回答

智谱把结果(JSON)发回给你的 Spring Boot。Spring AI 自动把复杂的 JSON 简化

你的 Controller 把这句字符串return

Spring MVC 再把它包装成 HTTP 响应,最后在你的浏览器屏幕上打印出来

2. 第二阶段:引入RAG

创建AiConfig类:

package com.example.aiassistant;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {
    // 1. 定义向量库(AI 的本地内存知识库)
    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel) {
        return SimpleVectorStore.builder(embeddingModel).build();
    }
    // 2. 这里的 ChatClient.Builder 是 Spring AI 2.0 的新用法,非常优雅
    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.build();
    }
}
  • @Configuration表示这是一个配置类,Spring容器会扫描其中的@Bean方法
  • @Bean注解:将方法返回值注册为Spring容器中的一个Bean

VectorStore:向量存储接口,用于存储和检索嵌入向量
EmbeddingModel:嵌入模型,用于将文本转换为向量

SimpleVectorStore:Spring AI提供的简单向量存储实现
.builder(embeddingModel):使用嵌入模型构建向量存储
.build():创建VectorStore实例

这里的 ChatClient.Builder 是 Spring AI 2.0 的新用法,非常优雅
创建ChatClient Bean,用于与AI模型交互

数据加载器,创建DataLoderService类

告诉 Spring AI:“把这个 CSV 文件读了,变成向量存进内存里。”

package com.example.aiassistant;

import jakarta.annotation.PostConstruct;
import org.springframework.ai.reader.TextReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

@Service
public class DataLoaderService {

    private final VectorStore vectorStore;

    @Value("classpath:data/signal_plan_sample.csv")
    private Resource csvResource;

    public DataLoaderService(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    @PostConstruct
    public void init() {
        // 1. 读取 CSV 文本
        TextReader reader = new TextReader(csvResource);
        // 2. 将数据“喂”给向量库(内部会自动调用智谱的 Embedding 接口进行向量化)
        vectorStore.accept(TokenTextSplitter.builder().build().apply(reader.get()));
        System.out.println("🚀 交通信号方案已成功载入 AI 知识库!");
    }
}

下载了一个交通监控的数据集,记录了交通信息

                                 

数据流向:

HTTP请求 → Controller → 获取参数 → 构建提示 → 向量检索 → AI调用 → HTTP响应
客户端   → 端口8080  → message  → 系统提示+用户消息 → 相关文档 → AI模型 → 回答文本

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐