技术笔记

← 返回笔记列表

Spring AI + RAG 流式 AI 助手

📅 2026/05 🏷️ Spring AI 人工智能

Spring AI 是 Spring 生态下的 AI 应用框架,能够快速接入 OpenAI、Ollama、Azure 等大模型服务。结合 RAG(Retrieval-Augmented Generation,检索增强生成)技术,可以让 AI 基于私有知识库作答,显著减少幻觉并提升回答的专业度。

一、RAG 核心流程

RAG 的典型流程分为两个阶段:

  • Indexing(索引阶段):加载文档 → 文本分块 → 向量化 → 存入向量数据库(如 Milvus、Redis、PgVector)。
  • Retrieval(检索阶段):用户提问 → 问题向量化 → Top-K 相似文档召回 → 拼接进 Prompt → 调用 LLM 生成答案。

二、核心依赖

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>

三、向量检索与 Prompt 组装

使用 VectorStore 进行相似度检索,将检索到的文档片段作为上下文注入 Prompt。

// 检索相关文档
List<Document> docs = vectorStore.similaritySearch(
    SearchRequest.query(question).withTopK(5)
);
String context = docs.stream().map(Document::getContent).collect(Collectors.joining("\n"));

// 构建增强 Prompt
String prompt = """
    基于以下上下文回答问题:
    ---
    {context}
    ---
    问题:{question}
    """;

return chatClient.prompt()
    .user(u -> u.text(prompt, context, question))
    .call().content();

四、流式对话接口

使用 Stream<String>Flux<String> 返回流式结果,前端通过 EventSource 接收,实现逐字输出效果。

@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chat(@RequestParam String message) {
    return chatClient.prompt(message).stream().content();
}

五、函数调用(Function Calling)

Spring AI 支持把 Java 方法注册为工具,让模型在需要时调用。例如:查询订单、获取天气、检索知识库。

  • 定义一个 @ToolFunction Bean
  • 在 ChatClient 中注册工具
  • 模型会根据上下文自动决定是否调用

六、对话持久化

生产环境中建议把对话历史存入 Redis 或数据库,维护 session 维度的上下文。避免每次请求都携带完整历史,可以配合滑动窗口裁剪。

RAG 让大模型从"通用知识"升级为"私有知识专家",关键在于检索质量与提示工程的结合。