快捷方式

快速入门

我们将在此介绍以下内容

安装

  1. 使用 fastembed 安装

  2. 不使用 fastembed 安装

向量化、插入和查询

  1. 使用 fastembed 的 addquery

  2. 不使用 fastembed 的 Qdrant:点、upsert 和查询

安装

使用 fastembed 安装

Qdrant 的 Python 客户端附带 FastEmbed,这是一个可选依赖项,用于文本向量化,而无需处理

[1]:
!pip install 'qdrant-client[fastembed]' --quiet

初始化客户端

我们支持 3 种生产选项

  1. Qdrant 云服务 - 推荐用于开始使用

  2. 通过您的云提供商进行 Qdrant 托管部署 - 推荐用于企业

  3. 通过 Docker 自托管 Qdrant - 推荐用于有特定要求的人

此外,Python 客户端在 :memory: 模式下封装了 numpy,这有助于熟悉客户端语法。

[2]:
from qdrant_client import QdrantClient

# client = QdrantClient(path="path/to/db")  # Persists changes to disk
# or
client = QdrantClient(":memory:")

向量化、插入和查询

我们将使用 FastEmbed 库进行文本向量化,而无需处理向量化模型。

向量化和插入

为了方便起见,我们将 Point 的创建和插入封装到一个 API 中:add

[3]:
# Prepare your documents, metadata, and IDs
docs = ["Qdrant has Langchain integrations", "Qdrant also has Llama Index integrations"]

client.add(
    collection_name="demo_collection",
    documents=docs,
)
[3]:
['a3e23385a815464385a7589443f850db', 'd5bef7146f1541518cd767313f6569d5']

如果您想添加对元数据有控制的点,可以使用 metadata 参数。这里有一个快速示例

[4]:
# Prepare your documents, metadata, and IDs
docs = ["Qdrant has Langchain integrations", "Qdrant also has Llama Index integrations"]
metadata = [
    {"source": "Langchain-docs"},
    {"source": "Linkedin-docs"},
]
ids = [42, 2]

# Use the new add method
client.add(
    collection_name="demo_collection",
    documents=docs,
    metadata=metadata,
    ids=ids
)
[4]:
[42, 2]

直接通过文本查询

在查询时,我们需要对输入的查询进行向量化,然后搜索最近的邻居。我们可以使用 query API 来实现这一点

[5]:
search_result = client.query(
    collection_name="demo_collection",
    query_text="This is a query document",
    limit=1
)
print(search_result)
[QueryResponse(id=42, embedding=None, metadata={'document': 'Qdrant has Langchain integrations', 'source': 'Langchain-docs'}, document='Qdrant has Langchain integrations', score=0.8276550115796268)]

不使用 fastembed 的 Qdrant

集合

集合是一组具有相同维度并定义了相似性指标(例如 Dot、Cosine)的点。我们可以使用 create_collection 方法创建一个集合

[6]:
from qdrant_client.http.models import Distance, VectorParams

if not client.collection_exists("test_collection"):
    client.create_collection(
            collection_name="test_collection",
            vectors_config=VectorParams(size=4, distance=Distance.DOT),
    )
[6]:
True

请注意,使用 fastembed 时我们不必显式创建集合:如果集合已存在,我们在使用 add 时会更新它或创建一个新的。

点是带有唯一标识符 id 的浮点向量。我们可以使用 Point API 创建一个点

[7]:
from qdrant_client.http.models import PointStruct

operation_info = client.upsert(
    collection_name="test_collection",
    wait=True,
    points=[
        PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
        PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
        PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
        PointStruct(id=4, vector=[0.18, 0.01, 0.85, 0.80], payload={"city": "New York"}),
        PointStruct(id=5, vector=[0.24, 0.18, 0.22, 0.44], payload={"city": "Beijing"}),
        PointStruct(id=6, vector=[0.35, 0.08, 0.11, 0.44], payload={"city": "Mumbai"}),
    ]
)
print(operation_info)
operation_id=0 status=<UpdateStatus.COMPLETED: 'completed'>

使用 add API 也对这种 Points 的创建进行了抽象。

通过向量查询

[8]:
search_result = client.search(
    collection_name="test_collection",
    query_vector=[0.18, 0.81, 0.75, 0.12],
    limit=1
)
print(search_result)
[ScoredPoint(id=2, version=0, score=1.2660000014305115, payload={'city': 'London'}, vector=None)]

通过筛选器和向量查询

[9]:
from qdrant_client.http.models import Filter, FieldCondition, MatchValue

search_result = client.search(
    collection_name="test_collection",
    query_vector=[0.2, 0.1, 0.9, 0.7],
    query_filter=Filter(
        must=[
            FieldCondition(
                key="city",
                match=MatchValue(value="London")
            )
        ]
    ),
    limit=1
)
print(search_result)
[ScoredPoint(id=2, version=0, score=0.8709999993443489, payload={'city': 'London'}, vector=None)]

Qdrant

了解更多关于 Qdrant 向量搜索项目和生态系统的信息

发现 Qdrant

相似度学习

探索使用相似度学习解决实际问题

学习相似度学习

社区

找到处理类似问题的人并获得答案

加入社区