轻松入门SpringAI-SpringAI综合案例

轻松入门 Spring AI 综合案例
(2025-2026 比较实用且完整的入门组合示例)

以下是一个相对完整的、适合初学者到中级的 Spring AI 综合案例,包含目前最常用的几种核心能力:

功能清单:
1. 普通对话(ChatClient 最基础用法)
2. 流式回答(打字机效果)
3. 会话记忆(短期记忆)
4. 系统提示词工程
5. RAG 简单实现(基于内存向量存储)
6. 函数调用(Function Calling / Tools)
7. 结构化输出(JSON模式 + Bean转换)

完整综合案例代码(单文件版)

@RestController
@RequestMapping("/ai/demo")
@RequiredArgsConstructor
@Slf4j
public class AiDemoController {

    private final ChatClient chatClient;

    // 1. 最基础聊天
    @GetMapping("/chat")
    public String simpleChat(@RequestParam String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }

    // 2. 流式回答(前端最推荐)
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamChat(@RequestParam String message) {
        return chatClient.prompt()
                .user(message)
                .stream()
                .content();
    }

    // 3. 带记忆 + 系统角色(最常用的组合写法)
    private final ChatMemory chatMemory = new MessageWindowChatMemory(10); // 保留最近10条

    @GetMapping("/memory")
    public String chatWithMemory(
            @RequestParam String sessionId,
            @RequestParam String message) {

        return chatClient.prompt()
                .system("""
                        你是一位友善、幽默、说话很接地气的「资深Java架构师」
                        用中文回答,尽量使用 markdown 格式排版
                        喜欢用表情和生活化比喻解释复杂概念
                        """)
                .user(message)
                .advisors(
                        new MessageChatMemoryAdvisor(chatMemory, sessionId)
                )
                .call()
                .content();
    }

    // 4. 简单 RAG (内存向量存储版 - 适合快速体验)
    private final EmbeddingModel embeddingModel;
    private final VectorStore vectorStore = new SimpleVectorStore(embeddingModel);

    @PostConstruct
    public void initKnowledgeBase() {
        List<String> docs = List.of(
                "Spring AI 是 Spring 家族推出的官方大模型集成框架,目标是让 Java 开发者用最熟悉的方式使用大语言模型。",
                "目前支持 OpenAI、Azure、Ollama、HuggingFace、阿里通义、百度文心、智谱、Moonshot、DeepSeek 等多种模型。",
                "ChatClient 是 Spring AI 提供的核心高层抽象,类似 RestTemplate 在 HTTP 时代的地位。",
                "2025年下半年开始,Spring AI 正式进入 1.0 阶段,API 基本稳定。"
        );

        List<Document> documents = docs.stream()
                .map(content -> new Document(content, Map.of("source", "spring-ai-doc")))
                .toList();

        vectorStore.add(documents);
    }

    @GetMapping("/rag")
    public String simpleRag(@RequestParam String question) {
        List<Document> similarDocs = vectorStore.similaritySearch(
                SearchRequest.query(question).withTopK(3)
        );

        String context = similarDocs.stream()
                .map(Document::getContent)
                .collect(Collectors.joining("\n\n"));

        return chatClient.prompt()
                .system("你现在是一个基于给定上下文回答问题的专家助手。\n上下文:\n" + context)
                .user(question)
                .call()
                .content();
    }

    // 5. 函数调用(工具调用) - 经典天气例子
    @GetMapping("/tools")
    public String weatherWithTools(@RequestParam String city) {

        record WeatherInfo(
                @JsonProperty("city") String city,
                @JsonProperty("temperature") double temperature,
                @JsonProperty("condition") String condition,
                @JsonProperty("humidity") int humidity) {}

        Function<WeatherRequest, WeatherInfo> fakeWeatherFunction = req -> 
            new WeatherInfo(req.city(), 24.5, "多云转晴", 65);

        return chatClient.prompt()
                .user("请告诉我" + city + "现在的天气怎么样?")
                .functions(List.of(
                        FunctionCallbackContext.builder()
                                .function("get_weather", fakeWeatherFunction)
                                .description("获取指定城市的当前天气信息")
                                .responseConverter(new BeanOutputConverter<>(WeatherInfo.class))
                                .build()
                ))
                .call()
                .content();
    }

    // 6. 结构化输出(最推荐的写法之一)
    public record TravelPlan(
            @JsonProperty("destination") String destination,
            @JsonProperty("days") int days,
            @JsonProperty("budget_level") String budgetLevel, // low/medium/high
            @JsonProperty("highlights") List<String> highlights,
            @JsonProperty("tips") List<String> tips
    ) {}

    @GetMapping("/structured")
    public TravelPlan structuredTravelPlan(
            @RequestParam String destination,
            @RequestParam(defaultValue = "3") int days,
            @RequestParam(defaultValue = "medium") String budget) {

        BeanOutputConverter<TravelPlan> converter = 
                new BeanOutputConverter<>(TravelPlan.class);

        String jsonSchema = converter.jsonSchema;

        String prompt = """
                你是一位专业的旅行规划师。
                请为用户规划一份 %d 天的%s预算%s旅行计划。

                请严格按照以下 JSON Schema 输出,不要输出任何多余的文字:

                %s

                目的地:%s
                """.formatted(days, budget, destination, jsonSchema, destination);

        String rawJson = chatClient.prompt(prompt).call().content();

        return converter.convert(rawJson);
    }
}

推荐学习路径(难度递增)

阶段重点掌握内容建议耗时推荐练习题目
第1天ChatClient基本用法 + 流式 + 系统提示词2~4小时写一个AI聊天室(带历史记录)
第2天会话记忆 + PromptTemplate3~5小时实现多角色对话(客服/面试官/女友等)
第3天简单RAG(内存/文件/PGVector)6~10小时做一个个人简历/知识库问答机器人
第4~5天Function Calling + 结构化输出8~15小时实现:天气+汇率+查快递+生成周报
第6天+多Agent协作 / ReAct / 工具链编排持续学习中写一个「程序员小助手」Agent(写代码+查资料+写文档)

一句话总结当前(2026年初)最舒服的入门技术栈建议:

Spring Boot 3.3.x + Spring AI 1.0.x +
硅基流动/DeepSeek官方 OpenAI兼容接口 +
deepseek-r1:free / deepseek-v3:free(推理最强) +
ChatClient流式 + Memory + 简单RAG + Function Calling + 结构化输出

祝你玩得开心,早日做出属于自己的AI小产品~ 🚀

文章已创建 3855

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部