【AI】【Java后端】RAG 实战示例:SpringBoot + 向量检索 + LLM 问答系统

下面写一个 RAG 高级功能实战示例 ,用 SpringBoot + 向量检索 + LLM(大语言模型) 搭建一个问答系统。下面我会给出完整架构、核心代码示例,以及如何运行。


RAG 实战示例:SpringBoot + 向量检索 + LLM 问答系统

一、系统架构概览

复制代码
用户请求 --> SpringBoot API --> 检索服务(向量数据库) --> LLM生成答案 --> 返回用户

组件说明

  1. SpringBoot

    • 提供 REST API 接口,接收用户问题。
  2. 向量检索服务

    • 使用 Milvus / Weaviate / FAISS 保存文档向量,实现高效语义检索。
  3. 大语言模型(LLM)

    • GPT-4、LLaMA 或开源模型,将检索结果与用户问题组合生成答案。

二、准备工作

  1. 知识库准备

    • 文档分段(每段 100-300 字)

    • 生成向量(Embedding)并存入向量数据库

  2. 依赖配置(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 "生成答案失败";
        }
    }
}

四、运行与测试

  1. 启动 SpringBoot 项目

  2. POST 请求测试接口:

    curl -X POST http://localhost:8080/api/qa
    -H "Content-Type: application/json"
    -d '{"question": "RAG 高级功能有哪些?"}'

  3. 返回示例:

    请基于以下文档回答问题:
    ...
    回答:RAG 高级功能包括多轮检索、动态更新知识库、上下文权重控制、多模态支持、可控生成、事实验证等。


五、进一步优化建议

  1. 缓存热点问题答案:提升 QPS,减少重复检索与生成。

  2. 多模态支持:结合 PDF、图片、表格向量化,实现更复杂问答。

  3. 链式推理:对复杂问题,进行多轮检索和生成。

  4. 生成结果评价:使用模型或规则对生成答案进行可信度评分。


这样就完成了一个 RAG 高级功能实战问答系统 的完整示例。

相关推荐
盖世英雄酱5813611 小时前
java深度调试技术【第六七八章:宽字节与多字节】
java·后端
元拓数智11 小时前
IntaLink:破解数仓建设痛点,重塑高效建设新范式
大数据·数据仓库·人工智能·数据关系·intalink
区块链小八歌12 小时前
从电商收入到链上资产:Liquid Royalty在 Berachain 重塑 RWA 想象力
大数据·人工智能·区块链
沃达德软件12 小时前
大数据反诈平台功能解析
大数据·人工智能
OAoffice12 小时前
智能学习培训考试平台如何驱动未来组织:重塑人才发展格局
人工智能·学习·企业智能学习考试平台·学练考一体化平台
岁月宁静12 小时前
LangChain + LangGraph 实战:构建生产级多模态 WorkflowAgent 的完整指南
人工智能·python·agent
爱丽_12 小时前
深入理解 Java Socket 编程与线程池:从阻塞 I/O 到高并发处理
java·开发语言
Java中文社群12 小时前
重磅!N8N新版2.0发布!不再支持MySQL?
人工智能
济南壹软网络科技有限公司12 小时前
云脉IM的高性能消息路由与离线推送机制摘要:消息的“零丢失、低延迟”之道
java·即时通讯源码·开源im·企业im
Seven9712 小时前
剑指offer-46、孩⼦们的游戏(圆圈中最后剩下的数)
java