下面写一个 RAG 高级功能实战示例 ,用 SpringBoot + 向量检索 + LLM(大语言模型) 搭建一个问答系统。下面我会给出完整架构、核心代码示例,以及如何运行。
RAG 实战示例:SpringBoot + 向量检索 + LLM 问答系统
一、系统架构概览
用户请求 --> SpringBoot API --> 检索服务(向量数据库) --> LLM生成答案 --> 返回用户
组件说明:
-
SpringBoot
- 提供 REST API 接口,接收用户问题。
-
向量检索服务
- 使用 Milvus / Weaviate / FAISS 保存文档向量,实现高效语义检索。
-
大语言模型(LLM)
- GPT-4、LLaMA 或开源模型,将检索结果与用户问题组合生成答案。
二、准备工作
-
知识库准备
-
文档分段(每段 100-300 字)
-
生成向量(Embedding)并存入向量数据库
-
-
依赖配置(Maven)
XML
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- HTTP Client for LLM API -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2</version>
</dependency>
<!-- JSON parsing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- 向量数据库 SDK, 以 Milvus 为例 -->
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.2.11</version>
</dependency>
</dependencies>
三、核心代码示例
1. SpringBoot 控制器
java
@RestController
@RequestMapping("/api/qa")
public class QAController {
@Autowired
private RAGService ragService;
@PostMapping
public ResponseEntity<String> askQuestion(@RequestBody Map<String, String> payload) {
String question = payload.get("question");
if (question == null || question.isEmpty()) {
return ResponseEntity.badRequest().body("问题不能为空");
}
String answer = ragService.getAnswer(question);
return ResponseEntity.ok(answer);
}
}
2. RAG 服务层
java
@Service
public class RAGService {
@Autowired
private VectorSearchService vectorSearchService;
@Autowired
private LLMService llmService;
public String getAnswer(String question) {
// 1. 向量检索:找出最相关的文档片段
List<String> contextDocs = vectorSearchService.search(question, 5);
// 2. 生成最终答案
String prompt = buildPrompt(question, contextDocs);
return llmService.generateAnswer(prompt);
}
private String buildPrompt(String question, List<String> contextDocs) {
StringBuilder sb = new StringBuilder();
sb.append("请基于以下文档回答问题:\n");
for (String doc : contextDocs) {
sb.append(doc).append("\n");
}
sb.append("问题:").append(question).append("\n回答:");
return sb.toString();
}
}
3. 向量检索服务示例
java
@Service
public class VectorSearchService {
// Milvus 客户端初始化
private final MilvusClient client = new MilvusClient.Builder()
.withHost("localhost")
.withPort(19530)
.build();
public List<String> search(String query, int topK) {
// 1. 生成 query 向量(使用 OpenAI Embedding API 或其他模型)
float[] queryVector = EmbeddingUtil.getEmbedding(query);
// 2. 调用 Milvus 检索
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("docs")
.withTopK(topK)
.withVectors(Collections.singletonList(queryVector))
.build();
SearchResponse response = client.search(searchParam);
// 3. 返回检索到的文档内容
List<String> results = new ArrayList<>();
response.getResults().forEach(hit -> results.add(hit.getDocumentText()));
return results;
}
}
4. LLM 调用服务示例
java
@Service
public class LLMService {
private static final String OPENAI_API_KEY = "YOUR_API_KEY";
public String generateAnswer(String prompt) {
try {
HttpPost post = new HttpPost("https://api.openai.com/v1/completions");
post.setHeader("Authorization", "Bearer " + OPENAI_API_KEY);
post.setHeader("Content-Type", "application/json");
ObjectNode json = new ObjectMapper().createObjectNode();
json.put("model", "gpt-4");
json.put("prompt", prompt);
json.put("max_tokens", 500);
post.setEntity(new StringEntity(json.toString(), StandardCharsets.UTF_8));
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = client.execute(post);
String res = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))
.lines().collect(Collectors.joining("\n"));
JsonNode node = new ObjectMapper().readTree(res);
return node.get("choices").get(0).get("text").asText();
} catch (Exception e) {
e.printStackTrace();
return "生成答案失败";
}
}
}
四、运行与测试
-
启动 SpringBoot 项目
-
POST 请求测试接口:
curl -X POST http://localhost:8080/api/qa
-H "Content-Type: application/json"
-d '{"question": "RAG 高级功能有哪些?"}' -
返回示例:
请基于以下文档回答问题:
...
回答:RAG 高级功能包括多轮检索、动态更新知识库、上下文权重控制、多模态支持、可控生成、事实验证等。
五、进一步优化建议
-
缓存热点问题答案:提升 QPS,减少重复检索与生成。
-
多模态支持:结合 PDF、图片、表格向量化,实现更复杂问答。
-
链式推理:对复杂问题,进行多轮检索和生成。
-
生成结果评价:使用模型或规则对生成答案进行可信度评分。
这样就完成了一个 RAG 高级功能实战问答系统 的完整示例。