2026 年 5 月 28 日,Spring AI 2.0.0 GA 正式发布。对 Java 开发者来说,这是一个标志性节点——终于有一套成熟的、Spring 生态内的 AI 工程化方案可以投入生产了。但在你决定把所有项目都绑上 Spring AI 之前,值得花十分钟看看另一条路:Solon AI。两个框架解决的是同一个问题,但路线选择差异很大,理解这些差异比选对框架更重要。
两条路线,同一个终点
Spring AI 和 Solon AI 的目标一致:让 Java 开发者以工程化的方式接入和使用 AI 能力。但"工程化"这个词,两个团队的理解并不相同。
Spring AI 的思路是在 Spring 生态内做 AI。它依赖 Spring Boot 的自动配置、Bean 容器和 Starter 机制,开发者用熟悉的注解和配置文件就能接入模型。好处是学习曲线平滑,坏处是你得带着整个 Spring 体系一起走。
Solon AI 的思路是先做轻量框架,再叠加 AI 能力。Solon 本身是一个约 2MB 的轻量 Java 框架,不依赖 Spring 体系,启动快、内存占用小。AI 模块是 Solon 生态的一部分,但不是框架的核心负担。
这种路线差异在实际项目中会直接体现:如果你已经是一个重度 Spring Boot 项目,Spring AI 几乎是无缝接入;但如果你的项目对启动速度、内存占用敏感,或者你压根不想引入 Spring 体系,Solon AI 提供了一个更轻的选择。
接入模型:配置哲学的分野
两个框架在模型接入上的配置方式差异明显。先看 Spring AI 的典型做法:
# application.yml — Spring AI 2.0 配置示例
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://api.openai.com
chat:
options:
model: gpt-4o
temperature: 0.7
// Spring AI — 用注解驱动的 ChatClient
@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
Spring AI 把模型参数放进 YAML,通过 Spring Boot 自动配置注入 Bean,开发者只需要声明 ChatClient 就能用。这是典型的 Spring 风格——配置外置、Bean 托管、注解驱动。
再看 Solon AI 的做法:
// Solon AI — 用代码直接组装模型接入
@Configuration
public class AiConfig {
@Bean
public ChatModel chatModel() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.baseUrl("https://api.openai.com")
.model("gpt-4o")
.temperature(0.7)
.build();
}
}
// Solon AI — Controller 直接注入 Model
@Controller
public class ChatController {
@Inject
private ChatModel chatModel;
@Mapping("/chat")
public String chat(@Param String message) {
return chatModel.chat(message);
}
}
Solon AI 倾向于用 Java 代码而非 YAML 声明配置。模型参数直接写在 Builder 里,环境变量用 System.getenv() 读取。没有自动配置的魔法,但也没有隐式行为的隐患——你写的每一行配置都是显式的。
实战对比:一个带 RAG 的问答接口
为了更直观地感受差异,我们用两个框架各写一个带 RAG(检索增强生成)的问答接口。假设你已经有一个向量数据库存储了文档片段。
Spring AI 版本:
// Spring AI 2.0 — RAG 问答服务
@Service
public class RagService {
private final ChatClient chatClient;
private final VectorStore vectorStore;
public RagService(ChatClient.Builder builder, VectorStore vectorStore) {
this.chatClient = builder.build();
this.vectorStore = vectorStore;
}
public String ask(String question) {
// 1. 从向量库检索相关文档
List<Document> docs = vectorStore.similaritySearch(
SearchRequest.builder()
.query(question)
.topK(3)
.build()
);
// 2. 构造带上下文的 prompt
String context = docs.stream()
.map(Document::getText)
.collect(Collectors.joining("\n---\n"));
return chatClient.prompt()
.system("基于以下参考资料回答用户问题,如果资料中没有答案,请如实说明。\n\n参考资料:\n" + context)
.user(question)
.call()
.content();
}
}
Solon AI 版本:
// Solon AI — RAG 问答服务
@Component
public class RagService {
@Inject
private ChatModel chatModel;
@Inject
private VectorStore vectorStore; // Solon AI 的向量存储接口
public String ask(String question) {
// 1. 检索相关文档
List<Document> docs = vectorStore.search(question, 3);
// 2. 手动拼接 prompt
String context = docs.stream()
.map(Document::getText)
.collect(Collectors.joining("\n---\n"));
String prompt = "基于以下参考资料回答用户问题,如果资料中没有答案,请如实说明。\n\n"
+ "参考资料:\n" + context + "\n\n用户问题:" + question;
return chatModel.chat(prompt);
}
}
两个版本的核心逻辑完全一致:检索文档 → 拼接上下文 → 调用模型。区别在于 Spring AI 用 ChatClient 的 DSL 风格链式调用(.system().user().call()),而 Solon AI 更接近原生调用——直接把完整 prompt 传给 ChatModel。
没有哪种方式绝对更好。DSL 风格在复杂 prompt 组合时更清晰,原生调用在简单场景下更直接。你需要根据团队习惯和项目复杂度做选择。
选型之前,先想清楚这三件事
在决定用哪个框架之前,建议先回答三个问题:
1. 你的项目已经在用什么框架?
如果你现有的项目就是 Spring Boot 体系,Spring AI 的接入成本几乎为零——加一个 Starter、写几行 YAML 就能跑起来。迁移到 Solon 意味着要换掉整个底层框架,这个代价通常不值得。
如果你的项目是 Solon 体系,或者是一个对启动速度和内存敏感的轻量服务(比如边缘部署、函数式微服务),Solon AI 是自然选择。
如果你在启动一个全新项目,两个框架都可以考虑,这时候要看下面两个问题。
2. 你的团队对"显式配置"和"自动配置"的偏好?
Spring AI 大量依赖自动配置——你写一行 YAML,框架替你创建 Bean、注册拦截器、管理生命周期。好处是少写代码,风险是出了问题排查链路长。
Solon AI 倾向于显式组装——你用 Builder 创建对象,用 @Bean 注册,每个环节都是你写的代码。好处是行为可预测,代价是配置代码多一点。
3. 你的 AI 功能是核心业务还是辅助能力?
如果 AI 是产品的核心能力(比如一个 AI 写作工具、智能客服系统),你需要深度定制 prompt 链、模型切换策略、流式输出、工具调用等。这时候两个框架都要仔细评估其扩展能力——Spring AI 的 Advisor 机制和 Solon AI 的 Filter 机制各有设计哲学,建议分别写一个原型再决定。
如果 AI 只是辅助能力(比如在管理后台加一个智能搜索),接入速度比深度定制更重要,选和你现有框架一致的方案就行。
一个快速验证的脚手架
不管选哪个框架,建议先用最小原型验证模型接入是否通畅。下面是一个不依赖任何 AI 框架的纯 HTTP 调用,用来确认你的 API Key 和网络链路没问题:
# 先用 curl 验证 OpenAI 接入是否正常
curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello, just testing connectivity."}],
"max_tokens": 20
}' | python3 -m json.tool
如果这个 curl 返回了正常的 JSON 响应,说明网络和 Key 都没问题,再往上叠加框架才有意义。如果连这一步都跑不通,先解决网络代理或 Key 问题,别急着写框架代码。
Spring AI 2.0 GA 是 Java AI 工程化的一个重要里程碑,但里程碑不等于唯一道路。Solon AI 提供了一条更轻量的路线,适合不同的项目约束和团队偏好。选框架的本质不是选"最好的",而是选"约束匹配的"——你的项目体量、团队习惯、AI 功能的深度,才是真正的决策变量。