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

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

时间:2024-11-05 20:46:06浏览次数:3  
标签:RAG Java AI spring springframework ai org 向量

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

向量数据库是一种特殊类型的数据库,在人工智能应用中发挥着至关重要的作用。

在向量数据库中,查询与传统的关系数据库不同。它们不是进行精确匹配,而是执行相似性搜索。当给定一个向量作为查询时,向量数据库会返回与查询向量"相似"的向量。

向量数据库用于将您的数据与 AI 模型集成。使用它们的第一步是将您的数据加载到向量数据库中。然后,当要将用户查询发送到 AI 模型时,首先检索一组类似的文档。然后,这些文档作为用户问题的上下文,并与用户的查询一起发送到 AI 模型。这种技术称为检索增强生成 (RAG)。

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

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

Embedding模型介绍

Embedding模型是将文本数据(如词汇、短语或句子)转换为数值向量的工具,这些向量捕捉了文本的语义信息,可用于各种自然语言处理
(NLP)任务。

#### 工作原理

Embedding模型将文本映射到高维空间中的点,使语义相似的文本在这个空间中距离较近。例如,"猫"和"狗"的向量可能会比"猫"和"汽车"的向量更接近。

#### 优点

  • 可以创建自己的或公司的私有知识库

  • 高效的相似性搜索:专为近似最近邻搜索(ANN)优化,能够在海量数据中快速找到相似项,适用于推荐系统、图像和文本搜索等应用。

  • 支持非结构化数据:可以存储 AI 模型生成的图像、文本等数据的向量表示,实现语义搜索和推荐等功能。

  • 出色的扩展性:支持水平扩展,能够处理数十亿条向量数据,适合高并发、大规模数据的业务场景。

  • 与机器学习框架的兼容性:与 TensorFlow、PyTorch 等框架兼容,加速 AI 应用的开发与部署。

Java AI支持的向量数据库

环境准备

  • jdk17+ 这里自行安装,我安装的jdk21

  • idea

postgres安装和表创建

这里使用docker安装

docker run -it --rm --name postgres -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres  pgvector/pgvector:pg16

使用Navicat连接postgres
如果连接报错时:column “datlastsysoid“ does not exist
Line1:SELECT DISTINCT datalastsysoid FROM pg_database

解决请看: https://blog.csdn.net/qq_51081700/article/details/139336320

连接上后执行sql

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE IF NOT EXISTS vector_store (
    id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
    content text,
    metadata json,
    embedding vector(4096)
  );

CREATE INDEX ON vector_store USING HNSW (embedding vector_cosine_ops);

下面是查询语句

select * from vector_store

创建项目

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-pgvector-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>

配置pgvector连接信息

spring.application.name=springai

spring.ai.openai.api-key=3422324******24324324

spring.datasource.url=jdbc:postgresql://192.168.1.97:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres

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.1.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;

    private final EmbeddingModel embeddingModel;

    @Autowired
    public AIController(EmbeddingModel embeddingModel) {
        this.embeddingModel = embeddingModel;
    }

    @GetMapping("/ai")
    public Map ai() {
        EmbeddingResponse embeddingResponse = this.embeddingModel.embedForResponse(List.of("春天的诗"));

        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 PGVector 把文本写入到向量数据库
        vectorStore.add(documents);

        // Retrieve documents similar to a query 从向量数据库中查询
        List<Document> results = this.vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(8));
        results.forEach(System.out::println);
        return Map.of("embedding", embeddingResponse);
    }

}

运行项目
访问接口:http://localhost:8080/ai

查询postgres是否入库
在这里插入图片描述

根据关键信息查询出来数据打印到控制台
在这里插入图片描述

后续可以结合Embedding模型把私有知识保存到向量数据库,建立私有知识库。如公司的公告文件,文档,手册,图片,视频等,这些比较隐私性的东西,不方便放公网大模型,所以建立私有知识库,私有知识库查询出来脱敏后结合大模型输出结构化消息。

标签:RAG,Java,AI,spring,springframework,ai,org,向量
From: https://blog.csdn.net/yinjl123456/article/details/143526832

相关文章

  • 使用Portainer管理docker容器
    使用Portainer管理docker容器内容这段代码用于启动Portainer,一个用于Docker的图形化管理工具。以下是每个参数的具体解释:dockerrun-d-p9000:9000-p8000:8000\--nameportainer\--restart=always\-v/var/run/docker.sock:/var/run/docker.sock\-vpor......
  • javascript跨域问题排查
    什么是跨域问题跨域是指浏览器从一个域名的网页去请求另一个域名下的资源。出于安全考虑,浏览器会限制这种跨域请求。例如,网页http://example1.com中的JavaScript代码尝试去获取http://example2.com的数据,这就会触发跨域问题。同源策略规定,只有当协议(如http、https)、域名(如ex......
  • Javascript 代码规范
    JavaScript代码规范是编程时遵循的一套规则和最佳实践,以确保代码的可读性、可维护性和一致性。以下是一些关键的JavaScript常见代码规范:1.使用严格模式在所有脚本文件或函数开头添加‘usestrict’;声明,以启用严格模式(strictmode),这有助于捕获潜在的错误并避免不明......
  • Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问
    文章目录前言1.本地安装Docker2.本地部署PortainerCE3.公网远程访问本地Portainer-CE3.1内网穿透工具安装3.2创建远程连接公网地址4.固定PortainerCE公网地址前言本篇文章介绍如何在Ubuntu中使用docker本地部署PortainerCE可视化管理工具,并......
  • Java内存区域详解(重点)
    运行时数据区域Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本略有不同,我们这里以JDK1.7和JDK1.8这两个版本为例介绍。JDK1.7:JDK1.8: 线程私有的:程序计数器虚拟机栈本地方法栈线程共享的:堆方法区......
  • java计算机毕业设计基于springboot的小区物业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加速,小区规模不断扩大,小区物业管理面临着诸多挑战。传统的物业管理方式依赖人工操作,效率低下,容易出现信息管理混乱、服务响应不......
  • java计算机毕业设计在线考试(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的迅猛发展,互联网在教育领域的渗透日益加深。在线教育成为一种广泛应用的教育模式,与之相伴的在线考试也逐渐兴起。传统考试存在诸多......
  • 基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
    作者:肯梦本文将演示如何使用事件总线(EventBridge),向量检索服务(DashVector),函数计算(FunctionCompute)结合灵积模型服务[1]上的EmbeddingAPI[2],来从0到1构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于OSS文本文档动态插入数据,进行实时的文本......
  • Rockchip SoC 赋能 AI 与视觉创新:推动智能设备的未来发展
    随着人工智能(AI)和计算机视觉技术不断推动各行各业的创新,Rockchip已成为提供强大系统级芯片(SoC)解决方案的领先厂商。该公司已开发出多款集成AI功能并支持先进多媒体与视觉技术的SoC,非常适合用于AI驱动的边缘计算、安全监控、机器人技术等应用领域。armsomboard本文将探讨......
  • Hume.ai 升级:自研情感模型集成 Claude 和 Fal;数字嗅觉公司 Osmo 用 AI 实现气味「传送
       开发者朋友们大家好: 这里是**「RTE开发者日报」**,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......