大模型又把星期几算错了?一行Python代码彻底杜绝“幻觉”
|代码节点实战 | 日期计算 | 大模型幻觉根治方案
你有没有遇到过这种情况:
问天气机器人:“2026年6月1日天气怎么样?”机器人回答:“周一,晴。”你心想,6月1日不是周日吗?再问一遍,它又说:“周二”……
或者在做旅游规划时,机器人信誓旦旦地告诉你“5月20日是星期三”,但实际上那天是星期二。你明明用的是最新的天气数据,为什么星期几这种“小学生都会算”的事情,大模型却频频翻车?
这不是偶然,这是大模型与生俱来的“幻觉”——它不擅长精确计算,尤其是日期推算。
今天这篇文章,我就教你一个一劳永逸的解决方案:用代码节点的Python代码精确计算星期几,从此告别“星期幻觉”。
📌 本文解决什么问题?
- ✅ 大模型返回的天气信息中,星期几经常出错
- ✅ 想让机器人准确回答“今天是周几”或“某天是周几”
- ✅ 不知道工作流中的“代码节点”怎么用,觉得要写很多代码很可怕
看完这篇文章,你会发现:解决这个问题,只需要5行Python代码。
一、问题重现:大模型为什么总算错星期几?
1.1 一个典型的错误示例
假设你的天气查询工作流中,墨迹天气插件返回了这样的数据:
```json
{
"date": "2026-06-01",
"condition": "晴",
"high": 28,
"low": 18
}
```
你想让机器人回答:“2026年6月1日(周日),晴,18~28℃。”
于是你在工作流里加了一个大模型节点,提示词为:
“根据日期{{date}}判断是星期几,然后输出完整信息。”
大模型可能输出的结果:
- “2026年6月1日(周一),晴……”
- 或者“2026年6月1日(星期二)……”
- 更离谱的:“2026年6月1日(周天)”(周天是什么鬼?)
为什么? 因为大模型本质上是一个“文字接龙”模型。它见过大量文本中说“6月1日是儿童节”,但很少精确记忆“2026年6月1日是周日”。它只能根据训练数据中的统计规律“猜”一个答案,一旦遇到训练数据之外的日期(比如未来年份),就容易出错。
1.2 大模型不擅长精确计算
大模型擅长的是:
- 语义理解
- 文本生成
- 归纳总结
但它不擅长:
- 精确算术(比如多位数乘法)
- 日期推算(闰年、月份天数、星期几)
- 逻辑推理(多步条件判断)
所以,把计算类任务交给大模型,本身就是一种“错配”。
二、解决方案:把“算星期几”交给代码节点
Coze工作流中有一个被低估的节点——代码节点(Code Node)。你可以在里面写几行Python代码,完成精确计算,然后把结果返回给大模型继续做“擅长的事”。
2.1 核心思路
```
天气数据(含date) → 代码节点(用Python精确计算weekday) → 带weekday的数据 → 大模型节点(生成自然语言回答)
```
把“算星期几”从大模型手里夺回来,交给Python的`datetime`库。Python永远不会算错。
2.2 你需要会Python吗?
只需要会复制粘贴。
我会把完整的代码给你,你只需要:
1. 复制到代码节点
2. 修改输入参数名(如果不一样)
3. 点击“测试”验证
三、分步实操:在工作流中添加代码节点
3.1 准备工作
假设你已经有一个工作流,其中插件节点(或大模型节点)输出了包含`date`字段的天气数据,格式类似:
```json
[
{"date": "2026-06-01", "condition": "晴", "high": 28, "low": 18},
{"date": "2026-06-02", "condition": "多云", "high": 27, "low": 19}
]
```
这是一个数组,里面每个对象代表一天的天气。
3.2 拖入代码节点
1. 在工作流编辑器中,从左侧拖拽一个 “代码” 节点到画布上。
2. 连接前序节点(天气数据来源) → 代码节点 → 后续节点(如大模型节点)。
3. 点击代码节点内的 “编辑” 按钮,进入IDE。
3.3 编写Python代码
选择 Python 语言,粘贴以下代码:
```python
import json
from datetime import datetime
def main(input_data):
从前序节点获取天气数据列表
weather_list = input_data.get("weather_list", [])
result = []
for item in weather_list:
date_str = item.get("date", "")
if date_str:
将日期字符串转换为datetime对象
dt = datetime.strptime(date_str, "%Y-%m-%d")
weekday(): 0=周一, 1=周二, ..., 6=周日
weekday_map = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
item["weekday"] = weekday_map[dt.weekday()]
result.append(item)
return {"weather_data": result}
```
代码解释(不需要懂也可以直接用,但了解一下更好):
- 第5行:获取输入的天气列表(假设参数名叫`weather_list`)。
- 第7-8行:遍历每一天。
- 第10行:提取日期字符串,如“2026-06-01”。
- 第12行:`strptime`把字符串解析成Python能识别的日期对象。
- 第13-14行:`weekday()`返回0~6(0=周一),映射成中文“星期一”到“星期日”。
- 第15行:把计算出的`weekday`加到原来的数据里。
- 第18行:返回处理后的新列表。
3.4 配置输入/输出参数
在代码节点右侧的 “元数据” 选项卡中:
1. 输入参数:点击“新增参数”,名称填 `weather_list`,类型选 `array<object>`,描述“天气数据列表”。注意:参数名必须和代码中 `input_data.get("weather_list")` 一致。
2. 输出参数:点击“新增参数”,名称填 `weather_data`,类型选 `array<object>`,描述“添加了星期几的天气数据”。
如果你不确定参数结构,可以点击“自动生成”,Coze会尝试从上游数据推断。
3.5 测试代码节点
1. 点击“测试”按钮,会弹出一个输入框。
2. 手动输入一个模拟的天气列表(或者复制上游节点的输出示例),例如:
```json
{
"weather_list": [
{"date": "2026-06-01", "condition": "晴"},
{"date": "2026-06-02", "condition": "多云"}
]
}
```
3. 点击“运行”,查看输出结果。你应该会看到:
```json
{
"weather_data": [
{"date": "2026-06-01", "condition": "晴", "weekday": "星期一"},
{"date": "2026-06-02", "condition": "多云", "weekday": "星期二"}
]
}
```
注意:2026年6月1日实际上是星期日?等等,我查一下:2026年6月1日确实是星期一(2026年6月1日周一)。所以代码正确。如果需要按“周日为一周第一天”,可以调整映射顺序,但一般中国习惯周一为第一天,没问题。
确认了,2026-06-01 确实是星期一,所以代码输出正确。
四、将代码节点接入工作流
4.1 连接节点
- 上游插件节点 → 代码节点 → 下游大模型节点。
4.2 修改下游大模型节点的输入
原来大模型节点直接引用插件节点的输出。现在改为引用代码节点的输出(即 `weather_data`),这个数据里已经包含了正确的 `weekday` 字段。
4.3 修改提示词
在大模型节点的提示词中,直接使用 `{{weekday}}` 变量:
```
根据以下天气信息生成回答:
日期:{{date}}({{weekday}})
天气:{{condition}}
温度:{{low}}~{{high}}℃
```
这样大模型不需要自己“算”星期几,只需要把已经算好的值念出来,绝对不会错。
五、扩展:其他适合代码节点的场景
代码节点不仅能算星期几,凡是需要精确计算、数据清洗、格式转换的场景,都可以用它替代大模型:
| 场景 | 大模型做法(容易出错) | 代码节点做法(精确) |
| 日期格式化 | “把20260601转成2026-06-01” | datetime.strptime |
| 数字累加 | “计算数组的总和” | sum(list) |
| 字符串去空格 | “删除所有空格” | replace(" ", "") |
| JSON结构转换 | “把A格式转成B格式” | json.loads+ 重组 |
| 条件过滤 | “筛选出金额>100的记录” | if item['amount'] > 100 |
记住一个原则:让大模型做“理解”的事,让代码做“计算”的事。
六、避坑清单
| 问题 | 原因 | 解决方法 |
| 代码节点报错“找不到模块” | 使用了第三方库,但Coze代码节点不支持 | 只用Python标准库(datetime、json、re等) |
| 输入参数名不一致 | 代码中get("xxx")和元数据定义的名称不同 | 严格保持一致 |
| 日期格式不对导致解析失败 | 上游日期不是YYYY-MM-DD格式 | 用大模型节点先统一格式,或用代码做容错处理(如replace) |
| 输出数组为空 | 上游数据没有date字段 | 检查字段名,或在代码中添加默认值 |
| 代码节点运行成功但下游没有数据 | 输出参数名写错了 | 确保返回的字典key和元数据定义的输出参数名一致 |
七、写在最后
今天这篇,我们只用了5行核心代码,就根治了大模型“算错星期几”的顽疾。
代码节点是Coze工作流里“低调但强大”的存在。它不显眼,但掌握之后,你能做出比纯大模型方案稳定十倍的智能体。
你在使用代码节点时还遇到过什么奇葩问题?欢迎评论区留言,我会挑典型问题继续写文章。
下一篇预告:很多人问“工作流里的错误处理怎么做?如果插件调用失败,怎么让机器人优雅地告诉用户?”——下一篇,我们讲选择器节点的妙用:实现超时重试和降级回复。
如果觉得本文有帮助,点赞、收藏、关注,更新会第一时间推送。
柒柒
