PostgreSQL数据库与PgVector向量插件基础使用

简介: 本文详细介绍了在Ubuntu系统上部署PgVector向量数据库并与SpringBoot集成的方法。主要内容包括:1) Ubuntu环境配置,包括PostgreSQL安装、PgVector插件编译和数据库设置;2) 向量数据库基础操作,如创建表、插入向量数据和相似度查询;3) SpringBoot集成方案,提供JDBC连接配置、实体类定义和JPA查询实现;4) SpringAI框架下的高级应用,展示如何将PgVector作为向量存储与AI模型集成。文章还包含远程连接配置、性能优化建议和完整的测试案例,为开发

 1.Ubantu部署安装软件

1.1 软件安装

# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装必要依赖(编译工具、PostgreSQL依赖、libpq等)
sudo apt install -y build-essential git postgresql postgresql-server-dev-all libpq-dev

image.gif

  • build-essential:提供编译所需的 gcc、make 等工具;
  • postgresql:基础 PostgreSQL 数据库(PgVector 依赖 PostgreSQL 11+,Ubuntu 默认源的版本满足);
  • postgresql-server-dev-all:PostgreSQL 扩展开发所需的头文件;
  • libpq-dev:客户端连接 PostgreSQL 的依赖。

1.2 确认软件状态

# 查看服务状态
sudo systemctl status postgresql
# 若未启动,手动启动并设置开机自启
sudo systemctl start postgresql
sudo systemctl enable postgresql

image.gif

1.3 PgVector插件安装

# 克隆仓库(建议放到 /usr/local/src 目录)
sudo git clone https://github.com/pgvector/pgvector.git /usr/local/src/pgvector
cd /usr/local/src/pgvector

image.gif

# 编译(使用 PostgreSQL 的 pg_config 定位编译路径)
make
# 安装(需要 root 权限)
sudo make install

image.gif

1.4 创建用户与数据库

创建postgres系统用户:

sudo -u postgres psql

image.gif

创建数据库并启用pgvector插件:

-- 1. 创建测试数据库(可自定义名称,如 vector_db)
CREATE DATABASE vector_db;
-- 2. 连接到新建的数据库
\c vector_db;
-- 3. 创建 pgvector 扩展(核心步骤,启用向量功能)
CREATE EXTENSION vector;
-- 4. 验证扩展是否创建成功
\dx; -- 列出所有已安装的扩展,能看到 vector 即成功

image.gif

输出中会包含如下内容:

List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 vector  | 0.5.1   | public     | vector data type and indexes

image.gif

1.5 测试PgVector功能

-- 1. 创建表(包含 id 和 3 维向量字段)
CREATE TABLE embeddings (
    id SERIAL PRIMARY KEY,
    vec vector(3) -- 定义 3 维向量,维度可自定义(如 1536 对应 OpenAI 嵌入)
);
-- 2. 插入向量数据
INSERT INTO embeddings (vec) VALUES 
('[1,2,3]'), 
('[4,5,6]'), 
('[7,8,9]');
-- 3. 查询向量(计算与 [2,3,4] 的欧氏距离并排序)
SELECT id, vec, vec <-> '[2,3,4]' AS distance 
FROM embeddings 
ORDER BY distance;

image.gif

输出结果会按距离从小到大排序,示例:

id |   vec   |     distance      
----+---------+-------------------
  1 | [1,2,3] | 1.7320508075688772
  2 | [4,5,6] | 3.464101615137755
  3 | [7,8,9] | 8.660254037844387

image.gif

<-> 是 PgVector 内置的欧氏距离运算符,还支持 <#>(内积)、<=>(余弦距离)等。

1.6 配置远程连接与密码修改

默认 PostgreSQL 只允许本地连接,需修改 Ubuntu 上的配置

修改 pg_hba.conf(信任远程连接):

sudo vim /etc/postgresql/$(ls /etc/postgresql)/main/pg_hba.conf

image.gif

添加一行(允许任意 IP 访问,生产环境建议限定具体 IP):

host    all             all             0.0.0.0/0               md5

image.gif

修改 postgresql.conf(监听所有地址):

sudo vim /etc/postgresql/$(ls /etc/postgresql)/main/postgresql.conf

image.gif

listen_addresses = '*' # 默认为 localhost,改为 *

image.gif

设置 postgres 用户密码:

sudo -u postgres psql
# 在PostgreSQL终端执行
ALTER USER postgres WITH PASSWORD '你的新密码';
\q

image.gif

重启 PostgreSQL 生效:

sudo systemctl restart postgresql

image.gif

2.SpringBoot集成

2.1 连接

Maven依赖(向量数据库的两种整合方式):

<!-- 自动整合 PGVector 向量存储 -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.ai</groupId>-->
<!--            <artifactId>spring-ai-starter-vector-store-pgvector</artifactId>-->
<!--            <version>1.0.0-M7</version>-->
<!--        </dependency>-->
        <!-- 手动整合 PGVector 向量存储 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-pgvector-store</artifactId>
        </dependency>

image.gif

配置文件:

spring:
  # 数据库连接配置
  datasource:
    url: jdbc:postgresql://你的Ubuntu服务器IP:5432/vector_db # 替换为实际IP和数据库名
    username: postgres # 默认用户名
    password: 你的postgres密码 # 需设置postgres用户密码(后续讲)
    driver-class-name: org.postgresql.Driver

image.gif

2.2 基础操作案例

实体类:

package com.example.demo.entity;
import javax.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "embeddings") // 对应 PostgreSQL 中的 embeddings 表
public class Embedding {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 对应 SERIAL 主键
    private Long id;
    @Column(name = "vec") // 向量字段,PgVector 中存储为字符串格式(如 "[1,2,3]")
    private String vec; // 注意:PgVector 的 vector 类型在 Java 中用 String 接收/传递
}

image.gif

数据层接口:

package com.example.demo.repository;
import com.example.demo.entity.Embedding;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface EmbeddingRepository extends JpaRepository<Embedding, Long> {
    // 自定义查询:根据目标向量计算欧氏距离并排序(核心向量查询)
    @Query(value = "SELECT e FROM Embedding e ORDER BY e.vec <-> :targetVec")
    List<Embedding> findByVecOrderByDistance(@Param("targetVec") String targetVec);
    // 也可写原生SQL(更灵活)
    @Query(value = "SELECT * FROM embeddings ORDER BY vec <-> :targetVec LIMIT 10", nativeQuery = true)
    List<Embedding> findTop10ByVec(@Param("targetVec") String targetVec);
}

image.gif

测试:

package com.example.demo;
import com.example.demo.entity.Embedding;
import com.example.demo.repository.EmbeddingRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class EmbeddingTest {
    @Autowired
    private EmbeddingRepository embeddingRepository;
    // 测试插入向量数据
    @Test
    public void testInsert() {
        Embedding embedding = new Embedding();
        embedding.setVec("[1,2,3]"); // 设置 3 维向量
        embeddingRepository.save(embedding);
        Embedding embedding2 = new Embedding();
        embedding2.setVec("[4,5,6]");
        embeddingRepository.save(embedding2);
    }
    // 测试向量相似度查询
    @Test
    public void testQuery() {
        // 查询与 [2,3,4] 最相似的向量(按欧氏距离排序)
        List<Embedding> list = embeddingRepository.findByVecOrderByDistance("[2,3,4]");
        for (Embedding e : list) {
            System.out.println("ID: " + e.getId() + ", 向量: " + e.getVec());
        }
    }
}

image.gif

2.3 SpringAI集成PgVector做向量数据库

2.3.1 依赖与配置

ai:
    dashscope:
      api-key: 
      chat:
        opentions:
          model: qwen-max
    vectorstore:
      pgvector:
        index-type: HNSW
        dimensions: 1536 #向量维度
        distance-type: COSINE_DISTANCE
        max-document-batch-size: 10000 # Optional: Maximum number of documents per batch

image.gif

<!-- 自动整合 PGVector 向量存储 -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.ai</groupId>-->
<!--            <artifactId>spring-ai-starter-vector-store-pgvector</artifactId>-->
<!--            <version>1.0.0-M7</version>-->
<!--        </dependency>-->
        <!-- 手动整合 PGVector 向量存储 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-pgvector-store</artifactId>
        </dependency>

image.gif

2.3.2 基于PgVector做向量数据库

-- 创建带维度的表(1536 维,根据你的嵌入模型调整)
CREATE TABLE public.vector_store (
    id VARCHAR(255) PRIMARY KEY,
    content TEXT,
    metadata JSONB,
    embedding VECTOR(1536)  -- 维度必须和嵌入模型一致
);

image.gif

import jakarta.annotation.Resource;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgDistanceType.COSINE_DISTANCE;
import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIndexType.HNSW;
// 为方便开发调试和部署,临时注释,如果需要使用 PgVector 存储知识库,取消注释即可
@Configuration
public class PgVectorVectorStoreConfig {
    @Resource
    private LoveAppDocumentLoader loveAppDocumentLoader;
    @Bean
    public VectorStore pgVectorVectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel dashscopeEmbeddingModel) {
        VectorStore vectorStore = PgVectorStore.builder(jdbcTemplate, dashscopeEmbeddingModel)
                .dimensions(1536)                    // Optional: defaults to model dimensions or 1536
                .distanceType(COSINE_DISTANCE)       // Optional: defaults to COSINE_DISTANCE
                .indexType(HNSW)                     // Optional: defaults to HNSW
                .initializeSchema(true)              // Optional: defaults to false
                .schemaName("public")                // Optional: defaults to "public"
                .vectorTableName("vector_store")     // Optional: defaults to "vector_store"
                .maxDocumentBatchSize(10000)         // Optional: defaults to 10000
                .build();
        // 加载文档
        List<Document> documents = loveAppDocumentLoader.loadMarkdowns();
        vectorStore.add(documents);
        return vectorStore;
    }
}

image.gif

2.3.3 向量Embed测试

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import java.util.Map;
@SpringBootTest
class PgVectorVectorStoreConfigTest {
    @Resource
    private VectorStore pgVectorVectorStore;
    @Test
    void pgVectorVectorStore() {
        List<Document> documents = List.of(
                new Document("吕贵浩是程序员", Map.of("meta1", "meta1")),
                new Document("吕贵浩擅长Java"),
                new Document("吕贵浩擅长大模型开发", Map.of("meta2", "meta2")));
        // 添加文档
        pgVectorVectorStore.add(documents);
        // 相似度查询
        List<Document> results = pgVectorVectorStore.similaritySearch(SearchRequest.builder().query("吕贵浩是谁").topK(3).build());
        Assertions.assertNotNull(results);
    }
}

image.gif

数据库存储:

image.gif 编辑

2.3.4 Agent集成测试

@Resource
    private VectorStore pgVectorStore;
    public String doChatWithRag(String message, String chatId) {
        ChatResponse chatResponse=chatClient.prompt()
                .user(message)
                .advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId))
                .advisors(new MyLoggerAdvisor())
                //RAG
//                .advisors(new QuestionAnswerAdvisor(loveAppVectorStore))
                //云上RAG
//                .advisors(loveAppRagCloudAdvisor)
                //PgRAG
                .advisors(new QuestionAnswerAdvisor(pgVectorStore))
                .call()
                .chatResponse();
        String content=chatResponse.getResult().getOutput().getText();
        log.info("content: {}", content);
        return content;
    }
    @Test
    void doChatWithRag() {
        String chatId = UUID.randomUUID().toString();
        String message = "吕贵浩是谁?";
        String answer= loveApp.doChatWithRag(message, chatId);
        Assertions.assertNotNull(answer);
    }

image.gif

image.gif 编辑


相关文章
|
7天前
|
人工智能 自然语言处理 Java
大模型应用开发5-SpringAIalibaba实战
本文介绍了SpringAIAlibaba开源项目,该项目基于SpringAI构建,为阿里云通义系列模型提供Java开发实践。主要内容包括: 基础使用:配置模型API、依赖引入、调用示例,支持同步和流式调用; 多种集成方式:对接本地Ollama模型、ChatClient高级API、SSE流式输出; 核心功能实现:提示词模板、结构化输出、持久化内存、文本生成图片/语音; 高级能力:向量数据库、RAG增强检索、工具调用(Tool Calling); MCP协议:标准化工具调用方案,实现服务端工具共享;
|
7天前
|
存储 人工智能 NoSQL
大模型应用开发3-LangChain4j实战
本文介绍了LangChain4j框架的使用方法,主要包括以下内容:1. 基础配置:创建SpringBoot项目并配置OpenAI聊天模型;2. AIServices工具类:简化模型调用,支持流式和阻塞式两种调用方式;3. 会话记忆功能:实现多轮对话记忆,支持会话隔离和Redis持久化存储;4. RAG检索增强:通过向量数据库存储和检索专业领域知识,提升大模型回答质量;5. Tools工具:通过Function Calling机制实现业务功能调用。文章详细讲解了每个功能的实现步骤,包括代码示例和配置方法,帮助
|
7天前
|
人工智能 Linux API
OpenClaw多Agent协作系统实操:本地+阿里云部署与千问/Coding Plan API配置全指南
2026年OpenClaw(原Clawdbot)推出的多Agent协作系统,彻底打破了单一AI智能体的能力边界,让多个AI Agent像人类团队一样实现智能分工、实时信息同步与灵活角色配置,可高效完成内容创作、软件开发、数据分析等复杂复合型任务。在实际落地过程中,开发者不仅需要掌握多Agent协作系统的基础使用逻辑,更需要完成OpenClaw在本地多系统(MacOS/Linux/Windows11)与阿里云的稳定部署,同时实现与阿里云千问大模型API、免费Coding Plan API的无缝对接,才能真正发挥多Agent协作的核心价值。本文将深度解析OpenClaw多Agent协作系统的核心
713 10
|
关系型数据库 数据库 数据安全/隐私保护
Docker-10:Docker安装PostgreSQL
通过容器化Docker 安装 postgrel
7003 0
Docker-10:Docker安装PostgreSQL
|
7天前
|
人工智能 NoSQL Java
大模型应用开发2-SpringAI实战
本文介绍了SpringAI框架如何整合大语言模型,并详细讲解了应用开发的关键技术。主要内容包括: 核心功能 支持OpenAI、Ollama等主流平台 封装对话模型、向量计算等功能 提供同步/异步调用方式 关键技术实现 会话记忆管理(内存/Redis) 工具调用(Function Calling) 知识增强(RAG)架构 多模态交互(文本/图像) 典型应用场景 文献阅读助手实现 智能客服系统 文档知识库问答 开发实践 配置向量数据库 处理PDF文档 实现工具调用 兼容阿里云平台 该框架显著简化了大模型应用开发
|
6天前
|
人工智能 文字识别 内存技术
一文看懂阿里云Token:怎么领免费Tokens、怎么用、能省多少钱?
2026年阿里云推重磅Tokens福利:新用户开通百炼即赠7000万Tokens(每模型100万),永久有效;企业新客更享万亿Tokens扶持。Qwen-Turbo低至0.367元/百万Tokens,阶梯价+4.5折节省计划大幅降本。
540 4
|
人工智能 弹性计算 监控
3分钟部署HiClaw
HiClaw 是基于 OpenClaw 的开源 Agent 团队系统,含 Manager(AI 管家)与可扩展 Worker,通过 Matrix 群聊协作。安全设计(仅用消费者令牌)、开箱即用(内置 Matrix)、一键部署(curl | bash)、丰富技能生态(skills.sh),真正让 AI 团队可控、可信、易用。(239字)
3分钟部署HiClaw
|
18天前
|
Oracle Java 关系型数据库
JDK 25安装与环境变量配置教程 Windows版:含自定义路径+JAVA_HOME设置+验证指南
JDK是Oracle官方Java开发工具包,含JVM、类库、编译器等,支持Java全平台。本文详解JDK 25在Windows下的下载、安装(建议D盘)、环境变量配置(JAVA_HOME与Path)及版本验证方法,步骤清晰,一键搞定开发环境搭建。(239字)
|
2月前
|
人工智能 API 网络安全
2026年OpenClaw零基础部署指南+官方Skills全解析:1条命令解锁全能AI助手
在AI工具从“聊天交互”向“落地执行”升级的2026年,OpenClaw(原Clawdbot)凭借其开放的技能生态脱颖而出——ClawHub官方技能平台汇集了数千款覆盖办公协作、内容创作、开发工具、智能家居等30+领域的Skills,让AI真正成为“全能执行者”。而阿里云推出的专属一键部署方案,更是打破了技术门槛,让零基础用户20分钟即可搭建稳定运行环境,通过简单命令安装技能,轻松实现密码管理、邮件处理、视频编辑等多样化需求。
1922 10
|
3月前
|
Ubuntu API 数据库
PXD 部署 阿里云 PolarDB-X 集群(企业版、标准版)教程
本文详细演示了使用PXD在Ubuntu 24.04上部署PolarDB-X企业版和标准版集群的完整流程,涵盖环境准备、Docker与Python配置、PXD安装、集群创建、连接测试及销毁等步骤,并附多篇主流操作系统安装指南,助力快速搭建分布式数据库环境。
1632 4