RAG基础架构-基础对话模型接入与使用

29 阅读7分钟

RAG基础架构-基础对话模型接入与使用

一、功能概述

基于Spring AI + Ollama实现本地大模型对话能力快速接入,零代码侵入适配Spring生态,开箱即用完成用户提问 → 模型生成 → 结果返回的基础对话链路,作为RAG架构的核心生成层,支撑纯对话、检索增强生成等业务场景。 ✅ 核心特性:

  1. 配置极简:Spring Boot配置文件一键声明模型参数,无需手动初始化客户端;
  2. 调用便捷:Spring AI原生注入模型对象,一行代码完成对话调用;
  3. 参数可控:支持温度、最大生成长度、超时时间等核心参数自定义;
  4. 生态兼容:完美融入现有RAG架构,可直接对接检索结果实现增强生成。

二、核心配置(application.yml)

✅ 关键规范:Ollama 所有配置必须归属 spring.ai.ollama 节点下,Spring AI 框架自动识别加载,配置位置不可变更

spring:
  ai:
    ollama:
      # 本地对话模型核心配置(支撑基础对话/增强生成)
      chat:
        model: deepseek-r1:1.5b  # 本地Ollama已拉取的模型名称(必填)
        options:
          temperature: 0.3       # 生成随机性:0-1,值越小回答越精准固定(推荐0.1-0.5)
          max_tokens: 2000        # 单次生成最大令牌数,限制回答长度
          connect_timeout: 60s    # 模型连接超时时间,适配大模型启动耗时
          read_timeout: 5m        # 模型生成读取超时时间,避免长文本生成中断

配置参数说明(核心必懂)

参数名取值范围作用说明
model自定义本地Ollama已部署的模型名(如deepseek-r1:1.5b、qwen2:7b、llama3:8b),需提前执行ollama pull 模型名拉取
temperature0.0 ~ 1.0核心参数:控制回答的随机性与创造性。
✅ 知识库场景推荐0.1-0.3:回答精准、贴合事实,无冗余发散;
❌ 创意生成场景可设0.7-0.9:回答更灵活、多样性更强
max_tokens正整数限制模型单次生成的最大内容长度,避免回答过长导致超时/内存占用过高,知识库场景推荐1000-3000
connect_timeout时间单位(s/m)客户端与本地Ollama服务的连接超时时间,建议≥30s(适配模型首次启动加载耗时)
read_timeout时间单位(s/m)模型生成内容的读取超时时间,长文本生成建议设置3-5m

三、最简使用方式(基础对话接口)

3.1 核心依赖(已集成无需额外引入)

若项目未全局引入Spring AI Ollama依赖,需补充以下Maven坐标(确保与Spring AI版本一致):

<!-- Spring AI 集成 Ollama 核心依赖 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

3.2 代码实现(一行调用,极简返回)

Spring AI 自动完成模型对象注入,无需手动创建客户端,直接调用方法即可返回对话结果,适配RESTful接口快速开发。

import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * Ollama 基础对话接口控制器
 * 实现:用户提问 → 本地模型生成 → 直接返回结果 核心链路
 */
@RestController
public class OllamaBasicChatController {

    // ✅ 自动注入Spring AI封装的Ollama对话模型对象(无需手动配置)
    @Resource
    private OllamaChatModel ollamaChatModel;

    /**
     * 基础对话接口(GET方式,极简调用)
     * @param msg 用户提问内容(必填)
     * @return 模型生成的回答文本
     */
    @GetMapping("/api/rag/chat/basic")
    public String basicChat(@RequestParam String msg) {
        // ✅ 核心调用:一行代码完成对话,直接返回生成内容
        return ollamaChatModel.call(msg);
    }
}

四、进阶使用方式(适配RAG增强生成,推荐)

基于基础对话能力,适配RAG架构核心诉求,将「用户提问 + 检索知识库结果」拼接为增强Prompt,实现检索增强生成,解决纯模型「知识过时、事实错误」问题,是生产环境的标准用法。

4.1 代码实现(RAG增强对话)

import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * RAG增强对话接口控制器
 * 核心:用户提问 + 知识库检索结果 → 模型增强生成 → 返回精准答案
 */
@RestController
public class OllamaRagChatController {

    @Resource
    private OllamaChatModel ollamaChatModel;
    // 注入知识库检索服务(已实现的混合检索/向量检索服务)
    @Resource
    private HybridSearchService hybridSearchService;

    /**
     * RAG增强对话接口(生产环境推荐)
     * @param question 用户提问内容
     * @return 基于知识库的精准回答
     */
    @GetMapping("/api/rag/chat/enhance")
    public String ragEnhanceChat(@RequestParam String question) {
        try {
            // 1. 知识库检索:获取与问题相关的文本片段(核心增强步骤)
            String indexName = "ai_vector_index"; // 你的ES向量索引名
            var docFragments = hybridSearchService.hybridSearch(indexName, question);
            // 拼接检索结果为上下文
            String context = docFragments.stream()
                    .map(frag -> frag.getText())
                    .reduce("", (a, b) -> a + "\n" + b);

            // 2. 构建增强Prompt(固定模板,保证生成效果)
            String prompt = """
                    请严格基于以下知识库上下文内容,回答用户提出的问题。
                    要求:回答精准、简洁,仅使用上下文信息,不编造内容;若上下文无相关信息,直接回复"未查询到相关内容"。
                    
                    【知识库上下文】
                    %s
                    
                    【用户问题】
                    %s
                    """.formatted(context, question);

            // 3. 调用模型生成增强回答并返回
            return ollamaChatModel.call(prompt);
        } catch (Exception e) {
            return "对话失败:" + e.getMessage();
        }
    }
}

五、接口调用示例

✅ 方式1:基础对话接口调用(GET请求)

# 请求地址
GET http://localhost:8080/api/rag/chat/basic?msg=介绍一下RAG架构的核心流程

# 返回结果(示例)
RAG架构的核心流程主要分为四大环节:1.数据接入与预处理,完成多格式文件解析、文本清洗和智能分片;2.文本向量化与存储,将文本转为向量并入库向量库;3.检索环节,通过关键词或语义检索召回相关内容;4.增强生成,结合检索结果与用户问题生成精准回答。整体链路实现了从知识沉淀到智能问答的闭环。

✅ 方式2:RAG增强对话接口调用(GET请求)

# 请求地址
GET http://localhost:8080/api/rag/chat/enhance?question=本项目中混合检索是如何实现的

# 返回结果(示例,基于知识库精准回答)
本项目的混合检索基于Elasticsearch实现,核心分为三步:1.执行BM25关键词检索,召回与问题匹配的Top20文本;2.执行kNN向量语义检索,基于用户问题向量召回Top20相似文本;3.采用RRF无参数融合算法,对两路结果重新排序,平衡关键词与语义权重,最终返回Top5精准结果,兼顾匹配精度与语义相关性。

六、核心注意事项

⚠️ 前置条件(必须完成)

  1. 本地已安装并启动 Ollama 服务(执行ollama serve命令);
  2. 已提前拉取配置文件中声明的模型(执行ollama pull deepseek-r1:1.5b,模型名需与配置完全一致);
  3. 确保Ollama服务端口未被占用(默认11434),Spring AI自动对接该端口,无需额外配置。

✅ 开发&部署最佳实践

  1. 模型选型建议:知识库场景优先选择轻量、精准、推理快的模型,推荐:
    • 小体量(测试/开发):deepseek-r1:1.5b、qwen2:0.5b;
    • 中体量(生产):qwen2:7b、llama3:8b、deepseek-coder:6.7b;
  2. 参数调优原则
    • 追求回答精准度:temperature=0.1-0.3,降低随机性;
    • 知识库内容较长:适当调大max_tokens=3000-5000,避免回答截断;
  3. 异常处理:生产环境建议为接口增加全局异常捕获,避免模型超时/服务不可用时返回兜底提示;
  4. 性能优化:本地部署模型时,可通过Ollama命令调整模型显存占用(如ollama run deepseek-r1:1.5b --numa off),提升推理速度。

✅ 扩展能力说明

本基础对话模型可无缝扩展以下高级能力,适配复杂业务场景:

  1. 流式返回:替换为OllamaStreamingChatModel,实现回答内容逐字流式输出,提升前端交互体验;
  2. 多轮对话:结合ChatMemory实现上下文记忆,支撑连续提问的多轮对话能力;
  3. 自定义Prompt模板:封装Prompt工程模板类,统一管理不同场景的提问模板,提升生成效果一致性;
  4. 多模型切换:修改配置文件model字段,即可快速切换本地部署的任意Ollama模型,无需改动代码。