跳到主要内容

时间敏感性识别

上一篇讲了会话记忆装载与历史上下文构建。装载完记忆后,prepare 方法紧接着要做的第一件事就是识别用户问题的时间敏感性:

// 识别是否需要处理"今天/最新/现在"等时间敏感表达,供后续路由和 Agent 提示词使用。
boolean requiresCurrentDateAnchoring = TimeSensitiveQueryHelper.requiresCurrentDateAnchoring(question);
boolean requiresFreshSearch = TimeSensitiveQueryHelper.requiresFreshSearch(question);

这两个布尔值会在后续的路由判断、Agent 提示词构建、无证据回复等多个环节被用到,所以在最开始就要识别清楚。

为什么要识别时间敏感性?

AI 模型的训练数据有截止日期,它不知道"今天"是哪天,也不知道"最新"的股价是多少。如果用户问"今天天气怎么样",模型直接回答会答非所问。所以系统需要提前识别出这类问题,然后:

  • 在提示词里注入当前日期,让模型知道"今天"是几号
  • 触发外部搜索,去拿真正的实时数据

这就是 TimeSensitiveQueryHelper 存在的意义。

关键词列表设计

在看两个方法的逻辑之前,先了解一下 TimeSensitiveQueryHelper 里定义的几组关键词列表,整个判断逻辑都是围绕这些列表展开的。

/**
* 时间敏感问题识别工具。
* 用于判断一个问题是否需要:
* 1. 以"当前日期"为锚点理解相对时间表达
* 2. 优先查询最新外部事实
* 3. 在搜索词中补充时间提示,减少把旧事实误当成今天的风险
*/
public final class TimeSensitiveQueryHelper {

// 匹配显式日期,比如 2024-05-01、2024年5月1日、5月1日
private static final Pattern EXPLICIT_DATE_PATTERN = Pattern.compile(
"(\\d{4}[-/.年]\\d{1,2}[-/.月]\\d{1,2}日?)|(\\d{1,2}月\\d{1,2}日)"
);

// 相对时间关键词:今天、本周、最新、实时……
private static final List<String> RELATIVE_TIME_KEYWORDS = List.of(
"今天", "今日", "明天", "明日", "昨天", "昨日", "后天", "前天",
"现在", "当前", "目前", "此刻", "实时", "最新", "刚刚",
"本周", "这周", "本月", "这个月", "今年", "本年度", "本季度",
"周几", "星期几", "几号", "日期", "几月几号"
);

// 典型"需要实时数据"的领域词:天气、股价、汇率、新闻……
private static final List<String> FRESH_INFORMATION_KEYWORDS = List.of(
"天气", "气温", "温度", "降雨", "下雨", "下雪", "空气质量", "aqi",
"限号", "限行", "尾号限行",
"汇率", "金价", "黄金价格", "银价", "油价",
"股价", "行情", "大盘", "指数",
"新闻", "头条", "热搜", "热榜",
"路况", "拥堵",
"票房", "排片",
"航班", "班次", "列车", "高铁", "火车", "地铁运营",
"比分", "赛果", "赛程", "比赛结果",
"预警", "台风"
);

// 日历类关键词:周几、几号……
private static final List<String> CALENDAR_KEYWORDS = List.of(
"周几", "星期几", "几号", "日期", "几月几号", "星期", "周"
);

// 历史意图关键词:历史、去年、上周……
private static final List<String> HISTORICAL_HINTS = List.of(
"历史", "过去", "去年", "前年", "上周", "上个月", "上月", "上一周",
"上一月", "往年", "历年", "当时", "之前", "回顾", "曾经"
);
}

这四组列表的分工很清晰:

列表作用
RELATIVE_TIME_KEYWORDS识别相对时间词,需要知道"今天"是哪天才能理解
FRESH_INFORMATION_KEYWORDS识别实时数据领域,必须查最新数据
CALENDAR_KEYWORDS识别日历类问题,需要日期锚定但不一定要搜索
HISTORICAL_HINTS识别历史回顾类问题,这类问题反而不需要锚定到今天
注意

HISTORICAL_HINTS 是一个"排除"列表,用来避免误判。比如"去年的新闻"虽然包含"新闻",但它是历史问题,不应该触发实时搜索。

requiresCurrentDateAnchoring:需要日期锚定吗?

这个方法判断的是:模型在回答这个问题时,是否需要知道"今天"是哪一天?

付费内容提示

该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放

加入星球后,你可以获得:

  • 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
  • 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
  • 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
  • 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠