基于当代数学理论构建林业的 AI 生长大模型
林深栩栩 · 技术笔记 AI 01

基于当代数学理论构建林业的 AI 生长大模型

数学子集 · 五层架构 · DeepSeek 基座与 Skill 插件:一份能落地的分工方案

先说一句可能让人不舒服的话:今天你让任何一个大模型「直接算」一片林子 30 年后的蓄积,它给你的数都是编的——不是能力不够,是它没有样地数据、没有数值积分器、也没有约束。

但这不是坏消息。真正能落地的架构,恰好是让模型别去算:数学留在它身后的过程引擎里,模型只负责「听懂需求 → 选对方程 → 调对参数 → 把结果翻成人话」。

四句话把结论说完
① 数学子集要挑:分布演化、随机生长、状态空间、Copula、贝叶斯分层——这五个能对上林业数据的现状,其余先别碰。
② LLM 是编译器,不是计算器:它产出「调哪个 Skill、参数是什么」,数值由后端返回。
③ 层间只认一种契约:JSON Schema。换模型不换内核,换内核不换对话。
④ 审计链比精度更重要:每个数字要能回溯到公式版本、参数来源、数据批次;签字的是人。

一、先把分工定死:LLM 该做什么,不该做什么

这一节不是修辞,是架构约束。定不下来,后面每一层都会长歪。

它擅长(也是唯一该做的)
听懂「杉木 12 年投到 30 年,给间伐建议」
选择调用序列:先校准、再推演、后优化
把自然语言补成参数 JSON(缺项追问)
把后端返回的表格翻成方案正文
标注不确定性、来源与未验证项
它不该做(做了必错)
解微分方程、积分、矩阵求逆
自己编立地指数、枯损率、价格
把「约 21.3 m³/亩」这类数字拍出来
推算采伐限额、合规结论
为省事跳过校准直接给结果

一句话:凡是「有唯一正确答案、且需要数值方法」的事,都不该交给语言模型。它负责的是「把模糊的人话变成明确的调用」,以及「把明确的结果变成人能读的句子」。

二、数学子集:五个结构,够用十年

不是所有高等数学都值得塞进林业模型。选型标准只有一条:它能不能对上林业数据的真实状态——五年一次复位、样地稀疏、气候年际波动、多指标相关。

五个数学结构
五个结构,各自对应 AI 系统里的一个落点

① 分布演化:径阶不是一组数,是一条密度

当林分状态用径阶密度 f(d,t) 描述时,它的演化有严格的写法(von Foerster–McKendrick 方程):

∂f/∂t + ∂[g(d)·f]/∂d + m(d)·f = 0
g(d) 是直径生长率,m(d) 是枯损率。翻译成人话:今年这张径阶直方图,明年会变成哪一张。

加入环境随机项后,它变成 Fokker–Planck 型方程(扩散近似):

∂f/∂t = −∂[μ·f]/∂d + ½·∂²[σ²·f]/∂d²

落到 AI 里,这一条改变的是输出形态:预测头不该吐一个「蓄积 = 312」,而该吐一条径阶密度轨迹,再由它积分出蓄积、出材率、碳量。下游所有指标才自洽。

② 随机生长:单木是 SDE,不是一条平滑曲线

以树高为例,最稳的写法是把 Bertalanffy 型平均生长写成随机微分方程:

dH(t) = η·(H∞ − H(t))·dt + σ(t)·dW(t)
漂移项是平均生长(Richards/Bertalanffy),扩散项 σ(t) 装气候、竞争与测量误差。

两个容易写错的地方,值得单独说:

其一,幂变换不是必需的。有的文献把状态写成 H^c(c 常取 1/3 一类),那是为了线性化,不是定义本身;混着写会得到一条量纲都不对的方程。
其二,Itô 与 Stratonovich 不是同一个东西。SDE 解的含义取决于积分口径。实践里最省事的做法是直接离散成 Euler–Maruyama 递推,别在连续形式上纠结;要对均值曲线做修正,也得先说清用的是哪种口径。

这一条落到 AI 里,改变的是输出的确定性:预测从「一条线」变成「一条带」。页面上那个「±」不是装饰,它决定了经营决策敢不敢下。

③ 状态空间:可投影、可回退,模型才敢接着算

把林分压成一个状态向量(例如高度 H、密度 N、断面积 G、蓄积 V),再定义转移函数:

X(t + Δt) = F( X(t), u )
u 是经营动作(间伐、施肥、采伐)。F 由微分方程积分而来,不是查表。

转移函数必须满足两条硬性质,否则系统会「漂移」:一致性(Δt = 0 不改变状态)与路径无关(分两段投和多段投结果一致)。 有了这两条,模型才能从「第 7 年」接着投到 31 年、也能回退重投——这正是对话式系统必须的。

这里我要补一个元宝那份没提、但在真实运营里更常用的东西:数据同化。样地五年才复测一次,中间这些年状态怎么办?用卡尔曼滤波或粒子滤波把每一次观测(包括遥感、巡护、临时样地)吃进去,持续修正 X 与参数。纯 MCMC 做的是「一次性校准」,滤波做的是「持续跟踪」——后者才是运营的日常。

④ Copula:多指标的相关结构,别让模型自己编

胸径 D、树高 H、蓄积 V 之间高度相关。假设多元正态是最省事、也最容易失真的做法。Sklar 定理给了更一般的答案:

F(D, H, V) = C_θ( F_D(D), F_H(H), F_V(V) )
把边缘分布与相关结构拆开:边缘各管各的,C_θ 只管「它们怎么一起动」。

用处很具体:碳汇计量里「大径木干形变异小」这类尾部相关;样地缺失时的条件采样;以及——最容易出事的地方——让模型生成多指标预测时给一个真实的相关结构,而不是拍一个相关系数。

⑤ 贝叶斯分层:参数是分布,小班之间要「部分借力」

这是我认为整篇文章里最该强调的一条,也是很多「林业 AI」方案最容易跳过的一条:

p(θ | D) ∝ p(θ) · p(D | θ)
参数不是一个人填的数字,是一个后验分布;再往上一层,让不同小班的参数共享同一组超参数(分层/部分汇聚)。

为什么必须这样?因为小样本下参数根本不可辨识:一个林分十来次观测,却要估四五个参数,解不唯一。解法不是换更好的算法,而是加先验、加分层、加约束——这也是「生长表」在历史上真正的价值:它是一个强先验。

对 AI 系统的要求是:Skill 返回的永远是「0.73 ± 0.05」而不是「0.73」,并且带上收敛诊断。下游所有预测都要能把这个不确定性传下去——传到轮伐期、传到现金流、传到「这块地该不该收」。

⑥ 再往上一层:可微物理,但先别急

把生长方程写进损失函数(PINN/UDE),让神经网络只学「机理方程补不上的残差」——气候适应、病虫害、立地异质。这在学术上很热,在县级林业局还不到能用的时候。但架构上要留接口:把过程模型包成可微层,是为了将来能用样地数据反传调参数,不是为了让今天的报告更好看。

三、五层架构:数学在下面,语言在上面

五层架构
层与层之间只有一种契约:JSON Schema

这套分层不新鲜,但每一层的边界必须写死:

第 1 层 数据:固定样地、二类调查、立地指数表、气候情景、价格与成本、采伐限额。这一层的质量决定上限,任何模型都救不回来。
第 2 层 过程引擎:Richards / 状态空间 / 径阶分布 PDE / Copula / 贝叶斯校准。纯 CPU 就够——RK4 加 numpy,一片林子跑一秒级,不需要 GPU。
第 3 层 技能层:每个 Skill = 一个 FastAPI 路由 + 一份 OpenAI tools Schema + 权限与配额。模型只能看见 Schema,看不见实现。
第 4 层 调度层:DeepSeek。把需求翻译成调用序列与参数 JSON,把结果翻译成方案文本。
第 5 层 审计层:每个数字可回溯到公式版本、参数来源、数据批次;输出带「未校准」「低置信」标记;签字的是人。

四、为什么用 DeepSeek 做基座,以及怎么接

选它做调度层,理由很实际,不是站队:

协议兼容:OpenAI Chat Completions 风格,base_url 一换就能迁,换模型时不用改业务代码。
原生支持工具调用:tools 数组 + tool_calls 回写,JSON 模式可用——这正是「编译器」需要的全部能力。
成本结构适合调度:调度层的 token 量与重计算分离,贵的部分在后端一次算完,不在对话里反复算。
推理模型与调度模型分开:写方案、做权衡的场合用推理型,路由与填参用普通的 chat 型,别让一个模型干两件事。

一次工具调用就四步,没有任何魔法:

一次工具调用的四步
四步:发 Schema → 收 tool_calls → 后端执行 → 以 tool 角色回写,再让模型汇总

我建议再往前一步:把 Skill 定义成与模型无关的标准描述(OpenAI tools Schema,或 MCP 那套工具描述)。这样将来换基座、或者让别的系统来调你的林业引擎,都不必重写一遍。

五、七个 Skill:七个「不许模型自己算」

七个 Skill
每个 Skill 都是一份 Schema 加一个路由;名字可以怪,描述必须像人话

这七个的划分不是我拍脑袋:它们正好覆盖「校准 → 情景 → 推演 → 抽样 → 优化 → 兜底 → 进阶」这条链。少一个,链路就断在某处。

其中 optimal_thinning 用最优控制(Pontryagin 或简化的 HJB)是理论上的正解;但工程上,离散间伐方案用动态规划更稳——状态少、边界清楚、好解释。这一点比用哪个数学工具更重要。

六、一次真实调用长什么样

一次真实调用
用户一句话,六个动作;模型自己算的数学:不承担数值求解

这张图里最容易被忽略的是第 6 步之后的那个「回写」:后端返回的不只是结论数字,还有中间量——逐年状态、径阶分布、参数后验、收敛诊断。少了中间量,审核的人无法复核,这套系统就永远只能当玩具。

七、它长什么样:三个岗位,三段对话

上面讲的全是架构。但大多数林业的同行想问的其实是一句更朴素的话:这东西打开长什么样,能帮我干什么活?

我把它画出来(界面示意,不是已上线产品)。它不像聊天机器人给你一段话,更像一个会算的同事:你说一句话,它回一张带数字、带区间、带出处的卡片,底下永远有「看依据」「看中间量」。

① 森林资源管理科:31 份采伐申请,先替你看一遍

每年的限额分配是最磨人的活:31 份申请、限额 3.2 万立方米,要逐条对公益林、对更新造林承诺、对权属。人工看一遍,两天。

资源管理科界面示意
界面示意:一句话交办,回一张预审卡(可批 27 份 / 建议退 4 份,理由可引用规程)

它做的不是"批准",而是把该看的都摆到你眼前:哪些能进、哪些要退、退的理由是什么、限额还剩多少、明年预测会不会超。最后那张预审表还要你盖章——它只是让你不用再翻两天 Excel。

② 林业开发机构:6800 万收不收,先算清楚

收储尽调最怕"凭经验拍价"。卖方开 6800 万,你心里得有个数:按这个价,全周期 NPV 是多少、最优轮伐期是第几年、林道缺口要不要补。

开发机构界面示意
界面示意:结论是区间不是点值;三情景对比;敢说"大概率不划算"

注意几个细节:NPV 给的是区间(来自参数后验,不是拍一个数);最优轮伐期 21 年,直接点出"你原计划 25 年,每年少 3.1%";林道缺口 8.4 km 换算成采运成本 +12%—— 把"值不值"拆成几个能被追问的量。

③ 林业规划设计院:6 章 24 节的初稿,一下午变两小时

编方案最耗时的不是写,是找数:立地指数在哪张表、生长表用哪版、主伐年龄怎么定、逐年作业怎么排。

规划设计院界面示意
界面示意:初稿 + 逐年作业表 + 参数来源 + 三处必须人工确认

这张卡片里最关键的不是"生成了 6 章",而是最后那三行:3 处需人工确认(权属、生态红线、林道选线),以及参数来源一行(立地指数取自哪年的二类调查、生长表用哪版标准、未实测项标黄)。这一行决定了这份初稿能不能拿去评审——评审最先问的就是"你这个数哪来的"。

三个岗位共享的同一条底线
· 数字来自后端,模型不自己算;每张卡片底下都能点开「依据」与「中间量」。
· 没有出处的参数会被标黄,而不是被悄悄填一个"看起来合理"的值。
· 它从不替你签字:预审表要盖章、尽调要投委会、方案要设计院出图签章。

所以它不是一个"聊天窗口",而是四样东西的合体:对话入口 + 结果卡片 + 可导出的交付物 + 一条能查的审计链。前两样让人愿意用,后两样让人敢用。

八、工程红线:六条,踩一条就白做

1. Schema 描述要像人话。写「预测林分从当前状态到目标龄的径阶分布与蓄积」,不要写「run_growth_v2」。模型是靠描述匹配工具的。
2. 校验必须在模型之外。Pydantic / JSON Schema 强校验,拒绝 age: -3、拒绝缺项、拒绝单位混用(亩 vs 公顷)。
3. 输出要截断成摘要。样地 CSV 别整张塞回上下文,先聚合成「第 30 年:H 21.3、N 920、G 34.1、V 312、区间 [298, 327]」。
4. 轮次熔断。单轮 3–5 次 tool call 强制汇总,防止模型在「再校准一次」里死循环。
5. 三级兜底。工具挂了用缓存参数;再挂就明说「未校准」;涉及采伐量审批的,直接转人工。
6. 权限与留痕。谁能查、谁能改参数、谁签了字,都要落库。这句在 AI 系统里不是合规装饰,是出事时唯一能自证的东西。

九、训练与微调:底座不用训,该做的是这三件

第一,别去预训练林业语料。通用能力已经够用,钱应该花在数据与参数上,不是花在底座上。

第二,造路由样本。几百条「用户问法 → 正确工具序列」放进系统提示,或做一次 LoRA。比如「投到 30 年出材」→ 生长推演;「间伐几次划算」→ 生长推演 + 最优间伐;「这棵树是什么」→ 不调工具。

第三,把生长表做成 RAG。《杉木生长表》《立地指数表》《造林技术规程》进向量库,让模型先检索、再填参数——这一步能显著降低「参数幻觉」,因为参数有出处了。

至于「把过程模型包成可微层、端到端反传」,这是「加了聊天的生长模型」和「真正的林业 AI」的分水岭。但现在不急着跨——先把前两件事做扎实,收益更大。

十、边界:三句实话

一,模型不会创造新的生长规律。它做的是「正确装配已有方程」。装配错了,比不装更危险。
二,参数幻觉是常态,不是意外。所以每个数字都要有出处,每个参数都要有区间——这条不妥协。
三,签字的是人。方案、评估报告、投资决策,责任主体是具备资质的机构与人。模型能做的,是把人的判断变得可复核。

十一、最小骨架:一两百行能跑起来

别一上来就画大架构。先把「一句话 → 一个 Skill → 一段结果 → 一段文本」跑通:

最小骨架
最小骨架:每一步都可替换,唯一不能动的是「数值不在对话里算」

这里每一行都可以替换:base_url 换成别的模型、dispatch 换成 FastAPI 或消息队列、summarize 换成你的截断策略。骨架不变,因为它守住了那条底线:数值不在对话里算。

结语:三层,一句话

数学是内核:SDE、PDE、状态空间、Copula、贝叶斯分层——负责「算得对」。
DeepSeek 是编译器:把中文需求编译成工具调用序列——负责「调得准」。
Skill 层是服务化:把林学公式封装成可注册、可校验、可审计的服务——负责「守得住」。

三者拼起来,才叫林业 AI 生长大模型。缺了第一层,它是个会背生长表的聊天机器人;缺了第三层,它是个没人敢用的黑箱。

而它最终要服务的,是那几个具体的问题:这片林子第几年主伐、这块地该不该收、这笔钱该不该再投进去。模型不必知道答案,只要能把问题正确地送到会算的地方。

说明
本文为技术架构讨论,不构成任何投资或经营建议。文中公式为标准形式的简化表述,正式使用请以所采用模型与规程的原始定义为准;模型名与接口以 DeepSeek 官方文档当期为准。
配套阅读:站内《微积分在林业生长经营模型中的应用》与计算器的「生长曲线与轮伐期」面板。
林深栩栩 · 森林观 | 技术笔记 AI 01
相关阅读

登录