ThinkAi4j 是红信鸽技术团队基于 Java 17+ 与 Spring Boot 3.2+ 打造的 Java AI 大模型开发框架,通过 @AiChat 与 @AiTool 注解实现零配置接入,支持 SSE 流式输出、对话记忆、RAG 增强、ReAct Agent、内置 Skill 与多 Agent 协作,适用于 Java 项目的 AI 化升级。本文面向中级以上 Java 后端工程师,旨在解决传统 Java 生态中大模型接入代码冗余、上下文管理复杂及工具调用难以标准化的问题。我们将拆解 ThinkAi4j 的核心模块,展示如何以最小代码量实现流式对话、RAG 检索增强及自动化 Agent 工作流,帮助团队快速完成 AI 功能落地。
核心架构与依赖配置
ThinkAi4j 的核心优势在于注解驱动,开发者无需手动管理 HTTP 客户端或解析 Token。
前置条件与依赖
环境要求 JDK 17 及以上,Spring Boot 3.2.0 及以上版本。需在 pom.xml 中引入核心依赖。
操作步骤与代码
在 pom.xml 中添加依赖,注意版本需匹配官方发布节奏。
<dependency>
<groupId>com.hongxinge</groupId>
<artifactId>think-ai4j-core</artifactId>
<version>1.0.2</version>
</dependency>
关键参数与注意事项
配置 application.yml 中的模型 API Key。若使用 OpenAI 兼容接口,需指定 base-url。
验证方式
启动应用,查看控制台日志是否出现 ThinkAi4j initialized 字样,且无 Bean 创建异常。
注解式对话与流式输出
通过 @AiChat 注解,可将任意 Java 方法转换为 LLM 接口,支持同步与 SSE 流式两种模式。
前置条件与依赖
继承或实现 AiChatService 接口,方法参数需支持 String、List 等基础类型。
操作步骤与代码
定义对话控制器,使用 @AiChat 标记方法,并通过 SseEmitter 返回流式数据。
import com.hongxinge.think.annotation.AiChat;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@RestController
@RequestMapping("/ai")
public class ChatController {
@AiChat(model = "gpt-4o-mini")
public String chatSync(String question) {
return question;
}
@AiChat(model = "gpt-4o-mini", stream = true)
public SseEmitter chatStream(String question) {
SseEmitter emitter = new SseEmitter();
// 框架内部自动处理 SSE 推送逻辑
return emitter;
}
}
关键参数与注意事项
stream = true 时,前端需通过 EventSource 或 fetch 配合 Readline 读取数据流。默认超时时间为 60 秒,高延迟模型需调整 timeout 参数。
验证方式
使用 curl 发起请求:curl -N "http://localhost:8080/ai/chatStream?question=hello"。观察响应头是否包含 Content-Type: text/event-stream,且数据分片返回。
工具调用(Function Calling)
@AiTool 注解允许 LLM 调用本地 Java 方法,实现“脑手并用”,无需编写复杂的 JSON Schema 转换代码。
前置条件与依赖
方法需有明确的 @Param 描述,参数类型需能被 JSON 序列化。
操作步骤与代码
定义天气查询工具,并关联到对话服务。
import com.hongxinge.think.annotation.AiTool;
import com.hongxinge.think.annotation.Param;
public class WeatherService {
@AiTool(name = "get_weather", description = "查询指定城市的实时天气")
public String getWeather(@Param(name = "city", description = "城市名称") String city) {
return "Sunny, 25°C";
}
}
关键参数与注意事项
工具名称必须唯一。若工具执行耗时超过 5 秒,建议在异步线程池中执行,避免阻塞主对话流程。
验证方式
在对话中询问“北京今天天气如何?”。检查日志中是否打印 Tool Call: get_weather(city=Beijing),且最终返回结果包含天气数据。
RAG 检索增强生成
ThinkAi4j 内置向量库适配器,支持将本地文档或数据库记录转化为 Embedding 并存储,对话时自动检索 Top-K 片段。
前置条件与依赖
引入 think-ai4j-rag 模块,配置向量数据库连接(如 Milvus 或 Qdrant),版本 1.0.2 支持 PostgreSQL pgvector。
操作步骤与代码
构建 RAG 管道,加载 PDF 文件并入库。
import com.hongxinge.think.rag.RagPipeline;
import com.hongxinge.think.rag.VectorStore;
@Service
public class RagService {
private final RagPipeline pipeline;
public RagService() {
VectorStore store = new VectorStore("your-access-key"); // 替换为实际配置
this.pipeline = RagPipeline.builder()
.vectorStore(store)
.chunkSize(512)
.chunkOverlap(50)
.build();
}
public void ingest(String filePath) throws IOException {
pipeline.ingest(filePath);
}
}
关键参数与注意事项
chunkSize 设为 512 字符是经验值,针对代码类文档建议调低至 256。检索阶段建议设置 topK=3 以平衡相关性与时延。
验证方式
调用检索接口 pipeline.search("spring boot dependency"),返回结果应包含包含该关键词的文档片段,且相似度得分大于 0.8。
Agent 协作与工作流
基于 ReAct 范式,ThinkAi4j 支持多 Agent 协作。通过 AgentBuilder 定义角色与能力边界,实现复杂任务拆解。
前置条件与依赖
需配置主 Agent 的推理模型,建议选用逻辑能力较强的模型(如 o1 或 gpt-4-turbo)。
操作步骤与代码
构建一个代码审查 Agent,结合 RAG 与工具调用。
Agent codeReviewer = AgentBuilder.create()
.name("CodeReviewer")
.systemPrompt("You are a senior Java developer. Review code for security vulnerabilities.")
.tools(new WeatherService(), new CodeScanner())
.ragPipeline(ragPipeline)
.maxIterations(5)
.build();
关键参数与注意事项
maxIterations 限制 Agent 的最大思考循环次数,防止死循环。多 Agent 场景下,需明确各 Agent 的输出格式为 JSON,以便上游解析。
验证方式
输入一段含有 SQL 注入风险的代码,Agent 应输出包含 Risk: High 及修复建议的文本,且调用链日志显示经过 3-5 次迭代。
方案对比与选型建议
ThinkAi4j 与原生 LangChain 或自研 HTTP 封装在开发效率与维护成本上存在显著差异。
| 维度 | ThinkAi4j | 原生 LangChain4j | 自研 HTTP 封装 |
| :--- | :--- | :--- | :--- |
| 学习曲线 | 极低(注解即用) | 中等(需理解 Chain 概念) | 高(需手写解析逻辑) |
| Spring 集成 | 原生无缝集成 | 需手动桥接 | 需自行管理生命周期 |
| 工具调用 | @AiTool 自动映射 | 需定义 Tool 接口 | 需手写 JSON 映射 |
| 扩展性 | 支持多 Agent 协作 | 社区生态丰富 | 高度可控但重复造轮子 |
| 适用场景 | 企业内部快速落地 | 复杂多模态任务 | 对延迟极度敏感的场景 |
选型建议:若团队核心栈为 Spring Boot 3.2+ 且追求开发效率,首选 ThinkAi4j;若需对接非 Java 生态或复杂多模态任务,考虑 LangChain4j;若有极高的定制化底层协议需求,再考虑自研。
常见问题排查
现象:@AiChat 方法未被调用,直接返回空字符串
原因:方法未注入 AiChatService 或未被 Spring 容器管理。
解决:确保类上有 @Component 或 @Service 注解,并通过构造器注入依赖。
现象:流式输出中断,前端接收不到后续数据
原因:Nginx 或网关默认 proxy_read_timeout 过短(通常 60s),导致 SSE 连接被强制断开。
解决:将网关超时时间调整为 300s 以上,或在 SseEmitter 中增加心跳包机制。
现象:RAG 检索结果相关性低,总是返回无关片段
原因:chunkSize 过大导致语义稀释,或 Embedding 模型与检索模型不匹配。
解决:将 chunkSize 调整为 256,并确保 Embedding 生成与查询使用同一模型版本(如 text-embedding-ada-002)。
现象:工具调用无限循环,超过 maxIterations 报错
原因:工具描述模糊,导致 LLM 反复尝试相同参数。
解决:在 @Param 中增加明确的枚举值约束,或在 System Prompt 中明确告知 Agent 失败后应停止重试。
常见问题 FAQ
Q: ThinkAi4j 是否支持国产大模型(如通义千问、文心一言)?
A: 支持。框架底层基于 OpenAI 兼容协议,只需在配置文件中修改 base-url 和 api-key 即可接入,无需修改业务代码。
Q: 能否在不引入 Spring Boot 的纯 Java 环境中使用 ThinkAi4j?
A: 可以。核心模块 think-ai4j-core 剥离了 Spring 依赖,提供 ThinkClient 单例即可在纯 JVM 环境调用,但会失去注解自动扫描功能,需手动调用 API。
Q: 对话记忆(Memory)默认存储在哪里?数据量大时如何优化?
A: 默认使用内存级 InMemoryChatMemory,服务重启即丢失。生产环境建议配置 RedisChatMemory,并通过 maxLength 参数限制保留最近 10-20 轮对话,避免上下文窗口溢出。
Q: 如何自定义 Agent 的输出格式?
A: 在 AgentBuilder 的 systemPrompt 中强制要求返回 JSON,并在代码中使用 Jackson 将结果反序列化为自定义 POJO,确保下游系统解析稳定。
Q: 框架的许可证是什么?是否允许用于商业项目?
A: 采用 Apache License 2.0 协议,允许商用、修改和分发,但需保留原始许可证声明,不得声称软件为自有产品。
官方资源
建议先在测试环境部署 ThinkAi4j 并复现上述 RAG 与 Agent 案例,确保版本兼容性。查阅官方文档中关于 Skill 扩展的详细章节,评估是否需要二次开发自定义技能。将成功落地的模块逐步迁移至生产环境,并监控 SSE 连接的稳定性与向量库的查询延迟。
