PostgreSQL笔记40:PG生态中AI与向量检索扩展全景概览

PostgreSQL向量化扩展pgvector:原理与应用实践 向量嵌入(Vector Embeddings)作为现代AI系统的核心数据表示方式,能够将文本、图像等非结构化数据转换为高维数值向量,从而捕捉深层次的语义关系。pgvector作为PostgreSQL的扩展插件,通过引入专门的向量数据类型和高效的相似性搜索算法(如IVFFlat和HNSW),使传统关系型数据库具备了处理高维向量的能力。这种技术方案特别适合需要同时处理结构化数据和向量搜索的场景,如推荐系统、语义搜索等。相比专用向量数据库,pgvector的优势在于无缝集成PostgreSQL的ACID事务、复杂 阅读详情

纲要

  • PostgreSQL 扩展性机制与 AI 生态
  • 核心向量检索扩展
    • pgvector:官方生态最流行的向量存储与检索扩展
    • pgvecto.rs / VectorChord:高性能向量检索扩展
    • pg_analytics / pg_lakehouse:分析型查询引擎
  • 相似性搜索与文本处理扩展
    • pg_similarity:文本相似性计算
    • pg_summarize:LLM 文本摘要
    • pg_tokenize:分词与 Token 计数
  • 库内机器学习扩展
    • PGforML:PostgreSQL 内建机器学习
    • postgresML:SQL 驱动的 ML/AI 框架
  • 生态优势与架构决策

引言

PostgreSQL 凭借其强大的扩展性(extensibility)机制,早已超越传统关系型数据库的边界。在 AI 与向量检索(vector search)领域,PG 生态中涌现出大量高质量的扩展插件,使得开发者可以在不引入独立向量数据库的前提下,直接在 PG 内完成向量数据的存储、索引与相似性检索。本文系统梳理 PG 生态中与 AI、向量检索相关的核心扩展,涵盖其功能定位、适用场景与技术选型建议。

核心向量检索扩展

pgvector

pgvector 是 PostgreSQL 生态中最流行的开源向量相似性搜索扩展。它通过在 PG 中引入新的 vector 数据类型,使数据库能够原生存储和操作向量嵌入(vector embeddings)。

核心能力:

  • 支持 vector(单精度)、halfvec(半精度)、binary(二进制)及 sparsevec(稀疏向量)等多种向量类型
  • 提供多种距离度量函数:L2 距离(欧氏距离)、内积(inner product)、余弦距离(cosine distance)、L1 距离、汉明距离(Hamming distance)及 Jaccard 距离
  • 支持精确最近邻搜索(exact nearest neighbor search)与近似最近邻搜索(approximate nearest neighbor search)
  • 支持 IVFFlat 与 HNSW 两种索引算法

安装与基础使用(适用版本:PostgreSQL 13+,pgvector 0.8.6):

-- 启用扩展(每个数据库执行一次)
CREATE EXTENSION vector;

-- 创建包含向量列的表,指定维度为 3
CREATE TABLE items (
    id bigserial PRIMARY KEY,
    embedding vector(3)
);

-- 插入向量数据
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');

-- 按 L2 距离查询最近邻
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

-- 创建 HNSW 索引以加速查询(推荐默认使用 HNSW)
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);

-- 创建 IVFFlat 索引(需先有数据)
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

距离算子说明:

算子距离类型说明
<->L2 距离欧氏距离,最常用
<#>内积返回负内积(因 PG 仅支持 ASC 索引扫描)
<=>余弦距离余弦相似度
<+>L1 距离曼哈顿距离
<~>汉明距离仅适用于二进制向量
<%>Jaccard 距离仅适用于二进制向量

维度限制说明:

pgvector 的 vector 类型默认最大支持 2000 维,这是由于 PostgreSQL 默认 8KB 页大小限制所致。自 0.7.0 版本起,可通过 halfvec 类型索引最高 4000 维的向量。

pgvecto.rs 与 VectorChord

pgvecto.rs 是一款用 Rust 编写、基于 pgrx 框架开发的 PostgreSQL 向量检索扩展。其官方团队后续推出了性能与稳定性更优的 VectorChord,官方建议新用户迁移至 VectorChord。

核心特性:

  • 最大支持 65535 维向量
  • 支持 FP16、INT8 及二进制向量等多种数据类型
  • SIMD 指令动态分发,最大化硬件性能
  • 引入 VBASE 方法处理向量检索与关系查询(如过滤、JOIN)的混合场景

快速启动(Docker):

docker run \
  --name pgvecto-rs-demo \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  -d ghcr.io/tensorchord/pgvecto-rs:pg17-v0.4.0
-- 启用扩展
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;

-- 创建向量表
CREATE TABLE items (
    id bigserial PRIMARY KEY,
    embedding vector(768)
);

pgvecto.rs / VectorChord 相较于 pgvector 的主要优势在于高维支持与混合查询能力,适合需要处理高维 embedding(如 768 维、1024 维)且对过滤条件有严格要求的场景。

pg_analytics 与 pg_lakehouse

pg_analytics 是 ParadeDB 团队开发的分析型查询引擎,目前已演进为 pg_lakehouse,可将 Postgres 转换为对外部对象存储(如 S3)和表格式(如 Delta Lake)的分析查询引擎。在向量检索场景中,该扩展可用于大规模向量数据的分析型工作负载。

相似性搜索与文本处理扩展

pg_similarity

pg_similarity 专注于文本相似性计算,提供多种相似度算法(如集合相似度、模糊搜索等),适用于文本去重、数据清洗等场景。该扩展侧重于非向量类的文本相似性判断,与向量检索形成互补。

pg_summarize

pg_summarize 是基于 pgrx 框架的 LLM 文本摘要扩展,允许用户在 PostgreSQL 内直接调用大模型生成文本摘要,属于 AI 应用层与 SQL 的结合。

pg_tokenize

pg_tokenize 提供分词与 Token 计数功能,可在 SQL 中直接进行文本分词,配合 RAG(Retrieval-Augmented Generation)系统进行文档分片与 Token 长度控制。

库内机器学习扩展

PGforML

PGforML 由国内开发者郭老师实现,允许在 PostgreSQL 数据库内直接进行机器学习模型的训练与推理,减少数据迁移开销。

postgresML

postgresML 是业界领先的 PostgreSQL AI 框架之一,提供 SQL 驱动的机器学习能力,支持在数据库内调用和运行深度学习模型。

生态优势与架构决策

在 PG 中直接实现向量检索能力,相较于引入独立向量数据库(如 Milvus、Pinecone)具有以下优势:

  1. 数据一致性:避免跨系统的数据同步与一致性问题
  2. 运维简化:减少额外组件的部署、监控与维护成本
  3. 统一查询:可在同一 SQL 中融合向量检索与关系查询
  4. ACID 保障:继承 PostgreSQL 的事务、点时间恢复等企业级特性

API 速览

pgvector 核心 API

数据类型:vector(n)

定义一个 n 维向量列。

CREATE TABLE table_name (
    column_name vector(n)
);

距离算子:

算子用途示例
<->L2 距离ORDER BY embedding <-> '[1,2,3]'
<#>内积(负值)ORDER BY embedding <#> '[1,2,3]'
<=>余弦距离ORDER BY embedding <=> '[1,2,3]'

索引创建:

-- HNSW 索引(推荐)
CREATE INDEX ON table_name USING hnsw (column_name vector_cosine_ops);

-- IVFFlat 索引
CREATE INDEX ON table_name USING ivfflat (column_name vector_l2_ops) WITH (lists = 100);

pgvecto.rs 核心 API

数据类型:vector(n)

CREATE TABLE table_name (
    column_name vector(n)
);

启用扩展:

CREATE EXTENSION vectors;

Demo 简单示例

以下是一个基于 Node.js 和 pgvector 的完整示例,演示向量存储与相似性检索。

运行环境要求:

  • PostgreSQL 13+ 已安装 pgvector 扩展
  • Node.js 16+

项目结构:

pgvector-demo
├── package.json
├── index.js
└── .env

package.json:

{
  "name": "pgvector-demo",
  "version": "1.0.0",
  "description": "pgvector 向量检索示例",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "pg": "^8.11.0",
    "dotenv": "^16.3.0"
  }
}

index.js:

const { Client } = require('pg');
require('dotenv').config();

const client = new Client({
  host: process.env.PGHOST || 'localhost',
  port: process.env.PGPORT || 5432,
  user: process.env.PGUSER || 'postgres',
  password: process.env.PGPASSWORD || 'postgres',
  database: process.env.PGDATABASE || 'postgres',
});

async function main() {
  await client.connect();

  // 1. 启用 pgvector 扩展
  await client.query('CREATE EXTENSION IF NOT EXISTS vector;');

  // 2. 创建表
  await client.query(`
    DROP TABLE IF EXISTS demo_items;
    CREATE TABLE demo_items (
      id SERIAL PRIMARY KEY,
      embedding vector(3),
      label TEXT
    );
  `);

  // 3. 插入向量数据
  const vectors = [
    { embedding: '[1, 1, 1]', label: 'A' },
    { embedding: '[2, 2, 2]', label: 'B' },
    { embedding: '[3, 3, 3]', label: 'C' },
    { embedding: '[10, 10, 10]', label: 'D' },
  ];

  for (const v of vectors) {
    await client.query(
      'INSERT INTO demo_items (embedding, label) VALUES ($1, $2)',
      [v.embedding, v.label]
    );
  }

  // 4. 创建 HNSW 索引
  await client.query(`
    CREATE INDEX IF NOT EXISTS idx_demo_items_hnsw
    ON demo_items USING hnsw (embedding vector_l2_ops);
  `);

  // 5. 查询最近邻(L2 距离)
  const queryVector = '[2.5, 2.5, 2.5]';
  const result = await client.query(
    `
    SELECT id, label, embedding,
           embedding <-> $1 AS distance
    FROM demo_items
    ORDER BY embedding <-> $1
    LIMIT 3
    `,
    [queryVector]
  );

  console.log('查询向量:', queryVector);
  console.log('最近邻结果:');
  result.rows.forEach(row => {
    console.log(`  label: ${row.label}, distance: ${row.distance.toFixed(4)}`);
  });

  await client.end();
}

main().catch(console.error);

对应的 PostgreSQL 原生指令(注释参考):

-- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;

-- 建表
CREATE TABLE demo_items (
    id SERIAL PRIMARY KEY,
    embedding vector(3),
    label TEXT
);

-- 插入数据
INSERT INTO demo_items (embedding, label) VALUES
    ('[1,1,1]', 'A'),
    ('[2,2,2]', 'B'),
    ('[3,3,3]', 'C'),
    ('[10,10,10]', 'D');

-- 创建 HNSW 索引
CREATE INDEX ON demo_items USING hnsw (embedding vector_l2_ops);

-- L2 距离查询
SELECT id, label, embedding,
       embedding <-> '[2.5,2.5,2.5]' AS distance
FROM demo_items
ORDER BY embedding <-> '[2.5,2.5,2.5]'
LIMIT 3;

运行说明:

npm install
node index.js

技术点总结:

  • pgvector 扩展的启用与向量列定义
  • 向量数据的插入与 HNSW 索引创建
  • 基于 L2 距离的最近邻查询
  • Node.js 中使用 pg 驱动操作向量数据

多语言示例

以下基于相同的 PostgreSQL + pgvector 环境,分别提供 Go、Python、Java 的完整示例代码,与前述 Node.js 示例实现相同的功能:启用扩展、建表、插入向量数据、创建 HNSW 索引、执行 L2 距离最近邻查询。

Go 示例

项目结构:

pgvector-go-demo
├── go.mod
├── main.go
└── .env

go.mod:

module pgvector-go-demo

go 1.21

require (
    github.com/joho/godotenv v1.5.1
    github.com/lib/pq v1.10.9
)

main.go:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "os"

    "github.com/joho/godotenv"
    _ "github.com/lib/pq"
)

func main() {
    // 加载 .env
    _ = godotenv.Load()

    connStr := fmt.Sprintf(
        "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
        getEnv("PGHOST", "localhost"),
        getEnv("PGPORT", "5432"),
        getEnv("PGUSER", "postgres"),
        getEnv("PGPASSWORD", "postgres"),
        getEnv("PGDATABASE", "postgres"),
    )

    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }

    // 1. 启用扩展
    _, err = db.Exec("CREATE EXTENSION IF NOT EXISTS vector;")
    if err != nil {
        log.Fatal(err)
    }

    // 2. 建表
    _, err = db.Exec(`
        DROP TABLE IF EXISTS demo_items;
        CREATE TABLE demo_items (
            id SERIAL PRIMARY KEY,
            embedding vector(3),
            label TEXT
        );
    `)
    if err != nil {
        log.Fatal(err)
    }

    // 3. 插入数据
    vectors := []struct {
        embedding string
        label     string
    }{
        {"[1,1,1]", "A"},
        {"[2,2,2]", "B"},
        {"[3,3,3]", "C"},
        {"[10,10,10]", "D"},
    }
    for _, v := range vectors {
        _, err = db.Exec(
            "INSERT INTO demo_items (embedding, label) VALUES ($1, $2)",
            v.embedding, v.label,
        )
        if err != nil {
            log.Fatal(err)
        }
    }

    // 4. 创建 HNSW 索引
    _, err = db.Exec(`
        CREATE INDEX IF NOT EXISTS idx_demo_items_hnsw
        ON demo_items USING hnsw (embedding vector_l2_ops);
    `)
    if err != nil {
        log.Fatal(err)
    }

    // 5. 查询最近邻
    queryVector := "[2.5,2.5,2.5]"
    rows, err := db.Query(`
        SELECT id, label, embedding,
               embedding <-> $1 AS distance
        FROM demo_items
        ORDER BY embedding <-> $1
        LIMIT 3
    `, queryVector)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    fmt.Println("查询向量:", queryVector)
    fmt.Println("最近邻结果:")
    for rows.Next() {
        var id int
        var label string
        var embedding string
        var distance float64
        if err := rows.Scan(&id, &label, &embedding, &distance); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("  label: %s, distance: %.4f\n", label, distance)
    }
}

func getEnv(key, fallback string) string {
    if val := os.Getenv(key); val != "" {
        return val
    }
    return fallback
}

运行说明:

go mod tidy
go run main.go

Python 示例

项目结构:

pgvector-py-demo
├── requirements.txt
├── main.py
└── .env

requirements.txt:

psycopg2-binary==2.9.9
python-dotenv==1.0.0

main.py:

import os
import psycopg2
from dotenv import load_dotenv

load_dotenv()

def main():
    conn = psycopg2.connect(
        host=os.getenv("PGHOST", "localhost"),
        port=os.getenv("PGPORT", "5432"),
        user=os.getenv("PGUSER", "postgres"),
        password=os.getenv("PGPASSWORD", "postgres"),
        database=os.getenv("PGDATABASE", "postgres"),
    )
    conn.autocommit = True
    cur = conn.cursor()

    # 1. 启用扩展
    cur.execute("CREATE EXTENSION IF NOT EXISTS vector;")

    # 2. 建表
    cur.execute("""
        DROP TABLE IF EXISTS demo_items;
        CREATE TABLE demo_items (
            id SERIAL PRIMARY KEY,
            embedding vector(3),
            label TEXT
        );
    """)

    # 3. 插入数据
    vectors = [
        ("[1,1,1]", "A"),
        ("[2,2,2]", "B"),
        ("[3,3,3]", "C"),
        ("[10,10,10]", "D"),
    ]
    for emb, label in vectors:
        cur.execute(
            "INSERT INTO demo_items (embedding, label) VALUES (%s, %s)",
            (emb, label),
        )

    # 4. 创建 HNSW 索引
    cur.execute("""
        CREATE INDEX IF NOT EXISTS idx_demo_items_hnsw
        ON demo_items USING hnsw (embedding vector_l2_ops);
    """)

    # 5. 查询最近邻
    query_vector = "[2.5,2.5,2.5]"
    cur.execute("""
        SELECT id, label, embedding,
               embedding <-> %s AS distance
        FROM demo_items
        ORDER BY embedding <-> %s
        LIMIT 3
    """, (query_vector, query_vector))

    print("查询向量:", query_vector)
    print("最近邻结果:")
    for row in cur.fetchall():
        print(f"  label: {row[1]}, distance: {row[3]:.4f}")

    cur.close()
    conn.close()

if __name__ == "__main__":
    main()

运行说明:

pip install -r requirements.txt
python main.py

Java 示例

项目结构:

pgvector-java-demo
├── pom.xml
└── src/main/java/com/example/Main.java

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 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>pgvector-java-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.cdimascio</groupId>
            <artifactId>dotenv-java</artifactId>
            <version>3.0.0</version>
        </dependency>
    </dependencies>
</project>

Main.java:

package com.example;

import io.github.cdimascio.dotenv.Dotenv;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Main {
    public static void main(String[] args) {
        Dotenv dotenv = Dotenv.configure().ignoreIfMissing().load();
        String host = dotenv.get("PGHOST", "localhost");
        String port = dotenv.get("PGPORT", "5432");
        String user = dotenv.get("PGUSER", "postgres");
        String password = dotenv.get("PGPASSWORD", "postgres");
        String database = dotenv.get("PGDATABASE", "postgres");

        String url = String.format(
            "jdbc:postgresql://%s:%s/%s",
            host, port, database
        );

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 1. 启用扩展
            try (PreparedStatement stmt = conn.prepareStatement(
                    "CREATE EXTENSION IF NOT EXISTS vector;")) {
                stmt.execute();
            }

            // 2. 建表
            try (PreparedStatement stmt = conn.prepareStatement("""
                    DROP TABLE IF EXISTS demo_items;
                    CREATE TABLE demo_items (
                        id SERIAL PRIMARY KEY,
                        embedding vector(3),
                        label TEXT
                    );
                """)) {
                stmt.execute();
            }

            // 3. 插入数据
            String[][] vectors = {
                {"[1,1,1]", "A"},
                {"[2,2,2]", "B"},
                {"[3,3,3]", "C"},
                {"[10,10,10]", "D"}
            };
            for (String[] v : vectors) {
                try (PreparedStatement stmt = conn.prepareStatement(
                        "INSERT INTO demo_items (embedding, label) VALUES (?, ?)")) {
                    stmt.setString(1, v[0]);
                    stmt.setString(2, v[1]);
                    stmt.execute();
                }
            }

            // 4. 创建 HNSW 索引
            try (PreparedStatement stmt = conn.prepareStatement("""
                    CREATE INDEX IF NOT EXISTS idx_demo_items_hnsw
                    ON demo_items USING hnsw (embedding vector_l2_ops);
                """)) {
                stmt.execute();
            }

            // 5. 查询最近邻
            String queryVector = "[2.5,2.5,2.5]";
            try (PreparedStatement stmt = conn.prepareStatement("""
                    SELECT id, label, embedding,
                           embedding <-> ? AS distance
                    FROM demo_items
                    ORDER BY embedding <-> ?
                    LIMIT 3
                """)) {
                stmt.setString(1, queryVector);
                stmt.setString(2, queryVector);
                try (ResultSet rs = stmt.executeQuery()) {
                    System.out.println("查询向量: " + queryVector);
                    System.out.println("最近邻结果:");
                    while (rs.next()) {
                        String label = rs.getString("label");
                        double distance = rs.getDouble("distance");
                        System.out.printf("  label: %s, distance: %.4f%n", label, distance);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行说明:

mvn compile exec:java -Dexec.mainClass="com.example.Main"

多语言对比

维度Node.jsGoPythonJava
驱动/ORMpg (node-postgres)database/sql + lib/pqpsycopg2-binaryorg.postgresql:postgresql (JDBC)
连接方式连接字符串 + Client 对象sql.Open + DSNpsycopg2.connectDriverManager.getConnection
参数占位符$1, $2, ...$1, $2, ...%s (或 %()s)? (但 PostgreSQL JDBC 也支持 $1,示例中使用了 ?)
环境变量加载dotenvgodotenvpython-dotenvdotenv-java
错误处理try/catch + console.errorif err != nil + log.Fataltry/except(示例中简化为直接检查)try/catch + e.printStackTrace()
SQL 执行client.query() 直接返回结果db.Query() / db.Exec()cur.execute() / cur.fetchall()PreparedStatement.executeQuery() / execute()
向量类型映射字符串传递(PG 自动转换)字符串传递字符串传递字符串传递(或使用 PGobject)
索引创建同 SQL,使用 CREATE INDEX ... USING hnsw同左同左同左
依赖管理npm / package.jsongo modpip / requirements.txtMaven / pom.xml
适用版本Node.js 16+Go 1.21+Python 3.8+Java 17+ (JDK 8+ 亦可)

所有语言实现的功能完全一致,且均通过 PostgreSQL 原生 SQL 与 pgvector 扩展交互,不引入额外的 ORM 映射层,保持轻量和可控。开发者可根据自身技术栈选择对应的实现。

官方文档

参考链接

总结

PostgreSQL 生态围绕 AI 与向量检索已形成丰富的扩展矩阵:

  • 向量存储与检索:以 pgvector 为核心,提供 vector 数据类型、多种距离度量(L2、内积、余弦等)以及 HNSW/IVFFlat 索引。pgvector 的 vector 类型最大支持 2000 维,halfvec 可扩展至 4000 维。pgvecto.rs / VectorChord 则将维度上限提升至 65535,并引入 VBASE 方法处理混合查询。
  • 文本相似性:pg_similarity 提供非向量类的文本相似度计算,适用于模糊搜索与数据清洗。
  • AI 应用层:pg_summarize 与 pg_tokenize 分别提供 LLM 摘要生成与分词能力,服务于 RAG 系统。
  • 库内机器学习:PGforML 与 postgresML 支持在数据库内直接训练和推理 ML 模型。

在 PG 内统一管理向量数据与业务数据,可有效规避跨系统数据同步、一致性问题与额外运维成本,是构建 AI 应用的高效架构路径。

Thompson Sampling vs UCB:5个真实业务场景下的算法选型指南 本文深入对比了Thompson Sampling与UCB算法在电商推荐、在线广告、医疗试验、金融定价和游戏调整五大真实业务场景下的表现。通过量化指标分析,为技术决策者提供了清晰的选型指南:Thompson Sampling凭借其概率匹配和贝叶斯框架,在需要快速收敛、处理冷启动及复杂约束的场景中通常更具优势;而UCB则在要求确定性、可解释性和理论保证的场景下表现更佳。 阅读详情

相关推荐

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 303

PostgreSQL 向量扩展插件pgvector安装和使用

重新修改.bash_profile,配置PG_CONFIG和LD_LIBRARY_PATH,指定安装的postgresql 16.3版本。make编译调用的postgresql不是之前安装的 16.3,而是apt-get 安装的10.23版本。利用pgvector 前提是事先安装好postgresql,安装postgresql例可参考下文。make编译pgvector时无法识别安装的postgresql。安装的版本不是最新的版本而是10.23。pgvector的安装成功。

qw10248的博客 717

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 865

PostgreSQL笔记4: 市场地位、生态全景与行业应用实践

技术能力实现方式适用场景全文检索tsvectortsquery+ GIN 索引内容搜索、日志分析半结构化数据JSONB类型 + GIN 索引灵活 Schema、配置存储向量检索pgvector扩展 + IVFFlat/HNSW 索引RAG、推荐系统、语义搜索混合查询上述能力的 SQL 组合复杂业务场景的统一数据访问表结构创建(若已存在则跳过)插入三条测试数据(包含 JSONB 和向量字段)全文检索查询(tsvectortsqueryJSONB 包含查询(@>运算符)

Wang的专栏 529

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6053

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2860

如何为PostgreSQL添加向量搜索能力:pgvector扩展的完整实战指南

在AI应用爆炸式增长的今天,向量相似性搜索已成为现代数据库系统的核心需求。pgvector作为一个开源的PostgreSQL扩展,为传统关系型数据库赋予了强大的向量搜索能力,让你可以在PostgreSQL中直接存储和查询向量数据,实现高效的近似最近邻搜索。 ## 为什么你需要pgvector?🎯 想象一下这样的场景:你的电商平台需要根据用户浏览历史推荐相似商品,你的内容平台需要根据文章语义匹

gitblog_01427的博客 700

Aspose Java 25.10 版本深度破解:基于字节码修改的实战指南

本文提供了Aspose Java 25.10版本基于字节码修改的实战指南。详细介绍了如何通过Javassist工具逆向分析并修改Aspose Cells、Words、Slides及PDF组件的许可证验证逻辑,从而实现绕过限制,并完成最终的打包与功能验证。

stone的博客 1366

PostgreSQL插件生态全景解析:赋能数据库的无限可能

PostgreSQL插件生态全景解析:赋能数据库的无限可能

huanhuanzhou blog 1457

T507 buildroot linux4.9之RLT8211F 1000M以太网开发调试

调试T507的gmac,解决该RTL8211F 1000m以太网中调试遇到的问题

目前从事linux驱动开发,多交流多学习吧 690

Ut接口原理及 VoLTE 补充业务自管理信令流程(GBA 引导认证+业务访问认证+ VoLTE 补充业务自管理)

2. Ut 接口及 VoLTE 业务子管理概述 2.1 UT 接口 —— VoLTE 终端补充业务配置 2.2终端通过 Ut 接口完成 VoLTE 补充业务自管理举例 2.3什么是 GBA 和 GAA 架构 2.4为什么要引入 GBA 架构认证及 BSF 网元 2.5UE(终端) 接口相关网元及功能 2.6GBA 架构流程概述 3. Ut 接口业务自管理信令流程 3.1 补充业务自管理及本文主要参考以下规范 3.2 Ut 接口业务自管理信令流程:查询补充业务 3.2.1 UE获

原来45的博客 1258

PostgreSQL向量搜索扩展pgvector的容器化部署与运维指南

pgvector是一个为PostgreSQL数据库设计的开源向量相似性搜索扩展,支持单精度、半精度、二进制和稀疏向量存储,提供精确和近似最近邻搜索功能。在AI应用、推荐系统和语义搜索等场景中,pgvector能够将向量数据与关系型数据统一存储,实现高效的向量检索。 ## 技术背景与架构原理 ### 向量搜索的核心概念 向量相似性搜索是现代AI应用的基础设施组件,它通过计算向量之间的距离来找到

gitblog_00640的博客 1099

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 290

PG + AI——向量检索、RAG、智能运维是风口还是未来?

主持人:尚雷PG & Oracle ACE,IvorySQL 专家顾问委员,PG 分会南京分会会长,TechTalk 技术交流社区主理人,公众号“尚雷的驿站”主理人。嘉宾:萧少聪「Dataer 数人」公众号主理人,Cortrix.AI 语义存储项目联合创始人。前 PostgreSQL 分会会长及中文社区主席,IvorySQL 专家顾问委员,曾先后任职阿里云 RDS 产品高级专家、华为存储产业营销专家。专注于数据库技术、AI 数据处理、开源技术发展。嘉宾:白鳝(徐戟)

IvorySQL的博客 216

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

PostgreSQL pgvector扩展深度解析:向量相似度搜索的技术实现与工程实践

在当今AI驱动的应用场景中,高效处理高维向量数据已成为现代数据库系统的核心挑战。传统的关系型数据库在面对向量相似度搜索时面临性能瓶颈,而专门的向量数据库又带来了额外的系统复杂性和数据同步问题。PostgreSQL pgvector扩展正是为解决这一矛盾而生,它将向量搜索能力无缝集成到成熟的PostgreSQL生态系统中。 ## 向量相似度搜索的核心挑战与技术选型 ### 传统方案的技术瓶颈

gitblog_00251的博客 1075

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

PostgreSQL 16 接入 pgvector:从部署到向量检索调优实践

商品检索的需求是:10 万条 embedding 入库,一次查询要返回最相似的 10 条文档。为此单独引入一套向量数据库不划算,把 pgvector 向量搜索扩展装进现有 PostgreSQL 16 是首选路径。下面从部署、验证、索引选型到调优走一遍。 ## 为什么选 pgvector:先看能力边界 pgvector 是 PostgreSQL 的原生向量扩展,装进 PostgreSQL 16

gitblog_00330的博客 311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pgvector完整指南:PostgreSQL向量搜索的终极解决方案

在当今AI驱动的时代,向量搜索已成为现代应用的核心需求。无论你是构建智能推荐系统、语义搜索引擎还是AI助手,都需要高效处理高维向量数据。pgvector作为PostgreSQL的开源向量相似度搜索扩展,将向量存储与关系数据库的强大功能完美结合,为开发者提供了完整的向量搜索解决方案。 pgvector支持精确和近似最近邻搜索,提供L2距离、内积、余弦距离等多种相似度计算方法,同时支持单精度、半精度

gitblog_01141的博客 1001

PostgreSQL向量扩展pgvector:高效处理AI时代的高维数据

向量数据库是处理AI生成的高维向量数据(Embedding)的关键技术。通过将文本、图像等非结构化数据转换为向量表示,可以高效实现语义搜索、推荐系统等智能应用。pgvector作为PostgreSQL的扩展插件,提供了专门的vector数据类型和近似最近邻(ANN)搜索算法(如IVFFlat和HNSW),使传统关系型数据库也能高效处理向量数据。该技术特别适合需要同时处理结构化数据和向量数据的场景,如构建语义搜索引擎或实现混合推荐系统。相比专用向量数据库,pgvector的优势在于与PostgreSQL生态的

weixin_30635053的博客 374

深度解析pgvectorscale:PostgreSQL向量搜索的性能革新者

在大规模AI应用快速发展的今天,向量搜索已成为现代数据库系统的核心能力。传统关系型数据库在处理高维向量数据时面临性能瓶颈,而专用向量数据库则带来额外的运维复杂性和成本开销。pgvectorscale作为PostgreSQL生态系统中的创新扩展,通过DiskANN算法和Rust语言实现,为pgvector提供了企业级的性能增强,让PostgreSQL在向量搜索领域具备了与专用向量数据库竞争的能力。

gitblog_00353的博客 304

如何高效解决PostgreSQL向量搜索部署难题:pgvector Docker镜像拉取最佳实践指南

PostgreSQL向量相似性搜索扩展pgvector为AI应用提供了强大的向量检索能力,但许多开发者在容器化部署时都会遇到镜像拉取失败的问题。本文将深入分析问题根源,并提供完整的解决方案和最佳实践,帮助你快速部署pgvector向量搜索功能。 ## 🔍 问题诊断:为什么Docker镜像拉取会失败? 当你尝试执行 `docker pull pgvector/pgvector` 时,系统会提示

gitblog_00385的博客 426

PostgreSQL的终局之战即将到来!!!PostgreSQL将成为人工智能与大数据时代“赢家通吃”的数据库

在数据库领域,**PostgreSQL(简称 PG)** 正在展现出一种罕见的“赢家通吃”潜力。不同于过去“关系型 vs NoSQL”、“SQL vs NewSQL”的割裂格局,PG 正在通过**极致的扩展性 + 开放生态**,把几乎所有数据库的能力都吸纳进来,成为“一个数据库,满足所有场景”的终极解决方案。

莫道桑榆晚 为霞尚满天 897
上一篇: PostgreSQL笔记39:PG作为AI数据底座——向量检索与语义搜索能力解析
下一篇: PostgreSQL笔记41:向量数据、向量化表示与pgvector扩展实践
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值