干支编码的确定性实现:节气切分 + 1000 条溯源断语(附 JS 源码)

同一个出生时间,问三个 AI 内容产品,得到三个不同的干支编码结果------这不是 AI 不够聪明,是工具选型错误:该用确定性代码的地方,用了概率模型硬扛。

本文复盘我花 13 天做的开源历法引擎:干支编码为什么是确定性计算、节气边界怎么处理、1000 条带出处的断语库怎么建,附完整源码。

一、干支编码:规则是死的,答案只有一个

把公历时间转换为干支纪年(年柱/月柱/日柱/时柱),规则全部确定:

  • 年界看立春时刻,不看春节;
  • 月界看节气交节时刻(精确到分钟);
  • 23 点后为晚子时,时柱按次日干支;
  • 中国 1986-1991 年夏令时需回拨一小时;
  • 真太阳时按出生地经度校正。

每个边界答案唯一、可复现------这正是"该计算而非生成"的典型问题。

二、为什么大模型会算错

大模型是概率模型,本质在猜"下一个词最可能是什么"。让它处理历法边界:

  • 偶尔对:训练数据里见过类似案例;
  • 经常错:历法边界是低频细节,覆盖不足;
  • 无法一致:同一输入、不同推理路径,输出不同。

用户问出三个答案,等于没问。

三、确定性实现:206 年节气表 + 精确切分

工程上采用预验证数据表方案,节气时刻不靠公式现算:

js 复制代码
// 节气表(1895-2100 共 206 年,预验证数据)
const JIEQI = {
  range: [1895, 2100],
  data: {
    "2026": ["02-04 04:02", "03-05 21:59", "04-05 02:40", /* 立春/惊蛰/清明... */],
    // ...
  }
};

// 年柱:立春时刻为界,精确到分钟
function yearGZ(y, m, d, hh, mm) {
  const lichun = parseJieqi(JIEQI.data[y][0]); // 立春时刻
  const born = toMinutes(y, m, d, hh, mm);
  const yy = born >= lichun ? y : y - 1;
  return ganZhiFromYear(yy);
}

核心排盘调用(101 个 API 之一):

js 复制代码
const ctx = BaziEngine.paipan("测试", "男", 1990, 5, 15, 23, 30, "广州市", "no");
// ctx.yg=庚午 ctx.mg=辛巳 ctx.dg=庚辰 ctx.hg=戊子
// 23:30 属晚子时:日柱仍为当天庚辰,时柱已按次日日干遁为戊子

四、断语库:1000 条,每条带古籍出处

解读不是让 AI 现场编,而是规则匹配 + 出处可追溯

json 复制代码
{
  "id": "char_jia",
  "category": "性格",
  "condition": { "日主": "甲木" },
  "conclusion": "如参天大树,仁德有担当,有领导气质;喜火通明、水木相滋,忌金重土埋。",
  "source": "《滴天髓》甲木参天 / 《穷通宝鉴》甲木",
  "confidence": "高",
  "suggestion": "发挥领导才能,注意人际柔性,寒木需火暖局"
}

每条断语都标注书名篇名,不搞"祖传秘方"。审计脚本专门扫描两类问题规则:

  • "永远成立"的废话规则 → 删;
  • "永远不命中"的死规则 → 删;
  • 1000 个真实盘批量跑,检查断语矛盾。

五、工程质量:13 套测试 + CI 门禁

  • 13 套回归测试(排盘 28 项 / 农历 27 项 / E2E 验收等);
  • CI 门禁:不绿不让合并;
  • 单文件 438KB、零外部依赖,浏览器/Node 双端可用。

六、开源与在线体验


历法计算是确定性的,该算的不能靠猜。欢迎 ⭐ star 仓库、提 issue/PR,或评论区聊聊你的实现思路。

免责声明:本文内容仅供历法技术研究与传统文化参考,不构成任何专业建议。

相关推荐
一晌小贪欢20 分钟前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
Mh21 分钟前
听说我兄弟喜欢跑车,所以必须安排上
前端·javascript·vue.js
孫治AllenSun21 分钟前
【LangChain4J-06】Prompt 工程与模板化开发
开发语言·python·prompt
qq_4260039623 分钟前
多语言新增语种全量测试策略
前端·javascript·python·pycharm·自动化
黄敬峰29 分钟前
从零搭建 Next.js 单词管理系统:Supabase + Drizzle ORM + shadcn/ui 全栈实战
javascript·面试
wuyk55530 分钟前
9.冒泡排序:像鱼缸泡泡一样的简单排序算法
开发语言·stm32·单片机·算法·排序算法
nicole bai31 分钟前
前端封装el-table及注意点
前端·javascript·vue.js
路多辛36 分钟前
为什么用 Go 写 AI Agent,covo-agent 的选型思考
开发语言·golang·agent·ai编程
晨枫阳41 分钟前
Vue 前端构建工具链完全理解指南
前端·javascript·vue.js