以下是基于 Spring AI、DeepSeek、通义千问(Qwen)、豆包(DouBao)、RAG、Agent 等技术构建知识问答系统的完整实现方案,包含代码示例和详细注释:
1. 系统架构与技术栈
模块 | 技术/工具 | 作用 |
---|---|---|
后端框架 | Spring Boot + Spring AI | 构建REST API和AI模型集成 |
大模型调用 | Qwen API、DeepSeek API、DouBao API | 提供生成式问答能力 |
RAG模型 | LangChain + Elasticsearch | 检索+生成混合模型 |
Agent协调器 | LangChain Agent | 协调多模型任务流和异常处理 |
知识库 | Elasticsearch | 存储和检索内部文档 |
反馈与训练 | MySQL + 自动重训练脚本 | 存储用户反馈并触发模型更新 |
前端框架 | Vue.js + WebSocket | 用户交互界面 |
2. 完整代码实现
(1) Maven依赖配置(pom.xml
)
<!-- Spring Boot核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI支持 -->
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-ai</artifactId>
<version>0.0.7</version>
</dependency>
<!-- LangChain Java客户端 -->
<dependency>
<groupId>ai.langchain</groupId>
<artifactId>langchain</artifactId>
<version>0.0.222</version>
</dependency>
<!-- Elasticsearch客户端 -->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.10.4</version>
</dependency>
<!-- MySQL数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
(2) 配置大模型API(application.yml
)
# 大模型API密钥配置
qwen:
api-key: YOUR_QWEN_API_KEY
deepseek:
api-key: YOUR_DEEPEEK_API_KEY
doubao:
api-key: YOUR_DOUBAO_API_KEY
(3) RAG模型配置(LangChain + Elasticsearch)
@Configuration
public class RAGConfig {
@Bean
public ElasticsearchClient elasticsearchClient() {
return ElasticsearchClient.builder()
.endpoint("http://localhost:9200")
.build();
}
@Bean
public RAGChain ragChain(ElasticsearchClient client) {
// 初始化检索器(Elasticsearch)
ElasticsearchRetriever retriever = new ElasticsearchRetriever(
client, "internal_docs", "content"
);
// 初始化生成器(多模型选择)
List<LLM> models = Arrays.asList(
new QwenLLM("qwen-1.5", System.getenv("QWEN_API_KEY")),
new DeepSeekLLM("deepseek-1.5", System.getenv("DEEPEEK_API_KEY"))
);
// 构建RAG链
return new RAGChain(
retriever,
new MultiModelSelector(models),
new QwenGenerator() // 默认生成器
);
}
}
(4) Agent智能体协调(多模型任务分配)
@Service
public class AgentService {
private final RAGChain ragChain;
private final RestTemplate restTemplate;
public AgentService(RAGChain ragChain, RestTemplate restTemplate) {
this.ragChain = ragChain;
this.restTemplate = restTemplate;
}
// Agent处理用户问题
public String handleQuestion(String query) {
// 1. 判断问题类型
if (isSystemQuery(query)) {
// 调用Spring Boot系统API
return restTemplate.getForObject("/api/system/data", String.class);
} else {
// 调用RAG模型生成答案
return ragChain.query(query).getContent();
}
}
private boolean isSystemQuery(String query) {
return query.contains("订单状态") || query.contains("实时数据");
}
}
(5) Spring Boot Controller
@RestController
@RequestMapping("/api")
public class AskController {
private final AgentService agentService;
public AskController(AgentService agentService) {
this.agentService = agentService;
}
@PostMapping("/ask")
public ResponseEntity<String> ask(@RequestBody QuestionRequest request) {
String answer = agentService.handleQuestion(request.getQuery());
return ResponseEntity.ok(answer);
}
// 用户反馈接口
@PostMapping("/feedback")
public ResponseEntity<Void> submitFeedback(@RequestBody Feedback feedback) {
feedbackService.save(feedback);
return ResponseEntity.ok().build();
}
}
(6) 自动反馈与模型更新(定时任务)
@Component
public class AutoUpdater {
@Scheduled(fixedRate = 86400000) // 每天执行一次
public void updateModels() {
List<Feedback> negativeFeedbacks = feedbackRepository.findByRatingLessThan(3);
if (!negativeFeedbacks.isEmpty()) {
// 1. 收集反馈数据
List<String> newQueries = negativeFeedbacks.stream()
.map(Feedback::getQuery)
.collect(Collectors.toList());
// 2. 重新训练RAG模型(示例:调用脚本)
Process process = new ProcessBuilder("python", "retrain_rag.py", "--queries", String.join(",", newQueries))
.start();
// 3. 更新知识库索引
documentService.reindex();
}
}
}
(7) Vue前端交互示例
<template>
<div>
<input v-model="query" placeholder="输入问题..." />
<button @click="askQuestion">提问</button>
<div v-for="answer in answers">
{{ answer.text }}
<button @click="submitFeedback(answer)">不满意</button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
query: "",
answers: []
};
},
methods: {
async askQuestion() {
const res = await fetch("/api/ask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query: this.query })
});
this.answers.push(await res.json());
},
submitFeedback(answer) {
fetch("/api/feedback", {
method: "POST",
body: JSON.stringify({
query: answer.query,
rating: 1 // 用户评分
})
});
}
}
};
</script>
3. 关键代码注释说明
(1) 多模型选择与RAG链
// 支持多模型动态选择
class MultiModelSelector implements LLM {
private final List<LLM> models;
public MultiModelSelector(List<LLM> models) {
this.models = models;
}
public CompletionResponse generate(String prompt) {
// 根据策略选择模型(如按权重或上下文)
LLM selectedModel = models.get(0); // 简单示例
return selectedModel.generate(prompt);
}
}
(2) Agent任务分解逻辑
// 判断是否调用系统API
private boolean isSystemQuery(String query) {
return query.contains("订单状态") || query.contains("实时数据");
}
(3) 自动重训练流程
// 定时任务触发模型更新
@Scheduled(fixedRate = 86400000)
public void updateModels() {
// 收集低评分反馈并重新训练
}
4. 最终代码总结表
模块 | 代码文件 | 核心功能 |
---|---|---|
RAG配置 | RAGConfig.java | 集成Elasticsearch和多模型生成器 |
Agent协调 | AgentService.java | 任务分解与多模型调用 |
反馈闭环 | AutoUpdater.java | 定时重训练和知识库更新 |
Spring Boot API | AskController.java | 提供问答接口和反馈收集 |
前端交互 | Ask.vue | 用户输入与实时反馈 |
数据库模型 | Feedback.java | 存储用户反馈和评分 |
5. 实现步骤总结
- 环境搭建:配置Spring Boot + Spring AI,集成Elasticsearch和MySQL。
- 知识库构建:将内部文档索引到Elasticsearch。
- 模型集成:通过LangChain调用Qwen、DeepSeek等模型API。
- Agent逻辑:编写任务分解逻辑,协调系统API与模型调用。
- 闭环反馈:收集用户反馈,触发模型重训练和知识库更新。
- 部署与监控:通过Prometheus/Grafana监控系统性能。
通过以上方案,可构建一个 高效、可扩展、自学习 的知识问答系统,支持多模型协同和实时反馈优化。