共计 2596 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么需要向量数据库
Excel 作为传统数据处理工具,在处理复杂查询和语义搜索时存在明显瓶颈:

- 模糊匹配能力弱:VLOOKUP 等函数只能进行精确匹配,无法实现相似性搜索
- 语义理解缺失:无法识别 ” 汽车 ” 和 ” 机动车 ” 这类语义相近词
- 性能下降快:数据量超过 10 万行时,公式计算和筛选操作响应显著变慢
- 多维度检索困难:难以同时基于价格、描述、评论等多特征进行联合搜索
技术选型:为什么选择 Chroma
对比主流向量数据库解决方案:
- FAISS
- 优势:Facebook 开源的超高速相似性搜索库
-
不足:需要自行搭建服务,缺乏现成的数据管理接口
-
Pinecone
- 优势:全托管服务,自动处理扩展和运维
-
不足:商业产品存在费用门槛,免费版有功能限制
-
Chroma
- 本地 / 服务端灵活部署
- 简洁的 Python API 接口
- 内置持久化存储支持
- 轻量级(安装包仅 3MB)
核心实现步骤
数据预处理:从 Excel 到干净文本
典型 Excel 数据问题处理方案:
- 合并多列文本内容(如产品名称 + 描述)
- 处理缺失值:
df.fillna('') - 统一字符编码:
df.apply(lambda x: x.encode('utf-8').decode('utf-8')) - 去除特殊符号:
re.sub(r'[^\w\s]', '', text)
文本向量化策略
推荐两种适合初学者的方案:
-
Sentence-Transformers 预训练模型
from sentence_transformers import SentenceTransformer model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') embeddings = model.encode(texts) -
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].shape 与collection.metadata['dimension']
进阶优化建议
- 索引优化
-
使用
HNSW索引提升搜索速度:collection = client.create_collection( "products", metadata={"hnsw:space": "cosine"} ) -
生产部署
- 使用 Docker 运行服务端:
docker run -p 8000:8000 chromadb/chroma -
客户端连接:
client = chromadb.HttpClient(host="localhost", port=8000) -
结合 LLM 扩展
- 将查询结果输入 GPT 生成自然语言回答
- 使用 LangChain 构建端到端问答系统
总结与展望
通过本教程,我们实现了从 Excel 数据到功能完善的向量数据库的转化过程。Chroma 以其简洁的 API 和适中的性能表现,成为中小规模语义搜索应用的理想选择。后续可探索将检索系统与业务工作流结合,如自动生成产品推荐说明、构建智能客服知识库等场景。
