1. 问题背景:单一向量库的局限性
上周我在处理一个线上问题时,遇到一个典型的向量检索场景。用户反馈我们的"找相似文档"功能表现不稳定——有时候能返回预期结果,有时候却完全偏离主题。通过日志分析发现,当用户查询涉及多个专业领域时,系统返回的结果总是偏向某一个特定方向。
深入调查后发现,我们把所有类型的文档(包括技术手册、用户反馈、产品介绍等)都塞进了同一个ChromaDB集合里。这就好比把小说、菜谱和维修手册混放在同一个书架上,然后期望读者能快速找到他们想要的内容。这种设计显然违背了信息组织的基本原则。
关键发现:当不同类型/领域的文档共用单一向量空间时,语义相近但领域不同的内容会产生干扰,导致检索质量下降。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多索引架构设计与实现
2.1 基础方案重构
我们重构后的方案采用了多索引架构,核心思路是根据文档类型建立独立的向量库。以下是基础实现代码:
python复制from langchain.vectorstores import Chroma, FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 初始化嵌入模型
embedding = OpenAIEmbeddings(model="text-embedding-3-small")
# 文档分类处理器
class VectorIndexManager:
def __init__(self):
self.indices = {
'technical': Chroma(embedding_function=embedding),
'feedback': Chroma(embedding_function=embedding),
'marketing': FAISS(embedding_function=embedding)
}
def add_document(self, text, metadata):
# 根据元数据路由到不同
