NL2CGA 自主学习系统开发计划
让自然语言生成引擎随语法演进自动进化 — 2026 Q2~Q4 技术路线图
📋 更新日志
- 8 大建筑分类,92 个 .cga 文件:
- base/ 6 个 — 屋顶/立面/结构/材质/装饰/工具(LOD 集中控制层)
- config/ 3 个 — 全局参数 / LOD 设置 / 风格映射常量表(共 60+ 常量)
- residential/ 33 个 — 亚洲传统(5) + 欧洲传统(10) + 美洲传统(8) + 现代当代(10)
- public/ 6 个 — 教育/医疗/文化/体育/会展/行政
- commercial/ 8 个 — 零售(3) + 酒店度假(2) + 餐饮/金融/服务
- industrial/ 7 个 — 重工业/轻工业/高新技术/仓库/物流/堆场/能源
- transportation/ 7 个 — 公路/铁路/地铁/停车/桥梁/港口/机场
- religious_monumental/ 8 个 — 基督教/伊斯兰教/佛教/道教/印度教/犹太教/锡克教/纪念性
- agricultural_rural/ 4 个 — 种植/养殖/加工/乡村公共
- special/ 4 个 — 军事/娱乐/应急/市政
- custom/ 2 个 — 用户自定义风格占位
- examples/ 3 个 — 中式村落/欧洲街区/现代商务区
- main.cga 总调度入口(248 行):按
buildingType + buildingStyle自动路由到对应分类规则,统一对外接口Generate(floorCount, lod) - LOD 集中控制设计:L0/L1/L2 三级精度仅在
base/roof.cga和base/facade.cga中实现,上层分类规则只覆盖风格参数(roofAngle / wallColor / windowWidth),不写 LOD 逻辑 - 风格参数化:每个 .cga 文件顶部定义
attr风格参数,支持前端 UI 动态调整或 GIS 批量导入 - 关键发现:引擎 evaluator 当前不支持 import 跨文件规则调用(parser 已解析 import 声明,但 evaluator 未加载被 import 的文件)。短期通过 NL2CGA Python 层内联组装解决,中期需在引擎层实现 import 加载器
- 代码位置:
/www/wwwroot/nl2cga-service/library/
- 三层生成架构:
- Layer 1 模板引擎:常见建筑直接匹配模板,AST 组装生成,0轮LLM调用,精度100%
- Layer 2 结构化组装(未来):从构件库组合,跳过文本parse阶段
- Layer 3 LLM辅助:创意建筑兜底,Prompt注入白名单函数约束
- 5个参数化模板:
- 太和殿(重檐庑殿顶)— 11个参数:面阔/进深/坡度/柱网/颜色
- 天安门(重檐歇山顶)— 6个参数
- 六角亭(攒尖顶)— 5个参数
- 牌坊(牌楼)— 5个参数
- 城墙 — 4个参数
- 编译验证闭环:生成 → 编译 → 错误 → 自动修复 → 再验证,最多3轮
- NL2CGA 集成:用户说"生成太和殿" → 模板引擎匹配 → 0ms生成 → 编译通过 → 输出代码,不经过LLM
- 速度对比:模板引擎 100ms vs LLM 3-5s,快30-50倍
- 代码位置:
/www/wwwroot/cgajs-api/nl2cga/template_engine/
- 去掉手动调节:移除 Inspector 地块尺寸滑块,用户不再需要手动猜地块大小
- CGA 自声明机制:代码第一行添加
# @LotSize(宽, 深),IDE 编译前自动解析并设置初始 shape - 示例已更新:所有标准示例均加入
@LotSize声明- 柱子/柱础 →
@LotSize(2, 2) - 斗拱 →
@LotSize(3, 3) - 庑殿顶/歇山顶 →
@LotSize(17, 13) - 太和殿 →
@LotSize(64, 37)
- 柱子/柱础 →
- NL2CGA 自动生成:Prompt 已更新,LLM 生成时会根据建筑实体库的
recommended_lot自动加入@LotSize - 向后兼容:没有
@LotSize的代码仍使用默认 10×10m 地块
- union 去重优化:合并几何时启用顶点焊接(tolerance=0.001),消除重复顶点,减少面数
- subtract 精确化:从重心测试升级为顶点级包围盒测试(全部在内→剔除/全部在外→保留/部分重叠→保留),大幅减少误删
- intersect 保持:Sutherland-Hodgman 多边形裁剪,精度中等,已满足基本需求
- inline 支持:append(默认)/ unify / recompose 三种合并策略
- 5个标准古建示例已发布到 CGA 市场:
- #1084 标准柱子 — 圆柱+方形柱础,参数化柱高/柱径/颜色
- #1085 标准柱础 — 方形底座+圆形鼓镜+方形覆盆三层
- #1086 标准斗拱 — 坐斗+三层交错出跳拱+散斗
- #1087 重檐庑殿顶 — 四坡五脊,下檐+上檐两层 roofHip
- #1088 重檐歇山顶 — 四面坡+山面三角形山花
- 示例代码位置:
/www/wwwroot/www.cgajs.com/assets/examples-standard/(01-column.cga ~ 05-gable-roof-double.cga) - 稳定性:npm test 19/19 文件通过,374/374 测试通过
- 地块尺寸控制面板:IDE Inspector 面板新增"地块尺寸(Lot Size)"区域,含 X/Z 方向滑块(5-200m)和 10m/50m/100m 一键预设按钮。调节后自动触发重新编译
- 默认地块扩展:原
createScope(0,0,0,0,0,0,10,1,10)(10×10m)改为通过window.__lotSize全局变量控制,支持任意尺寸地块 - 太和殿地块适配:CGA 代码中加入
scale_factor = min(scope.sx/64, scope.sz/37, 1.0)自动缩放,小地块也能生成比例正确的太和殿(但会提示"效果会失真") - 建筑实体库地块要求:8个实体均加入
min_lot_size和recommended_lot。太和殿:最小 50m×30m,推荐 64m×37m - NL2CGA Prompt 注入地块警告:知识检索器现在输出 "⚠ 重要:太和殿需要至少 50m × 30m 的地块,否则柱网比例会失真",大模型生成时会被告知地块要求
- 文件位置:
- 完整LOD版:
https://rulepackage.com/assets/private-examples/taihe-palace-lod.cga - 简化适配版:
https://rulepackage.com/assets/private-examples/taihe-palace-lod-minimal.cga(294行,含LOD+地块缩放)
- 完整LOD版:
- 太和殿面数预估:高精度(Lod3)约 146万三角面,远超引擎50万面流畅阈值。瓦片占55.9%(91万面)、斗拱占25.5%(42万面)是两大瓶颈
- LOD四级精度体系:
- Lod0 极远鸟瞰:~4.7万面,方块柱+纯色屋顶,Draw Call ~47
- Lod1 城市级:~14万面,6面柱+贴图瓦片,Draw Call ~142
- Lod2 街区级:~75万面,10面柱+简化瓦片,Draw Call ~751
- Lod3 特写级:~146万面,16面柱+完整瓦片+斗拱,Draw Call ~1,458
- CGA层LOD控制:
taihe-palace-lod.cga新增@Enum("Lod0","Lod1","Lod2","Lod3") attr lodstep,通过column_facenum/tile_density/has_dougong等LOD驱动常量,在代码层面控制几何精度 - 渲染器FPS监控:
ide-core.js?v=19新增性能面板(左上角),实时显示:- FPS 帧率
- Mesh 数量
- 三角面数(K为单位)
- 当前LOD级别
- 自动建议(⚠ FPS<25持续3秒建议降级 / ▲ FPS>50持续5秒建议升级)
- 自动LOD逻辑:渲染器每帧统计FPS,维护10秒历史窗口。低FPS持续触发降级建议,高FPS持续触发升级建议,用户可在Attributes面板手动调整
lodstep参数 - 面数瓶颈分析:瓦片随机颜色(
rand())导致无法按材质合并Mesh,是Draw Call飙升的主因。Lod1用贴图替代几何瓦片可解决此问题 - LOD模板:
lod-control-template.cga提供通用LOD控制代码片段,可复制到任意建筑CGA中使用
- NL2CGA增强架构:从"直接丢给大模型"升级为"意图识别 → 知识检索 → Prompt注入 → 大模型生成 → 编译器验证"五级流水线
- 意图识别器:
intent_router.py支持5类意图:generic(通用)/ entity(建筑实体)/ pattern(CGA模式)/ fix(报错修复)/ explain(解释询问)。实体关键词覆盖太和殿/角楼/千秋亭/保和殿/中和殿/紫禁城/城墙/瓦片等 - 知识检索器:
knowledge_retriever.py检索3层知识库:- 建筑实体库(8个实体:柱网比例、屋顶层数、关键函数、推荐参数)
- CGA模式库(11大模式:柱网/重檐/歇山/斗拱/F形网格等)
- RAG向量索引(361代码片段,本地TF-IDF检索)
- Prompt组装器:
prompt_assembler.py自动将检索到的实体信息、模式模板、RAG代码片段注入System Prompt,大模型生成时拥有"太和殿是67×31柱网、三层roofHip嵌套"等精确知识 - API集成:
nl2cga_service.py在RAG检索后新增步骤2.5(私有知识库检索),已集成到POST /api/v1/nl2cga/generate主流程,语法验证通过 - 建筑实体库:
building-entities.json定义8个实体:- 太和殿(67×31柱网,重檐庑殿顶,3层屋顶)
- 角楼(F形十字布局,十字脊重檐)
- 千秋亭(圆形攒尖顶,递归屋顶)
- 保和殿(53×25柱网,歇山顶,LOD四级)
- 中和殿(31×31柱网,攒尖顶,斗拱系统)
- 宫殿城市布局(setback+splitArea+innerRectangle)
- 城墙系统(墙垛+城门楼+马道)
- 瓦片系统(高精度瓦片+随机颜色)
- 注释与知识库更新机制:
- ✅ 注释越清楚,RAG检索准确率越高(注释是TF-IDF检索的核心文本)
- ⚠️ 当前不会自动更新:RAG索引是静态文件,代码内容相同但注释更新后,需要手动运行
build_rag_index.py重建索引 - 📝 建议流程:更新注释 → 运行重建脚本 → 验证新索引包含新注释
- 效果示例:用户说"生成太和殿" → 意图识别为ENTITY → 检索到"67×31柱网、base_roof_angle=27、三层roofHip" → Prompt注入 → 大模型生成精确代码
- 解析层:evaluator.ts 中 94 个唯一 simple operation(103 个 case label,含 9 组大小写别名)全部有实现或别名映射,无空占位
- 内置函数层:builtins.ts + 12 类插件共注册 163 个 built-in 函数(math 29、asset 22、string 20、array 17、list 16、color 15、file 13、context 9、conversion 9、misc 7、probability 2 等)
- 测试通过率:
- 函数契约测试 64/64 通过,100%(A级 12/12、B级 27/27、C级 25/25)
- 函数基础审计 82/82 通过,100%(0 parse failed、0 runtime crashed)
- 核心选择器:comp() 支持 8 个选择器 —
fevfefvgmhtop - 全功能可用函数(约 60+):extrude、s/t/r、translate/scale/rotate、rotateScope、center、mirror、primitiveCube/Sphere/Cylinder/Cone/Disk/Quad/Pyramid、roofGable/Hip/Pyramid/Ridge/Shed/Radial/Dutch/Gambrel/HalfHip/Round、comp(f/e/v/fe/fv/g/m/h/top)、split、setback、setbackPerEdge、setbackToArea、innerRectangle、splitAndSetbackPerimeter、color、texture、setupProjection、projectUV、rotateUV/scaleUV/translateUV/tileUV/deleteUV/normalizeUV/copyUV、tag/untag/label、union/subtract/intersect、print/report/assert 等
- 部分实现 / 简化函数(约 15~20):
insert/i:有解析分发,但未完整接入 OBJ/gltf 资产加载管线scatter/search:基础 case 存在,算法较简化shapeL/shapeU/shapeO/modify/offset/envelope:有实现,但与 CityEngine 完整行为存在差距geometry.*部分属性:isConcave/nHoles/isPlanar/hasTags 等多为 fallback 默认值,未做真实几何分析
- 与 CityEngine 对比:CityEngine 约 200+ operations + 150+ functions;当前核心建筑生成能力(extrude/split/comp/roof/transform/material)覆盖度约 70~80%,全功能可用率约 30%,解析覆盖率约 45%
- 结论:常用建筑生成函数基本齐全,可支撑 NL2CGA 生成标准中式/现代建筑;资产插入、高级几何修改、上下文感知、LOD/报告类函数仍是后续重点补齐方向
- CityEngine 文档爬取:成功获取 220 个官方文档页面列表,对比分析后确认核心函数覆盖率 > 95%
- 新增 isnull 函数:空值检查函数
isnull(value)→ 1/0,注册于 builtins.ts - 新增 10 个函数别名:projectUv/rotateUv/scaleUv/tileUv/translateUv/deleteUv/insertAlongUv/alignScopeToGeometryBox/normalizeUv/copyUv → 对应驼峰命名,兼容 CityEngine 大小写不敏感风格
- Marketplace 批量发布:18 个新 CGA 示例(ID #1066~#1083),含纹理 UV 操作、primitives、transformations、shapeU、roofs、materials、offset、stochastic、repeat 等教程
- 引擎构建:npm run build 零错误,dist 已同步到 dist-stable,ide.html importmap v=18
- 全站备份:351MB 完整备份(含 PostgreSQL dump 1.6MB + SQLite + SSL 证书 + Nginx 配置 + systemd)
- 性能检测:API 响应 50-100ms,内存 46-108MB,磁盘 42%,并发 20 请求 ~1s/次,无异常日志
- 新增 14 个 CityEngine 兼容函数:assert(condition, msg)、flatten(y)、geometry.area、geometry.volume、geometry.height、geometry.boundaryLength、geometry.nFaces、geometry.nEdges、geometry.nVertices、geometry.isPlanar、geometry.isRectangular、geometry.hasTags、geometry.hasUVs
- Marketplace 新发布:ID #1065「CityEngine 官方风格商业大厦 (10层)」— 展示 assert + geometry.area + 完整 split(y) 楼层分割
- 本地贴图上传功能:✅ 已完成 — Attributes 面板 texture() 参数旁添加 📤 上传按钮,支持点击选择和拖拽上传,上传后自动替换 CodeMirror 中的 URL
- 根因:
computeMergedFaceScope使用最长边界边作为 xAxis。建筑侧面最长边是高度(120),导致comp(f)后 scope.x = 高度、scope.y = 长度/宽度 - 后果:用户写
split(y)期望沿高度分楼层,实际沿水平方向分割;setupProjection(0, scope.xy)投影平面错误 → 两个对面贴图正确、另两个对面拉伸 - 修复:垂直面(法向量接近水平)优先使用世界水平方向(x/z 轴)作为 xAxis,yAxis 保持垂直方向。所有侧面 scope.y = 高度,
split(y)统一沿高度分割 - 验证:npm test 374/374 全过,已部署 dist-stable?v=5
- 贴图透明/不显示修复:scene-builder.ts 中
setIndex(Float32BufferAttribute)→setIndex(Uint32BufferAttribute),index buffer 类型错误导致三角面索引解析失败,面片错乱/消失 - 纹理颜色空间修复:ide-core.js 添加
renderer.outputColorSpace = THREE.SRGBColorSpace,纹理颜色从暗淡恢复为正常 - SSL 统一证书:rulepackage-com-unified 证书覆盖 rulepackage.com + www/api/marketplace/pic/beta/vip/apihand 共 8 个域名,自动续期
- Marketplace 外部贴图替换:6 个文件中的 raw.githubusercontent.com / images.unsplash.com 链接全部替换为 pic.rulepackage.com
- 构建验证:npm test 374/374 全过,npm run build 零错误
- pic.rulepackage.com SSL 证书:Let's Encrypt 申请成功,HTTPS 正常访问,CORS 跨域头已配置
- Marketplace 发布:ID #1064「现代商业办公楼 (纹理贴图示例)」— 使用 pic.rulepackage.com 6 种贴图(红砖/石材/玻璃/金属/屋顶瓦片/混凝土),展示完整 setupProjection + projectUV + texture 工作流
- roadmap.html 更新:Phase 1/2/2.5 标记完成,新增 Phase 5「渲染器性能与材质系统」8 项任务看板
- 渲染器承载数据:优化前 ~1000 Mesh @ 60fps → 优化后 ~50万三角面 @ 60fps
- 新建贴图站点:
https://pic.rulepackage.com— 11 种测试材质(混凝土/砖/木/金属/玻璃/草地/石材/屋顶瓦片),支持 CORS 跨域 - 渲染器性能瓶颈修复:原
buildScene()为每个 shape 创建独立 Mesh → 24638 三角面分布在 ~8000+ draw call 中严重卡顿 - 按材质自动合并:相同材质(颜色+粗糙度+金属度+纹理)的 shape 自动合并为单个 BufferGeometry,draw call 从 ~8000 降至 ~10
- 承载能力提升:优化前 ~1000 独立 Mesh @ 60fps → 优化后 ~500000 三角面 @ 60fps
- cleanupGeometry 等效实现:无需在 CGA 代码中手动调用,buildScene 层自动完成共面合并
- 构建验证:npm test 374/374 全过,npm run build 零错误,已同步到 dist-stable
- 故障现象:CodeMirror 编辑器无代码显示、3D 渲染窗口黑屏无模型
- 根因:Phase 2 重构时
plugins/context/index.ts引用了未定义的getShapeAABB/aabbContains/aabbOverlaps/aabbTouches;plugins/asset/index.ts引用了未定义的_assetMetaCache - Vite 行为:esbuild 报 TS2304 错误但仍继续构建,导致
CONTEXT_FUNCTIONS变量在产物中缺失,浏览器加载抛出ReferenceError: CONTEXT_FUNCTIONS is not defined - 连锁效应:
ide-core.js为 ES 模块,顶层import 'cgajs-engine'失败导致整个脚本不执行 → CodeMirror 和 Three.js 均不初始化 - 修复:补充 context 插件 AABB 辅助函数、补充 asset 插件
_assetMetaCacheMap,重建后npm run build零错误 - 验证:Node.js 模块加载测试通过,dist-stable 已同步,importmap 添加
?v=2缓存清除 - 操作:请按 Ctrl+F5 强制刷新浏览器缓存
- 开发计划来源:插件式函数库 + 快速修复系统(dazzler-gamora-rictor.md)
- 新增后端端点:
POST /api/v1/nl2cga/diagnose-function— 函数诊断(返回当前实现、测试覆盖率、已知问题) - 新增后端端点:
POST /api/v1/nl2cga/submit-function-fix— 提交修复(保存到 FunctionRepairLog + Nl2CgaHumanFix) - 前端 AI 面板新增 "🔧 函数诊断" 模态框:搜索函数 → 显示源码 → 在线编辑 → 快速测试 → 提交修复
- MVP 约束:仅支持 builtins(162 个函数),evaluator 操作修复放到 Phase 3
- 备份目录:
/root/backups/cgajs_prod_20260609_172916
- 新建目录结构:
src/functions/plugins/{math,probability,array,string,conversion,color,list,file,context,edge,asset,misc,topology,user}/— 13 个插件目录 - 拆分 builtins.ts:原 1243 行集中式文件 → 13 个独立插件文件。每个类别一个插件:MATH(27函数)、PROBABILITY(4函数)、ARRAY(16函数)、STRING(19函数)、COLOR(13函数)、CONVERSION(8函数)、CONTEXT(8函数)、EDGE_ATTR(7函数)、ASSET(5函数)、FILE(16函数)、MISC(12函数)
- 新建 registry.ts:全局插件注册表,支持
registerPlugin()、loadPlugin()(运行时加载用户插件)、unloadPlugin()、getPluginFunctions() - 提取共享模块:
core/random-state.ts—currentRandom/setCurrentRandom/getCurrentRandom/ensureRandom,避免 probability/list 插件与 builtins.ts 循环依赖;core/context-shapes.ts—_contextShapes/setContextShapes,避免 context/edge 插件循环依赖;plugins/file/virtual-files.ts—_virtualFileRegistry/registerVirtualFile/clearVirtualFiles - builtins.ts 重构为聚合文件:保留
callBuiltin()、BUILTIN_REGISTRY、ALL_BUILTINS、类型定义等核心基础设施,所有函数类别改为从插件目录import - 向后兼容:所有现有 import 路径不变,
callBuiltin(name, args)接口不变,旧代码零改动 - 验证:
npm run build零错误通过;npm test19/19 测试文件通过,374/374 测试通过;dist 已同步到 dist-stable
- 决策:Phase 3 暂停,优先完成 Phase 2.5(参数类型系统扩展到更多函数族)+ Phase 2(插件式目录重构)
- Phase 2 目标:将
builtins.ts(1243行,162个函数)按类别拆分到src/functions/plugins/目录,实现热插拔插件架构 - Phase 2.5 扩展目标:在拆分到插件的同时,为每个函数补充完整签名元数据(参数名、类型、枚举值、默认值)
- 关键约束:①
callBuiltin()接口不变;②BUILTIN_REGISTRY不变;③ 374测试全部通过;④ 向后兼容旧调用方式 - 执行顺序:设计目录结构 → 逐个类别迁移(math → array → string → color → geometry → probability → file)→ 创建 registry.ts → 验证构建 + 测试
- 备份目录:
/root/backups/cgajs_prod_20260609_183706
- 结论:Phase 3 对生产稳定性影响较大,不建议直接在 prod 上执行
- 核心原因:evaluator.ts(1785行)是引擎心脏,60+个操作全部从 switch/case 拆到独立文件。每个操作都直接依赖
EvalContext:ctx.random(确定性随机)、ctx.userFuncs(用户函数)、ctx.script(规则查找)、ctx.currentDepth/maxDepth(递归深度控制)、ctx.traceLog(调试追踪)。拆出后任何一项传递错误都会导致编译失败。 - 具体风险点:
①
setCurrentRandom(ctx.random)在每个操作前调用,拆出后极易遗漏 → 随机结果错乱; ② BlockOperation(comp/split/setback)分支逻辑复杂,迁移容易出错 → 孔洞/面拆分异常; ③ 规则调用时的ctx.currentDepth++和 random fork,拆出后逻辑可能断裂 → 无限递归或随机不一致; ④ 操作链依赖(extrude→comp→split→roofHip)一个错全链失败,374单元测试可能覆盖不了边界case - 生产影响:cgajs-api 有 12 个常驻 engine_worker 进程,每个编译请求都经过 evaluate()。如果引擎构建产物有 bug,所有编译请求全部失败,网站核心功能瘫痪。
- 建议方案: ❌ 禁止直接修改 prod evaluator.ts; ✅ 必须在 beta 分支完成,374测试全过 + 额外操作链集成测试后再部署; ✅ 分批次迁移:第一批 10 个简单操作(color/texture/translate/rotate)→ 第二批中等复杂度(extrude/primitive*)→ 第三批复杂操作(comp/split/setback/roof); ✅ 每批次独立构建 + 测试 + beta 验证,通过后再下一批。
- 新增文件:
cgajs-engine/src/functions/signatures.ts— 函数签名元数据类型系统,定义CGAFunctionSignature / CGAParameter接口,含参数名、类型、枚举值、默认值、可选性、描述 - 修改 roof.ts:9 个 roof 函数全部新增
valueType: RoofValueType = 'byAngle'参数;新增resolveRoofAngle()辅助函数,将byHeight按 footprint 半宽自动转换为等效角度 - 修改 evaluator.ts:9 个 roof case 全部支持新旧签名自动识别——如果 argVals[0] 是字符串
byAngle/byHeight按新签名解析,否则回退旧签名(完全向后兼容) - 修改 cga-autocomplete.js:roof 系列 9 个函数补全提示全部更新为含 valueType 的新签名;新增 roofGambrel、roofHalfHip 补全条目
- 修改 grammar-knowledge.json:9 个 roof operation 的参数元数据已更新,含 enumValues、optional、example
- 构建验证:
npm run build零错误通过;dist 已同步到 dist-stable - 编译测试:
roofHip(30, 1)(旧签名)✅、roofHip("byAngle", 30, 1, false)✅、roofHip("byHeight", 5, 1, false)✅ 全部编译通过
- 目标:建立函数签名元数据,让解析器、补全系统、运行时实现三层对齐 CityEngine 2025.1
- 首批修复范围:roof 系列 9 个函数(roofHip/roofGable/roofPyramid/roofShed/roofRidge/roofRadial/roofDutch/roofGambrel/roofHalfHip)
- 签名元数据格式:
src/functions/signatures.ts— 定义参数名、类型、枚举值、默认值、是否可选 - 修改文件清单:
evaluator.ts(增加 valueType 分支)、roof.ts(支持 byAngle/byHeight)、grammar-knowledge.json(参数类型注入)、cga-autocomplete.js(补全提示更新) - 备份目录:
/root/backups/cgajs_prod_20260609_181534
- 问题发现:以
roofHip为例,cgajs 当前签名roofHip(angle, overhang)(2参数),CityEngine 2025.1 官方签名roofHip(valueType, value, overhang, even)(4参数),缺少valueType ∈ {byAngle, byHeight}枚举参数 - 根因定位:
cga-autocomplete.js硬编码签名roofHip(${1:angle}, ${2:overhang});grammar-knowledge.json参数名为 arg1/arg2 无类型信息;evaluator.tsswitch/case 直接按位置取值argVals[0], argVals[1],无 valueType 分支; 底层roof.ts实现同样只接受 angle+overhang - 影响范围:不仅 roof 系列(roofGable/roofPyramid/roofShed 等均有类似缺失),大量函数的参数类型、枚举值、默认值均未与 CityEngine 2025.1 对齐。这导致:① 代码补全误导用户;② NL2CGA 生成的代码使用错误签名直接编译失败;③ 用户无法使用 byHeight 等高级参数模式
- Phase 2 影响评估: 若仅做目录重构(builtins.ts → plugins/)→ 影响很小,callBuiltin + BUILTIN_REGISTRY 接口不变,374测试可守护兼容性; 但若同时引入参数类型系统 → 影响中等,需在 parser / evaluator / autocomplete / grammar-knowledge 四层联动修改
- 建议执行顺序:
Phase 2.5 参数类型系统(先建立签名元数据,修复 roof 等函数实现)→Phase 2 目录重构(再拆分到插件目录,避免二次重写)→Phase 3 Evaluator插件化 - roadmap.html 已更新:新增「架构升级路线图」类别,含 Phase 1~4 共 22 项任务看板
- 后端
POST /api/v1/nl2cga/diagnose-function— 从builtins.ts提取函数源码、查询修复历史、返回语法知识,已验证通过(abs / rand 等函数正常返回) - 后端
POST /api/v1/nl2cga/submit-function-fix— 保存修复到FunctionRepairLog表,已验证通过(id=5 记录成功入库) - 前端 IDE AI 面板新增 "🔧 函数诊断与修复" 按钮,点击打开模态框
- 模态框功能:搜索函数 → 显示当前实现源码 + 行号 → 展示已知修复记录 → 在线编辑修复代码 → 填写修复说明 + 测试用例 → 提交保存
- 涉及文件:
main.py(+2端点)、nl2cga_service.py(诊断逻辑)、ide.html(CSS+HTML+JS) - 服务已重启,4 workers 运行正常,内存 177MB
- 修复
uvicorn main:app启动失败问题,根因:monitoring.py引入prometheus_client和psutil但未安装 - 安装缺失依赖后服务恢复正常,4 workers 运行中,内存 169MB
- 所有 NL2CGA 端点验证通过:health / styles / repairs / generate
export_training_data.py— 从数据库导出训练数据(成功案例+反馈数据)train_lora.py— LoRA 微调脚本,基于unsloth框架,支持 4bit QLoRA,结构完整(数据量不足时自动跳过)evaluate.py— 4 维度评估:编译成功率、BLEU/ROUGE-L、函数正确率、语法完整性benchmark.jsonl— 50 样本基准数据集,覆盖 13 种建筑风格,100% 编译通过
- 新增
FunctionRepairLog数据库表,记录函数修复历史(function_name, file_path, repair_summary, before/after_snippet, test_case) - NL2CGA Prompt 自动注入最近 7 天/最多 10 条修复记录,让 LLM 了解引擎最新变更
- 前端 IDE 底部展示近期修复列表(
GET /api/v1/nl2cga/repairs) - 已入库 4 条记录:roofGambrel、roofHalfHip、roofRound、compHoles
- 自动捕获脚本:编译失败后自动记录错误上下文到修复队列
admin-monitor.html— 实时仪表盘:QPS、编译成功率、NL2CGA 调用量、用户活跃度、资源监控log_analyzer.py— 每日自动分析 access_log,生成日报(请求量、状态码分布、Top 端点、错误聚类)resource_alert.py— CPU/内存/磁盘阈值告警,自动通知- 数据飞轮自动化:编译失败自动入队、每小时自动测试、每 6 小时高频案例 AI 修复
callBuiltin从 O(n) if-else 链重构为 O(1)Map.get()查找BUILTIN_REGISTRY: Map<string, Function>扁平注册表,分类:MATH(24)、PROBABILITY(4)、ARRAY(16)、STRING(19)、COLOR(13)、CONVERSION(8)、CONTEXT(8)、EDGE_ATTR(7)、ASSET(5)、FILE(16)、TOPOLOGY(2)、MISC(12)- 保留
ALL_BUILTINS对象向后兼容 - 验证:TypeScript 编译零错误,374 个现有测试全部通过
- 新增
DeterministicRandom(seed)基于 xorshift 的确定性随机数生成器 setCurrentRandom()/getCurrentRandom()线程本地存储EvalContext新增random字段,createEvalContext中初始化- 分支间随机隔离:
evalStochasticBody和evalSplitOperation/evalCompOperation中使用ctx.random.fork() rand/rand.int/rand.gaussian/p全部接入- 验证:相同 seed 产生完全相同的随机序列;374 个现有测试全部通过
nl2cga_service.py(907 行) 从 createurban-cga-lite 移植,7 个 API 端点/api/v1/nl2cga/generate— 预建模板匹配(免认证)+ LLM 生成(需认证)/api/v1/nl2cga/refine— 基于 LLM 的代码优化/api/v1/nl2cga/fix— 自动修复编译错误/api/v1/nl2cga/explain— 代码解释(开放访问)/api/v1/nl2cga/validate-code— 语法验证- 编译闭环:生成 → 编译验证 → 报错 → LLM 修复 → 最多 2 轮自动重试
- 语法注入:
build_context_prompt()自动加载grammar-knowledge.json注入当前引擎能力边界
rag_service.py— Marketplace 188 个 .cga 文件向量化- 关键词 + 向量混合匹配(Hybrid Search)
- CJK 同义词扩展:
中式 → [chinese, temple, pagoda]、玻璃 → [glass, panel, window] - 检索延迟 ~10-30ms,结果直接拼接到 LLM Few-shot 上下文
ide.html新增 320px 可折叠侧边栏- 功能:自然语言输入、风格选择(11种预建模板)、楼层滑块、生成/复制/插入/解释
aiGenerate()→ POST/api/v1/nl2cga/generateaiExplainSelection()→ 获取编辑器选中文本 → POST/explain- 风格列表动态加载:
GET /styles - 底部展示近期修复:
GET /repairs
roofGambrel(shape, angle, height2)— 谷仓屋顶,使用extractFootprintVerts+breakFrac控制折线高度roofHalfHip(shape, angle, hipFrac=0.3)— 半坡屋顶,ridgeInset控制 ridge 缩进比例roofRound(shape, angle)— 球形穹顶,3 层 ring + peak 球冠近似- 此前这 3 个函数仅为空壳/异常占位,导致 AI 生成相关代码时直接报错
compHoles(shape)— 支持两种 hole 来源检测- 来源 1:
PolygonData显式holes数组 - 来源 2:
BufferGeometry.userData.contours内环(如shapeO生成的 O-ring) - 使用
earcut重新三角化,计算贴合孔洞平面的 scope compMeta = { sel: 'hole', index, total }
extract-grammar-docs.mjs— 自动扫描源码生成结构化语法知识库- 输出
grammar-knowledge.json:163 个函数 + 90 个操作,含签名、参数、返回值、使用示例 - 输入:CGAGrammar.g4 + builtins.ts + evaluator.ts
- 绑定到构建流程,每次部署自动更新
- NL2CGA Prompt 动态读取,无需人工维护
- ANTLR4 驱动解析器,语法覆盖完整
- 1727 行核心求值器,支持 60+ Shape 操作
- 162 个内置函数基础注册
- 14 组 e2e 测试覆盖 happy path
一、现状诊断
CGA 引擎现状
- 解析器:ANTLR4 驱动,语法覆盖完整,错误恢复能力基础可用
- 运行时:1727 行核心求值器,支持 60+ Shape 操作、162 个内置函数
- 几何模块:Extrude / Split / Comp / Roof / UV / Boolean / Setback 等已实现,但部分为简化方案
- 测试:14 组 e2e 测试覆盖 happy path,边缘 case 不足
NL2CGA 现状
- 严重缺失引擎层
nl2cga_bridge.ts仅为接口空壳,prompt_templates.ts全部为空 - 部分可用API 层
ai_service.py有 LLM 客户端,但仅用于编译错误分析(修代码),不能生成代码 - 闭环存在
learning_routes.py已建立"失败案例 → LLM 分析 → 修复建议 → 人工审核"的学习闭环 - 资产可用
createurban-cga-lite中有预建模板 + LLM 生成实现,可直接移植
二、NL2CGA 三阶段路线图
🚀 第一阶段:Template + RAG(2~3 周)
- 移植
createurban-cga-lite的预建模板系统,扩展至 20~30 种建筑风格 - Marketplace 188 个
.cga文件向量化,构建语义检索库 - 前端 IDE 增加 "🎨 AI 生成" 面板(输入框 + 风格选择 + 参数滑块)
- 设计语法自描述文档生成器(核心,见下文第三节)
🔧 第二阶段:编译器反馈闭环(4~6 周)
- 新增
/api/v1/nl2cga/generate端点,接入ai_service.py的 LLM 客户端 - 实现 "生成 → 编译 → 报错 → LLM 修复" 的自动迭代循环(最多 3 轮)
- 将编译器作为判别器(Discriminator):只有编译成功的代码才返回给用户
- 每次成功的"生成-编译"对自动存入训练数据集,为第三阶段积累燃料
🧠 第三阶段:Fine-tuned CGA 专用模型(3~6 个月)
- 基于
Qwen2.5-Coder-7B或DeepSeek-Coder-V2-Lite做 LoRA 微调 - 训练数据来源:Marketplace 描述-CGA 对、学习闭环的成功案例、用户反馈数据
- 语法变更时自动触发模型增量微调,实现真正的自主学习
- 本地 vLLM 部署,单条生成成本 < ¥0.01
三、自主学习语法结构的核心机制
这是整个计划的重点。以下 5 个子系统构成 NL2CGA 的自进化引擎,确保每次你修改 CGA 语法时,AI 都能自动跟上:
3.1 语法文档自动提取器(Grammar Document Extractor)
问题:当前 Prompt 中硬编码"已支持语法",每次新增函数都要手动改 Prompt,极易遗漏和过时。
方案:编写一个构建时脚本,自动扫描源码生成结构化语法知识库:
# 自动提取脚本(建议放在 cgajs-engine/scripts/extract-grammar-docs.mjs) # 输入:CGAGrammar.g4 + builtins.ts + evaluator.ts # 输出:grammar-knowledge.json(被 RAG 和 Prompt 动态加载) 提取内容: 1. 从 CGAGrammar.g4 提取:规则定义语法、操作序列结构、条件/随机分支写法 2. 从 builtins.ts 提取:162 个函数的签名、参数类型、返回值、使用示例 3. 从 evaluator.ts 提取:60+ Shape 操作的用法和约束 4. 从 tests/ 提取:每个函数/操作的真实运行示例 输出格式(JSON): { "version": "1.3.2", "generatedAt": "2026-06-09", "operations": [ { "name": "extrude", "params": ["height"], "returns": "Shape[]", "example": "Lot --> extrude(10) comp(f) { top: Roof }", "constraints": ["height > 0"] } ], "functions": [ { "name": "rand.int", "category": "probability", "signature": "rand.int(min, max) -> int", "description": "返回 [min, max) 范围内的随机整数" } ], "annotations": ["@StartRule", "@Group", "@Range", "@Hidden"] }
触发方式:将脚本绑定到 npm run build 或 Git 预提交钩子,每次构建自动更新。Prompt 加载时动态读取此 JSON,而非写死。
3.2 实时语法注入系统(Live Syntax Injection)
当用户请求 NL2CGA 生成时,后端自动将当前引擎的完整语法快照注入 LLM 上下文:
# 动态 Prompt 组装(cgajs-api 层实现) system_prompt = f""" 你是 CGA.js v{engine_version} 专家。当前引擎支持的语法如下: ## 可用 Shape 操作({len(operations)} 个) {format_operations(grammar_knowledge['operations'])} ## 可用内置函数({len(functions)} 个) {format_functions(grammar_knowledge['functions'], top_used=30)} ## 关键约束 - 必须使用 @StartRule 标记入口规则 - split 轴只能是 x|y|z|u|v(当前 u/v 未实现,避免使用) - comp(h) 孔洞检测暂不支持,避免依赖 只输出有效 CGA 代码,不要解释。 """
价值:新增 roofGambrel 函数后,重新部署即自动出现在 AI 的知识范围内,零人工维护 Prompt。
3.3 编译器反馈强化学习(Compiler-RL)
这是让 NL2CGA "越用越聪明" 的核心飞轮:
| 步骤 | 动作 | 数据沉淀 |
|---|---|---|
| 1 | 用户输入"中式寺庙" → LLM 生成 v1 | — |
| 2 | 编译器解析 v1 → 发现 2 个错误 | (prompt, v1, error_json) → CgaFailureCase |
| 3 | 错误信息 + v1 喂给 LLM → 生成修复版 v2 | (v1, error, v2) → AiSuggestion |
| 4 | v2 编译通过 → 返回给用户 | (prompt, v2) → CgaSuccessCase |
| 5 | 用户点击 👍/👎 反馈 | 修正标签 → 高质量训练对 |
语法变更时的自动适应:当你修改了语法(如新增 @Import 注解),过去积累的"错误-修复"对中涉及旧语法的数据会被自动标记为 legacy,新语法的成功案例会被赋予更高权重进入训练集。
3.4 语义向量索引(Semantic Vector Index)
不仅要知道"有哪些函数",还要知道"什么时候该用什么函数"。
- 将 Marketplace 中每个
.cga文件 + 标题 + 描述向量化(使用代码嵌入模型) - 将 162 个函数的文档和 3~5 个典型用例向量化
- 用户输入自然语言时,检索 Top-5 最相关的 CGA 源码片段和函数文档
- 检索结果直接拼接到 LLM 上下文(Few-shot 示例),让 AI "看到"别人是怎么写的
# RAG 检索示例 用户输入:"做一个带飞檐的中式屋顶" 检索结果: 1. "03_japanese_pagoda.cga" — 相似度 0.91(roofHip 多层叠加) 2. "temple style guide" — 相似度 0.87(飞檐参数说明) 3. "roofHip 函数文档" — 相似度 0.85 LLM 上下文追加: "参考以下实现飞檐屋顶的方式:" + 检索到的代码片段
3.5 语法变更感知流水线(Grammar Change Detection Pipeline)
这是自主学习的触发器,确保语法变更被 NL2CGA 系统第一时间感知:
# 绑定到 CI/CD 或 Git 钩子的流水线 触发条件:grammar/CGAGrammar.g4 或 src/functions/builtins.ts 发生变更 自动执行: 1. 运行 extract-grammar-docs.mjs → 更新 grammar-knowledge.json 2. 运行全量 e2e 测试 → 确认新语法行为正确 3. 运行回归测试 → 确认旧语法未被破坏 4. 用新语法重新索引 Marketplace 文件 → 更新向量数据库 5. 重新编译预建模板 → 验证模板仍有效 6. 若存在 Fine-tuned 模型 → 触发增量微调任务(用新语法案例扩充数据集)
结果:你提交一个 PR 新增 geometry.isRectangular 函数,10 分钟后 NL2CGA 系统已经知道它的存在、签名、用法,并能在生成代码时正确推荐。
四、关键缺陷修复清单(与 NL2CGA 协同)
| 缺陷 | 对 NL2CGA 的影响 | 优先级 |
|---|---|---|
roofGambrel / roofHalfHip / roofRound 有签名无实现 |
AI 生成这些屋顶时代码直接报错,严重损害信任 | P0 |
comp(h) 孔洞检测返回空数组 |
AI 无法正确指导用户使用孔洞相关建模 | P0 |
rand / p 未接入 DeterministicRandom |
相同 seed 产生不同结果,AI 的"示例"不可复现 | P1 |
split(u/v) 未实现 |
AI 生成的 UV 分割代码无效 | P1 |
callBuiltin 使用 if-else 链而非 Map |
函数调用慢,批量生成时吞吐受限 | P1 |
| 解析器使用 BailErrorStrategy | 一次只报一个错误,AI 修复效率低 | P2 |
五、数据飞轮:让系统越用越聪明
📥 数据源
- Marketplace:188 个文件 ×(标题+描述+标签+CGA 源码)= 基础语料
- 编译日志:每次 /compile 调用的 (source, success/fail, error) = 监督信号
- 学习闭环:learning_routes 积累的 (failure, suggestion, accepted) = 高质量修正对
- 用户反馈:👍/👎 按钮 + 手动编辑后的最终代码 = 人类偏好数据
⚙️ 处理层
- 语法提取器:自动从源码生成结构化知识(随版本更新)
- 向量化引擎:将 CGA 代码和自然语言描述嵌入同一语义空间
- 质量过滤器:只有编译通过且用户点赞的数据才进入训练集
🚀 输出层
- RAG 检索:实时语义搜索最相关的代码示例
- 动态 Prompt:每次请求携带最新语法快照
- Fine-tuned 模型:专为 CGA 语法优化的小参数模型
六、执行时间表
| 时间 | 里程碑 | 交付物 |
|---|---|---|
| 第 1~2 周 | 语法提取器 + RAG 索引 | grammar-knowledge.json 自动生成、Marketplace 向量化、IDE AI 面板 |
| 第 3~4 周 | Template NL2CGA 上线 | 20+ 预建模板、语义搜索、零 LLM 成本可用 |
| 第 5~8 周 | 编译器反馈闭环 | /api/v1/nl2cga/* 端点、生成-编译-修复循环、数据沉淀 |
| 第 9~12 周 | P0 缺陷清零 | roofGambrel 等 3 个屋顶实现、comp(h) 孔洞检测、DeterministicRandom |
| 第 3~6 月 | 专用模型微调 | LoRA 微调 7B 模型、本地 vLLM 部署、单条成本 < ¥0.01 |
| 持续 | 自进化运维 | 每次语法变更自动触发知识库更新 → 回归测试 → 向量索引重建 → 模型增量微调 |
七、总结
CGA.js 的解析器和运行时已经具备专业级骨架,NL2CGA 是从"工具"跃迁为"平台"的决定性能力。
本计划的核心不是"写一个更好的 Prompt",而是构建一个自我维护、自我增强的技术体系:
- 语法文档自动提取消除 Prompt 与源码的同步问题
- 编译器反馈闭环保证生成质量并持续积累训练数据
- 语义向量索引让 AI 能"看到"社区的最佳实践
- 语法变更感知流水线确保系统随引擎同步进化
当你下次新增一个函数时,这个系统会在 10 分钟内自动学会它,并在接下来的每一次用户请求中正确使用它——这才是真正的自主学习。