以下是针对 RAG 开发中不同向量数据的读取和存储的详细分析和实现,基于当前时间(2025 年 3 月 12 日,太平洋夏令时晚上 10:42)的研究和实践。
背景与需求分析
在 AI 的检索增强生成(RAG)开发中,向量数据通常指文本或其他模态数据的嵌入表示,用于相似性搜索和信息检索。向量数据的读取和存储是 RAG 管道的关键步骤,涉及从文件或数据库读取预计算的嵌入,并将其高效存储到向量数据库中以支持后续检索。
用户可能需要处理不同来源或不同维度的向量数据,例如来自 OpenAI 嵌入模型(通常 1536 维)或 SentenceTransformer 模型(可能 384 维)的嵌入。存储时,需要确保向量数据库能够处理这些差异,并保持检索效率。

完整代码
import json
from collections import defaultdict
import pinecone
from chromadb import Client
defread_vector_data(file_path):
"""
从 JSON 文件读取向量数据。
JSON 文件应包含一个字典列表,每个字典有 'text' 和 'vector' 键。
参数:
file_path (str): JSON 文件路径。
返回:
list: 包含 'text' 和 'vector' 的字典列表。
"""withopen(file_path, 'r') as f:
data = json.load(f)
return data
defstore_in_pinecone(data):
"""
将向量数据存储到 Pinecone,按向量维度分组。
每个相同维度的向量组存储在单独的索引中。
参数:
data (list): 包含 'text' 和 'vector' 的字典列表。
"""# 初始化 Pinecone# 请确保设置您的 Pinecone API 密钥和环境 pinecone.init(
api_key="your_pinecone_api_key",
environment="your_pinecone_environment" )
# 按向量维度分组数据 dimension_groups = defaultdict(list)
for item in data:
dim = len(item['vector'])
dimension_groups[dim].append(item)
# 为每个组创建并存储到单独的索引for dim, group in dimension_groups.items():
index_name = f"index_{dim}"if index_name notin pinecone.list_indexes():
pinecone.create_index(
index_name,
dimension=dim,
metric="cosine" )
index = pinecone.Index(index_name)
ids = [str(i) for i inrange(len(group))]
vectors = [item['vector'] for item in group]
metadatas = [{'text': item['text']} for item in group]
index.upsert(vectors=vectors, ids=ids, metadatas=metadatas)
defstore_in_chroma(data):
"""
将向量数据存储到 Chroma,按向量维度分组。
每个相同维度的向量组存储在单独的集合中。
参数:
data (list): 包含 'text' 和 'vector' 的字典列表。
""" client = Client()
# 按向量维度分组数据 dimension_groups = defaultdict(list)
for item in data:
dim = len(item['vector'])
dimension_groups[dim].append(item)
# 为每个组创建并存储到单独的集合for dim, group in dimension_groups.items():
collection_name = f"collection_{dim}" collection = client.get_or_create_collection(name=collection_name)
ids = [str(i) for i inrange(len(group))]
embeddings = [item['vector'] for item in group]
metadatas = [{'text': item['text']} for item in group]
collection.add(
embeddings=embeddings,
metadatas=metadatas,
ids=ids
)
# 示例用法file_path = Path('testdata') / 'vector_data.json'data = read_vector_data(file_path)
store_in_pinecone(data)
store_in_chroma(data)
向量数据
其中,向量数据通常是文本或其他模态数据的嵌入表示,用于相似性搜索和信息检索。vector_data.json 文件是存储这些嵌入数据的一种常见格式,方便从本地文件读取并导入向量数据库,如 Pinecone 和 Chroma。文件应包含文本及其对应向量的映射,格式为 JSON,方便 Python 代码处理。
文件格式与结构
vector_data.json 文件应是一个 JSON 数组,每个元素是一个字典,包含以下键:
- “text”:一个字符串,表示原始文本内容。
- “vector”:一个浮点数列表,表示该文本的向量嵌入。
向量嵌入通常由嵌入模型生成,例如 OpenAI 的 text-embedding-ada-002(1536维)或 Hugging Face 的 SentenceTransformer 模型(常见384维)。每个向量的维度取决于所用模型,实际应用中可能有数百到数千维。
统一维度示例
[
{
"text": "这是一个示例句子。",
"vector": [0.123456789, 0.234567890, 0.345678901]
},
{
"text": "另一个演示句子。",
"vector": [0.456789012, 0.567890123, 0.678901234]
},
{
"text": "机器学习很有趣。",
"vector": [0.789012345, 0.890123456, 0.901234567]
}
]
- 特点:所有向量维度一致,代码会创建单一索引或集合,适合大多数 RAG 应用。
- 适用场景:使用同一嵌入模型(如 OpenAI 的 text-embedding-ada-002)生成嵌入。
混合维度示例
[
{
"text": "2维向量的文本。",
"vector": [0.1234567890, -0.9876543210]
},
{
"text": "3维向量的文本。",
"vector": [0.4567890123, 0.5678901234, -0.6789012345]
},
{
"text": "4维向量的文本。",
"vector": [0.7890123456, -0.2345678901, 0.3456789012, -0.8765432109]
}
]
- 特点:代码会按维度分组(如2维、3维、4维),创建多个索引或集合,适合混合来源的嵌入。
- 适用场景:使用不同嵌入模型或不同版本模型,维度不一致。

功能与竞争对比
以下表格比较了 Pinecone 和 Chroma 在 RAG 开发中的主要特性:
平台 | 主要功能 | 存储方式 | 适合场景 |
Pinecone | 云端向量数据库,高效检索 | 按索引存储,需 API 密钥 | 大规模分布式系统 |
Chroma | 本地或云端向量数据库,易部署 | 按集合存储,无需额外密钥 | 小型项目或本地开发 |
RA/SD 衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/ai%e6%95%99%e6%88%91%e5%81%9a%e4%ba%8b%e4%b9%8brag%e5%bc%80%e5%8f%91-17-rag%e4%b8%ad%e4%b8%8d%e5%90%8c%e7%9a%84%e5%90%91%e9%87%8f%e6%95%b0%e6%8d%ae%e5%ba%93%e7%9a%84%e6%93%8d%e4%bd%9c%e8%83%8c/