Calendar 第 0 天

项目:构建你的第一个向量搜索系统

是时候应用你所学的知识了。你将从零开始创建一个完整、可用的向量搜索系统。

你的任务

构建一个功能性的向量搜索系统,演示核心概念:集合(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:发布你的结果

展示你构建的内容并与他人比较。将你的结果发布在 Post your results in Discord ,使用这个简短的模板——复制、填写并发送:

**[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天!