You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AMAZON.DATE槽类型自定义处理仅识别过去日期的问题咨询

解决方案

核心优化思路

你现有方案的核心缺陷是仅依赖槽位解析后的日期结果做判断,没有结合用户输入的原始文本语义,所以无法区分「明确要未来日期」和「模糊指代过去日期」的场景,也没法解决周几/几号的输入歧义。你需要额外获取AMAZON.DATE槽对应的用户原始输入文本(Amazon Lex/Alxea的槽返回结果都包含原始输入字段),用语义判断先解决两类歧义,再配合原来的日期差值逻辑处理。

具体修改后的代码

import datetime
import re

# 提前定义规则集,可根据业务场景扩展
# 明确的未来时间修饰词,匹配到直接报错
FUTURE_KEYWORDS = {"明天", "后天", "下周", "下个月", "明年", "下周一", "下周二", "下周三", "下周四", "下周五", "下周六", "下周日", "下个"}
# 周几表述正则
WEEKDAY_PATTERN = re.compile(r'周[一二三四五六七日天]|礼拜[一二三四五六七日天]|星期[一二三四五六七日天]')
# 日期表述正则(几号/几日)
MONTH_DAY_PATTERN = re.compile(r'\d+[号日]|^\d+$')

def getArticleDate(input_date: datetime.date, raw_date_input: str):
    today = datetime.date.today()
    diff = (input_date - today).days

    # ========== 第一层判断:先筛明确要未来的请求 ==========
    # 情况1:原始输入包含未来修饰词
    if any(keyword in raw_date_input for keyword in FUTURE_KEYWORDS):
        raise ValueError(f"无法查询未来日期({input_date.isoformat()})的新闻,请选择过去日期")
    # 情况2:原始输入包含大于当前年份的完整年份
    year_match = re.search(r'20\d{2}', raw_date_input)
    if year_match and int(year_match.group()) > today.year:
        raise ValueError(f"无法查询未来日期({input_date.isoformat()})的新闻,请选择过去日期")

    # ========== 第二层判断:日期是过去的直接返回 ==========
    if diff <= 0:
        return input_date

    # ========== 第三层判断:处理未来日期的修正 ==========
    # 先判断输入类型是周几还是几号,解决7天内的优先级冲突
    is_weekday_input = bool(WEEKDAY_PATTERN.search(raw_date_input))
    is_month_day_input = bool(MONTH_DAY_PATTERN.search(raw_date_input))

    # 情况1:用户输入的是周几,7天内的减7天
    if diff <=7 and is_weekday_input:
        return input_date - datetime.timedelta(days=7)
    
    # 情况2:用户输入的是当月日期,找最近的过去的同天
    if input_date.month == today.month and input_date.year == today.year:
        end_of_month = today
        while end_of_month.day < input_date.day:
            end_of_month = end_of_month.replace(day=1) - datetime.timedelta(days=1)
        return end_of_month.replace(day=input_date.day)
    
    # 情况3:输入是月日但没带年份,减1年
    if input_date.replace(year=input_date.year -1) < today:
        return input_date.replace(year=input_date.year -1)
    
    # 其他超过1年的未来日期直接报错
    raise ValueError(f"{input_date.isoformat()} 超出可查询范围,仅支持查询过去日期的新闻")

适配你提到的异常场景

  1. 用户明确要未来日期的场景:比如输入「明天」、「2022年1月30日」,会在第一层判断就被捕获,直接返回报错,不会进入后面的修正逻辑。
  2. 当月日期和周几的优先级冲突:比如11月14日输入「17号的新闻」,会先判定为日期类输入,不走周几的减7天逻辑,直接进入当月日期处理分支,返回10月17日;如果输入「周三的新闻」,判定为周几输入,减7天返回11月10日,完全符合预期。

可扩展优化点

如果业务场景更复杂,你可以继续扩展规则集:

  • 补充更多未来修饰词,比如方言、网络用语的未来表述
  • 针对「上个月」、「去年」这类明确过去的修饰词,可以直接跳过修正逻辑
  • 增加用户澄清逻辑,比如修正后日期距离当前超过半年,可以询问用户是否为对应日期,进一步降低错误率

内容的提问来源于stack exchange,提问作者Sam Tuson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:54:03