批量相似度计算

本文介绍了一种利用PyTorch库实现的批量余弦相似度计算方法,该方法能够高效地计算不同尺寸向量之间的相似度,避免了使用循环所带来的效率问题。
部署运行你感兴趣的模型镜像
import torch

def batch_cosine_similarity(sentence_embedding_a, sentence_embedding_b):
    """
    :param sentence_embedding_a: [a_number, hidden_dim]
    :param sentence_embedding_b: [b_number, hidden_dim]
    :return:
    """
    a_number = sentence_embedding_a.size(0)
    b_number = sentence_embedding_b.size(0)

    # a_embedding: [a_number, hidden_dim] --> [a_number, b_number, hidden_dim] --> [a_number * b_number, hidden_dim]
    # b_embedding: [b_number, hidden_dim] --> [a_number, b_number, hidden_dim] --> [a_number * b_number, hidden_dim]
    a_embedding = sentence_embedding_a.unsqueeze(1).repeat(1, b_number, 1).view(-1, 768)
    b_embedding = sentence_embedding_b.unsqueeze(0).repeat(a_number, 1, 1).view(-1, 768)

    # similarity: [b_number * a_number, 1]
    similarity = torch.cosine_similarity(a_embedding, b_embedding)
    similarity = similarity.view(a_number, b_number)

    return similarity

torch 自带的 cosine_similarity 函数似乎仅适用于相同尺寸的向量进行相似度的计算,为了避免for循环带来的速度慢的情况,采用repeat方式进行向量的复制,并且实现多对多的的余弦相似度计算。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>首先,用户的问题是关于在PostgreSQL中使用pgvector进行向量相似度计算的使用方法。我需要根据系统指令来构建我的回答。 系统指令的关键点: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 参考站内引用:用户提到了一个引用[1],是关于pgvector插件的安装和使用。但用户说“上述引用仅供参考”,所以我需要基于pgvector的官方文档或可靠知识来回答。 用户的具体问题:"我想在PostgreSQL中使用pgvector进行向量相似度计算 请问PostgreSQL pgvector 向量相似度计算 使用方法" 我的回答应该包括: 1. **安装pgvector插件**:因为这是使用的前提。 2. **创建表来存储向量**:使用向量数据类型。 3. **插入向量数据**:如何向表中添加向量。 4. **执行相似度查询**:使用pgvector提供的函数来计算相似度,如余弦相似度、欧几里得距离等。 5. **优化查询**:可能涉及索引的使用以提高性能。 6. **示例代码**:提供SQL或Python示例来演示。 步骤结构: - 介绍pgvector。 - 安装步骤。 - 使用步骤:创建表、插入数据、查询。 - 示例代码。 - 生成相关问题。 引用标识:我需要自然地添加引用。既然用户提供了一个引用[1],我可以引用它,但用户说“上述引用仅供参考”,所以我应该基于通用知识或参考官方文档。为了安全,我可以添加一个引用到pgvector的GitHub或文档。 生成相关问题:在回答末尾,添加3-5个相关问题。 确保中文回答。 LaTeX格式:如果有数学表达式,比如相似度计算公式,使用$...$或$$...$$。例如,余弦相似度公式:$ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} $。 现在,构建回答大纲: 1. **引言**:简要介绍pgvector和其用途。 2. **安装pgvector**:步骤说明。 3. **配置和使用**: - 创建扩展。 - 创建表。 - 插入向量数据。 - 执行相似度查询。 4. **示例**:提供一个完整的例子。 5. **优化**:如使用索引。 6. **结论**:总结。 7. **相关问题**:生成几个相关问题。 示例代码:使用SQL代码块,像在系统指令示例中的Python代码那样。 最终输出格式: - 使用Markdown。 - 代码块用```sql ... ```。 - 问题部分用"§§相关问题§§"开头。 相关问题想法: 1. 如何优化pgvector的查询性能? 2. pgvector支持哪些相似度度量? 3. 如何处理大规模向量数据? 4. pgvector与其他向量数据库的比较? 5. 如何更新或删除向量数据? 确保回答真实可靠:基于我对pgvector的知识。pgvector是一个开源插件,支持向量相似度搜索,使用PostgreSQL的扩展机制。</think>### PostgreSQL pgvector 向量相似度计算使用方法 pgvector 是 PostgreSQL 的一个开源插件,用于存储和检索高维向量数据,并支持多种相似度计算(如余弦相似度、欧几里得距离等)。这在机器学习和人工智能应用中非常有用,例如推荐系统、图像检索或自然语言处理。下面我将逐步指导您完成安装、配置和使用过程,确保操作简单可靠。整个过程基于 pgvector 的官方文档和最佳实践[^1]。 #### 1. **安装 pgvector 插件** 在 PostgreSQL 中使用 pgvector 前,必须先安装该插件。以下是通用步骤(假设您已安装 PostgreSQL 12+ 版本): - **下载并编译插件**: ```bash # 克隆 pgvector 仓库 git clone --branch v0.5.0 https://github.com/pgvector/pgvector.git cd pgvector # 编译并安装 make make install # 可能需要 sudo 权限 ``` - **在 PostgreSQL 中启用插件**: 连接到您的数据库(例如使用 `psql` 命令行工具),运行: ```sql CREATE EXTENSION IF NOT EXISTS vector; ``` 这一步添加了 `vector` 数据类型和相关函数。 如果安装失败,检查 PostgreSQL 版本是否兼容(pgvector 支持 PostgreSQL 11+),并确保 `pg_config` 在系统路径中[^1]。 #### 2. **创建表并存储向量数据** pgvector 引入了 `vector` 数据类型,用于存储高维向量(如 128 维或 768 维)。以下示例创建一个简单的表来存储向量: ```sql -- 创建表,使用 vector 类型存储向量(例如 128 维) CREATE TABLE items ( id SERIAL PRIMARY KEY, embedding VECTOR(128), -- 指定向量维度 description TEXT ); ``` - **说明**:`VECTOR(128)` 定义了一个 128 维的向量列。维度应与您的数据匹配(例如,BERT 嵌入向量常为 768 维)。 #### 3. **插入向量数据** 使用 SQL 插入语句添加向量数据。向量以数组形式表示,例如 `[0.1, 0.2, ..., 0.128]`。以下是插入示例: ```sql -- 插入示例数据 INSERT INTO items (embedding, description) VALUES ('[0.1, 0.2, 0.3, ..., 0.128]', 'Item A'), ('[0.4, 0.5, 0.6, ..., 0.128]', 'Item B'), ('[0.7, 0.8, 0.9, ..., 0.128]', 'Item C'); ``` - **提示**:在实际应用中,您可能通过 Python 脚本(如使用 `psycopg2` 库)批量插入向量数据。例如: ```python import psycopg2 import numpy as np # 连接到 PostgreSQL conn = psycopg2.connect(database="your_db", user="your_user", password="your_password") cur = conn.cursor() # 生成随机向量并插入 embedding = np.random.rand(128).tolist() # 128 维随机向量 cur.execute("INSERT INTO items (embedding, description) VALUES (%s, %s)", (embedding, "Sample Item")) conn.commit() ``` #### 4. **执行相似度查询** pgvector 提供了内置函数来计算向量相似度,支持多种度量方式: - **余弦相似度**:用于测量向量方向的相似性,公式为 $ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} $,值域为 $[-1, 1]$,1 表示完全相似。 - **欧几里得距离**:用于测量向量间的几何距离,公式为 $ d(\mathbf{A}, \mathbf{B}) = \sqrt{\sum_{i=1}^{n} (A_i - B_i)^2} $,值越小表示越相似。 - **内积**:直接计算点积,公式为 $ \mathbf{A} \cdot \mathbf{B} = \sum_{i=1}^{n} A_i B_i $。 以下 SQL 示例演示如何查询与给定向量最相似的项: ```sql -- 使用余弦相似度查询(值越大越相似) SELECT id, description, 1 - (embedding <=> '[0.1, 0.2, 0.3, ..., 0.128]') AS cosine_similarity FROM items ORDER BY cosine_similarity DESC LIMIT 5; -- 返回前 5 个最相似项 -- 使用欧几里得距离查询(值越小越相似) SELECT id, description, embedding <-> '[0.1, 0.2, 0.3, ..., 0.128]' AS euclidean_distance FROM items ORDER BY euclidean_distance ASC LIMIT 5; ``` - **说明**: - `<=>` 运算符计算余弦距离(即 $1 - \cos(\theta)$),所以 `1 - (embedding <=> ...)` 得到余弦相似度。 - `<->` 运算符直接计算欧几里得距离。 - 查询结果按相似度排序,便于快速检索。 #### 5. **优化查询性能** 对于大规模数据集(如百万级向量),直接查询可能较慢。pgvector 支持索引加速: - **创建 HNSW 索引**(高效近似最近邻搜索): ```sql CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops); -- 用于余弦相似度 -- 或 CREATE INDEX ON items USING hnsw (embedding vector_l2_ops); -- 用于欧几里得距离 ``` - **索引使用提示**: - 索引创建可能需要较长时间(大数据集时),但查询速度可提升 10-100 倍。 - 在查询前运行 `SET enable_seqscan = off;` 强制使用索引。 - 调整索引参数(如 `hnsw.ef_search`)以平衡精度和速度[^1]。 #### 6. **完整示例:从插入到查询** 以下是一个端到端示例(使用 SQL 和 Python 结合): ```sql -- Step 1: 创建表和索引 CREATE TABLE documents ( doc_id SERIAL PRIMARY KEY, content TEXT, embedding VECTOR(384) -- 假设使用 Sentence-BERT 嵌入(384 维) ); CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops); -- Step 2: 插入数据(通过 Python 脚本) ``` Python 脚本示例(使用 `psycopg2` 和 `sentence-transformers` 生成嵌入): ```python from sentence_transformers import SentenceTransformer import psycopg2 # 初始化模型 model = SentenceTransformer('all-MiniLM-L6-v2') # 384 维嵌入 texts = ["Hello world", "PostgreSQL is great", "Vector similarity search"] embeddings = model.encode(texts).tolist() # 插入数据库 conn = psycopg2.connect(database="your_db", user="postgres", password="password") cur = conn.cursor() for text, emb in zip(texts, embeddings): cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (text, emb)) conn.commit() # 查询相似项 query_text = "Database tutorial" query_embedding = model.encode([query_text])[0].tolist() cur.execute(""" SELECT doc_id, content, 1 - (embedding <=> %s) AS similarity FROM documents ORDER BY similarity DESC LIMIT 3 """, (query_embedding,)) results = cur.fetchall() for row in results: print(f"ID: {row[0]}, Content: {row[1]}, Similarity: {row[2]:.4f}") cur.close() conn.close() ``` - **输出示例**:可能返回与 "Database tutorial" 相似的文档,相似度值接近 1 表示高度相关。 #### 总结 使用 pgvector 进行向量相似度计算,只需简单几步:安装插件、创建表、插入向量数据,并利用内置函数执行查询。pgvector 集成了 PostgreSQL 的事务和 ACID 特性,适合生产环境。对于性能敏感场景,务必使用索引(如 HNSW)。如果您遇到问题,参考 pgvector 的 [GitHub 文档](https://github.com/pgvector/pgvector) 获取最新信息[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值