1. 项目概述
最近在做一个挺有意思的AI编程助手项目,用SpringBoot+LangChain4j+Qwen大模型搭建了一套完整的AI应用开发框架。这个项目特别适合想在自己的简历上增加AI相关经验的Java开发者,因为整个技术栈都是基于Java生态的,不需要额外学习Python等语言。
项目实现了从基础对话到高级RAG检索的完整功能链,包括:
- 基础对话交互
- 多模态处理
- 系统提示词定制
- AI Service开发模式
- 会话记忆管理
- 结构化输出
- RAG检索增强
- 工具调用集成
- MCP协议支持
- 护轨机制
- SSE流式接口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 开发环境搭建
推荐使用以下环境配置:
- JDK 17或21(必须≥17)
- Spring Boot 3.2+
- Maven 3.8+
- IntelliJ IDEA(推荐)
创建Spring Boot项目时选择:
- Spring Web
- Lombok
2.2 核心依赖配置
在pom.xml中添加LangChain4j相关依赖:
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
<version>1.1.0-beta7</version>
</dependency>
2.3 Qwen大模型配置
在application.yml中配置:
yaml复制langchain4j:
community:
dashscope:
chat-model:
api-key: your-api-key
model-name: qwen-max
embedding-model:
model-name: text-embedding-v4
api-key: your-api-key
API Key需要从阿里云百炼平台获取。这里有个小技巧:创建多个环境配置文件,把敏感信息放在非版本控制的配置文件中。
3. 基础功能实现
3.1 ChatModel基础对话
最简单的AI交互实现:
java复制@Service
@Slf4j
public class AiCodeHelper {
@Resource
private ChatModel qwenChatModel;
public String chat(String message) {
UserMessage userMessage = UserMessage.from(message);
ChatResponse chatResponse = qwenChatModel.chat(userMessage);
AiMessage aiMessage = chatResponse.aiMessage();
log.info("AI响应: {}", aiMessage.text());
return aiMessage.text();
}
}
这个基础版本有几个问题需要注意:
- 没有上下文记忆
- 没有角色设定
- 响应是同步阻塞的
3.2 系统提示词设计
系统提示词是控制AI行为的关键。我们设计了一个专业的编程助手提示词:
java复制private static final String SYSTEM_STRING = """
你是一位资深的编程与面试辅导专家。你的核心使命是帮助用户在技术面试和编程能力提升方面取得成功...
""";
public String chatWithSystemPrompt(String message) {
SystemMessage systemMessage = SystemMessage.systemMessage(SYSTEM_STRING);
UserMessage userMessage = UserMessage.from(message);
ChatResponse chatResponse = qwenChatModel.chat(systemMessage, userMessage);
return chatResponse.aiMessage().text();
}
提示词设计的几个要点:
- 明确角色定位
- 限定回答范围
- 结构化输出要求
- 避免开放式回答
4. 高级功能实现
4.1 AI Service开发模式
LangChain4j提供的AI Service模式可以大幅简化开发:
java复制public interface AiCodeHelperService {
@SystemMessage(fromResource = "system-prompt.txt")
String chat(String userMessage);
}
@Configuration
public class AiCodeHelperServiceFactory {
@Bean
public AiCodeHelperService aiCodeHelperService(ChatModel chatModel) {
return AiServices.create(AiCodeHelperService.class, chatModel);
}
}
这种模式背后使用了动态代理技术,自动处理消息转换和模型调用。实际开发中,我们可以通过注解实现:
- 系统提示词(@SystemMessage)
- 用户消息(@UserMessage)
- 记忆ID(@MemoryId)
- 工具调用(@Tool)
4.2 会话记忆管理
实现多轮对话的关键是ChatMemory:
java复制@Bean
public AiCodeHelperService aiCodeHelperService(ChatModel chatModel) {
ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
return AiServices.builder(AiCodeHelperService.class)
.chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(10))
.chatMemory(chatMemory)
.chatModel(chatModel)
.build();
}
记忆管理的几个注意事项:
- 不同会话要隔离(memoryId)
- 消息窗口不宜过大(通常10-20条)
- 重要信息可以持久化到数据库
4.3 结构化输出
让AI返回结构化数据:
java复制public interface AiCodeHelperService {
@SystemMessage("你是一个编程面试评估专家")
Report evaluateCode(String code);
record Report(String quality, int score, List<String> suggestions) {}
}
实现结构化输出的三种方式:
- JSON Schema强制约束
- Prompt工程引导
- 后处理解析
5. RAG检索增强
5.1 RAG核心流程
完整的RAG实现流程:
- 文档加载与分割
- 向量化处理
- 向量存储
- 相似度检索
- 结果排序
- 提示词增强
5.2 代码实现
java复制@Configuration
public class RagConfig {
@Bean
public ContentRetriever contentRetriever(
EmbeddingModel embeddingModel,
EmbeddingStore<TextSegment> embeddingStore) {
// 文档加载
List<Document> documents = FileSystemDocumentLoader.loadDocuments("docs");
// 文档分割
DocumentSplitter splitter = new DocumentByParagraphSplitter(1000, 200);
// 向量存储
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
.documentSplitter(splitter)
.embeddingModel(embeddingModel)
.embeddingStore(embeddingStore)
.build();
ingestor.ingest(documents);
// 内容检索器
return EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.75)
.build();
}
}
5.3 性能优化技巧
-
文档预处理:
- 去除无关内容
- 添加元数据
- 分块大小优化
-
检索优化:
- 混合检索策略
- 重排序模型
- 查询扩展
-
缓存策略:
- 向量缓存
- 结果缓存
- 热点问题缓存
6. 工具调用与MCP协议
6.1 工具调用实现
java复制public class Calculator {
@Tool("执行数学计算")
public double calculate(double a, double b, String operator) {
// 实现计算逻辑
}
}
public interface AiCodeHelperService {
String useTool(String question);
}
@Bean
public AiCodeHelperService aiCodeHelperService(
ChatModel chatModel,
Calculator calculator) {
return AiServices.builder(AiCodeHelperService.class)
.chatModel(chatModel)
.tools(calculator)
.build();
}
工具调用的关键点:
- 明确工具描述
- 参数类型匹配
- 错误处理机制
6.2 MCP协议集成
MCP协议的核心组件:
- 服务注册中心
- 协议适配器
- 权限管理
- 监控统计
集成步骤:
- 添加MCP依赖
- 配置服务端点
- 实现工具接口
- 注册服务描述
7. 生产环境优化
7.1 护轨机制
java复制@Bean
public AiCodeHelperService aiCodeHelperService(ChatModel chatModel) {
return AiServices.builder(AiCodeHelperService.class)
.chatModel(chatModel)
.inputGuardrail(message -> {
// 敏感词检测
if(containsSensitiveWords(message)) {
throw new GuardrailException("包含敏感内容");
}
})
.outputGuardrail(message -> {
// 输出内容过滤
return filterContent(message);
})
.build();
}
7.2 流式响应
SSE接口实现:
java复制@RestController
public class AiController {
@GetMapping("/chat")
public Flux<ServerSentEvent<String>> chat(String message) {
return aiService.chatStream(message)
.map(chunk -> ServerSentEvent.builder(chunk).build());
}
}
public interface AiCodeHelperService {
Flux<String> chatStream(String message);
}
流式响应的优化点:
- 响应超时设置
- 背压处理
- 客户端重连
- 性能监控
8. 项目部署与运维
8.1 部署架构
推荐的生产环境架构:
- 前端:Nginx+Web
- 后端:Spring Boot应用
- 向量数据库:Milvus/Pinecone
- 缓存:Redis
- 监控:Prometheus+Grafana
8.2 性能调优
关键性能指标:
- 响应时间:<3s
- 吞吐量:>100rps
- 错误率:<1%
优化手段:
- 模型量化
- 请求批处理
- 缓存策略
- 异步处理
8.3 监控指标
必须监控的核心指标:
- API响应时间
- 模型调用次数
- 错误类型统计
- 资源使用率
- 会话保持时间
9. 经验总结
在实际开发中,有几个关键点需要特别注意:
-
提示词工程是核心
- 迭代优化提示词
- A/B测试不同版本
- 领域知识注入
-
RAG效果优化
- 文档质量决定上限
- 分块策略影响巨大
- 混合检索效果更好
-
生产环境问题
- 流式响应稳定性
- 长上下文记忆管理
- 敏感内容过滤
-
性能与成本平衡
- 模型选型
- 缓存策略
- 异步处理
这个项目完整展示了如何将AI能力集成到Java应用中,从基础对话到高级RAG检索,形成了一个完整的AI应用开发框架。最大的收获是理解了如何在实际业务场景中有效利用大模型能力,而不是简单调用API。
