1. 向量数据库与语义搜索基础
在当今信息爆炸的时代,传统的关键词匹配搜索已经难以满足我们对信息检索的精准需求。想象一下,当你在客服知识库中搜索"无法登录账户"时,系统只返回包含这几个字的文档,而忽略了"登录失败"、"账号无法访问"等语义相同但表述不同的内容——这就是传统搜索的局限性。
向量数据库正是为解决这一问题而生的技术。它通过将文本、图像等数据转换为高维向量(通常是由768或1024个数字组成的数组),然后在这些向量空间中进行相似性搜索。这种方法的精妙之处在于,语义相近的内容在向量空间中的位置也会相近,就像在地图上相邻的两个城市。
Weaviate作为一款开源的向量数据库,其核心能力可以概括为:
- 原生支持多种Embedding模型(如OpenAI、HuggingFace等)
- 提供高效的近似最近邻(ANN)搜索算法
- 支持混合搜索(同时结合向量和关键词)
- 具备过滤、聚合等传统数据库功能
提示:选择向量数据库时,需要特别关注其对动态数据更新的支持能力。有些系统在频繁更新数据时性能下降明显,而Weaviate在这方面表现优异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 向量搜索的数学原理
2.1 从文本到向量的转换
文本转换为向量的过程由Embedding模型完成。以句子"系统登录失败"为例,经过Embedding处理后可能变成类似[0.23, -0.45, 0.78, ..., 0.12]的768维数组。这个转换过程背后的神经网络已经捕捉到了文本的深层语义特征。
目前主流的Embedding模型有:
- 通用型:OpenAI的text-embedding-ada-002(1536维)
- 开源型:BAAI的bge-small(384维)和bge-large(1024维)
- 轻量级:Google的Universal Sentence Encoder(512维)
2.2 相似度计算方法
向量间的相似度计算主要有三种方法:
-
余弦相似度:测量向量间角度的余弦值
python复制def cosine_similarity(a, b): dot_product = np.dot(a, b) norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) return dot_product / (norm_a * norm_b) -
欧氏距离:计算向量间的直线距离
python复制def euclidean_distance(a, b): return np.linalg.norm(a - b) -
点积相似度:简单计算向量对应位置乘积之和
python复制def dot_product(a, b): return np.dot(a, b)
在实际应用中,余弦相似度最为常用,因为它对向量长度不敏感,更适合衡量方向相似性。当向量经过归一化处理后,余弦相似度与点积等价。
3. Weaviate的Schema设计与实践
3.1 Schema的核心要素
Weaviate的Schema设计决定了数据如何被组织和检索。一个典型的客服工单Schema应该包含:
python复制schema = {
"class": "ServiceTicket",
"description": "客户服务工单知识库",
"vectorizer": "text2vec-transformers", # 使用内置向量化模型
"moduleConfig": {
"text2vec-transformers": {
"poolingStrategy": "masked_mean",
"vectorizeClassName": False
}
},
"properties": [
{
"name": "ticket_id",
"dataType": ["string"],
"description": "工单唯一标识符"
},
{
"name": "title",
"dataType": ["text"],
"description": "工单标题",
"moduleConfig": {
"text2vec-transformers": {
"skip": False,
"vectorizePropertyName": False
}
}
},
{
"name": "content",
"dataType": ["text"],
"description": "工单详细内容",
"moduleConfig": {
"text2vec-transformers": {
"skip": False,
"vectorizePropertyName": False
}
}
},
{
"name": "category",
"dataType": ["string"],
"description": "工单分类",
"moduleConfig": {
"text2vec-transformers": {
"skip": True # 分类不参与向量化
}
}
}
]
}
3.2 向量化策略选择
Weaviate提供多种向量化策略配置:
-
内置向量化:直接使用Weaviate集成的模型
python复制"vectorizer": "text2vec-transformers" -
外部向量化:使用自定义Embedding模型
pytho复制
