最近在做 Java 后端的企业知识库问答项目,核心需求是让大模型基于内部文档精准回答,而不是随意生成内容。直接把全文塞 prompt 里不仅容易超 token 限制,还会让模型逻辑混乱,甚至频繁出现与业务不符的 “幻觉” 回答。真正可行且稳定的方案还是 RAG 检索增强生成,用向量数据库做高效语义检索,再把相关片段交给大模型生成答案。整个过程完全基于 Java 实现,不用切换技术栈,对后端同学非常友好,也更容易集成到现有 Spring Boot 项目中。

整个流程其实很清晰:先把业务文档拆分成小段文本,通过嵌入接口转为高维向量存入 Milvus,用户提问时同样将问题转为向量做相似度检索,拿到最相关的内容后拼装提示词,最后调用大模型给出可靠回答。我在实际开发里踩过不少坑,比如向量维度不匹配、检索结果杂乱、文本预处理不干净、topK 参数设置不合理等,这里把完整可用代码和避坑点一起整理出来,方便大家直接复用。

依赖部分主要用到 Milvus Java SDK、文本嵌入相关依赖以及简单的文档处理工具,版本尽量保持稳定,避免和 Spring Boot 3.x 出现冲突。

xml

<!-- Milvus 向量数据库客户端 -->
<dependency>
    <groupId>io.milvus</groupId>
    <artifactId>milvus-sdk-java</artifactId>
    <version>2.4.4</version>
</dependency>
<!-- 文本嵌入相关依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dashscope-sdk-java</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- 文本处理工具 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

连接 Milvus 并创建集合时一定要注意向量维度,嵌入模型输出多少维,集合就必须建多少维,否则数据根本插不进去。我一开始没注意这点,直接使用默认参数创建集合,结果插入时报错,调试了很久才定位问题。文本插入前最好做简单清洗,去掉多余换行、空格、特殊符号和乱码字符,否则会严重影响检索精度,导致查询结果与问题不相关。

下面是向量入库、检索以及拼接 prompt 的核心代码,结构尽量精简,方便直接集成到项目里。

java

运行

// 连接 Milvus
ConnectParam connectParam = ConnectParam.newBuilder()
        .withHost("127.0.0.1")
        .withPort(19530)
        .build();
MilvusClient client = new MilvusServiceClient(connectParam);

// 构建检索参数
SearchParam searchParam = SearchParam.newBuilder()
        .withCollectionName("doc_collection")
        .withVectorFieldName("vector")
        .withVectors(questionVector)
        .withTopK(3)
        .withMetricType(SearchParam.MetricType.COSINE)
        .build();

// 执行检索并解析结果
SearchResponse response = client.search(searchParam);
List<String> contextList = new ArrayList<>();
response.getResults().forEach(res -> {
    contextList.add(res.getEntity().getField("text").toString());
});

// 构造提示词
String prompt = String.format("请基于以下参考内容回答问题,不编造信息:%s,用户问题:%s",
        String.join(";", contextList), question);

拿到检索结果后,把相关文本拼进提示词,再设置较低的温度系数,让模型更专注于给定内容,减少幻觉。经过这样处理后,大模型基本不会编造信息,回答稳定性明显提升,响应速度也比全文塞 prompt 快很多。对于较长的业务文档,还可以进行分块处理,控制每段文本长度,避免单段信息过载,进一步提升检索准确率。

整体实现下来,RAG 在 Java 生态里落地并不复杂,关键在于向量处理、检索参数调优、文本分块规则和提示词工程。掌握这套思路后,企业知识库、智能客服、内部问答机器人、文档检索助手等场景都可以快速扩展,也能在此基础上接入多轮对话、历史记忆等更复杂的功能。

更多 Java AI 应用开发相关的实战内容可以参考文档。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐