让机器人听懂“下周三”“后天”这样的自然语言?我有两套方案告诉你!
让机器人听懂“下周三”“后天”这样的自然语言?我有两套方案告诉你
你有没有遇到过这种情况:用户问“下周三上海天气怎么样”,你的机器人完全不知道“下周三”是哪一天;用户说“帮我规划五一假期北京旅游”,大模型提取出来的开始日期是“五一”,结束日期却空空如也。
你让用户“说清楚点”,用户却觉得机器人很笨。
其实这不是你的错,也不是大模型不够聪明。大模型天生擅长理解语义,但对“从今天起算的相对日期”这种需要实时参照今天才能算准的事情,它确实力不从心。
今天这篇文章,我就把两种经过验证的解决方案整理出来。你不需要从头摸索,照着做就能让机器人听懂“下周三”“后天”“未来三天”这些日常说法。
到底有哪些方法可以用
在Coze工作流里,目前有两种主流做法能够把自然语言时间转成标准日期。
第一种是纯大模型解析。你写好提示词,让大模型直接输出YYYY-MM-DD格式的日期。这种方法实现起来最快,不需要写代码,适合大多数日常场景。
第二种是大模型加代码节点。大模型先把用户的话拆解成容易理解的变量,比如“下周三”变成“下周的星期三”,“三天后”变成“三天偏移量”,然后代码节点用Python精确算出具体日期。这种方法准确率更高,尤其适合那些对日期精度要求很严格的项目。
简单来说,想快速上手就选方案一,想要稳如磐石就选方案二。我个人更推荐方案二,因为一旦涉及到“今天”“明天”“未来X天”这种需要参照当前时间的计算,代码算出来的结果永远不会出错。
方案一:只用大模型解析
如果你不想写一行代码,这个方法最适合你。
它的核心思想很简单:让大模型直接输出日期,并且用一个非常具体的示例告诉它“只能输出这个格式,不要多一个字”。
举个例子,你可以在提示词里这样写:
从以下用户输入中提取出旅行的开始日期和结束日期。如果用户没有明确提供结束日期,则默认开始日期和结束日期都等于当天日期。
请严格按照下面的JSON格式输出,不要有任何额外的解释:
{"start_date": "2026-06-13", "end_date": "2026-06-13"}
用户输入:{{user_input}}
同时,你还需要告诉大模型今天的日期是什么。你可以在工作流里先调用一个日期时间插件,或者用一个简单的代码节点获取当前时间,然后把“今天是XXXX年XX月XX日”这个信息喂给大模型。否则它不知道“下周三”应该从哪天开始算。
为了让大模型能够处理“下周三”“未来三天”这类表达,你还需要在提示词里写明计算规则。比如可以这样写:如果用户输入包含“未来X天”,则结束日期等于开始日期加上X天;如果用户输入包含“下周三”,请根据当前日期向后推算到下一个周三。
这种方法的局限性也很明显。大模型对闰年、跨月、跨年的日期推算容易出错。而且有时候即便你提示词写得再具体,它还是会在输出结果前加一句“好的,已为您提取”,导致后续节点解析失败。
方案二:大模型提取语义,代码节点精确计算
如果你希望机器人的日期解析能力更稳定,试试这套组合拳。
这个方案的核心思路是把“理解语义”和“精确计算”拆开。大模型只做它擅长的事——把用户的自然语言翻译成结构化的变量,比如“下周三”变成“weekday偏移量”,“三天后”变成“days偏移量”。至于具体日期是多少,全部交给Python去算。
第一步,在工作流的最开始获取当前时间。你可以直接用一个日期时间插件,或者写一个只有两行代码的代码节点:
from datetime import datetime
def main(input_data):
current_date = datetime.now().strftime("%Y-%m-%d")
return {"current_date": current_date}
第二步,设置一个大模型节点,专门负责把用户的话拆解成结构化数据。它的提示词不需要让它知道今天是几号,只需要让它识别出用户说的是“今天”“明天”“下周三”还是“X天后”。例如你可以这样写:
你是一个专业的自然语言时间解析助手。请将用户输入中关于日期的部分解析成标准的结构化数据,输出JSON格式。
规则如下:
- “今天”“今日”“此刻”输出 {"type": "today"}
- “明天”“明日”输出 {"type": "tomorrow"}
- “后天”输出 {"type": "in_days", "days": 2}
- “X天后”输出 {"type": "in_days", "days": X}
- “下周一”到“下周日”输出 {"type": "next_weekday", "weekday": "Monday"} 等
用户输入:{{user_input}}
当前参考日期(仅用于理解,不要输出具体日期):{{current_date}}
请严格按照以上规则输出一个JSON对象。如果解析不出来,输出 {"type": "unknown"}
第三步,把大模型输出的JSON传给一个代码节点,由Python完成最后的日期计算。下面是一个可以直接复制使用的核心代码:
import json
from datetime import datetime, timedelta
def main(input_data):
intent_str = input_data.get("intent", "{}")
current_date_str = input_data.get("current_date", datetime.now().strftime("%Y-%m-%d"))
current_date = datetime.strptime(current_date_str, "%Y-%m-%d")
intent = json.loads(intent_str) if isinstance(intent_str, str) else intent_str
result = {}
if intent.get("type") == "today":
result["start_date"] = current_date_str
result["end_date"] = current_date_str
elif intent.get("type") == "tomorrow":
target_date = current_date + timedelta(days=1)
result["start_date"] = target_date.strftime("%Y-%m-%d")
result["end_date"] = target_date.strftime("%Y-%m-%d")
elif intent.get("type") == "in_days":
days = intent.get("days", 0)
target_date = current_date + timedelta(days=days)
result["start_date"] = target_date.strftime("%Y-%m-%d")
result["end_date"] = target_date.strftime("%Y-%m-%d")
elif intent.get("type") == "next_weekday":
weekday_map = {"Monday":0, "Tuesday":1, "Wednesday":2, "Thursday":3, "Friday":4, "Saturday":5, "Sunday":6}
target_weekday = weekday_map.get(intent.get("weekday", ""), -1)
if target_weekday != -1:
days_ahead = (target_weekday - current_date.weekday() + 7) % 7
if days_ahead == 0:
days_ahead = 7
target_date = current_date + timedelta(days=days_ahead)
result["start_date"] = target_date.strftime("%Y-%m-%d")
result["end_date"] = target_date.strftime("%Y-%m-%d")
else:
result["error"] = "未能解析日期,请使用标准格式(如:2026-06-13)"
if "end_date" not in result:
result["end_date"] = result.get("start_date", "")
return result
这段代码已经涵盖了“今天”“明天”“后天”“X天后”“下周三”等最常见的表达。如果你还需要处理“中秋节”“国庆节”这类带名字的节假日,可以在代码里提前建一个日期映射表。
几个常见的坑,提前知道能省很多时间
第一,日期解析总差一天。这是因为Python中weekday函数把周一当作0,周日当作6,而日常语境里有时把周日当作一周的第一天。解决办法是在代码里统一基准,或者手动定义一个修正函数。
第二,跨年计算出错。如果用户在12月说“明年1月”,代码节点默认会在当前年份上加一天,结果算出来还是今年。你可以在大模型节点里让大模型输出一个年份偏移量,然后在代码里手动加上这个偏移。
第三,代码节点报JSON解析错误。大模型输出的字符串里经常会带上换行符或多余的空格。你可以先在代码里用正则表达式把换行符替换掉,再尝试解析。
第四,大模型总想输出解释性文字。解决方案是在提示词末尾明确写上“不允许输出示例之外的内容,只允许输出单行JSON”,如果还不放心,可以在代码节点里做一层保护:只提取第一个左大括号到最后一个右大括号之间的内容。
总结一下
时间解析是智能体开发中绕不开的一环。方案一简单快速,写好提示词就能应付大部分日常场景,适合快速验证想法。方案二稳扎稳打,把理解和计算分开,虽然配置稍微多了几步,但它不会给你埋定时炸弹。
如果你做的项目只是个人使用或者内部测试,方案一完全够用。但如果你是做旅游规划、日程管理这类对日期精度要求很高的产品,我强烈建议你采用方案二。多花十分钟配置一个代码节点,后面能省下无数次熬夜排查日期错误的时间。
你在开发过程中遇到过最奇怪的日期解析bug是什么?欢迎在评论区分享,我们一起想办法解决。
柒柒
2026年6月
更多推荐


所有评论(0)