自学内容网 自学内容网

零基础学习Spring AI Java AI使用向量数据库Redis检索增强生成 RAG

零基础学习Spring AI Java AI使用向量数据库Redis检索增强生成 RAG

要使用向量数据库的原因:数据通常是非结构化的,这就意味着它没有由定义良好的架构去描述。非结构化数据一般包括文本段落,图像,视频或音频。存储和查询非结构化数据的一种方法是使用向量嵌入。

什么是向量? 在机器学习和人工智能AI中,向量是表示数据的数字序列。它们是模型的输入和输出,以数字形式封装基础信息。矢量将非结构化数据(如文本,图像,视频或音频)转换为机器学习模型可以处理的格式。

增强传统搜索查询。传统的关键字或词汇搜索查询依赖于单词或短语的精确匹配,这可能会受到限制。相比之下,向量搜索或语义搜索利用了向量嵌入中捕获的丰富信息。通过将数据映射到向量空间中,相似的项目根据其含义彼此靠近放置。这种方法允许更准确和有意义的搜索结果,因为它考虑了查询的上下文和语义内容,而不仅仅是使用的确切的单词。

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG

零基础学习Spring AI Java AI SpringBoot AI调用大模型OpenAi Ollama集成大模型

本地部署大模型,不需要GPU就能玩本地模型-亲测成功

### 向量检索

向量检索(Vector Search)的核心原理是通过将文本或数据表示为高维向量,并在查询时根据向量的相似度进行搜索。

  • 检索的核心是将文本或数据转换成向量,在高维向量空间中查找与查询最相似的向量。

  • 在存储数据时将指定的字段通过嵌入模型生成了向量。

  • 在检索时,查询文本被向量化,然后与 Redis 中存储的向量进行相似度比较,找到相似度最高的向量(即相关的文档)。

Redis向量数据库

Redis 是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存、消息代理和流式处理引擎。Redis 提供数据结构,例如字符串、哈希、列表、集合、带范围查询的有序集合、位图、超对数日志、地理空间索引和流。

Redis 搜索和查询 扩展了 Redis OSS 的核心功能,并允许您将 Redis 用作向量数据库

  • 在哈希或 JSON 文档中存储向量和关联的元数据

  • 检索向量

  • 执行向量搜索

解读具体向量化过程

    1. 向量化数据

当你将 JSON 中的字段存入 Redis 时,向量化工具(例如 vectorStore)会将指定的字段转换为高维向量。每个字段的内容会通过某种嵌入模型(如 Word2Vec、BERT、OpenAI Embeddings 等)转换成向量表示。每个向量表示的是该字段内容的语义特征。

    1. 搜索时的向量生成

当执行 SearchRequest.query(message) 时,系统会将输入的 message 转换为一个查询向量。这一步是通过同样的嵌入模型,将查询文本转换为与存储在 Redis 中相同维度的向量。

    1. 相似度匹配
      vectorStore.similaritySearch(request) 函数使用了一个向量相似度计算方法来查找最相似的向量。这通常是通过 余弦相似度 或 欧几里得距离 来度量查询向量和存储向量之间的距离。然后返回与查询最相似的前 K 个文档,即 withTopK(topK) 所指定的 K 个最相关的结果。
    1. 返回匹配的文档
      匹配的结果是根据相似度得分排序的 List。这些文档是你最初存储在 Redis 中的记录,包含了 JSON 中指定的字段。

环境安装

需要安装Redis Stack

docker运行Redis Stack

官方地址:https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/docker/

  • redis/redis-stack包含 Redis Stack 服务器和 Redis Insight。此容器最适合本地开发,因为您可以使用嵌入式 Redis Insight 来可视化数据。

  • redis/redis-stack-server仅提供 Redis Stack 服务器。此容器最适合生产部署。

docker启动redis-stack

docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

浏览器访问redis可视化界面:http://127.0.0.1:8001
在这里插入图片描述

创建项目

在这里插入图片描述

在这里插入图片描述
maven的pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springai</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springai</name>
    <description>springai</description>

    <properties>
        <java.version>23</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

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


<!--        <dependency>-->
<!--            <groupId>org.springframework.ai</groupId>-->
<!--            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>-->
<!--        </dependency>-->

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>

</project>


配置Redis连接信息
spring.application.name=springai

spring.ai.vectorstore.redis.initialize-schema=true
spring.ai.vectorstore.redis.uri=redis://192.168.18.97:6379
spring.ai.vectorstore.redis.index=default-index
spring.ai.vectorstore.redis.prefix=default:

spring.ai.openai.api-key=34223242432424324


spring.ai.vectorstore.pgvector.index-type=HNSW
spring.ai.vectorstore.pgvector.distance-type=COSINE_DISTANCE
spring.ai.vectorstore.pgvector.dimensions=1536

spring.ai.ollama.base-url=http://192.168.18.59:11434
spring.ai.ollama.init.pull-model-strategy=never
spring.ai.ollama.init.timeout=60s
spring.ai.ollama.init.max-retries=1

spring.ai.ollama.chat.options.model=llama3.1:latest
spring.ai.ollama.chat.options.temperature=0.7

spring.ai.ollama.embedding.enabled=true
spring.ai.ollama.embedding.options.model=llama3.1-instruct:latest

代码使用如下

package com.example.springai.controller;

import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
class AIController {
    @Autowired
    VectorStore vectorStore;

    @GetMapping("/ai")
    void ai() {
        List<Document> documents = List.of(
                new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
                new Document("The World is Big and Salvation Lurks Around the Corner"),
                new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

// Add the documents to Redis
        vectorStore.add(documents);

// Retrieve documents similar to a query
        List<Document> results = this.vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));
    }
}

运行项目

访问接口:http://localhost:8080/ai

查看保存到Redis里的数据

参考链接:
http://www.liuhaihua.cn/archives/711448.html
https://mp.weixin.qq.com/s?__biz=MzAxMjY5NDU2Ng==&mid=2651869668&idx=1&sn=894bd454f055fa4a80d6cad8cfdf51ed&chksm=81e7bab8410a46d987098c55234834796d0ef8ffd1b3495029b33ac45807fa00364d39aeff93&scene=27
https://blog.csdn.net/u011046509/article/details/138292597
https://blog.csdn.net/rubys007/article/details/140561477


原文地址:https://blog.csdn.net/yinjl123456/article/details/143750498

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!