想象你开了一家社区杂货铺,货架上有三种牛奶:今天刚到的鲜奶、放了五天的酸奶、还有上个月囤的老库存。顾客问“给我推荐牛奶”,你会怎么摆货?显然,新到的鲜奶应该放在最显眼的位置,临期商品塞到角落,过期了直接下架。但如果顾客问的是“发酵乳的生产工艺”,五年前的经典书籍反而更值得推荐。 RAG(检索增强生成)系统面临同样的难题——知识库里新文档不断涌入,旧文档未必过时,但用户往往更想先看到新鲜内容。这就是今天的主角:时间衰减检索。它像一位精明的理货员,在“相关性”这个原有评分基础上,叠加一层“时间折扣”:越新的文档加分越多,越旧的文档逐渐“沉底”。问题是,折扣力度怎么算?打八折还是打对折?按月衰减还是按天衰减?这背后藏着两条经典的数学曲线——指数衰减和对数衰减。 本文要聊的就是:如何用这两条曲线给文档“贴保质期标签”,如何调整衰减力度(调参),如何把时间因子和相关性得分揉在一起(融合公式),以及在实际项目中怎么落地。读完你就能亲手给自家的杂货铺设计一套“上新优先”的理货规则。

岗位关联

对AI从业者而言,时间衰减检索是提升RAG系统回答质量的关键技巧,尤其在新闻、政策、产品文档等强时效场景,能让AI告别“拿着三年前的旧闻回答今天的问题”的尴尬。掌握它,你就能让知识库始终保持“新鲜呼吸”。

目录
  1. 可视化演示
  2. 时序衰减概述
  3. 指数衰减原理
  4. 对数衰减原理
  5. 衰减权重调参
  6. 相关性融合
  7. 工程实现方式
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示时间衰减检索的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

时间衰减检索:时间衰减 时间衰减检索的核心原理与动机 指数衰减函数的数学原理与适用场 核心机制可视化 时间衰减检索整体架构与关键组件

时序衰减概述

回到杂货铺的比喻。你第一次意识到“该理货了”,是在顾客抱怨“怎么给我推荐了一瓶过期的牛奶?”之后。你翻查记录,发现知识库(货架)里确实有今天的新品,但算法的排序逻辑(你的理货习惯)只盯着“顾客问什么”,完全没管“货是什么时候进的”。于是新老文档的分数一样高,老库存反倒因为积累了更多“好评”(旧文档引用多、链接多)而排在新品前面。

这就是时间衰减检索要解决的核心矛盾:相关性告诉系统“顾客要什么”,时效性告诉系统“现在什么最值钱”。两者缺一不可。传统的BM25、向量相似度都只解决了前者——它们像只看口味不看保质期的服务员。

时间衰减检索的思路简单但有效:给每个文档计算一个“时间折扣因子”,新文档折扣接近 1(不打折),旧文档折扣逐渐小于 1(打折)。然后用这个折扣因子去调整原有的相关性分数。折扣怎么打?两种最经典的方式:指数衰减(按固定百分比逐期降价)和对数衰减(越降越慢,永远留一点底价)。前者像生鲜食品——过了保质期价值断崖式下跌;后者像经典书籍——历久弥新,时间只会让它稍微褪色。

time_decay=f(文档年龄)\text{time\_decay} = f(\text{文档年龄})
这里的文档年龄是从文档入库时间到当前时间的间隔(比如 3 天、5 个月),衰减函数 f 把年龄映射为一个 0 到 1 之间的折扣系数。

指数衰减原理

假设你的杂货铺定了一条规矩:每过一天,牛奶的“推荐权重”乘以 0.8。第一天权重大约 0.8,第二天 0.64,第三天 0.51,第十天只剩下 0.1 左右。这种“每天打固定折扣”的方式,数学上就是指数衰减。

指数衰减的函数形式为:

其中 t 是文档年龄(通常以天为单位),λ(lambda)是衰减率——控制折扣速度的旋钮。λ 越大,曲线掉得越狠。当 λ 取 0.1 时,30 天后的文档权重约为 $e^{-3} \approx 0.05$,几乎在检索中隐退。

指数衰减最显著的特征是衰减率恒定:无论是新文档还是旧文档,每多一天年龄,权重都乘以相同的比例因子 $e^{-\lambda}$。这在数学上叫“无记忆性”——系统不关心文档已经多大了,只关心“又老了一天”,就打同样的折扣。对新闻资讯、市场行情这类强时效场景,这很好用:昨天的新闻价值大减,上周的新闻基本没人关心,指数衰减恰好模拟了这种“热门话题快速冷却”的规律。

weight(t)=e−λt\text{weight}(t) = e^{-\lambda t}
公式的直观含义:指数衰减让文档权重随时间流逝呈等比级数下滑——每过一个固定时间间隔,权重就乘一个同样的折扣。这就像每天给牛奶打个八折,永远不会变成零,但会无限接近零。
  1. 取指数对衰减率的相反数取自然指数,确保权重是正数且小于等于 1
    e−λte^{-\lambda t}
  2. 计算年龄当前时间减去文档发布时间,单位换算成天
    t=now−pub_time86400t = \frac{\text{now} - \text{pub\_time}}{86400}
  3. 衰减率设定λ 控制折扣力度,经验取值在 0.01 到 0.5 之间,越大衰减越快
    λ=ln⁡2T1/2\lambda = \frac{\ln 2}{T_{1/2}}

对数衰减原理

现在换一间书店。老板的理货逻辑是:新书当然要放显眼位置,但三年前的书只要是好书,照样有人找。他不会让一本书因为“老了点”就被彻底遗忘。这种“越老越不着急降权”的曲线,对应的是对数衰减。

对数衰减的函数形式为:

其中 α 是调节下降幅度的系数,t 是文档年龄(天)。注意当 t = 0 时权重为 1(新文档不打折),t 增大时权重缓慢下降,但下降速度越来越慢。这正是对数函数的特性:前期陡一些,后期趋于平缓,永远不会降到 0。

对比指数衰减,对数衰减对旧文档温柔得多。假设 α 取 0.1,一个 100 天前的文档权重约 $1 - 0.1 \times \ln 101 \approx 0.54$——仍然有一半以上的权重。而对指数衰减(λ = 0.05),同样 100 天前的文档权重只剩 $e^{-5} \approx 0.007$,基本忽略不计。这种温和的衰减方式适合政策法规、学术论文、经典教程等场景——2020 年的疫情指南可能过时了,但 2018 年的基础会计学教材依然有效。

weight(t)=1−αln⁡(1+t)\text{weight}(t) = 1 - \alpha \ln(1 + t)
对数衰减的本质是“边际折扣递减”——文档每老一天,折扣力度都比前一天少一点。就像老朋友不是不值钱了,而是你不再需要用“新鲜感”来衡量他的价值。
  1. 加一取对数对“年龄 + 1”取自然对数,加 1 是为了让 t=0 时对数值为 0
    ln⁡(1+t)\ln(1 + t)
  2. 乘以系数α 控制衰减幅度,经验取值在 0.01 到 0.2 之间
    αln⁡(1+t)\alpha \ln(1 + t)
  3. 从 1 中扣除用 1 减去衰减量,保证新文档权重为 1,旧文档权重在 0 到 1 之间
    1−αln⁡(1+t)1 - \alpha \ln(1 + t)

衰减权重调参

杂货铺老板最头疼的问题:牛奶打几折合适?折扣打太狠,滞销品永远卖不掉;打太轻,货架又被旧货占满。时间衰减检索里的“折扣力度”由两个关键参数控制:半衰期($T_{1/2}$)和衰减系数(λ 或 α)。

半衰期是核物理借来的概念,指权重降到初始值一半所需的时间。它的公式是:

如果设半衰期为 7 天,意味着 7 天后文档权重是原来的 50%,14 天后是 25%——非常适合新闻场景。如果设半衰期为 30 天,则衰减平缓得多,适合政策库。设定半衰期比直接设定 λ 更直观:你不需要理解指数函数的细节,只需要说“我希望多少天后这则新闻不再有优势”。

实操中,衰减系数 λ 的经验取值范围是 0.01~0.5。做新闻推荐,λ 取 0.1 左右;做企业知识库(文档更新不频繁),λ 取 0.01~0.03。α(对数衰减)则通常在 0.01~0.2 之间。还有两个调参原则:一是从业务反推——问业务方“一周前的新闻还重要吗”,确定半衰期再用公式换算 λ;二是A/B 测试验证——在真实检索中对比不同 λ 下的用户满意度或点击率。

T1/2=ln⁡2λT_{1/2} = \frac{\ln 2}{\lambda}
调参的本质是找到一个平衡点:让“太旧”的文档退出竞争,但又不至于把有价值的老文档误杀。半衰期就是那个“新鲜度开关”的位置——定得太短,知识库容易“失忆”;定得太长,时效性优势就体现不出来。
  1. 确定半衰期业务上决定“文档多久算旧”,新闻场景 7 天,法规场景 30 天
    T1/2=7 或 30(天)T_{1/2} = 7 \text{ 或 } 30 \text{(天)}
  2. 反解衰减率用 $\ln 2$ 除以半衰期得到 λ
    λ=0.693T1/2\lambda = \frac{0.693}{T_{1/2}}
  3. 归一化验证计算最老文档的权重,确认不会低到完全消失
    weightmin⁡=e−λ⋅tmax⁡\text{weight}_{\min} = e^{-\lambda \cdot t_{\max}}

相关性融合

现在你同时有两个分数:相关性得分(比如 BM25 或向量相似度)和时间折扣系数。怎么把它们合在一起?这是时间衰减检索的“最后一公里”。

最常用的方法是乘法融合:

乘法直观且自然:相关性分数高的文档,乘以接近 1 的时间权重,保持优势;相关性中等但很新的文档,时间权重高,可以逆袭上位;相关性很高但很旧的文档,时间权重低,被压下去。乘法融合有一个好处——它自动化了“新鲜 vs 相关”的权衡:足够新的文档可以在相关性较低时胜出,足够相关的文档可以在较旧时仍然保留。

另一种是加权融合(加法模型):

这里 β 是权重参数(0 到 1 之间),控制相关性和时效性的相对重要性。β = 0.8 表示相关性占八成、时效性占两成。加法模型更灵活,但需要额外调一个参数 β,并且对两个分数的归一化有更高要求——如果相关性分数范围是 0~30,而时间分数是 0~1,直接相加等于没加。因此需要先做归一化:

final_score=rel_score×time_weight\text{final\_score} = \text{rel\_score} \times \text{time\_weight}
final_score=β⋅rel_score+(1−β)⋅time_score\text{final\_score} = \beta \cdot \text{rel\_score} + (1 - \beta) \cdot \text{time\_score}
norm_score=score−min⁡max⁡−min⁡\text{norm\_score} = \frac{\text{score} - \min}{\max - \min}
融合公式的巧妙之处在于:时间权重不是“硬过滤”而是“软调节”——它不会让旧文档完全消失(除非你设置硬性时间截断),只是让它们排名往后靠。这就像杂货铺把旧库存从“推荐位”挪到“货架深处”,但顾客执意要找,依然找得到。
  1. 归一化相关分数把相关性得分映射到 0~1 区间,避免量纲不一致
    norm_rel=rel_score−relmin⁡relmax⁡−relmin⁡\text{norm\_rel} = \frac{\text{rel\_score} - \text{rel}_{\min}}{\text{rel}_{\max} - \text{rel}_{\min}}
  2. 计算时间折扣根据文档年龄和衰减函数得到 0~1 的权重
    time_weight=e−λt\text{time\_weight} = e^{-\lambda t}
  3. 乘法融合两者相乘,得到最终排序分数
    final=norm_rel×time_weight\text{final} = \text{norm\_rel} \times \text{time\_weight}

工程实现方式

理论说完了,怎么在真实 RAG 系统里落地?这就像理货员的工作分配——有人负责收货时贴标签(入库阶段),有人负责上架时摆位置(检索阶段),有人负责定期盘点(重排阶段)。时间衰减检索可以在三个环节插入:

方案一:检索前过滤。在向量检索或关键词检索之前,先按文档时间字段过滤掉过老的文档。例如加一个 SQL 条件 WHERE pub_time > now() - interval '90 days'。这是最省算力的方式,相当于直接把过期牛奶扔出仓库。缺点是太粗暴——如果用户问的是“去年的年终总结”,你直接过滤掉就没法答了。所以过滤条件通常放宽,只过滤绝对过期的(比如 5 年前的新闻)。

方案二:检索中动态加权。这是最优雅的方式。在向量检索时,不直接过滤,而是在计算相似度后叠加时间折扣:

实现上可以在索引文档时把 pub_time 作为元数据存起来,检索时用当前时间减去发布时间得到年龄,再乘上折扣因子。对向量数据库,通常需要自定义打分函数或用 post-filter 实现。

方案三:重排序阶段调整。先用标准检索召回 Top 50 文档,然后重排时把时间折扣乘进去:

重排序的优点是灵活——召回用纯相关性保证“不要漏”,重排用时间因子保证“最相关且最新优先”。这也是 LangChain、LlamaIndex 这些框架里最常插入自定义逻辑的位置。

回到杂货铺。你现在是一位既懂理货又懂数据算法的店主:你在入库时给每件商品贴上时间戳,在上架时按“相关×新鲜”综合排序,在盘点时把过期货直接清仓。顾客问你“最近有什么好喝的牛奶”,你不再拿出去年囤货,而是把今天刚到的鲜奶放在最前面——这就是时间衰减检索的完整闭环。

score=cosine_sim(q,d)×e−λ⋅age(d)\text{score} = \text{cosine\_sim}(q, d) \times e^{-\lambda \cdot \text{age}(d)}
final_rank=sort_by(rel_score×time_weight)\text{final\_rank} = \text{sort\_by}(\text{rel\_score} \times \text{time\_weight})
三种实现方式的取舍:过滤最快但最不灵活,动态加权最优雅但受限于向量数据库能力,重排最灵活但多一步计算。实际项目中,组合使用常见:粗过滤保证效率,重排细化保证效果。
  1. 检索前过滤用硬性时间阈值拦截过老文档,减少无效计算
    age(d)<Tmax⁡\text{age}(d) < T_{\max}
  2. 检索中加权在向量相似度计算后乘以时间折扣,实现软降权
    sim(q,d)×e−λ⋅age(d)\text{sim}(q,d) \times e^{-\lambda \cdot \text{age}(d)}
  3. 重排序调整先召回后重排,兼顾召回率和时效性
    rerank(d)=w1⋅rel(d)−w2⋅age(d)\text{rerank}(d) = w_1 \cdot \text{rel}(d) - w_2 \cdot \text{age}(d)

AI 应用场景

新闻资讯知识库问答

阶段:检索召回 + 重排序

解决的问题:传统 RAG 检索新闻库时,旧新闻往往因为积累了更多链接和引用而排在前面,导致用户问“最近发生了什么”时,AI 却在引用三个月前的旧闻。时间衰减因子让今天刚发布的新闻自动获得排名优势。

具体案例:某新闻 App 的 AI 助手使用指数衰减(半衰期 7 天),用户询问“今天有哪些科技大新闻”时,检索结果优先展示 24 小时内发布的文章。一周前的相关报道虽然仍被召回,但排在后面;一个月前的文章除非极其精确匹配,否则不进入 Top 5。

企业内部政策法规库

阶段:检索前过滤 + 动态加权

解决的问题:企业内部规章经常更新,员工问“报销流程”时,系统绝不能引用三年前的旧制度。但 HR 又希望保留历史版本备查。对数衰减让新制度有优势,但不彻底屏蔽旧版本。

具体案例:某大型企业部署知识库问答,对政策文档采用对数衰减(α = 0.05),配合“版本号 + 生效日期”元数据。当新制度发布后,AI 自动回答新版内容;当员工问“去年的政策是什么”时,显式提到时间范围的查询会让时间衰减因子让位给精确时间匹配。

产品版本文档检索

阶段:重排序阶段调整

解决的问题:SaaS 产品每年更新多个版本,用户问“这个 API 怎么调用”时,应优先给当前版本的文档。但老版本用户仍可能访问旧文档。时间衰减配合版本号过滤,让新版本文档有更高的出场率。

具体案例:某云服务商的开发者文档库,为文档打上“版本号 + 发布日期”标签。采用半衰期 90 天的指数衰减,保证 v2.0 的文档在 v3.0 发布后逐渐降权,同时用硬过滤保证已停止维护的 v1.x 文档彻底不出现。

Python 演示

python78 行
import mathimport timefrom datetime import datetime, timedelta  def parse_time(s):    return datetime.strptime(s, "%Y-%m-%d").timestamp()  def calc_age_days(pub_time, now_ts):    """    计算文档年龄(天)    """    return max(0.0, (now_ts - parse_time(pub_time)) / 86400.0)  def exp_decay_weight(age_days, half_life_days):    """    指数衰减:半衰期 half_life_days 天后权重降为 50%    """    lam = math.log(2) / half_life_days    return math.exp(-lam * age_days)  def log_decay_weight(age_days, alpha=0.05):    """    对数衰减:缓慢降低权重,永不归零    """    return max(0.0, 1.0 - alpha * math.log(1.0 + age_days))  def calc_time_score(pub_time, now_ts, decay_type="exp", half_life=7, alpha=0.05):    """    计算时间折扣因子    """    age = calc_age_days(pub_time, now_ts)    if decay_type == "exp":        return exp_decay_weight(age, half_life)    elif decay_type == "log":        return log_decay_weight(age, alpha)    else:        raise ValueError("decay_type 只支持 exp 或 log")  def combine_scores(rel_scores, time_weights, beta=0.8):    """    加权融合:beta 控制相关性权重,1-beta 控制时间权重    """    return [beta * r + (1 - beta) * t for r, t in zip(rel_scores, time_weights)]  def rerank_by_time(docs, rel_scores, now_ts=None, decay_type="exp", half_life=7, alpha=0.05):    """    重排序:把时间折扣乘到相关性得分上,重新排序    """    if now_ts is None:        now_ts = time.time()    weighted = []    for doc, rel in zip(docs, rel_scores):        tw = calc_time_score(doc["pub_date"], now_ts, decay_type, half_life, alpha)        weighted.append((doc["title"], rel, tw, rel * tw))    weighted.sort(key=lambda x: x[3], reverse=True)    return weighted  if __name__ == "__main__":    docs = [        {"title": "最新AI芯片发布", "pub_date": "2025-06-10"},        {"title": "AI芯片市场分析", "pub_date": "2025-03-15"},        {"title": "深度学习入门教程", "pub_date": "2024-11-20"},        {"title": "五年前AI芯片回顾", "pub_date": "2020-01-05"},    ]    rel_scores = [0.6, 0.85, 0.52, 0.78]    result = rerank_by_time(docs, rel_scores, decay_type="exp", half_life=7)    print("原始排序: ", [d["title"] for d in docs])    print("重排结果:")    for title, rel, tw, final in result:        print(f"  {title}: rel={rel:.2f}, time_w={tw:.2f}, final={final:.2f}")
目的:演示时间衰减检索的完整流程——从文档时间戳计算年龄,到指数/对数衰减计算时间权重,再到与相关性分数融合并重新排序。
  1. return max(0.0, (now_ts - parse_time(pub_time)) / 86400.0)年龄为负时取 0,防止因时区误差导致的负数时间
  2. lam = math.log(2) / half_life_days从半衰期反推衰减系数,这是指数衰减的核心换算
  3. math.exp(-lam * age_days)指数衰减的核心公式,年龄越大权重越小
  4. return max(0.0, 1.0 - alpha * math.log(1.0 + age_days))对数衰减,加 1 防止 log(0) 报错
  5. [beta * r + (1 - beta) * t for ...]加权融合公式,β 调节相关性和时效性的配比
  6. weighted.sort(key=lambda x: x[3], reverse=True)按融合后的最终分数从高到低排序

常见误区

误区很多同学以为时间衰减检索就是把超过一定时间的文档直接删除,或者用硬过滤让旧文档完全无法被检索到。这会导致用户问历史问题时系统一片空白。

正解时间衰减是软降权而非硬删除。权重趋近于 0 不等于权重等于 0。就像杂货铺把旧库存挪到货架深处,但顾客明确说“我要找去年的产品手册”,系统仍应该能翻出来。硬过滤可以作为辅助手段,但只针对“彻底过期”的文档;核心机制应该是让旧文档排名靠后,而不是消失。

为何常见:因为“衰减”这个词给人“逐渐消失”的联想,而且硬过滤代码写起来最简单。

误区有些人觉得指数衰减曲线更“科学”或者“标准”,对所有场景一律套用指数衰减,结果政策法规库里的旧教程被过度打压。

正解两种衰减是不同业务场景的适配器。新闻用指数衰减(昨天的事没人关心了),法规和教程用对数衰减(去年写的规范照样有参考价值)。选哪种取决于业务的“遗忘曲线”是急刹车还是滑翔下降。判断标准很简单:问业务方“三个月前的文档还有价值吗?”有价值用对数,没价值用指数。

为何常见:指数衰减在数学上更常见(如退火算法、核函数),容易让人误以为它更“正统”。

误区新人调参时喜欢把 λ 调得很大,觉得“越新的越好”,结果发现系统频繁遗忘文档,碰到稍微旧一点但重要的内容(如季度报表)就答不上来。

正解λ 越大衰减越狠,半衰期越短。λ 过大等效于“只看最近几天的文档”,RAG 的回答会缺乏深度和背景。合理的做法是设定半衰期时留余量:宁可让旧文档排名靠后,也不要让它完全出局。因为很多问题本质上需要参考历史信息(“对比去年同期的数据”)。

为何常见:做新闻场景时发现大 λ 效果立竿见影,就以为它是万能药。实际上不同场景的最优 λ 可能相差一个数量级。

误区直接把原始相关性分数乘以时间权重,然后发现新文档虽然有“时间加成”,但因为相关性分数本身太低,排不过旧文档的零头。

正解如果相关性分数范围是 0~30(BM25),时间权重是 0~1,两者相乘时时间权重的影响微乎其微。正确做法是先对相关性分数做归一化,再做乘法或加法融合。否则时间因子只是“装点门面”,主导排序的还是纯相关性。

为何常见:因为乘法公式看起来“很简单”,让人忽视了量纲匹配的问题。

面试题

Q1. 时间衰减检索的核心目标是什么?

单选题 · easy

  • A.提高检索速度
  • B.删除过期的旧文档
  • C.让新文档获得更高排名优势← 正确答案
  • D.增加文档的存储空间

答案:C。时间衰减检索的核心是让新文档在排序中占优势。它不是删除旧文档(B 错),也不是为了性能优化(A 错)或存储(D 错),而是通过时间折扣因子调整排序,让新内容优先出场,类似于货架理货中“新品放前排,旧货沉底”。

Q2. 指数衰减函数的标准形式是哪个?

单选题 · easy

  • A.weight(t) = 1 - α·ln(1+t)
  • B.weight(t) = e^(-λt)← 正确答案
  • C.weight(t) = 1 / (1+t)
  • D.weight(t) = cos(t)

答案:B。指数衰减的标准形式是 e 的负 λt 次方。选项 A 是对数衰减;C 是反比例衰减;D 是三角函数,都不符合指数衰减的“恒定比例折扣”特征。指数衰减就像牛奶每天打八折,折扣率恒定,权重越来越趋近于 0。

Q3. 半衰期 T(1/2) 与衰减率 λ 的关系是?

单选题 · mid

  • A.T = λ·ln2
  • B.T = ln2 / λ← 正确答案
  • C.T = λ / ln2
  • D.T = e^λ

答案:B。半衰期是权重降到一半所花的时间。代入公式 e^(-λT) = 0.5,两边取自然对数得到 -λT = ln(0.5) = -ln2,即 T = ln2 / λ。选项 B 正确。这就像如果牛奶每天打七折(λ≈0.36),半衰期约为 2 天,两天后权重降到一半。

Q4. 对数衰减相比指数衰减最大的特点是什么?

单选题 · easy

  • A.衰减速度恒定
  • B.权重会降到负值
  • C.旧文档权重下降越来越慢,永不归零← 正确答案
  • D.新文档权重小于 1

答案:C。对数衰减的斜率随 t 增大而减小,即“边际折扣递减”,权重下降得越来越慢且永远大于 0。指数衰减是恒定比例下降(A 错);对数衰减不会降到负值(B 错);t=0 时权重为 1,新文档不打折(D 错)。

Q5. 以下哪些场景适合用指数衰减?(多选)

多选题 · mid

  • A.新闻资讯实时检索← 正确答案
  • B.基础学科教科书库
  • C.股票行情快讯← 正确答案
  • D.十年不变的行业标准文档

答案:AC。指数衰减适合“信息快速过时”的场景——新闻(A)和行情快讯(C)都是典型强时效场景。教科书(B)和行业标准(D)内容长期有效,更适合对数衰减或干脆不做时间折扣。判断标准如同理货:生鲜食品每天打折,经典书籍只需偶尔调整位置。

Q6. 加权融合公式 final = β·rel + (1-β)·time 中,直接相加前必须做什么?

单选题 · hard

  • A.把 rel 乘以 100
  • B.对两个分数分别做归一化← 正确答案
  • C.把 time 取倒数
  • D.对 β 取对数

答案:B。如果 rel 的范围是 0~30,而 time 是 0~1,直接相加时 time 几乎没有存在感。必须先将两者归一化到同一量纲(如 0~1 区间),加权才有意义。这就像比较牛奶价格时,不能拿“分”和“元”直接比——先换算成同一单位再说。

Q7. 关于时间衰减检索的实现方式,哪些说法正确?(多选)

多选题 · hard

  • A.检索前过滤适合剔除绝对过期的文档← 正确答案
  • B.检索中动态加权需要向量数据库支持自定义打分← 正确答案
  • C.重排序阶段加时间因子是最省算力的方案
  • D.三种实现方式只能选一种使用

答案:AB。A 正确——WHERE pub_time > now() - 90 days 这类硬过滤适合剔除不可能有用的文档,省算力。B 正确——动态加权需要在相似度计算后乘时间因子,不是所有向量库都支持。C 错误——重排需要多一步排序,不算省力。D 错误——实际项目中常组合使用(先过滤再重排)。

Q8. 某业务设定半衰期为 30 天,则衰减率 λ 约为多少?

单选题 · mid

  • A.0.023← 正确答案
  • B.0.693
  • C.3.0
  • D.0.1

答案:A。半衰期和 λ 的关系为 T = ln2 / λ,所以 λ = ln2 / T = 0.693 / 30 ≈ 0.0231。选项 A 正确。B 是 ln2 的数值,C 是 T/10,D 是新闻场景的常用近似值。算清这一步才能把业务需求准确地翻译成数学参数。

Q9. 在 RAG 重排序阶段应用时间衰减,正确的流程是?

单选题 · hard

  • A.先过滤旧文档再检索召回
  • B.先按时间排序再做文本匹配
  • C.先相关性召回 Top N,再乘时间折扣重排← 正确答案
  • D.直接把时间加到向量里做检索

答案:C。重排序的正确姿势是“先保召回、再调顺序”——先用标准方法召回 Top N(保证不漏),然后乘时间权重重排(保证新鲜度优先)。A 是检索前过滤,C 才是重排序的典型实现。B 和 D 混淆了检索和排序的职责。这和理货一样:先保证货架上该有的商品都在,再调整摆放位置。

Q10. 关于对数衰减,以下说法正确的有?(多选)

多选题 · hard

  • A.t=0 时权重为 1← 正确答案
  • B.权重渐近于 0 但永远不等于 0← 正确答案
  • C.适合法规、教程等长效文档← 正确答案
  • D.衰减率绝对值随时间增大而增大

答案:ABC。A 正确——新文档权重为 1,不打折。B 正确——对数衰减理论上永远不会到 0。C 正确——长效文档适合温和降权。D 错误——对数衰减的导数(衰减率)绝对值随时间递减,是越降越慢。这个特性使它特别适合“老而弥坚”的知识类型。