函数是什么
代码写的逻辑:输入、输出、在哪里用;声明式先行;AIDC 的发布、列表与 v2 执行。

本课目标
读完这一课,你将能够
- 说出函数是什么,以及它会在哪里被用到
- 用一张台阶图判断一段逻辑该用声明式构件还是写代码
- 说明 AIDC 怎样发布、列出和执行 Function
函数:用代码写的逻辑
上一门课里,Action 用规则改数据。规则写得下的事,不需要代码。有些逻辑要读很多对象、加权或分情况。在本体(Ontology)里,这样的代码逻辑叫 Function。
函数是用通用编程语言写的逻辑,在服务端的隔离环境里执行。输入可以是数字、文字,也可以是对象或一组对象(对象集);输出是一个值、一个对象集,或者一份对数据的修改。它能读对象的属性、沿关系走,也能改数据。
算出一个值
例如供应商评分,放进表格的一列或图表里。
返回一组对象
例如有延期风险的订单,供界面或别的逻辑继续筛选。
驱动一个 Action
规则写不下的复杂修改:函数算出要改什么,Action 负责校验、执行和记录。
只读的一类叫查询函数(Query)。调用方经 v2 API 执行它。下面用伪代码说明输入和输出。实际发布的源码是 JavaScript ES module。
// Pseudocode: illustrates inputs and outputs, not publishable source.
function supplierScore(supplier: supplier): double {
// read this supplier's purchase orders, weigh late deliveries
return score; // a value comes out; nothing is changed
}
函数适合界面、Action 和 API 当场调用的逻辑。运行默认超时为 60 秒,上限为 300 秒。当前发布源码用 JavaScript ES module,默认导出 (params, ctx) => 结果。
声明式先行
不是每一段逻辑都该写成代码。代码灵活,也更贵:要版本,要测试,要监控,出错的方式也多。所以标准模型先给了一排声明出来的构件——配置就行,看得懂,改得快,平台替你校验——函数是最后一级。
- 01派生属性沿关系最多 3 跳,读时计数、求和、求平均。
- 02对象集与聚合筛选、并交差、分组统计。
- 03Action 的规则与提交条件改什么,什么情况下拒绝。
- 04函数以上都表达不了的时候。最灵活,也最贵
给 salesOrder 写一个函数,数一数这张订单有几行明细。
给 salesOrder 加一个派生属性 lineCount:沿 lines 关系计数,读的时候算。
判断的顺序很简单:只是沿关系汇总,用派生属性;只是筛选和统计,用对象集;只是「不满足就拒绝」,用提交条件;要逐个对象计算、分情况、读好几类对象再下结论,才轮到函数。读者最容易踩的坑,是一上来就想写代码。
在 AIDC 里:今天谁来干这些活
这门课反复用示例工厂的三个问题:供应商评分,有延期风险的订单,建议一张工单上哪条产线。它们在标准模型里都是函数。在 AIDC 里,同样的活分给下面几处:
| 标准模型(函数) | AIDC 今天 | |
|---|---|---|
| 订单有几行明细 | 函数沿关系遍历并计数 | 派生属性 lineCount |
| 临近交期的订单 | 返回对象集的查询函数 | 对象集加筛选,或一条只读 SQL |
| 这次修改能不能做 | 函数里的校验代码 | Action 的提交条件 |
| 逐行算余量、成本 | 函数里的循环 | 工作流的计算步骤(表达式) |
| 供应商综合评分 | 读采购订单并加权的函数 | 聚合按供应商汇总,计算步骤按权重算分,AI 分析步骤只解释原因 |
| 读文字、下判断、给建议 | 调用语言模型的函数 | 智能体,或工作流的 AI 分析步骤 |
模型参与的部分放在两处:智能体会多轮地自己找资料再回答;工作流的 AI 分析步骤是固定的一次调用。工作流可以先预演——读、算、分析都真跑,写入只返回计划——确认之后再正式运行。
这张表也是整门课的地图:后面五节,每一节先讲标准模型,再讲 AIDC 今天用什么。
要点
- 函数是代码写的逻辑:输入对象或对象集,输出值、对象集或一份改动清单。
- 声明式先行:派生属性、对象集、提交条件都表达不了,才写函数。
- 只读的函数叫查询函数,没有副作用;改数据永远要经过 Action。
- AIDC 已支持发布、列出和执行 Function。简单逻辑仍优先用声明式构件。
练一练
给逻辑找一个位置
拿示例工厂做练习,先不写代码,只判断放在哪一级。
把下面五件事各放到台阶的一级:每张订单的明细行数;工单下达前状态必须是 planned;本周每条产线的产出合计;供应商综合评分;给延期订单起草一封说明邮件。写下理由。
为 salesOrder 写出 lineCount 的 derived 片段(linkPath 与 aggregation),再用 aidc semantic define ontology/ --dry-run 检查引用是否闭合。
从你自己的业务里找一件四级台阶都表达不了的逻辑,写下它的输入、输出,以及它要读哪些对象类型。
小测
选一个答案,马上看解析。
Q1要在订单表格里显示每张订单有几行明细,AIDC 里最合适的做法是?
只是沿关系汇总,派生属性就够了。它在读取时计算,不用存结果,也不用写函数。
Q2旧 v1 的 queryTypes 返回空列表,说明什么?
旧 v1 的空列表不能代表现有 Function。用 aidc semantic functions list 查看已发布函数,用 v2 查询接口执行。
Q3「工单下达前状态必须是 planned」应该写在哪里?
拿对象的当前属性和一个值比较,不满足就拒绝,这正是提交条件;写在 Action 里,每个入口都受约束。