在无外部客观真值的玄学领域,通过 TypeScript 确定性规则引擎计算所有衍生事实,LLM 仅负责按人设翻译表达,从架构上根除幻觉。
我在一个 LLM 真实性最差_single worst domain领域做软件:算命。一个八字(中国四柱占星术)解读应用,模型的工作是听起来像一位智慧大师——而竞品 AI 产品的用户评价集中在一个抱怨上:"纯属胡扯。"LLM 被要求"解读出生图表"时,会幻觉出不存在的图表元素,发明传统中不存在的规则,并以完全自信的语气呈现这一切。在一个没有任何外部客观事实可供检验的领域,用户无法辨别——直到同一张图表的两次解读互相矛盾。
不管你怎么看这个领域(我之前写过它真正困难的时区数学问题),工程上的答案是可以迁移到任何不能胡编乱造的 LLM 产品上的。只有一条规则:
确定性引擎决定说什么。LLM 只决定怎么说。
图表、元素强弱、吉凶分析、每一个派生事实——全部由 TypeScript 规则引擎计算,有单元测试,有发布的常量。模型收到这些事实作为一个紧凑的块和一条指令:只引用给出的内容。这是一个带着人格的翻译者,不是先知。
这是容易的 80%。有趣的工程在三个差点打破规则的地方。
很多用户不知道自己的出生时辰——而时辰是四柱之一。两种朴素选项都很糟糕:拒绝用户,或者让模型在空白处即兴发挥。猜猜如果直接省略时辰模型会做什么:它会填充那个空洞。静悄悄地。用一个具体的、似是而非的、虚构的柱。
修复方法是让引擎确定性处理不确定性。时辰未知 → 恰好有 12 种可能的图表。计算全部 12 种,然后取交集:只有所有候选图表中都成立的事实才会进入 prompt。元素强弱在全部 12 种中都一致?陈述它。它分裂成 7/5?那 prompt 里就说,原文是:"strength undetermined (7 of 12 candidates lean strong) — you may not build on this."
关键的是,空洞本身要明确标出而不是省略:
Chart: 己未 丙寅 庚午 ▢ (hour pillar unknown — 12 candidate
charts computed, only facts true in all of them are listed)
这个 ▢ 物有所值。显式标出的空洞胜过静默的空洞:留空位模型会回填;标出来并指示("不要提及时辰柱;不要讨论它掌管的人生领域;虚构一个就是说谎")模型就会绕开它。prompt 甚至告诉模型如何优雅收尾——一句话说明如果用户得知出生时间还能看到什么。不确定性成了产品特性而不是幻觉现场。
Prompt 是策略,不是执行。所以生成的文本在存储前要过验证器:
虚构柱检测。对于时辰未知图表,扫描输出中是否出现 12 个候选时辰柱中的任何一个。技巧是匹配两字符的干支对,绝不匹配单字——单字"子"会出现在普通词"孩子"里,"金"会出现在"资金"里。配对匹配几乎没有误报;单字匹配则会标记一半的句子。
禁止模式扫描。宿命论/恐吓式表达的 regex 列表("一定会离婚"、"命短"、"不治之症")——这是该领域的黑暗模式,已经编码。这不只是品味问题:管辖这个垂直领域的所有平台策略(搜索质量指南、广告政策、支付处理商)都在具体末日论断和诠释性反思之间划定允许/禁止线。regex 列表就是代码化的合规边界。
封闭词汇检查。引擎从不计算的星宿/神灵术语列表;如果输出中出现了其中一个,说明模型从训练数据里导入了民俗知识。标记待审。
验证器原本有第三道更强力的检查:一个白名单断言,断言输出中的每个天干、地支和"十神"术语都来自图表 JSON。几个月后代码审查时,我发现它的两个循环都在问一个集合是否包含从同一个集合中取出的元素——这个条件永远为真,所以链接到的检查永远无法触发。两个支撑数组从未被读取过。它逮到了零次违规,一次都没有。
我删掉了它,并写了一条注释解释原因,包括一个真实版本需要解决什么(和上面一样的单字冲突问题)。我现在到处应用两条教训:
一道无法触发的护栏比没有护栏更糟糕——它会出现在每个架构图和代码审查里显示"我们验证了",然后每个人就不再思考它。
像测试代码一样测试你的验证器:用必须失败的输入来测试。一个没有失败测试用例的验证函数是一个假设,不是一道门。
人格和所有指令用中文写成;应用也提供英文解读。一句"用英文回复"在与 2000 字中文 prompt 接触后无法存活:模型会发出混合句子进入生产环境——实际例子:"Your盘的里,其实事业和财这两条线比性格更有讲头" ——直接从人格里的中文例句中搬过来的。修复方案:明确的一段话说上面的每个引句只是语气示范,不得复制或翻译,输出中不得包含中文字符,拼音除外。当你的 prompt 是双语时,语言指令必须压过整个 prompt 的其余部分。
成本。模型每节写 300 字的风格化散文,而不是"推理"图表。不需要思维链——思考模式关闭,调用约 1.5 秒,成本不到一分钱。
一致性。两个相同图表的用户得到的是相同事实上的风格变化,不是两种不同的命运。重读不会矛盾。
这条线是可以审计的。当用户问"为什么这么说?"时,可以指向一个引擎事实——和网站方法页上公布的是同一个。
这个模式很老了,说实话——就是一个编译器发出事实,一个美化器渲染它们。唯一新的部分是美化器去读了艺术学校,如果你放任它,它就会发明事实。别放任它:计算真相,标出空洞,验证输出,测试你的验证器确实能失败。
应用地址:auspiceoracle.com —— 引擎的评分常量公布在方法页上,这是同样的"展示你的工作"规则应用到营销上。