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

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

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

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