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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 uniapp 中实现图形验证码

全篇大概2000 字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间10分钟。 什么是图形验证码&#xff1f; 图形验证码&#xff08;也称为图片验证码或验证码图像&#xff09;通常用于防止机器人自动提交表单&#xff0c;确保用户是人工操作。 一、需求 我们希望在一个…

mysql error:1449权限问题 及 用户授权

一、权限问题 Got error: 1449: The user specified as a definer (skip-grants userskip-grants host) does not exist when using LOCK TABLES 在迁移数据库时&#xff0c;定义的definer&#xff0c;在两个数据库之间不同步时&#xff0c;要将不存在的definer改成数据库中已…

uniapp+vue加油服务系统 微信小程序

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 基于微信小程序的加油服务系统设计为微信小程序和后台管理两个服务端&#xff0c;并对此设计相应的功能模块如下&#x…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC&#xff08;Microsoft Founda…

如何解决传统能源企业后备人才不足、人才规划缺失问题

如何解决传统能源企业后备人才不足、人才规划缺失问题 很多传统能源企业都面临着老员工逐渐退休&#xff0c;新员工还没有培养起来的问题&#xff0c;缺乏提前对人力资源规划的意识&#xff0c;导致当企业要开展新业务时或者老员工离职的时候&#xff0c;缺乏合适的人选。特别…

服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角

摘要&#xff1a;本文以服装品牌零售业态融合为背景&#xff0c;探讨信息流优化和资金流创新的重要作用&#xff0c;并结合开源 AI 智能名片 S2B2C 商城小程序&#xff0c;分析其如何进一步推动服装品牌在零售领域的发展&#xff0c;提高运营效率和用户体验&#xff0c;实现商业…

C#编程:VSTO在Excel工作表中输出List数据

标题 C#编程&#xff1a;VSTO在Excel工作表中输出List数据 正文 一、问题&#xff1a; 我想把C#中的List<T>输出到Excel工作表中 二、思路方法&#xff1a; &#xff08;1&#xff09;用程序创建一个List<T> &#xff08;2&#xff09;输出到当前工作表 三、代码&a…

【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)

目录 1、题目链接 相似题目&#xff1a; 2、题目 3、解法 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 106.从中序与后序遍历序列构造二叉树&#xff08;LeetCode&#xff09; 相似题目&#xff1a; 105.从前序与中序遍历序列构造二叉树 889.根…

【Postman深入测试接口的详细指南】保姆级

Postman深入测试接口的详细操作步骤 一、创建测试集合二、使用环境变量三、编写请求四、编写测试脚本五、数据驱动测试六、模拟请求&#xff08;Mocking&#xff09;1. 创建Mock Server2. 定义响应3. 使用Mock Server进行请求 七、API监控1. 创建监控2. 运行监控 一、创建测试集…

Memento 备忘录模式

备忘录模式 意图结构适用性实例Java Web开发中的简单示例Originator 类Memento 类Caretaker 类 文本编辑器示例1. Originator (发起人) - TextEditor2. Memento (备忘录) - TextMemento3. Caretaker (负责人) - History4. 使用示例输出 备忘录模式&#xff08;Memento Pattern&…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…

为什么越来越多人开始用云电脑?网友道出了真相

近期&#xff0c;3A游戏大作《黑神话&#xff1a;悟空》的横空出世&#xff0c;成功激起大多数人对国产游戏的兴趣。然而&#xff0c;没有一台高配置的电脑&#xff0c;就无法在《黑神话&#xff1a;悟空》中获得震撼的游戏体验。想要配齐处理器、显卡、内存等硬件&#xff0c;…

https服务器访问http资源报Mixed Content混合内容错误

1 报错内容 Mixed Content: The page at ‘https://xxx’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://xxx’. This request has been blocked; the content must be served over HTTPS. 2 报错原因 页面通过 HTTPS 加载&#xff…

vue3项目中实现el-table分批渲染表格

开篇 因最近工作中遇到了无分页情景下页面因大数据量卡顿的问题&#xff0c;在分别考虑并尝试了懒加载、虚拟滚动、分批渲染等各个方法后&#xff0c;最后决定使用分批渲染来解决该问题。 代码实现 表格代码 <el-table :data"currTableData"borderstyle"wi…

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…

基于vue框架的的楼盘销售管理系统6n60a(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 用户,房源类型,员工,房源信息,购房预订,购房合同 开题报告内容 基于Vue框架的楼盘销售管理系统开题报告 一、研究背景 随着房地产市场的蓬勃发展&#xff0c;楼盘销售行业的竞争日益激烈。传统的销售管理方式依赖于人工记录和纸质文档&#xff0c;效率低下…

DevOps开发运维简述

DevOps平台是一套集成的解决方案&#xff0c;旨在协调软件开发&#xff08;Development&#xff09;和信息技术运维&#xff08;Operations&#xff09;。它促进跨功能团队合作&#xff0c;实现自动化流程&#xff0c;确保持续集成与持续交付&#xff08;CI/CD&#xff09;。 一…

如何记住美好的时刻,使用标准 SAP NetWeaver 日志的可能性

在本文中&#xff0c;我们将介绍一些常见的技巧&#xff0c;以及是否有针对它们的标准文档&#xff08;请参阅 Auding and Logging 寻求帮助&#xff09;。在本文中&#xff0c;我们将主要考虑标准工具。所有代码清单都可以在 ZABAPFILEOS_07 年的 github 上找到。 SAP NetWea…

ONLYOFFICE 8.2深度体验:高效协作与卓越性能的完美融合

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ONLYOFFICE 8.2 &#x1f50d;引言&#x1f4d2;1. ONLYOFFICE 产品简介&#x1f4da;2. 功能与特点&#x1f341;协作编辑 PDF&#x1f342;…

[mysql]修改表和课后练习

目录 DDL数据定义语言 添加一个字段 添加一个字段到最后一个 添加到表中的第一个一个字段 选择其中一个位置: 修改一个字段:数据类型,长度,默认值(略) 重命名一个字段 删除一个字段 重命名表 删除表 清空表 DCL中事务相关内容 DCL中COMMIT和ROLLBACK的讲解 对比TR…