• 大模型向量去重的N种解决方案!

大模型向量去重的N种解决方案!

2025-06-05 00:00:03 栏目:宝塔面板 31 阅读

简单来说,“向量”Vector 是大模型(LLM)在搜索时使用的一种“技术手段”,通过向量比对,大模型能找出问题的相关答案,并且进行智能回答。

向量简介

Vector 是向量或矢量的意思,向量是数学里的概念,而矢量是物理里的概念,但二者描述的是同一件事。

定义:向量是用于表示具有大小和方向的量。

向量可以在不同的维度空间中定义,最常见的是二维和三维空间中的向量,但理论上也可以有更高维的向量。例如,在二维平面上的一个向量可以写作 (x,y),这里 x 和 y 分别表示该向量沿两个坐标轴方向上的分量;而在三维空间里,则会有一个额外的 z 坐标,即 (x,y,z)。

例如,有以下 4 种狗,我们要在大模型中如何表示它们呢:

我们就可以使用向量来表示,如下图所示:

向量关系图:

向量数据库

定义:向量数据库是一种专门用于存储、管理和检索向量数据(即高维数值数组)的数据库系统。其核心功能是通过高效的索引结构和相似性计算算法,支持大规模向量数据的快速查询与分析。

向量数据库以向量为基本存储单元,这些向量通常由文本、图像、音频等非结构化数据通过深度学习模型(如 Embedding 技术)转换而来,每个向量代表对象在多维空间中的特征。例如,一段文本可转化为 512 维的浮点数向量,用于表示其语义信息。

向量数据库维度越高,查询精准度也越高,查询效果也越好。

常用向量数据库

Java 领域常用的向量数据库有:

  • Redis Stack:原有 Redis 服务升级之后就可以用来存储向量数据。
  • Elastic Search
  • Milvus:一款开源的高性能向量数据库,专为存储、索引和检索大规模向量数据而设计。它可以实现万亿级向量的毫秒级相似性搜索。

向量数据去重

向量数据库去重通常是在添加时进行判断,它主要实现方式有以下几种:

  • 基于向量相似度去重。
  • 基于 Redis 唯一键去重。
  • 使用 Redis SetNX 去重。
  • 基于 Redis Set 数据结构去重。

具体实现如下。

1.基于向量相似度去重

原理:在插入前计算新向量与已有向量的余弦相似度,若超过阈值(如 0.95)则视为重复。

EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
    .queryEmbedding(newEmbedding)
    .maxResults(1)
    .minScore(0.95) // 相似度阈值
    .build();
List> matches = embeddingStore.search(request);
if (matches.isEmpty()) {
    embeddingStore.add(newEmbedding, textSegment);
}

优点:语义级去重,适合文本内容相似但表述不同的场景。

缺点:存在线程安全问题,多任务同时执行,可能导致插入重复数据。

2.基于 Redis 唯一键去重

原理:使用文本内容的哈希值(如 MD5)作为 Redis Key 的一部分,确保唯一性。

String textHash = DigestUtils.md5Hex(textSegment.text());
String redisKey = "embedding:" + textHash;
if (!redisTemplate.hasKey(redisKey)) {
    embeddingStore.add(newEmbedding, textSegment);
    redisTemplate.opsForValue().set(redisKey, "1");
}

优点:性能高,适合完全相同的文本内容。

缺点:存在线程安全问题,多任务同时执行,可能导致插入重复数据。

3.使用 Redis SetNX 去重

原理:使用 Redis 的 SETNX(set if not exists)命令,避免非原子性问题,它是先判断才插入,如果已经存在就不再插入了。

具体实现代码如下:

// 生成文本的唯一哈希(如 MD5)
String textHash = DigestUtils.md5Hex(textSegment.text());
String redisKey = "vector:" + textHash;
// 判断是否存在
Boolean isSet = redisTemplate.opsForValue()
    .setIfAbsent(redisKey, "1");
if (Boolean.TRUE.equals(isSet)) {
    // 键不存在,保存向量数据
    embeddingStore.add(embedding, textSegment);
} else {
    // 键已存在,跳过或报错
    throw new RuntimeException("重复数据");
}

优点:性能高,不存在线程安全问题。

4.基于 Redis Set 数据结构去重

原理:Set 去重,将向量 ID 或文本哈希存入 Redis Set,插入前检查是否存在。

// 生成文本的唯一哈希(如 MD5)
String textHash = DigestUtils.md5Hex(textSegment.text());
if (redisTemplate.opsForSet().add("unique_embeddings", textHash) == 1) {
    embeddingStore.add(newEmbedding, textSegment);
}

优点:简单高效,不存在线程安全问题。

缺点:需维护额外的 Set 数据结构。

小结

向量数据库去重一定是生产环境要做的事,它的解决方案也有很多,通常我们会选择一种高效、且没有线程安全的解决方案,例如 Redis SetNX 或 Set 数据结构来解决。

本文地址:https://www.yitenyun.com/264.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL 数据同步 ACK Web 应用 异步数据库 双主架构 循环复制 Deepseek 宝塔面板 Linux宝塔 Docker 生命周期 JumpServer JumpServer安装 堡垒机安装 Linux安装JumpServer 序列 核心机制 esxi esxi6 root密码不对 无法登录 web无法登录 Windows Windows server net3.5 .NET 安装出错 宝塔面板打不开 宝塔面板无法访问 SSL 堡垒机 跳板机 HTTPS 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 Windows宝塔 Mysql重置密码 无法访问宝塔面板 HTTPS加密 连接控制 机制 ES 协同 Oracle 处理机制 Serverless 无服务器 语言 OB 单机版 scp Linux的scp怎么用 scp上传 scp下载 scp命令 Spring SQL 动态查询 技术 存储 缓存方案 缓存架构 缓存穿透 分页查询 索引 运维 架构 InnoDB 日志文件 MIXED 3 Rsync 响应模型 修改DNS Centos7如何修改DNS RocketMQ 长轮询 配置 监控 Redis 电商 系统 HexHub MySQL 9.3 Linux 安全 服务器 聚簇 非聚簇 异步化 防火墙 黑客 sftp 服务器 参数 自定义序列化 查询 数据 主库 group by SQLark PostgreSQL 管理口 数据库锁 开源 存储引擎 线上 库存 预扣 业务 人工智能 向量数据库 推荐系统 SQLite-Web SQLite 数据库管理工具 Doris SeaTunnel MVCC R edis 线程 工具 共享锁 PG DBA 网络架构 网络配置 Ftp 加密 场景 流量 数据备份 信息化 智能运维 B+Tree ID 字段 • 索引 • 数据库 RDB AOF Redis 8.0 AI 助手 redo log 重做日志 Canal ​Redis 机器学习 推荐模型 Python 优化 万能公式 缓存 高可用 GreatSQL 连接数 Postgres OTel Iceberg INSERT COMPACT 核心架构 订阅机制 同城 双活 网络故障 云原生 Hash 字段 IT运维 微软 SQL Server AI功能 prometheus Alert 不宕机 自动重启 Web 大模型 SVM Embedding 高效统计 今天这篇文章就跟大家 向量库 Milvus OAuth2 Token Netstat Linux 服务器 端口 引擎 性能 虚拟服务器 虚拟机 内存 Entity 开发 分库 分表 DBMS 管理系统 MongoDB 容器 sqlmock LRU 崖山 新版本 ZODB Undo Log 单点故障 窗口 函数 mini-redis INCR指令 JOIN openHalo 数据集成工具 容器化 SpringAI 分布式 集中式 悲观锁 乐观锁 排行榜 排序 磁盘架构 Redisson 锁芯 QPS 高并发 Testcloud 云端自动化 Redka 数据脱敏 加密算法 Recursive PostGIS 启动故障 大表 业务场景 分页 数据结构 EasyExcel MySQL8 分布式架构 分布式锁​ Pottery 聚簇索引 非聚簇索引 数据类型 模型 原子性 StarRocks 数据仓库 意向锁 记录锁 AIOPS R2DBC InfluxDB 1 事务 Java SSH IT Caffeine CP MCP 开放协议 网络 dbt 数据转换工具 RAG HelixDB 工具链 发件箱模式 池化技术 连接池 Web 接口 部署 filelock 数据分类 字典 传统数据库 向量化 对象 速度 服务器中毒 读写 Go 数据库迁移 事务隔离 仪表盘 双引擎 频繁 Codis 分页方案 排版 数据页 优化器 单线程 线程安全 Order LLM Crash 代码 订单 事务同步 List 类型 UUIDv7 主键 日志 Pump Ansible