了解 LLM 如何解释业务规则、跟踪工作流状态并使用提示、工具、测试和人工审查来验证决策——不仅仅是写代码。

当人们问一个 LLM 是否“能对业务规则进行推理”时,他们通常想要的是比“它能写一个 if/else 语句”更复杂的能力。业务规则推理是能够一致地应用策略、解释决策、处理例外并与当前工作流步骤保持一致——尤其是在输入不完整、凌乱或不断变化时。
代码生成主要关注在目标语言中产生有效语法。规则推理关心的是保留意图。
模型可以生成完全有效的代码,但仍然产出错误的业务结果,原因包括:
换句话说,正确性不是“能否编译?”而是“是否与业务每次都会做出的决定一致,并且我们能否证明它?”
LLM 可以帮助把政策翻译成结构化规则、建议决策路径并为人工提供解释。但它们不会自动知道哪个规则具有权威性、哪个数据源可信或案件当前处于哪个步骤。在没有约束的情况下,它们可能自信地选择一个看上去合理的答案,而不是受管控的答案。
因此目标不是“让模型来决定”,而是给它结构和检查点,使其能够可靠地协助。
一个务实的方法看起来像一个流水线:
这就是聪明代码片段与能支持真实业务决策的系统之间的区别。
在讨论 LLM 如何“推理”之前,先把团队经常混在一起的两件事分开:业务规则 和 工作流。
业务规则 是组织希望一致执行的决策陈述。它们以政策和逻辑的形式出现,例如:
规则通常以“如果 X,则 Y”的形式表达(有时带例外),并应产生明确结果:批准/拒绝、价格 A/价格 B、请求更多信息等。
工作流 是将工作从开始推进到完成的过程。它更关注“接下来该发生什么”,而不是决定“什么被允许”。工作流通常包括:
想象一个退款请求。
规则片段: “购买后 30 天内允许退款。例外:数字下载一旦被访问即不可退款。例外:涉及争议的必须升级处理。”
工作流片段:
当规则发生冲突(“VIP 客户总能退款” vs. “数字下载永不退款”),依赖缺失的上下文(是否已访问下载?),或隐藏边缘情况(捆绑、部分退款、地区法律)时,规则就变得棘手。工作流增加了另一层:决策必须与当前状态、先前操作和截止日期保持一致。
LLM 并不像人那样“理解”业务规则。它们是基于大量文本学习到的模式来生成下一个最可能的词。这就是为什么 LLM 在猜测时也能表现得很有说服力——或者在缺失信息时默默填充未提供的细节。
这一限制对工作流和决策逻辑很重要。模型可能应用一个“听起来正确”的规则(“员工总需经理批准”),即便真实政策有例外(“仅在超过 $500 时”或“仅对承包商”)。这是一个常见的失败模式:自信但错误地应用规则。
即便没有真正的“理解”,当你把它们当作结构化助手来使用时,LLM 也能发挥作用:
关键是把模型置于不能轻易即兴发挥的位置。
减少歧义的实用方法是受限输出:要求 LLM 以固定模式或模板回应(例如带特定字段的 JSON,或带必需列的表格)。当模型必须填写 rule_id、conditions、exceptions 和 decision 时,就更容易发现空白并自动验证输出。
受限格式也更容易表明模型不知道某些信息。如果某个必填字段缺失,你可以强制模型提出后续问题,而不是接受不牢靠的答案。
结论:LLM 的“推理”最好被视为在结构引导下的基于模式的生成——适合用于组织和交叉校验规则,但如果把它当作不可置疑的决策者就很危险。
政策文档是为人写的:目标、例外和“常识”往往混在同一段落里。LLM 可以总结这些文本,但当你把政策转成明确、可测试的输入时,它们遵循规则会更可靠。
好的规则表示有两个特点:无歧义且可校验。
把规则写成你可以测试的语句:
规则可以以多种形式提供给模型:
真实政策会发生冲突。若两条规则相互矛盾,模型需要清晰的优先级方案。常见方法:
直接声明冲突规则或把优先级编码进去(例如 priority: 100),否则 LLM 可能会对规则进行“平均化”。
原始政策文本:
“年付计划在购买后 30 天内可退款。月付计划在 7 天后不可退款。如果账户显示欺诈或过高的争议率,则不得退款。企业客户退款超过 $5,000 需要财务批准。”
结构化规则(YAML):
rules:
- id: R1
statement: "IF plan_type = annual AND days_since_purchase <= 30 THEN refund MAY be issued"
priority: 10
- id: R2
statement: "IF plan_type = monthly AND days_since_purchase > 7 THEN refund MUST NOT be issued"
priority: 20
- id: R3
statement: "IF fraud_flag = true OR chargeback_rate = excessive THEN refund MUST NOT be issued"
priority: 100
- id: R4
statement: "IF customer_tier = enterprise AND refund_amount > 5000 THEN finance_approval MUST be obtained"
priority: 50
conflict_resolution: "Higher priority wins; MUST NOT overrides MAY"
现在模型不会猜测哪些细节重要——它在应用一个你可以审查、测试和版本化的规则集。
工作流不仅仅是一组规则;它是事件序列,早期步骤会改变接下来该做的事。那种“记忆”就是状态:关于案件的当前事实(谁提交了什么、哪些已被批准、什么在待办、有哪些截止时间适用)。如果不显式跟踪状态,工作流会以可预测的方式失败——重复审批、跳过必需检查、撤销决定,或者因为模型无法可靠推断已发生的事情而应用错误的政策。
把状态想象成工作流的记分牌。它回答:我们现在在哪里?已完成了什么?下一步被允许做什么?对于 LLM,提供清晰的状态摘要可以防止它重新审议过去的步骤或猜测。
调用模型时,除了用户请求外,还应包含一个简洁的状态负载。常用字段有:
manager_review: approved、finance_review: pending);避免丢出所有历史消息。相反,提供当前状态加上关键转变的简短审计轨迹。
把工作流引擎(数据库、工单系统或编排器)当作单一可信来源。LLM 应该从该系统读取状态并提出下一步动作,但系统应当是记录状态转换的权威。这能减少模型叙述与现实发生偏离的“状态漂移”。
{
"request_id": "TRV-10482",
"workflow": "travel_reimbursement_v3",
"current_step": "finance_review",
"step_status": {
"submission": "complete",
"manager_review": "approved",
"finance_review": "pending",
"payment": "not_started"
},
"actors": {
"employee_id": "E-2291",
"manager_id": "M-104",
"finance_queue": "FIN-AP"
},
"amount": 842.15,
"currency": "USD",
"submitted_at": "2025-12-12T14:03:22Z",
"last_state_update": "2025-12-13T09:18:05Z",
"flags": {
"receipt_missing": false,
"policy_exception_requested": true,
"needs_escalation": false
}
}
有了这样的快照,模型就能保持一致:不会再次请求经理批准,会聚焦于财务检查,并能基于当前标志和步骤解释决策。
一个好的提示不仅仅是询问答案——它要设定模型如何应用规则以及如何报告结果的期望。目标是可重复的决策,而不是华而不实的文案。
给模型一个与流程绑定的具体角色。三个互补角色通常效果很好:
你可以按顺序运行这些角色(“分析 → 验证 → 执行”),或在一个结构化响应中请求三种输出。
不要请求“chain-of-thought”,而应指定可见的步骤和交付物:
这能让模型有条理地工作,同时专注于可交付的内容:使用了哪些规则以及产生了何种结果。
自由形式的解释容易漂移。要求一个紧凑的理由,指向来源:
这能加快审查速度并帮助调试分歧。
每次都使用固定模板:
该模板减少歧义,并促使模型在做出不当操作之前暴露信息缺口。
LLM 可以在缺少关键事实时写出有说服力的答案。这对起草有用,但对业务规则决策有风险。如果模型必须“猜测”账户状态、客户等级、地区税率或限制是否已达上限,就会产生看似自信的错误。
工具把“推理”变为两步:先获取证据,再决定。
在规则和工作流密集的系统中,少数工具能完成大部分工作:
关键是模型不是在“凭空创造”运营事实——它在请求事实。
即便你把所有政策都保存在中心库里,也很少需要把所有内容粘贴到提示中。检索可以根据当前案件只选出最相关的片段,例如:
这能减少矛盾并防止模型仅因为某条旧规则在上下文中早先出现就去遵循它。
一个可靠的模式是把工具结果视为模型必须在决策中引用的证据。例如:
get_account(account_id) → status="past_due", plan="Business", usage_this_month=12000retrieve_policies(query="overage fee Business plan") → 返回规则:"Overage fee applies above 10,000 units at $0.02/unit."calculate_overage(usage=12000, threshold=10000, rate=0.02) → $40.00现在,这一决策不是猜测:它是基于具体输入得出的结论("past_due"、"12,000 units"、"$0.02/unit")。以后审计时,你可以看到使用的是哪些事实和哪个规则版本——并在出错时修正对应部分。
自由文本灵活但也最容易导致工作流出错。模型可能给出“看上去没问题”的答案,但这类答案不可自动化(“看起来可以”)或在不同步骤间不一致(“approve” vs. “approved”)。受限输出通过把每个决策约束到可预测的形态来解决这类问题。
实用的模式是要求模型以单个 JSON 对象回应,系统可以解析并路由:
{
"decision": "needs_review",
"reasons": [
"Applicant provided proof of income, but the document is expired"
],
"next_action": "request_updated_document",
"missing_info": [
"Income statement dated within the last 90 days"
],
"assumptions": [
"Applicant name matches across documents"
]
}
这种结构使输出在模型无法完全决定时仍有用。missing_info 和 assumptions 把不确定性转化为可操作的后续步骤,而非隐藏的猜测。
为减少可变性,为关键字段定义允许值(枚举)。例如:
decision: approved | denied | needs_reviewnext_action: approve_case | deny_case | request_more_info | escalate_to_human有了枚举,下游系统无需解释同义词或语气差异,只需基于已知值分支。
模式像护栏一样:
reasons 更容易审计为何做出某决策;decision 与 next_action 触发;结果是更少歧义、较少边缘故障,以及在工作流中能一致推进的决策。
即便提示得当,模型也可能“听起来正确”却悄悄违反规则、跳过必需步骤或捏造数值。验证是把看似合理的回答变成可靠决策的安全网。
先验证是否有应用规则所需的最小信息。预检应在模型做任何决策之前运行。
典型预检包括必填字段(如客户类型、订单总额、地区)、基本格式(日期、ID、货币)和允许范围(非负金额、百分比上限为 100%)。若有失败,返回明确可操作的错误(“缺少 'region';无法选择税率集”),而不是让模型猜测。
在模型产生结果后,验证它是否与规则集一致。
重点检查:
增加一个“第二遍”来重新评估第一次答案。这可以是另一次模型调用,或用验证者风格的提示让同一模型只执行合规性检查而不发挥创造力。
一种简单模式:第一遍生成决策 + 理由;第二遍返回 valid 或结构化的失败列表(缺失字段、违规约束、模糊的规则理解)。
对每个决策,记录所用输入、规则/政策版本 和验证结果(包括第二遍发现)。当出错时,这能让你重现确切条件、修正规则映射并确认修复——而无需猜测模型“到底是什么意思”。
测试基于规则与工作流的 LLM 功能,不是看“它生成了什么?”,而是看“它是否像细心的人那样为正确的理由每次都做出同样的决定?”好消息是:你可以用与传统决策逻辑相同的严谨性来测试它。
把每条规则当作一个函数:给定输入,它应该返回可断言的结果。
例如针对“30 天内未开封商品可退款”的退款规则,写出聚焦用例:
这些单元测试能捕捉越界错误、缺失字段以及模型“好心填补未知”的行为。
工作流在跨步骤状态不一致时会失败。场景测试模拟真实旅程:
目标是验证模型尊重当前状态并只执行被允许的转换。
创建一套经审定的真实(已匿名化)示例及确定结果(并附简短理由)。保持其版本化,并在政策变更时审查。一个小型黄金集(即使 100–500 个案例)也很有价值,因为它反映了真实世界的复杂性:缺失数据、措辞不一、边界决策。
追踪决策分布与质量信号随时间的变化:
needs_review 或转人处理的激增(通常是提示、检索或上游数据问题);将监控与安全回滚配合:保留先前的提示/规则包,用特性开关发布新版本,并在指标回退时快速恢复。关于操作手册与发布门控,请参阅 /blog/validation-strategies。
若你要实施上述模式,通常会在模型周围构建一个小型系统:状态存储、工具调用、检索、模式校验与工作流编排。Koder.ai 是一种实用方式,能更快地原型和发布这类有工作流支撑的助手:你可以在聊天中描述工作流,生成一个可运行的 Web 应用(React)及后端服务(Go + PostgreSQL),并通过快照与回滚安全迭代。
这对业务规则推理很重要,因为“护栏”往往在应用层而不是提示中:
LLM 在应用日常政策时可能表现出色,但它们并非确定性的规则引擎。把它们当作需要护栏的决策助手,而不是最终权威。
三类失败模式在规则密集的工作流中经常出现:
在以下情况设置强制人工复核:
不要让模型“随意编造”,而要定义清晰的下一步:
当你能对以下大多数问题回答 “是” 时,可以在规则密集的工作流中使用 LLM:
若不能,将 LLM 保持在草稿/助理角色,直到这些控制到位。