Spring AI 基于Redis和Ollama实现RAG本地知识库

deepseek > AI (62) 2025-02-20 17:41:08

概述

本文讲解Java编程中如何通过Spring AI框架 集成 Redis Stack 向量数据库和Ollama模型服务提供者实现RAG本地外挂知识库。

前置条件

  • JDK 17
  • Spring Boot 3.x
  • Spring AI Ollama (<spring-ai.version>1.0.0-M6</spring-ai.version>)
  • Redis Stack 

Redis Stack 部署演示环境可参考:redis-stack 安装(Docker)

Spring Boot AI项目

本项目基于 Spring Boot 接入Ollama实现与Deepseek简单对话 项目修改。

maven引入必要的向量库依赖:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-redis-store-spring-boot-starter</artifactId>
</dependency>

application.yml配置参考:

spring:
  application:
    name: demo-boot-ollama
  ai:
    vectorstore:
      redis:
        initialize-schema: true
        prefix: custom-prefix
        index: custom-index
    ollama: # ai 提供者 ollama
      init:
        pull-model-strategy: never # 下载策略
        embedding:
          additional-models:
            - mxbai-embed-large #redis 向量库默认嵌入模型
            - nomic-embed-text
#            - chroma/all-minilm-l6-v2-f32
      base-url: http://192.168.31.162:11434
      chat:
        options:
          model: deepseek-r1:8b
  data:
    redis:
      host: 192.168.31.162

 

RAG演示controller

@RestController
public class RagController {

    @Resource
    RedisVectorStore vectorStore;

    @Resource
    OllamaChatModel chatModel;


    // 系统提示词模板
    private final static String SYSTEM_PROMPT = """
            你需要使用文档内容对用户提出的问题进行回复,同时你需要表现得天生就知道这些内容,
            不能在回复中体现出你是根据给出的文档内容进行回复的,这点非常重要。
            
            当用户提出的问题无法根据文档内容进行回复或者你也不清楚时,回复不知道即可。
            
            文档内容如下:
            {documents}
            
            """;

    @GetMapping("/ai/saveDocument")
    public Object saveTextDocument(@RequestParam String text){
        Document document = new Document(text);
        vectorStore.add(List.of(document));
        return "success";
    }

    @GetMapping("/ai/chatWithVectorStore")
    public Object chatWithVectorStore(@RequestParam String message){
        List<Message> messages = new ArrayList<>();
        //构建用户信息
        UserMessage userMessage = new UserMessage(message);
        messages.add(userMessage);
        //构建基于向量数据库结果的系统数据
        List<Document> documents = vectorStore.similaritySearch(message);
        if (documents != null &&!documents.isEmpty()){
            Message systemMessage = new SystemPromptTemplate(SYSTEM_PROMPT).createMessage(Map.of("documents", documents));
            messages.add(systemMessage);
        }
        // 将Message列表一并发送给大模型
        ChatResponse rsp = chatModel.call(new Prompt(messages));
        return rsp;
    }

}

 

第一次请求询问:XQLEE是什么

http://localhost:8080/ai/chatWithVectorStore?message=XQLEE是什么

响应内容:

{
  "result": {
    "output": {
      "messageType": "ASSISTANT",
      "metadata": {
        "messageType": "ASSISTANT"
      },
      "toolCalls": [],
      "media": [],
      "text": "<think>\n\n</think>\n\n截至2024年7月,XQLEE并非一个广为人知的常见术语或技术领域。它可能是某个特定行业、项目或新兴技术的代号或简称。如果你指的是某个特定的概念、产品或技术,请提供更多背景信息,以便更好地帮助你理解。\n\n如果你有其他问题或需要进一步的解释,请随时告诉我!"
    },
    "metadata": {
      "finishReason": "stop",
      "contentFilters": [],
      "empty": true
    }
  },
  "metadata": {
    "id": "",
    "model": "deepseek-r1:8b",
    "rateLimit": {
      "requestsRemaining": 0,
      "tokensRemaining": 0,
      "requestsReset": "PT0S",
      "requestsLimit": 0,
      "tokensReset": "PT0S",
      "tokensLimit": 0
    },
    "usage": {
      "promptTokens": 7,
      "completionTokens": 96,
      "totalTokens": 103,
      "generationTokens": 96
    },
    "promptMetadata": [],
    "empty": false
  },
  "results": [
    {
      "output": {
        "messageType": "ASSISTANT",
        "metadata": {
          "messageType": "ASSISTANT"
        },
        "toolCalls": [],
        "media": [],
        "text": "<think>\n\n</think>\n\n截至2024年7月,XQLEE并非一个广为人知的常见术语或技术领域。它可能是某个特定行业、项目或新兴技术的代号或简称。如果你指的是某个特定的概念、产品或技术,请提供更多背景信息,以便更好地帮助你理解。\n\n如果你有其他问题或需要进一步的解释,请随时告诉我!"
      },
      "metadata": {
        "finishReason": "stop",
        "contentFilters": [],
        "empty": true
      }
    }
  ]
}

第一次提问可以看到result结果中,它并没有明确回答

投喂向量数据库数据:XQLEE是一款视频剪切软件

http://localhost:8080/ai/saveDocument?text=XQLEE是一款视频剪切软件

响应内容:

success

 

第二次请求询问:XQLEE是什么

http://localhost:8080/ai/chatWithVectorStore?message=XQLEE是什么

响应内容:

{
  "result": {
    "metadata": {
      "finishReason": "stop",
      "contentFilters": [],
      "empty": true
    },
    "output": {
      "messageType": "ASSISTANT",
      "metadata": {
        "messageType": "ASSISTANT"
      },
      "toolCalls": [],
      "media": [],
      "text": "<think>\n嗯,用户问的是“XQLEE是什么”,我需要用文档内容来回答。首先看文档内容,里面明确写着“XQLEE是一款视频剪切软件”。所以,我应该直接告诉用户XQLEE是视频剪切软件。\n\n接下来,我要考虑用户可能的需求。他们可能想知道这个软件的功能或者是否适合某个特定的用途。但文档里没有提到更多细节,所以我只能基于提供的信息回答。\n\n另外,用户希望我的回复显得天生就知道这些内容,不要表现出在查找资料。因此,我需要直接明了地告诉用户,不带任何额外的猜测或不确定性。\n\n最后,检查一下是否有无法回答的情况,但这里问题很简单,可以直接解答。\n</think>\n\nXQLEE是一款视频剪切软件。"
    }
  },
  "metadata": {
    "id": "",
    "model": "deepseek-r1:8b",
    "rateLimit": {
      "tokensLimit": 0,
      "tokensRemaining": 0,
      "requestsLimit": 0,
      "tokensReset": "PT0S",
      "requestsReset": "PT0S",
      "requestsRemaining": 0
    },
    "usage": {
      "promptTokens": 167,
      "completionTokens": 188,
      "totalTokens": 355,
      "generationTokens": 188
    },
    "promptMetadata": [],
    "empty": false
  },
  "results": [
    {
      "metadata": {
        "finishReason": "stop",
        "contentFilters": [],
        "empty": true
      },
      "output": {
        "messageType": "ASSISTANT",
        "metadata": {
          "messageType": "ASSISTANT"
        },
        "toolCalls": [],
        "media": [],
        "text": "<think>\n嗯,用户问的是“XQLEE是什么”,我需要用文档内容来回答。首先看文档内容,里面明确写着“XQLEE是一款视频剪切软件”。所以,我应该直接告诉用户XQLEE是视频剪切软件。\n\n接下来,我要考虑用户可能的需求。他们可能想知道这个软件的功能或者是否适合某个特定的用途。但文档里没有提到更多细节,所以我只能基于提供的信息回答。\n\n另外,用户希望我的回复显得天生就知道这些内容,不要表现出在查找资料。因此,我需要直接明了地告诉用户,不带任何额外的猜测或不确定性。\n\n最后,检查一下是否有无法回答的情况,但这里问题很简单,可以直接解答。\n</think>\n\nXQLEE是一款视频剪切软件。"
      }
    }
  ]
}

第二次提问,已经根据外挂RAG知识向量库进行了准确回答。

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
概述本文讲解Java编程中如何通过Spring AI框架 集成 Redis Stack 向量数据库和Ollama模型服务提供者实现RAG本地外挂知识库。前置条件
Ollama 环境准备Ollama安装使用参考:Deepseek Windows安装和入门使用Spring Boot项目接入OllamaSpring Boot
基于上一个项目Spring Boot 接入Ollama实现与Deepseek简单对话修改,增加嵌入库配置,修改模型拉取策略为alwaysapplication.
Ollama 简介Ollama 是一个用于部署本地 AI 模型的工具,开发者可以在自己的机器上运行模型,并通过 API 接口调用。在本地搭建 Ollama 服务
问题ollama国内拉取模型慢,断点续传也蛮怎么办,当然是修改ollama镜像源 配置ollama模型国内镜像源
安装环境windows 11ollama工具下载ollama工具ollama官网 Download Ollama on Windows注:ollama同时支持L
在科技领域,新兴公司的涌现几乎每天都有,而每一家公司背后都有着独特的故事和潜力。最近,一家名为“深度求索”(DeepSeek)的中国公司引发了广泛关注。这家公司
继上一篇deepseek Windows安装和入门使用 本地部署deepseek只能在cmd窗口使用,体验感不好。这里使用一个可视化工具Cherry Studi
确认Ollama兼容您的GPUNvidiaOllama 支持计算能力 5.0 及以上的 Nvidia GPU。要检查您的显卡是否受支持,请查看您的计算兼容性:h
Ollama 模型动辄xxGB,默认位置可能不满足需求,特别是Windows,默认的C盘,所以一般都需要调整下Ollama 模型存放位置。ollama 默认的模
一 了解什么是 RAGRAG(Retrieval Augmented Generation)检索增强生成,是 2023 年最火热的 LLM 应用系统架构,它的作
概述Ollama官方最新版0.5.7,默认是不支持AMD 780m(代号:gfx1103)集成显卡的,已知方法都是基于一个开源项目ollama-for-amd来
目标使用Redis Stack中间件作为向量数据库(Vector Database)实现文档数据的存储和查询功能。先决条件已安装好的 redis stack ,
GPUNvidiaOllama 支持计算能力为 5.0 及以上的 Nvidia GPU。检查你的计算兼容性,以确认你的显卡是否受支持: https://deve
deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别?1.5B、7B、8B、14B、32B、70B是蒸馏后的小模型