真实面经题目 · 原创解析

RAG 混合召回链路中 URL 解析怎么做,如何把网页链接、正文和元数据接入向量与关键词召回?

这题考的是 Web 类知识源进入 RAG 的完整索引链路:候选人要能讲清 URL 规范化、网页抓取解析、正文抽取、元数据建模、chunk 切分、向量和关键词混合召回、权限过滤、去重引用和评估闭环。

出现于:蚂蚁集团 · 后端开发

60 秒回答模板

我会把 RAG 混合召回里的 URL 解析理解成一条从网页链接到可检索证据的 ingestion 链路,而不是简单 parse 一个字符串。第一步是 URL 规范化:统一 scheme、host、大小写、尾斜杠、query 白名单、fragment 处理和重定向,把同一页面收敛成 canonical URL,同时保留原始 URL 方便追踪。第二步是抓取和解析:按 robots、鉴权、限速和超时策略获取 HTML/PDF/Markdown 等内容,识别编码、状态码、重定向、内容类型和更新时间。第三步是正文抽取和清洗:去掉导航、广告、脚本、重复页脚,保留标题、正文、表格、代码块、面包屑、发布时间、作者、站点、路径层级等元数据。第四步是 chunk:按标题层级、段落、语义边界和 token 预算切分,并让每个 chunk 继承 URL、权限、更新时间、锚点和内容 hash。第五步是混合索引:正文和标题做 embedding 进向量库,同时把标题、URL path、关键词、实体、错误码、产品名等建倒排或 BM25 索引;查询时并行做向量召回和关键词召回,再合并去重、权限过滤、时效过滤和重排。最后把引用来源、chunk id、canonical URL 和快照版本带给模型,评估召回率、引用准确率、去重率、权限误召回和抓取失败率。核心是让网页内容可检索、可过滤、可更新、可引用,而不是只把 URL 文本塞进向量库。

考点 不是只 parse URL 字符串
难度 真实面经题
回答目标 让候选人把 RAG 混合召回中的 URL 解析讲成一条可落地的 Web 知识接入和检索工程链路,覆盖规范化、解析抽取、索引融合、安全过滤、引用追踪和评估闭环。

深入解析

01

URL 规范化先解决同页多址

URL 解析第一步不是直接抓网页,而是把不同写法收敛成稳定的 canonical key。常见处理包括统一 scheme 和 host 大小写、补全或移除尾斜杠、默认端口归一、解码或标准化 path、过滤无意义的 utm 和会话 query、保留有业务含义的 query、去掉 fragment 或把锚点单独记录,并跟随 301/302 得到最终地址。这样可以避免同一页面被重复索引,也能在引用时保留用户最初提交的原始 URL。

02

抓取要带权限、限速和内容识别

抓取层需要判断 URL 是否允许访问、是否需要登录态或租户凭证、是否遵守 robots 和站点限速,以及如何处理超时、重试、重定向和 4xx/5xx。拿到响应后要记录状态码、content-type、charset、content-length、ETag、Last-Modified、最终 URL 和抓取时间。不同内容类型走不同解析器:HTML 用 DOM 解析,PDF 或 Office 文档走文档解析,Markdown 或纯文本保留结构,不能把所有响应都当成普通 HTML。

03

正文抽取决定知识质量

网页里大量内容不是答案证据,例如导航、侧边栏、推荐位、广告、版权页脚、cookie 弹窗、脚本和样式。正文抽取要结合 DOM 结构、语义标签、标题密度、链接密度、可见文本和站点模板规则,把主标题、正文段落、列表、表格、代码块和图片 alt 等保留下来。抽取后还要做乱码修复、空白折叠、重复段落清理和模板噪声识别,否则 embedding 会被无关文本稀释。

04

元数据不是附属字段

URL 来源天然有丰富元数据,应在索引前建模清楚。常见字段包括 canonical URL、原始 URL、domain、path 层级、页面标题、H1/H2、面包屑、作者、发布时间、更新时间、语言、内容类型、站点栏目、租户、可见范围、抓取批次、内容 hash、快照版本和锚点。元数据既用于过滤和排序,也用于回答时展示引用、判断时效、排查召回问题。

05

Chunk 要保留语义边界和来源

网页正文不能按固定字符数粗暴切开。更好的做法是先按标题层级、段落、列表、表格和代码块形成语义单元,再按 token 预算合并或拆分,必要时加少量 overlap。每个 chunk 要能独立理解,并继承页面标题、章节标题、URL、锚点、权限、更新时间和内容 hash。表格和代码块要避免被切碎,否则检索命中后模型也无法还原证据。

06

向量索引负责语义召回

向量索引通常对 chunk 正文、标题和必要上下文一起生成 embedding,适合处理同义表达、长问句和语义相近的问题。建索引时要记录 embedding 模型版本、向量维度、chunk id、文档版本和更新时间,便于后续重建和回滚。向量召回的风险是把语义相似但事实不匹配的内容召回来,所以不能只依赖向量距离做最终排序。

07

关键词索引补精确命中

混合召回里倒排索引或 BM25 很关键,因为 URL path、产品名、接口名、错误码、日期、人名、术语缩写、配置 key 和标题关键词常常需要精确匹配。关键词索引可以覆盖正文、标题、URL path、anchor、标签和实体抽取结果,并支持字段权重。它能弥补 embedding 对短词、专有名词和符号串不稳定的问题。

08

合并、过滤和重排控制最终候选

在线查询时通常先做 query 改写或实体识别,然后并行走向量召回、关键词召回、标题/URL 字段召回和结构化过滤。合并时要按 document id、canonical URL、chunk hash 去重,再做权限过滤、语言过滤、时间过滤、站点可信度过滤和业务范围过滤。重排可以使用 cross-encoder、LLM rerank 或轻量排序模型,综合相关性、标题匹配、段落完整度、时效、来源质量和引用可解释性。

09

权限、去重和引用追踪要贯穿全链路

RAG 接入网页链接时最容易出问题的是越权、重复和不可追溯。权限不能只在生成前做一次,索引、召回、重排和拼 prompt 前都要带租户、角色、文档 ACL 或来源可见性约束。去重既要处理 URL 级重复,也要处理正文转载、镜像站、分页和模板重复。引用追踪要保存 chunk id、文档版本、抓取时间、canonical URL、锚点和原文片段,使模型回答能回链到具体证据。

10

评估和失败模式决定能否上线

评估不能只看最终答案是否像样,而要拆开看抓取成功率、正文抽取准确率、chunk 命中率、Recall@K、MRR、nDCG、混合召回互补率、rerank 提升、引用准确率、权限误召回率、重复率、索引延迟和过期内容比例。常见失败包括动态页面抓不到正文、query 参数误删导致不同页面合并、模板噪声进入 embedding、chunk 切断表格、向量召回相似但不相关、关键词召回被广告词污染、旧快照覆盖新内容,以及引用 URL 已失效。

易错点

  • 把 URL 解析答成正则拆 scheme、host、path,完全没有讲抓取、抽取、chunk、索引和召回链路。
  • 把所有 query 参数都删掉,导致不同内容页被错误合并,或者把追踪参数都保留,导致同一页面重复入库。
  • 只做向量库,不建关键词或字段索引,忽略 URL path、错误码、产品名、缩写和短 query 的精确匹配需求。
  • 抓到整页 HTML 就直接 embedding,把导航、广告、页脚、推荐位、脚本和 cookie 弹窗一起索引。
  • chunk 只按固定长度切分,切断标题层级、表格、代码块或步骤列表,导致召回后证据不可读。
  • 元数据只存 URL,不存标题、更新时间、权限、内容类型、hash、版本和锚点,后续无法过滤、重排或引用排错。
  • 权限只在最终 prompt 前过滤,索引和召回阶段已经混入了无权内容,存在越权泄漏风险。
  • 合并召回结果时只拼接 topK,不按 canonical URL、document id、chunk hash 去重,导致上下文被重复页面挤满。
  • 回答时只讲召回,不讲 rerank、引用追踪和证据快照,无法保证生成答案可追溯。
  • 评估只看最终回答主观好坏,没有拆分抓取成功率、正文抽取质量、Recall@K、引用准确率和权限误召回率。

面试官追问

URL 规范化时 query 参数应该全部删除吗?

不能。utm、ref、session id 这类追踪参数通常可以删除,但 page、id、locale、version、category、search 等参数可能决定页面内容。实际做法是按站点或参数白名单保留有业务含义的 query,并把归一化前后的 URL 都记录下来。

动态网页正文抓不到怎么办?

先看是否有服务端渲染内容、站点 API、sitemap、RSS 或导出接口可以用;如果必须渲染,再用受控浏览器抓取,但要限制域名、超时、并发和脚本权限。对登录态页面还要走授权凭证和审计,不能让爬虫绕过权限。

网页标题、正文和 URL path 在索引里权重怎么分?

标题和 H1 通常是强相关字段,URL path 对产品名、接口路径、版本号很有价值,正文提供完整证据。关键词索引可以设置字段权重,向量索引可以把标题和章节作为上下文拼入 chunk,但不能让 URL path 里的短词压过正文相关性。

混合召回的结果如何合并打分?

常见方式是分别取向量 topK 和 BM25 topK,用 RRF、归一化加权或学习排序做融合,再按 chunk/document 去重。之后用 reranker 重新判断 query 与候选段落的匹配度,并加入权限、时效、来源质量和引用可解释性等特征。

为什么不能只用向量召回?

向量召回对语义表达很好,但对专有名词、错误码、URL path、配置 key、数字和短 query 不稳定,还可能召回语义像但事实不对的段落。关键词召回能提供精确命中,两者结合才能兼顾覆盖率和精度。

如何处理同一内容被多个 URL 转载或镜像?

先用 canonical link、重定向、站点规则和 URL 归一化做 URL 级去重,再用正文 simhash/minhash、chunk hash 或 embedding 相似度做内容级去重。保留一个主引用 URL,同时记录其他来源,避免结果页重复堆同一段内容。

RAG 引用应该指向页面还是具体 chunk?

对用户展示通常指向页面 URL 加锚点或章节;系统内部必须指向具体 chunk id、文档版本、抓取时间和原文片段。这样既方便用户打开来源,也方便排查模型是否真的依据该证据回答。

URL 内容更新后索引怎么处理?

用 ETag、Last-Modified、sitemap、变更订阅或定期重抓发现更新。内容 hash 变化后生成新版本 chunk 和 embedding,旧版本延迟下线或按版本切换,避免查询时混用新旧正文;同时要保留引用快照用于审计。