Case 人力资源科技

招聘数据是模糊的,但招聘约束条件不是。

为大规模人才平台提供职位搜索、候选人匹配和推荐系统支持。

result = client.query_points(
    collection_name="jobs",
    prefetch=[
        models.Prefetch(
            query=dense_emb, using="dense",
            ),
        models.Prefetch(
            query=sparse_vec, using="sparse",
            ),
    ],
    query=models.FusionQuery(
        fusion=models.Fusion.RRF),
    query_filter=models.Filter(must=[
         models.FieldCondition(
            key="location",
            match=models.MatchAny(any=["london", "remote"]),
         ),
         models.FieldCondition(
            key="salary_max",
            range=models.Range(gte=60000),
         ),
    ]),
    limit=20,
)
Code
步骤 1

嵌入 - 解析 + 嵌入简历 / 职位描述

Filter
步骤 2

搜索 - 语义搜索 + 严格过滤

List
步骤 3

排名 - 排名 + 重排(可选)

Check
步骤 4

结果 - 基于证据的匹配

Filter 针对招聘约束的先进过滤功能
Rocket 实时匹配速度
Dollar 按规模优化以符合预算
Server 原生推理能力

“Qdrant 是我最不用担心会出问题的地方。”

Elvis Moraa avatar

Elvis Moraa

Pariti 工程负责人

2.4 倍

招聘填充率提升


70%

候选人筛选时间缩短


为什么团队选择 Qdrant

大规模招聘搜索效率低下

许多人力资源科技团队起初并未使用向量搜索。他们选择 Elasticsearch、PGVector 或托管 API,但在产品需要大规模组合过滤、多语言支持或百万级向量下的亚秒级延迟时,往往会遇到瓶颈。这些就是浮现出来的工程难题,也是我们从转向 Qdrant 的团队那里听到的痛点。

Alert
分类体系不一致

“高级软件工程师”、“Staff Dev”和“Lead SWE”可能是同一个职位。关键词搜索会漏掉这些,但语义搜索不会,嵌入(Embedding)可以捕捉到它们。

Alert
带有约束的模糊数据

简历中的技能和职称不一致,但地点、工作许可和认证是严格的硬性约束。你需要对同一个查询同时进行语义相似度搜索和硬性过滤。

客户评价

考虑迁移?

我们的解决方案工程师每周都会与人力资源科技团队进行深入的技术交流。

预约交流

您可以使用 Qdrant 构建什么

Search
现代化职位搜索

通过混合搜索,在现有的关键词/布尔模式之上增加语义相关性。在进行向量相似度搜索的同时应用严格的元数据过滤器,无需承担后过滤带来的性能损失。

Alert
相似职位与候选人

通过混合搜索,在现有的关键词/布尔模式之上增加语义相关性。在进行向量相似度搜索的同时应用严格的元数据过滤器,无需承担后过滤带来的性能损失。

底层原理

针对上述问题的架构模式及 API 示例。

带有硬性招聘约束的语义匹配

嵌入职位描述或简历,然后为不可协商的约束条件应用“必须匹配”的负载过滤器。过滤器在 HNSW 遍历期间应用,而非遍历后,因此召回率不会下降。

查看完整示例
Check
图遍历期间的预过滤

地点、薪资、类别的复合过滤不会导致延迟激增。

Check
混合搜索

在单次查询中结合密集向量 + 稀疏向量,并使用倒数排名融合(RRF)。

Check
原生推理

使用 Qdrant 云推理简化您的数据管道。

# Pattern: hybrid semantic + keyword with filters
# → see docs for complete example
result = client.query_points(
    collection_name="jobs",
    prefetch=[
        models.Prefetch(
            query=dense_emb, using="dense",
            limit=100),
        models.Prefetch(
            query=sparse_vec, using="sparse",
            limit=100),
    ],
    query=models.FusionQuery(
        fusion=models.Fusion.RRF),
    query_filter=models.Filter(must=[
        models.FieldCondition(
            key="location",
            match=models.MatchAny(any=["london", "remote"]),
        ),
        models.FieldCondition(
            key="salary_max",
            range=models.Range(gte=60000),
        ),
    ]),
    limit=20,
)

针对 1000 万+ 向量的量化

标量和二进制量化可将内存中的向量压缩 4-32 倍。适用于 1000 万+ 候选人或职位向量。

查看完整示例
Check
标量量化

在极小的召回率损失下实现 4 倍内存缩减。仅需一个配置标志。

Check
可预测的成本

固定的向量搜索基础设施成本,意味着可在管道的多个阶段进行检索,而不会侵蚀利润空间。

# Pattern: quantized collection for scale
# → see docs for complete example
client.create_collection(
    collection_name="candidates_quantized",
    vectors_config={
        "dense": models.VectorParams(
            size=1536,
            distance=models.Distance.COSINE,
        ),
    },
    sparse_vectors_config={
        "sparse": models.SparseVectorParams(
            modifier=models.Modifier.IDF,
        ),
    },
    quantization_config=models.ScalarQuantization(
        scalar=models.ScalarQuantizationConfig(
            type=models.ScalarType.INT8,
            quantile=0.99,
            always_ram=True,
        )
    ),
)

“相似职位”与候选人发现

使用现有数据点作为查询输入的推荐式检索。传入正面和负面示例,查询端无需额外的嵌入步骤。

查看完整示例
Check
按点 ID 推荐

无需重新嵌入。只需传入职位或候选人 ID。

Check
正面 + 负面示例

“寻找更像这 3 个的,而不像那一个的”:无需重新训练即可进行优化。

# Pattern: recommend by point ID
# → see docs for complete example
result = client.query_points(
    collection_name="jobs",
    query=models.RecommendQuery(
        recommend=models.RecommendInput(
          positive=[0], # job_id_0
          negative=[1], # job_id_1
        )
    ),
    using="dense",
    query_filter=models.Filter(
        must=[
            models.FieldCondition(
                key="category",
match=models.MatchValue(value="engineering"),
            ),
            models.FieldCondition(
                key="remote",
                match=models.MatchValue(value=True),
            ),
        ]
    ),
    limit=20,
)

Pariti 是非洲一家以推荐驱动的招聘市场。Qdrant 向量搜索可实时对 7 万名候选人进行排名。

Pariti · 人力资源科技

20% → 48%

招聘填充率

阅读完整案例研究

常见问题

与关键词搜索相比,向量搜索如何改善职位匹配?
关键词搜索要求候选人猜测雇主使用的确切术语。求职者搜索“开发”时,会得到软件工程职位中混杂的“业务发展”结果。向量搜索将职位描述、简历和查询转化为能够捕捉含义的嵌入,因此“高级软件工程师”、“Staff Dev”和“Lead SWE”在语义上都会被识别为相似。Qdrant 在单次查询中将这种语义匹配与严格的负载过滤器(地点、薪资范围、工作许可)相结合,确保结果既相关又符合严格的招聘限制。
Qdrant 能否在不降低性能的情况下处理数百万个职位或候选人向量?
可以。Qdrant 基于 Rust 构建,具有自定义的 HNSW 实现和存储引擎,专为高吞吐量、并发读写的工作负载而设计。招聘平台通常维护数百万个向量(候选人和职位总和),且每天有大量的更新负载。标量和二进制量化可将内存中的向量压缩 4 到 32 倍,这有助于在扩展时保持基础设施成本的可预测性。过滤器在 HNSW 图遍历期间应用,而非事后应用,因此对地点、薪资、类别和经验水平的复合查询不会产生其他架构可能导致的召回率下降和延迟激增。
Qdrant 是否符合人力资源数据的 HIPAA、GDPR 和数据驻留要求?
Qdrant 云服务已获得 SOC 2 Type 2 认证,并支持为医疗招聘平台提供符合 HIPAA 标准的部署(包含业务伙伴协议 BAA)。对于有 GDPR 或数据驻留要求的团队,Qdrant 提供混合云部署:您的数据保留在您自己的 AWS、GCP 或 Azure 基础设施中,而 Qdrant 管理控制平面。对于需要完全数据主权的组织,还可提供本地部署和完全离线(air-gapped)部署。
在招聘搜索方面,Qdrant 与 Elasticsearch 或 OpenSearch 相比如何?
Elasticsearch 和 OpenSearch 设计初衷是用于全文关键词搜索和日志分析,而非语义向量检索。将向量搜索强行添加到这些系统中的团队经常反映过滤器性能下降、需过度配置集群以处理突发流量,以及复杂的运营开销。Qdrant 是专为向量工作负载构建的:过滤器在图遍历期间执行(而非作为后处理步骤),混合搜索将密集语义向量与稀疏 BM25 关键词向量在单次查询中结合,基于 Rust 的引擎在没有 JVM 系统内存开销的情况下提供一致的低延迟性能。一些评估 Qdrant 的人力资源科技团队实际上是在替换现有的搜索堆栈,而不是从零开始构建。
Qdrant 是否支持基于地理位置的职位匹配的地理空间搜索?
是的。Qdrant 具有原生的地理空间过滤功能,让您可以在同一次请求中与向量搜索一起运行半径查询和边界框过滤器。对于在多个国家或地区运营的招聘网站,这意味着您可以将语义职位匹配与地理位置限制结合起来,而无需维护单独的地理空间索引。这也是团队探索替代方案的常见原因,因为在其他解决方案中,如果没有定制工程,很难将地理空间搜索和向量搜索结合起来。
Qdrant 能否为国际招聘网站支持多语言职位搜索?
Qdrant 与嵌入模型无关,这意味着它支持您的团队选择的任何多语言嵌入模型(如 multilingual-e5、Cohere 多语言模型或 OpenAI 嵌入)。对于希望简化管道的团队,Qdrant 云推理可直接在 Qdrant 内部处理嵌入,因此您可以发送原始文本(任何语言的职位描述、简历、查询),无需管理单独的推理服务。从单一市场扩展到多个国家的招聘网站可以将所有语言变体存储在同一个集合中,并以一致的性能进行查询。结合区域部署选项和地理空间过滤,这让您可以从一个市场扩展到数十个市场,而无需重构您的搜索基础设施。
对于实时的候选人或职位搜索,我能预期 Qdrant 达到什么样的延迟?
Qdrant 帮助团队在包含数十亿向量的集合(包括过滤查询)上实现激进的延迟目标。这对招聘平台至关重要,因为搜索延迟直接影响候选人体验:缓慢的搜索速度会导致可观测的用户流失。Qdrant 在并发摄入(每日职位或候选人更新)和搜索流量期间保持卓越性能,帮助避免在高峰时段或批量更新窗口期间常见的延迟激增。

与专家沟通
人力资源市场检索。

获取关于将搜索、匹配和推荐规模扩展到 2000 万以上向量的指导。

咨询专家
Rocket flying over globe illustration