解决图像和关键词基于房产搜索中的延迟和分页问题
Source: Dev.to
所有权与方法
作为高级软件工程师,我承担了修复 Deep Search 的性能和正确性的问题。
一个关键决定是保持系统的确定性,避免使用 LLM 进行排序或检索。LLM 虽然有用,但它们是非确定性的,且在大规模时难以控制。
我仅在理解用户意图时使用 LLM。LLM 解析用户查询并提取:
- 像卧室数量或位置这样的硬过滤条件
- 一个标记,指示是否需要基于图像的搜索
示例
- “2 bedroom apartment in Manhattan” → 仅使用确定性过滤和关键词搜索
- “2 bedroom house with backyard having large trees” → 需要视觉理解并触发 Deep Search
这种受限的 LLM 使用,使得系统的其余部分可预测且易于调试。
实施过程中发现的挑战
在重新设计系统时,我发现了一个关于如何合并不同检索系统结果的重大问题。
- BM25 搜索有其自己的排序和分页。
- Vector 搜索也有其自己的排序和分页。
当先对结果进行分页再合并时,分页完全失效。BM25 的第 2 页和向量搜索的第 2 页并不代表相同的结果集。有的页面主要是向量匹配,有的则没有,且排序在请求之间会变化。这导致结果不稳定且不一致,在生产搜索系统中是不可接受的。
该问题需要重新思考排序和分页的处理方式。
解决方案
当触发 Deep Search 时,我构建了一个具有明确职责分离的混合搜索管道:
- 硬确定性过滤
- 使用 RedisSearch 的 BM25 全文搜索
- 使用 pgvector 对房产图片进行 向量搜索
关键的改变是这些系统不再各自独立分页。
合并结果
我实现了 Reciprocal Rank Fusion(倒数排名融合)来合并来自不同搜索引擎的排序列表。对每个房产,计算一个统一的混合分数:
- BM25 排名转换为倒数得分
- 向量相似度得分进行归一化
根据是否触发 Deep Search,应用不同的权重:
# Hybrid scoring formula
hybridScore = alphaBM25 * bm25Score + betaVector * (vecScore / maxVec)
只有在计算出统一的混合分数后才进行分页。这保证了跨页的排序稳定。
结果
新的方法解决了性能和排序问题:
- 延迟 从约 5 分钟降至 10 秒以内
- 分页 稳定且确定
- 当用户请求视觉特征时,视觉匹配自然出现
- 关键词意图仍然影响排序
- 结果在各页之间保持一致