项目:构建你的第一个向量搜索系统
是时候应用你所学的知识了。你将从零开始创建一个完整、可用的向量搜索系统。
你的任务
构建一个功能性的向量搜索系统,演示核心概念:集合(collections)、点(points)、相似性搜索和过滤。你将设计简单的4维向量,代表不同的概念或项目。
预计时间: 30分钟
您将构建什么
一个可工作的搜索系统,包含:
- 一个包含4维向量和余弦距离的集合
- 5-10个带有手动创建向量和有意义的负载的点
- 基本的相似性搜索以查找最近邻
- 结合相似性和负载条件的过滤搜索
设置
先决条件
- Qdrant 云集群(URL + API 密钥)
- Python 3.9+ (或Colab)
- 所需包:
qdrant-client。
模型
- 无。我们将手动创建向量。
数据集
- 无。我们将创建自己的数据点。
在创建数据之前,请决定向量中四个维度各自代表什么。这是向量搜索的创造性部分!
示例思路
- 产品类别:创建向量,其中每个维度代表一个特征(价格承受力、质量、流行度、创新性)。电子产品可能是
[0.8, 0.7, 0.9, 0.6],而书籍可能是[0.3, 0.9, 0.4, 0.8]。 - 调色板:每个维度代表一种颜色(红色、绿色、蓝色)。亮红色:
[0.9, 0.1, 0.1],森林绿:[0.1, 0.8, 0.2]。 - 数据类型:维度的结构、大小、复杂性、频率。电子表格:
[0.9, 0.6, 0.3, 0.7],图像:[0.2, 0.8, 0.5, 0.4]。 - 电影类型:动作、剧情、喜剧、科幻强度。动作惊悚片:
[0.9, 0.3, 0.1, 0.7],浪漫喜剧:[0.1, 0.6, 0.9, 0.2]。
在本教程中,我们将使用产品类别概念。
构建步骤
步骤 1:初始化客户端
from qdrant_client import QdrantClient, models
import os
client = QdrantClient(url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY"))
# For Colab:
# from google.colab import userdata
# client = QdrantClient(url=userdata.get("QDRANT_URL"), api_key=userdata.get("QDRANT_API_KEY"))
第二步:创建集合
collection_name = "day0_first_system"
client.create_collection(
collection_name=collection_name,
vectors_config=models.VectorParams(size=4, distance=models.Distance.COSINE),
)
# Create payload index right after creating the collection and before uploading any data to enable filtering.
# If you add it later, HNSW won't rebuild automatically—bump ef_construct (e.g., 100→101) to trigger a safe rebuild.
client.create_payload_index(
collection_name=collection_name,
field_name="category",
field_schema=models.PayloadSchemaType.KEYWORD,
)
第三步:插入点
我们使用虚拟嵌入。
points=[
models.PointStruct(
id=1,
vector=[0.9, 0.1, 0.1, 0.8], # High affordability, high innovation
payload={"name": "Budget Smartphone", "category": "electronics", "price": 299},
),
models.PointStruct(
id=2,
vector=[0.2, 0.9, 0.8, 0.5], # High quality, high popularity
payload={"name": "Bestselling Novel", "category": "books", "price": 19},
),
models.PointStruct(
id=3,
vector=[0.8, 0.3, 0.2, 0.9], # High affordability, high innovation (similar to ID 1)
payload={"name": "Smart Home Hub", "category": "electronics", "price": 89},
),
# Add 2-5 more points to experiment with...
]
client.upsert(collection_name=collection_name, points=points)
第五步:测试搜索
# Define a query vector for "affordable and innovative"
query_vector = [0.85, 0.2, 0.1, 0.9]
# 1. Basic similarity search
basic_results = client.query_points(collection_name, query=query_vector)
# 2. Filtered search (only find electronics)
filtered_results = client.query_points(
collection_name,
query=query_vector,
query_filter=models.Filter(
must=[models.FieldCondition(key="category", match=models.MatchValue(value="electronics"))]
),
)
print("Filtered search results:", filtered_results)
成功标准
你将在以下情况下知道你已成功:
集合创建无误
搜索返回按相似性分数排序的结果
过滤搜索有效并返回适当的子集
你能解释为什么某些项目比其他项目更相似
分享你的发现
步骤 1:反思你的发现
对于一个新概念(非产品类别概念),运行上述代码并执行以下操作:
- 向量含义:你的四个维度分别代表什么?
- 查询和结果:选择一个你尝试过的查询向量。哪些项目是最佳匹配,为什么这基于你的向量设计是有意义的?
- 过滤:添加过滤器如何改变你的结果?
- 惊喜:结果是否有任何意想不到的地方?(例如,“一个维度上的微小变化对分数影响很大”)
步骤 2:发布你的结果
展示你构建的内容并与他人比较。将你的结果发布在 ,使用这个简短的模板——复制、填写并发送:
**[Day 0] Building Your First Vector Search System**
**High-Level Summary**
- **Domain:** “I built a vector search for [topic]”
- **Key Finding:** “[one sentence on what your vectors captured well]”
**Project-Specific Details**
- **Vector meaning:** d1=…, d2=…, d3=…, d4=…
- **Collection:** day0_first_system (Cosine), points: [count]
- **Query vector:** [a, b, c, d]
- **Top matches (id → score):**
1) [id] → [score]
2) [id] → [score]
3) [id] → [score]
- **Filter used:** category=electronics
- **Filtered result:** [ids returned]
**Why these matched**
- [brief note about direction in 4D space]
**Surprise**
- “[one thing you didn’t expect]”
**Next step**
- “[what you’ll try tomorrow]”
故障排除
过滤搜索没有结果?如果没有向量满足过滤条件,Qdrant将返回一个空结果集。尝试调整你的过滤值或检查你的负载数据。
集合已存在?使用client.delete_collection(collection_name)删除它,然后重新创建。
向量维度不匹配?确保所有向量的维度数量与集合配置中指定的完全相同。
连接问题?验证你的Qdrant Cloud凭据并确保你的集群正在运行。
恭喜!🎉 你已完成第0天!