
🧠 为什么 Java 开发者终于在 2025 年开始做 RAG 了?
在 2024 年之前,检索增强生成(RAG)还是个 Python 专属的 "俱乐部"。
Java 开发者只能眼睁睁看着:
…… 做着各种酷炫的 AI 操作
但 2025 年彻底改变了这一切。
现在有了:
无需黑客手段。 无需胶水脚本。 无需 Python 依赖。
这份指南将带你构建第一个端到端的 Java RAG 管道,代码简洁且对开发者友好。
让我们开始吧。👇
01
🧩 步骤 1:2025 RAG 架构(Java 版)
大多数公司在生产环境中使用的就是这个架构:
┌──────────────────────────┐
│ Spring Boot │
│ (Spring AI) │
└────────────┬─────────────┘
│
┌───────────▼────────────┐
│ Embedding Generator │ ← OpenAI / Ollama / Gemini
└───────────┬────────────┘
│
┌───────────▼────────────┐
│ Vector Database (DB) │ ← PgVector / Milvus / Pinecone
└───────────┬────────────┘
│
┌───────────▼────────────┐
│ LLM (Chat / Completion)│
└─────────────────────────┘一个干净、现代的 Java RAG 系统:
✔ 文档摄取
✔ 转换为 Embeddings
✔ 存储向量
✔ 向量搜索
✔ 将相关片段输入 LLM
让我们构建每个部分。
02
📦 步骤 2:添加依赖(Spring Boot 3.5)
你的 pom.xml 只需要三个真正的依赖:
<dependencies>
<!-- Spring AI 核心 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- 用于 Embeddings + 聊天 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
</dependency>
<!-- Web API -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>就这些。Spring AI 承担了大部分繁重的工作。
03
🧠 步骤 3:创建 Embeddings(Java 代码)
Spring AI 为 Java 提供了最简单的 Embedding API。
@Service
public class EmbeddingService {
@Autowired
private EmbeddingClient embeddingClient;
public List<Double> embed(String text) {
return embeddingClient.embed(text).getOutput();
}
}调用这个方法可以将任何文档转换为向量。
04
🏛️ 步骤 4:将 Embeddings 存储到 PgVector
PgVector 是 Spring Boot 最容易使用的向量数据库,因为它本质上就是 PostgreSQL。
你的表结构:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);用 Spring 插入数据:
@Autowired
JdbcTemplate jdbc;
public void saveEmbedding(String content, List<Double> vector) {
jdbc.update("""
INSERT INTO documents(content, embedding)
VALUES (?, ?)
""", content, vector.toArray());
}
搞定。你现在有了一个 Java 向量数据库。💥05
🔍 步骤 5:向量搜索(最近邻查询)
这是那个神奇的查询:
SELECT content
FROM documents
ORDER BY embedding <-> :queryVector
LIMIT 3;
代码版本:public List<String> searchSimilar(List<Double> vector) {
return jdbc.query("""
SELECT content FROM documents
ORDER BY embedding <-> ?
LIMIT 3
""", (rs, row) -> rs.getString("content"), vector.toArray());
}
这赋予了 RAG 强大的能力 —— 语义搜索而非关键词搜索。06
🤖 步骤 6:使用检索到的上下文询问 LLM
Spring AI 的 ChatClient 让 RAG 变得极其简单:
@Autowired
ChatClient chatClient;
public String answer(String question) {
List<Double> queryVector = embeddingClient.embed(question).getOutput();
List<String> context = searchSimilar(queryVector);
String prompt = """
Answer the question using ONLY the context below.
Context:
%s
Question:
%s
""".formatted(String.join("\n", context), question);
return chatClient.call(prompt);
}这就是一个完整的 RAG 管道。
没有 LangChain。 没有 Python。 只有干净的 Spring Boot 代码。
07
🚀 步骤 7:暴露为 API
@RestController
@RequestMapping("/rag")
public class RagController {
@Autowired
private RagService ragService;
@GetMapping("/ask")
public String ask(@RequestParam String q) {
return ragService.answer(q);
}
}调用方式:
GET /rag/ask?q=What is the refund policy?你现在有了一个基于 Java 的 RAG 微服务,可以直接部署。
08
🎉 你刚刚构建了什么
✔ AI 驱动的答案引擎
✔ 语义向量搜索
✔ 具备外部知识的 LLM
✔ 完全基于 Spring Boot
✔ 可部署到任何地方:Docker、Kubernetes、ECS、Cloud Run
现在,各大公司正在使用完全相同的设置:
这就是 2025 年 Java 团队标准化的架构。
09
🏁 最后思考
Spring AI 彻底改变了游戏规则。Java 开发者终于有了一个干净、官方的方式来构建:
而且它与 Spring Boot 完美配合。
如果你是一名 Java 后端工程师,这是属于你的 AI 时刻。别错过!