RAG - Data Processing
数据存储
- LLM 变成生产力,有两个制约因素 - 交互过程中的长文本 + 内容的实时更新
- 在传统的应用开发中,数据存储在数据库中,保留了应用的全部记忆
- 在 AI 时代,向量数据库充当了这一角色
- 在 RAG 系统中,数据被转换为高维向量形式,使得语言模型能够进行高效的语义相似度计算和检索
- 在向量数据库中,查找变成了计算每条记录的向量近似度,然后按照分值倒序返回结果
- RAG 就如何存储向量的方法论,根据不同的实现策略,衍生出了不同的 RAG 技术
- 利用图结构表示和检索知识的 GraphRAG
- 结合知识图谱增强生成能力的 KG-RAG - Knowledge Graph Augmented Generation
- AI 应用的数据建模强调的是数据的语义表示和关联,以支持更灵活的查询和推理
- 高质量的数据处理,不仅影响检索的准确性,还直接决定了 LLM 生成内容的质量和可靠性
Embedding
- 将所有内容转成文本 + 额外数据(用来关联数据)
- 选择一个 Embedding 模型,把文本转成向量,并存储到向量数据库中
厂商 | LLM | Embedding | 国产 |
---|---|---|---|
百度 | 文心一言 | Embedding-V1 bge-large-zh bge-large-en tao-8k |
|
阿里 | 通义千问 | text-embedding-v1 text-embedding-async-v1 text-embedding-v2 text-embedding-async-v2 |
Y |
智谱 | ChatGLM | Embedding-3 Embedding-2 |
Y |
OpenAI | GPT 系列 | text-embedding-3-small text-embedding-3-large text-embedding-ada-002 |
N |
Cohere | Cohere | embed-english-v3.0 embed-multilingual-v3.0 embed-english-light-v3.0 embed-multilingual-light-v3.0 |
N |
向量数据库
名称 | 开源 | 分布式部署 | 语言 | 特性 |
---|---|---|---|---|
Pinecone | 否 | 是 | Python / Go | 托管服务,专注高效相似性搜索 支持实时查询和扩展 |
Faiss | 是 | 是 | C++ / Python | A library for efficient similarity search and clustering of dense vectors. |
Milvus | 是 | 是 | C++ / Go / Python | 开源 + 支持大规模向量搜索 支持混合搜索和组件级扩展 |
Qdrant | 是 | 是 | Rust | 高效语义搜索 + 实时更新 丰富的过滤支持 |
Weaviate | 是 | 是 | Go | 云原生 + 支持 AI 搜索 GraphQL 接口 + 灵活的模式管理 |
Chroma | 是 | 是 | Python | AI 应用优化,灵活 API 支持 数据管理简便 |
- 向量数据库是一种专门为存储、管理和查询高维向量数据而设计的数据库
- 向量数据库,在数据库里存一个固定长度的向量,每个元素都是小数
- 查询参数也是一个向量,执行查询时,计算两个向量的距离,然后按照距离倒排,找到最近的记录
Qdrant
概述
Vector Search Engine for the next generation of AI applications
- Qdrant (read: quadrant) is a vector similarity search engine and vector database.
- It provides a production-ready service with a convenient API to store, search, and manage points—vectors with an additional payload
- Qdrant is tailored to extended filtering support.
- It makes it useful for all sorts of neural-network or semantic-based matching, faceted search, and other applications.
- Qdrant is written in Rust 🦀, which makes it fast and reliable even under high load.
- With Qdrant, embeddings or neural network encoders can be turned into full-fledged applications for matching, searching, recommending, and much more!
- API - REST / gRPC
距离
Algorithm | Desc |
---|---|
余弦相似度 | 适用于比较向量的方向,不考虑向量的大小 - 文本相似度、信息检索 |
欧式距离 | 适用于度量两点之间的直线距离,考虑向量的大小和方向 - 几何计算、图像处理等 |
点积 | 适用于度量向量的相对位置和方向 - 线性代数和信号处理等离散数据计算 |
曼哈顿距离 | 适用于度量两点之间的网格距离,适合网格状或离散空间 - 路径规划、特征工程等 |
架构
数据处理
- 开发者针对文档等资料进行整理和分割,通过 Embedding 模型计算出 Chunk 向量
- 然后将向量和向量关联的数据(Playload)写入到 Qdrant
数据查询
- 应用通过 SDK 或者接口访问 Qdrant
- 通过查询参数(向量+字段),在向量数据库中找到向量距离最近的记录
- 按照距离排序后,返回给应用,应用拿到对应记录,通过 Playload 继续后续的操作
基本概念
- Collections
- 类似于 MySQL 中的表,里面存储实际的记录
- Points
- 类似于 MySQL 中的记录,由 3 部分组成
- idx - 唯一 ID
- vector - 固定长度的向量,在创建 Collection 时,已经确定
- playload - JSON 对象,核心数据
- Storage
- vector 和 playload 会分开存储,通过 payload 索引进行关联
- 为了保证数据完整,Qdrant 使用 WAL 两阶段提交 - Write-Ahead Logging
- vector 存储
- InMemory - 所有数据都会被加载到内存,超高性能,只有在需要持久化时才会写入磁盘
- Memmap - 内存映射文件,创建一个文件关联到虚拟内存地址
- playload 存储
- InMemory
- OnDisk - 直接存储到内置的 RocksDB 中
- vector 和 playload 会分开存储,通过 payload 索引进行关联
实践经验
- 向量数据库处于高速发展阶段,需要持续关注
- 向量是没办法修改的,在测试阶段,不要全量写入,节省 Embedding 费用
- 如果文本的切片规则发生变动的话,也会涉及到全量 Collection 更新 - 高成本
- Collection 的向量维度要与 Embedding 模型保持一致
- Payload 中可以自定义数据
- 但不要在 Payload 中存储长文本,只存放关键的 ID 数据,确定性的信息使用传统数据库
- Qdrant # write_consistency_factor
- 副本数量 - 需要平衡一致性和性能 - 类似于 Kafka
- 为了通用性,传入的长文本,统一抽象为 document,而文档拆分后的块统一抽象为 node
- 数据自动更新 + 质量监控(剔除低效数据)
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.