共计 3184 个字符,预计需要花费 8 分钟才能阅读完成。
为什么需要向量数据库?
传统文本搜索(如 LIKE 查询或倒排索引)在处理语义搜索时存在明显短板:

- 无法理解同义词(” 汽车 ” 和 ” 轿车 ” 被视作完全不同的词)
- 对错别字零容忍(” 苹呆手机 ” 无法匹配 ” 苹果手机 ”)
- 缺乏语义相关性判断(” 如何做蛋糕 ” 与 ” 烘焙教程 ” 明明相关却无法匹配)
向量数据库通过将文本转换为高维向量(通常 300-1536 维),使相似语义的内容在向量空间中距离接近,完美解决了这些问题。
技术选型对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| FAISS | 本地运行,超高性能 | 无托管服务,需自建基础设施 |
| Pinecone | 全托管,开发者友好 | 价格昂贵,企业级功能较少 |
| Azure AI Search | 微软生态集成,混合搜索能力强 | 学习曲线略陡 |
对于需要快速上线、已有 Azure 生态或需要混合搜索(同时使用关键词和向量)的场景,Azure AI Search 是最佳选择。
实战四步曲
1. 服务准备
首先在 Azure 门户创建服务(注意选择标准 S1 以上 SKU 才能使用向量功能):
# 安装最新版 SDK
pip install azure-search-documents==11.4.0b8
2. 索引定义
向量索引需要特殊字段配置,以下是核心字段示例:
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
SearchIndex,
SimpleField,
SearchableField,
SearchFieldDataType,
VectorSearchProfile,
HnswAlgorithmConfiguration,
VectorSearch
)
# 连接配置
service_endpoint = "https://your-service.search.windows.net"
key = "your-admin-key"
index_name = "products-vector-index"
# 定义向量配置
vector_search = VectorSearch(
profiles=[
VectorSearchProfile(
name="my-vector-config",
algorithm_configuration_name="my-algorithms-config"
)
],
algorithms=[
HnswAlgorithmConfiguration(name="my-algorithms-config")
]
)
# 创建索引
fields = [SimpleField(name="id", type=SearchFieldDataType.String, key=True),
SearchableField(name="name", type=SearchFieldDataType.String),
SearchableField(name="description", type=SearchFieldDataType.String),
SearchableField(
name="descriptionVector",
type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
searchable=True,
vector_search_dimensions=1536,
vector_search_profile_name="my-vector-config"
)
]
index = SearchIndex(name=index_name, fields=fields, vector_search=vector_search)
client = SearchIndexClient(service_endpoint, AzureKeyCredential(key))
client.create_index(index)
3. 数据导入
使用批量 API 高效导入数据(注意向量需要提前用模型生成):
from azure.search.documents import SearchClient
from azure.search.documents.models import Vector
# 假设已通过 OpenAI 生成向量
products = [
{
"id": "1",
"name": "智能手机",
"description": "最新款 5G 手机",
"descriptionVector": [0.1, 0.2, ..., 0.8] # 实际应为 1536 维向量
},
# 更多产品...
]
search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))
result = search_client.upload_documents(documents=products)
print(f"上传成功: {len(products)} 条数据")
4. 混合搜索
同时使用关键词和向量进行搜索(这才是真正的威力所在):
from azure.search.documents.models import VectorizableTextQuery
# 关键词搜索部分
search_text = "平价智能手机"
# 向量搜索部分(实时生成查询向量)vector_query = VectorizableTextQuery(
text=search_text,
k_nearest_neighbors=3,
fields="descriptionVector",
exhaustive=True
)
# 执行混合搜索
results = search_client.search(
search_text=search_text,
vector_queries=[vector_query],
select=["id", "name"],
top=5
)
for result in results:
print(f"ID: {result['id']}, 名称: {result['name']}")
性能优化三板斧
- 索引分区
- 按业务维度分索引(如 products_zh / products_en)
-
对超大数据集使用分片(每个索引不超过 1GB)
-
批量写入
- 每次批量提交 100-1000 条(实测 500 条 / 批次效率最高)
-
启用临时存储加速写入(需额外付费)
-
查询调优
- 对精确匹配优先使用 filter
- 向量搜索时合理设置 k_nearest_neighbors(通常 3 -10)
- 必要时牺牲 recall 换取 latency(设置 approximate_neighbors=True)
常见坑点预警
⚠️ 认证失败
错误:403 Forbidden
原因:1. 密钥过期(Azure 密钥默认 180 天过期)2. 权限不足(需要搜索服务管理员权限)⚠️ 维度不匹配
错误:400 Invalid field definition
原因:1. 向量维度与索引定义不符(比如定义 1536 维但传入 512 维)2. 浮点数精度问题(必须使用 float32)⚠️ 费用超标
现象:突然收到高额账单
预防:1. 设置预算警报
2. 测试环境使用基本版(B1)3. 注意存储容量外费用(每 10 万次查询约 $0.10)
思考题
- 在电商场景中,如何设计混合搜索的权重(关键词 vs 向量)?
- 当商品描述有多语言版本时,应该建立统一索引还是分语言索引?
- 对于实时性要求极高的场景(如客服系统),如何平衡索引更新频率和查询性能?
经过一周的实战测试,我们的商品搜索准确率从 62% 提升到了 89%,且开发周期比自建 FAISS 方案缩短了 60%。Azure AI Search 的托管服务确实大幅降低了向量搜索的落地门槛,特别推荐给需要快速实现语义搜索的中大型项目。
正文完
发表至: 技术教程
近一天内
