从Excel到向量数据库:使用Chroma构建高效数据检索系统的入门指南

1次阅读
没有评论

共计 2596 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景痛点:为什么需要向量数据库

Excel 作为传统数据处理工具,在处理复杂查询和语义搜索时存在明显瓶颈:

从 Excel 到向量数据库:使用 Chroma 构建高效数据检索系统的入门指南

  • 模糊匹配能力弱:VLOOKUP 等函数只能进行精确匹配,无法实现相似性搜索
  • 语义理解缺失:无法识别 ” 汽车 ” 和 ” 机动车 ” 这类语义相近词
  • 性能下降快:数据量超过 10 万行时,公式计算和筛选操作响应显著变慢
  • 多维度检索困难:难以同时基于价格、描述、评论等多特征进行联合搜索

技术选型:为什么选择 Chroma

对比主流向量数据库解决方案:

  1. FAISS
  2. 优势:Facebook 开源的超高速相似性搜索库
  3. 不足:需要自行搭建服务,缺乏现成的数据管理接口

  4. Pinecone

  5. 优势:全托管服务,自动处理扩展和运维
  6. 不足:商业产品存在费用门槛,免费版有功能限制

  7. Chroma

  8. 本地 / 服务端灵活部署
  9. 简洁的 Python API 接口
  10. 内置持久化存储支持
  11. 轻量级(安装包仅 3MB)

核心实现步骤

数据预处理:从 Excel 到干净文本

典型 Excel 数据问题处理方案:

  • 合并多列文本内容(如产品名称 + 描述)
  • 处理缺失值:df.fillna('')
  • 统一字符编码:df.apply(lambda x: x.encode('utf-8').decode('utf-8'))
  • 去除特殊符号:re.sub(r'[^\w\s]', '', text)

文本向量化策略

推荐两种适合初学者的方案:

  1. Sentence-Transformers 预训练模型

    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
    embeddings = model.encode(texts)

  2. OpenAI Embedding API(需 API Key)

    import openai
    response = openai.Embedding.create(input=texts, model="text-embedding-ada-002")
    embeddings = [item['embedding'] for item in response['data']]

Chroma 数据库初始化

完整初始化示例:

import chromadb

# 创建内存数据库
client = chromadb.Client()

# 创建集合(相当于表)collection = client.create_collection("products")

# 添加数据
collection.add(documents=["智能手机", "笔记本电脑", "无线耳机"],  # 原始文本
    ids=["id1", "id2", "id3"],  # 唯一标识
    embeddings=[[0.1, 0.2,...], [0.3, 0.4,...], ...]  # 向量数据
)

完整代码示例

import pandas as pd
from sentence_transformers import SentenceTransformer
import chromadb
import re

# 1. 数据加载与清洗
df = pd.read_excel("products.xlsx")
df['combined'] = df['名称'] + "" + df[' 描述 ']
df['cleaned'] = df['combined'].apply(lambda x: re.sub(r'[^\w\s]', '', str(x))
)

# 2. 文本向量化
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
embeddings = model.encode(df['cleaned'].tolist())

# 3. 构建向量数据库
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.create_collection("products")

# 批量添加数据
collection.add(ids=[str(i) for i in df.index],
    documents=df['cleaned'].tolist(),
    embeddings=embeddings.tolist())

# 4. 查询示例
results = collection.query(query_texts=["适合打游戏的电脑"],
    n_results=3
)
print("最匹配的结果:", results['documents'][0])

性能测试数据

使用不同数据规模的测试结果(CPU: i7-11800H):

数据量 构建时间 查询延迟
1,000 8.2s 42ms
10,000 1.5min 65ms
100,000 15min 110ms

常见问题解决

中文处理异常
– 确保使用支持多语言的模型(如 paraphrase-multilingual 系列)
– 检查文件编码:with open('file.txt', 'r', encoding='utf-8')

特殊字符报错
– 添加预处理步骤:text.replace('\x00', '')
– 使用正则过滤:re.sub(r'[^\u4e00-\u9fa5\w\s]', '', text)

向量维度不匹配
– 确认模型输出维度与 Chroma 设置一致
– 检查 embeddings[0].shapecollection.metadata['dimension']

进阶优化建议

  1. 索引优化
  2. 使用 HNSW 索引提升搜索速度:

    collection = client.create_collection(
        "products",
        metadata={"hnsw:space": "cosine"}
    )

  3. 生产部署

  4. 使用 Docker 运行服务端:
    docker run -p 8000:8000 chromadb/chroma
  5. 客户端连接:

    client = chromadb.HttpClient(host="localhost", port=8000)

  6. 结合 LLM 扩展

  7. 将查询结果输入 GPT 生成自然语言回答
  8. 使用 LangChain 构建端到端问答系统

总结与展望

通过本教程,我们实现了从 Excel 数据到功能完善的向量数据库的转化过程。Chroma 以其简洁的 API 和适中的性能表现,成为中小规模语义搜索应用的理想选择。后续可探索将检索系统与业务工作流结合,如自动生成产品推荐说明、构建智能客服知识库等场景。

正文完
 0
评论(没有评论)