跳到主要内容

5 篇博文 含有标签「search」

查看所有标签

RAG 流水线中被你忽略的查询重写层

· 阅读需 12 分钟
Tian Pan
Software Engineer

当 RAG 系统回答错误时,大多数团队的第一反应是归咎于编码器(encoder)。更换更大的嵌入模型(embedding model)。尝试针对特定领域微调过的模型。增加维度。三个迭代周期(sprint)后,召回率曲线只提升了几个百分点,而用户的投诉看起来还是老样子。

诊断错了。大多数检索失败并非嵌入失败。它们是查询形状(query-shape)失败——在编码器运行之前就存在的词汇不匹配,无论如何调整向量都无法修复。

用户输入“如何取消”。相关的文档标题却是“订阅生命周期管理”,并使用了“终止”、“计费周期结束”和“服务停用”等词汇。世界上没有任何编码器能靠词汇运气将这两个字符串拉入同一个邻域。余弦相似度(cosine similarity)的差距是真实存在的,它存在于输入中,而非模型中。位于检索之前的查询重写层是大多数流水线跳过的步骤,随后他们却要花一个季度的时间试图在下游进行补偿。

生产环境中的实时网络接地:调用搜索 API 只是开始

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数工程师发现实时网络接地局限性的方式如出一辙:花一个下午接入搜索 API,推上生产,然后接下来三周都在解释为什么延迟高达六秒、近期事件的回答出错,以及用户偶尔被引导到假冒电话号码。

根本假设——搜索增强型 LLM 不过是"带新鲜数据的普通 RAG"——是大多数痛苦的来源。实时网络接地与静态检索几乎没有共同之处,除了"检索"这个词。它是一个披着 NLP 外衣的分布式系统问题。

发现难题:为什么语义搜索会让浏览型用户失望

· 阅读需 11 分钟
Tian Pan
Software Engineer

向量搜索正在吞噬世界。基于嵌入(Embedding)的检索现在为各大电商平台的商品搜索提供动力,驱动着 RAG 系统的检索层,并处于大多数 AI 驱动的搜索重写(search rewrites)的核心。但有一类用户,这些系统一直在默默且持续地令其失望:即“浏览型用户”(browsing user)。这并不是因为嵌入模型不好,而是因为它们被设计用来解决一个完全不同的问题。

语义搜索背后的基本假设是:用户带着一个与其需求相近的查询(query)而来。只要在嵌入空间中优化与该查询的邻近度(proximity),你就赢了。但很大一部分真实用户带来的更像是“好奇心”而非具体的查询——对于他们来说,向量空间中的最近邻(nearest neighbors)恰恰是错误的答案。

语义搜索作为产品:当检索理解意图时,什么发生了改变

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数构建语义搜索的团队都从 RAG 概念验证出发:对文档分块、生成嵌入向量、存储到向量库、用余弦相似度查询。在演示中效果不错。然后他们把它发布给用户,结果有一半的查询以与检索质量毫无关系的方式失败了。

原因在于 RAG 和面向用户的语义搜索解决的是不同的问题。RAG 在问"给定一个问题,检索上下文供 LLM 回答"。语义搜索在问"给定用户的查询,呈现真正符合其需求的结果"。第二个问题有一层 RAG 基准系统性忽视的复杂性——而这种复杂性几乎完全存在于检索开始之前。

生产环境中的混合检索:为什么 BM25 在关键查询上仍然更胜一筹

· 阅读需 13 分钟
Tian Pan
Software Engineer

BM25 发表于 1994 年,其数学原理简单到可以写在白板上。然而在 2025 年的生产检索基准测试中,它在真实世界查询的相当一部分场景中,依然超越了数十亿参数规模的稠密嵌入模型。那些在部署纯向量检索后才发现这一问题的团队,往往是以最糟糕的方式发现的:用户反馈幻觉,而他们在评估集中却无法复现——因为评估集是从那些已经能正常工作的查询中构建的。

这是检索领域的抽样偏差。稠密检索在特定且可预测的查询形式上会失败。这种失败是无声的——大语言模型仍会从检索到的任何片段中生成流畅、自信的答案。没有错误日志,没有延迟异常,只是对查询产品 SKU、错误码、API 名称或任何词汇特定而非语义通用内容的用户,悄悄给出了错误的回答。

解决方案是混合检索。但"混合检索"作为一个工程决策,本身定义不够充分。本文将介绍实际的失败模式、如何正确融合检索信号、重排序层的位置,以及——最关键的——如何在用户发现之前,找到当前流水线正在悄悄失败的查询类型。