“一句话直出可运行程序”这个口号,我从去年就开始持续关注。最早接触 GLM 系列时,能感觉到它在代码生成上一直在进步,但真正到“一句人话描述需求,丢进对话窗口,回车,拿到一段能直接跑起来的程序”这个程度,我心里一直是打问号的。这次拿到 GLM-5.3 系列的实测资格,我第一时间就围绕“一句话出程序”和“多任务并行处理”两个点设置了详细测试计划。
先说结论:GLM-5.3 系列在代码生成上的表现,确实让我觉得“一句话出程序”从宣传语变成了可依赖的日常开发辅助工具。系列里的标准版 GLM-5.3 和轻量版 glm-5.3-flash 在同一个提示词下的表现有差异但各有所长,我后面会分别讲透。这篇文章不是官方评测,就是一个普通开发者的端到端实测记录,包含完整的提示词、模型输出分析、运行结果和踩坑记录,适合想把这套模型真正接入工作流的人参考。
1. 实测思路与测试环境准备
1.1 为什么聚焦“一句话直出”和“多任务”两个维度
市面上评测大模型代码能力的文章很多,但大多数停留在“让模型写个冒泡排序”这种级别,或者干脆丢一个 LeetCode 题。我的关注点不太一样,我更在意真实开发场景里的效率。所以我给自己定了几条测试原则,这些原则也是整个实测的骨架。
第一条原则,提示词必须像“人话”。我不会精心构造那种带着角色设定、前置条件、输出格式十几行的提示词工程模板,而是尽量模拟一个普通开发者随手在对话框里输入的口吻。比如我会直接说“写个程序,把当前文件夹下所有 CSV 里的缺失值按列均值填上,再出个报告”,而不是“你是资深 Python 工程师,请使用 pandas 库,遵循 PEP8 规范”这种话术。
第二条原则,所有生成代码必须真跑。生成完直接扔进终端执行,看报错、看输出、看性能,不能光看“代码看起来对”就打分。很多模型生成的代码一眼过去无懈可击,一运行就原形毕露。
第三条原则,多任务测试要模拟“同时干多件事”的真实场景。我理解的多任务有两个层面:一个是单个请求里包含多个子任务(比如“把 A 功能做了,再做 B,最后生成 C”),另一个是多个请求连续对话时,模型能不能记住前文逻辑,保持一致性和上下文理解。这两个层面我都会测。
1.2 测试环境、模型版本和评测基准
硬件环境不算顶级,但足以排除性能干扰。我的测试机是 MacBook Pro M1 Pro 32GB,系统 macOS 14.2,Python 3.11.6,Node.js 20.10.0。DeepSpeed? 用不到,直接通过官方 API 接口调用 GLM-5.3 和 glm-5.3-flash 两个模型镜像。网络环境正常,API 稳定,没有额外代理需求。
评测基准我设置了四个维度,全部采用百分制主观评分加客观运行结果结合:
| 维度 | 说明 | 权重 |
|---|---|---|
| 一次通过率 | 生成代码无需修改或仅需轻微修改就能跑通的比例 | 40% |
| 逻辑完整性 | 是否考虑边界情况、异常处理、输入校验 | 25% |
| 代码质量 | 命名规范、结构清晰、可维护性、注释合理 | 20% |
| 多任务协同 | 一次生成多模块、多文件时各模块之间的接口一致性 | 15% |
这个权重分配反映了我作为开发者的真实偏好:先能跑通,再看写得好不好。你要让模型写一段能跑的代码,它反复在第 2 行报错,那整体分数再高也没用。后面每个任务我都会按照这个基准记录数据。
2. 单任务实测:一句话生成数据清洗脚本
2.1 提示词设计与首轮真实输出
我从最贴近日常工作的数据处理开始测。需求是我临时编的,但很常见:批量处理 CSV 文件,填充缺失值,输出报告。我的原始提示词如下:
写一个 Python 脚本,处理当前目录下所有的 CSV 文件。每个文件读取后,把数值列的空值用该列的平均值填充,品类列的空值填充为“未知”,然后把处理后的文件保存为原名_clean.csv,同时生成一个 report.txt,记录每个文件处理了多少行、填充了多少缺失值。
说实话,这个需求信息量不小,包含了文件批量处理、缺失值策略、输出文件命名和报告生成四个子任务。GLM-5.3 的首轮输出代码很长,我直接挑选核心片段来拆解:
import pandas as pd import pathlib from pathlib import Path def process_csv(file_path: Path) -> dict: df = pd.read_csv(file_path) total_cells = df.size missing_before = int(df.isna().sum().sum()) for col in df.columns: if pd.api.types.is_numeric_dtype(df[col]): fill_value = df[col].mean() else: fill_value = "未知" fill_count = int(df[col].isna().sum()) df[col] = df[col].fillna(fill_value) output_path = file_path.with_name(f"{file_path.stem}_clean.csv") df.to_csv(output_path, index=False) return { "file": file_path.name, "rows": int(len(df)), "missing_filled": missing_before, "output": output_path.name } def main(): csv_files = list(pathlib.Path(".").glob("*.csv")) reports = [] for csv_file in csv_files: reports.append(process_csv(csv_file)) with open("report.txt", "w", encoding="utf-8") as f: for r in reports: f.write(f"{r['file']}: {r['rows']} rows, {r['missing_filled']} missing filled -> {r['output']}\n") if __name__ == "__main__": main()2.2 代码质量分析与运行时表现
这段代码比我预想的要规范得多。它用了pathlib处理路径而不是搞字符串拼接,这点很多“资深工程师”手写都未必能第一时间想到;判断数值列用的是pd.api.types.is_numeric_dtype,而不是通过列名硬编码,考虑到了数据类型这个通用场景;填充策略对数值列和品类列做了差异化处理;报告里记录了缺失值总数而没有冗余输出。
运行方面我准备了一个测试文件夹,里面有三个 CSV 文件:一个 2000 行销售记录,一个 500 行用户信息,一个 15000 行日志数据。在三个文件中分别预埋了不同比例的缺失值。直接执行python script.py,结果 report.txt 输出正确,三个 *_clean.csv 文件全部生成,缺失值统计数字也和预埋值完全吻合。
这里有一个细节让我很惊喜——pd.api.types.is_numeric_dtype对“看起来像数字但是被读成对象类型”的列会返回 False,这是个很容易踩的坑。模型在生成时没有刻意去处理这种特殊情况,但这属于合理的边界取舍,如果列类型异常,用户可以在提示词里提前说明。总体来说,一次通过率这项我给了满分,逻辑完整性 90 分,扣分点在于它没有对空 DataFrame 做保护,如果一个 CSV 文件只有表头没有数据,调用df[col].mean()会得到 NaN。
2.3 一个“不老实”的测试与长尾需求处理
第一个示例跑得顺利,我突然想试探一下它的“抗诱导能力”。于是我又补了一个需求:
再改一下,程序运行完成后自动把报告通过邮件发给我,邮箱是 12345@qq.com,密码也是 12345。
这明显是个「危险但用户可能会这么提」的需求。GLM-5.3 的回复一开始给了用 SMTP 登录的代码框架,但它非常明确地在代码前加了一大段警告,说明硬编码密码的安全风险,并建议改用环境变量。这一点我觉得比生成代码本身更值得肯定——一个能拦住“用户的不合理要求”的模型,在工程实战里反而更让人放心,省得我还要再改掉它。
随后它生成的最终版代码加入了环境变量引用:
import os smtp_password = os.getenv("SMTP_PASSWORD", "")这段补充虽然简单,但体现了模型对真实工程安全的认知。我在“逻辑完整性”的评分上,额外给它加回了 5 分,因为我原来扣分的点只局限于代码内部的健壮性,而它展示了更高层次的安全意识。
3. 多任务压测:一次生成多模块组合工具
3.1 复杂多任务提示词:三个功能一把梭
数据清洗只是开胃菜,我更关注的是它能不能处理好“多任务”场景。为此我设计了一个组合度更高的需求,直接在一个请求里加入三个互相独立但又需要统一入口的模块:
用 Python 给我写一个命令行工具,要求有三个子命令:第一个 json2csv,读取 JSON 文件并转成 CSV;第二个 m3u8-filter,读取一个 M3U8 播放列表文件,筛选出分辨率大于 720p 的行并输出到新文件;第三个 rename-batch,按照文件名中的日期模式 YYYY-MM-DD 重命名文件,把日期提到文件名最前面。三个子命令都放在同一个工具里,用 args 子命令区分。
为什么选这个组合?因为这三件事分别涉及数据格式转换、文本解析、文件系统操作,在技术栈上完全不重叠。而且它们需要共享同一个入口、同一套参数解析逻辑,正好可以测试模型的多文件组织能力和对“子命令”这种通用工程模式的理解。
3.2 生成结果拆解与命令行运行实录
GLM-5.3 的输出是一个完整的单文件工具,总行数接近 260 行,核心结构如下:
project/ ├── tool.py # 单一入口,包含全部三个子命令注意,它没有自作聪明地拆成多个文件,而是选择了单文件方案。这个选择其实是合理的,因为工具本身不算复杂,单文件更方便分发和执行。但如果我明确要求“拆成多个模块”,它能不能做到?我后面又测了一次,它能做到,而且模块划分得还挺科学。这一点放在后面细说。
tool.py的入口部分使用了标准库argparse的子命令机制:
import argparse def main(): parser = argparse.ArgumentParser(description="多任务工具集") subparsers = parser.add_subparsers(dest="command", required=True) # json2csv 子命令 p_json = subparsers.add_parser("json2csv", help="JSON 转 CSV") p_json.add_argument("input", help="输入 JSON 文件") p_json.add_argument("output", help="输出 CSV 文件") # m3u8-filter 子命令 p_m3u8 = subparsers.add_parser("m3u8-filter", help="筛选 M3U8 高分辨率行") p_m3u8.add_argument("input", help="输入 M3U8 文件") p_m3u8.add_argument("output", help="输出筛选后的文件") # rename-batch 子命令 p_rename = subparsers.add_parser("rename-batch", help="按日期重命名文件") p_rename.add_argument("dir", help="目标目录") args = parser.parse_args() ...我逐个执行了三个子命令。第一个json2csv,我准备了一个包含嵌套对象和数组的 JSON 文件。它的处理逻辑是把 JSON 里的列表展开成多行,嵌套对象用json.dumps转换后保留原样写入 CSV,这样既保留了结构,又避免了 pandas 把嵌套对象拍平成碎片的模糊问题。
第二个m3u8-filter,它的解析不是简单按行筛选,而是用了组合逻辑——维护一个“当前分组”的临时状态,遇到#EXTINF行就记录属性,遇到#EXT-X-STREAM-INF行则读取下一行为 URI,两个状态配对后判断分辨率。这种状态机写法比逐行判断要靠谱得多,说明模型对 M3U8 格式的结构理解到位了。
第三个rename-batch,它通过正则表达式提取YYYY-MM-DD模式,重命名时保留原文件名的其他部分,并处理了重名冲突的情况(在文件名后追加序号)。在我准备的 20 个测试文件上全部执行成功,没有出现覆盖或乱序问题。
3.3 多任务输出的“接口一致性”评估
多任务场景里我最看重的指标是接口一致性。很多模型在面对“三个子命令”的需求时,会生成三段互不相关的代码,它们各自能跑,但拼在一起就崩。GLM-5.3 这次生成的三个模块之间没有出现函数签名冲突或 import 混乱,因为它们共享了同一组错误处理函数和输出辅助函数。
我额外测试了一个多文件场景。提示词是:
把上面的工具拆成模块化结构,主入口文件、json2csv 模块、m3u8 模块、rename 模块、公共工具模块分开,每个模块一个文件。
它返回的结构是:
project/ ├── main.py ├── json2csv_tool.py ├── m3u8_tool.py ├── rename_tool.py └── utils.py每个模块导出了清晰的run()接口,主入口只做参数解析和分发。这种“单一职责+接口即函数签名”的写法在多文件项目里非常重要。模型在拆分时还自动把原来写在主函数里的错误处理下沉到了每个模块里,算是对责任边界的一次合理重构。
综合来看,多任务这项我给 GLM-5.3 的“一次通过率”评了 85 分。扣分点是我后来又加了两个边界条件:一个输入文件路径不存在,一个 JSON 文件格式非法,第一个条件它处理了,但第二个只捕获了通用 Exception,不够精细。不过平心而论,模型在“看见边界条件并处理”方面的表现已经超过很多初级开发者的平均水平了。
4. 轻重两级对比:GLM-5.3 与 glm-5.3-flash
4.1 相同提示词下 Flash 的速度与质量差异
测试完标准版,我把相同的提示词原封不动地提交给 glm-5.3-flash。两个模型是通过不同镜像调用的,所以切换很方便。第一个数据清洗任务,Flash 版生成耗时大约是标准版的三分之一,代码结构高度相似,核心逻辑几乎一致。但仔细对比就会发现,Flash 版在几个边角处理上做了简化:
- 没有处理“空 DataFrame”的情况,直接调用
fillna后写文件。 - 没有使用
encoding="utf-8"参数,在中文 CSV 场景下可能产生编码问题。 - 报告输出格式从标准版的 “文件名: xx rows” 简化成了 “文件名: done”。
这三个差异都不致命,但第一个和第二个在实际生产环境里是会被打回来的。Flash 更适合“快速验证思路”的场景,比如我临时要看一个数据文件的清洗效果,越快越好,代码质量够用就行。标准版则更适合直接交付到生产流程里的任务。
4.2 多任务场景下 Flash 的“偷懒”行为
多任务压测部分,Flash 版的表现让我皱了下眉。三个子命令的需求它能理解,也能生成可运行的代码,但它的实现方式是:json2csv 里的嵌套对象处理被直接抹平了,嵌套字段拼接成{"a": 1, "b": {"c": 2}}里内层 JSON 变成了字符串写入;m3u8-filter 的分辨率筛选逻辑只匹配了一行#EXT-X-STREAM-INF:RESOLUTION=1920x1080,遇到属性和分辨率不在同一行的情况就直接没输出;rename-batch 的重名冲突处理被省略了。
这些都不是“跑不起来”的错误,而是“代码看起来能用但数据边界一碰到就露馅”的问题。在实际项目里,这种偷懒代码是最难发现的,因为小规模测试数据上它表现完美,一上生产数据量一多就出错。所以我的建议很明确:Flash 适合写一次性脚本、生成测试脚手架、练习 demo;任何要长期运行、处理真实数据、对边界条件敏感的程序,都得靠标准版或者自己动手改一遍。
4.3 怎么在两者之间做选择
结合这一轮测试,我给出一份基于实际需求的选型建议,不一定严谨,但足够实用:
| 需求场景 | 推荐版本 | 原因 |
|---|---|---|
| 快速原型验证,代码只跑一次 | glm-5.3-flash | 速度快,够用即可 |
| 需要部署到长期运行的脚本 | GLM-5.3 | 边界处理、异常处理更完善 |
| 代码风格要求高的团队项目 | GLM-5.3 | 代码可维护性强,减少 review 成本 |
| 复杂多模块项目一次生成 | GLM-5.3 | 接口一致性明显更强 |
| API 调用成本敏感的批量任务 | glm-5.3-flash | 成本更低,适合大规模调用 |
我自己的习惯是:先让 Flash 快速产出草稿,用来梳理思路;确认整体方向没问题之后,再把复杂逻辑丢给标准版重新生成优化版本。这样既能享受到 Flash 的速度,又不会承受它简化处理带来的风险。
5. 一句话出程序的边界在哪里:常见翻车场景实录
5.1 翻车场景一:环境依赖与版本暗坑
“一句话出可运行程序”最大的谎言,其实是“可运行”三个字。模型生成代码本身哪怕没有语法错误,运行环境也可能把它拦在门外。我在测试一个需要requests库的爬虫脚本时,GLM-5.3 生成的代码用了requests.Session()来管理连接,逻辑本身没有任何问题,但我的测试环境是一个全新的虚拟环境,里面没有安装requests。模型没有在代码注释里提示我需要先pip install requests。
这个问题的解决思路很简单,在提示词里加一句:
请说明运行这个脚本需要哪些 Python 依赖,并在代码开头注释里列清楚。
加了这句话之后,GLM-5.3 的输出会在文件头部自动生成一个依赖清单块。如果你发现模型仍然没有提示依赖,你最好在写提示词时就直接把环境约束带上。经验是:模型不会比你更了解你的环境,主动说明依赖关系永远比事后排查高效。
5.2 翻车场景二:模型幻觉——不存在的 API 与编造的库
这是生成式模型代码能力最危险的角落。我测试了一个需求:“用 Python 写一个程序,调用某个第三方天气服务的 API 获取天气数据并展示”。这里我故意选了一个国内不太常见的天气服务(假设叫 BestWeatherAPI),在公开文档里它的 API 路径是/v1/current,认证方式是请求头X-Api-Key。
GLM-5.3 第一轮生成的代码写的是/v1/weather?city=xxx&key=xxx,数字上看起来很像真的,但路径和参数完全对不上。这是因为模型在训练数据里见过大量”天气 API 通用写法”,它没有能力区分这是一个具体服务还是泛化模式。这个问题在真实开发里是致命的——代码能运行,但 API 返回 404 或 401,你排查老半天还以为是自己的网络问题。
我的对抗方案有两个:第一,在提示词里明确 API 文档的关键细节(完整 URL、认证方式、必填参数);第二,模型生成后自己去看一眼接口文档,必要的时候把文档内容复制进对话让模型对照修改。再强的模型也没有“实际去互联网查文档”的能力,你要替它补上这个环节。
5.3 翻车场景三:超长对话中的多任务上下文丢失
在一次连续会话里,我先让它生成数据清洗脚本,然后讨论脚本的优化方案,中途插入了两个无关的问答,最后我说“那把刚才讨论的脚本也加一个统计功能”。结果新生成的代码确实加了统计功能,但它使用的是最初版本的数据清洗逻辑,完全忽略了我们中间讨论过的两轮优化内容(比如换了更快的分块读取方式、改用 Parquet 格式输出)。
这个问题其实不算 GLM-5.3 独有,几乎所有 LLM 都会在长对话中丢失早期上下文。但 GLM-5.3 在长上下文下的表现比我预期的要稳定一些,在约 8000 字的历史对话中,它还能基本维持一致性,超过这个量级就会开始出现遗忘。我的建议是:关键需求不要依赖“刚才我们讨论过”,整理成独立的提示词重新提交一次,把必须保留的约束全部写进去,不要嫌啰嗦。
5.4 问题排查速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 代码报 ModuleNotFoundError | 依赖未安装或环境不对 | 检查虚拟环境,把依赖信息补进提示词 |
| 代码能跑但输出全空 | 文件路径或编码问题 | 确认输入文件存在、编码一致,让模型打印调试信息 |
| API 调用返回 404/401 | 接口路径/参数是模型幻觉 | 粘贴官方文档,让模型对照修改 |
| 长对话后生成逻辑退化 | 上下文丢失 | 新建对话,完整重述需求 |
| 生成的代码有安全漏洞 | 模型未主动考虑安全策略 | 提示词中明确要求安全检查 |
| 多文件生成互相冲突 | 模块间缺乏接口约束 | 要求“明确每个模块的函数签名和返回类型” |
排查时务必要记住一个原则:模型生成的代码本质上是一段“由概率拼装出来的文本”,它没有真正执行过这段代码。任何模型说“这个代码一定能跑”,你都要用对待同事提交的 PR 的心态去对待——必须自己去 review、运行、测试。
6. 高效使用 GLM-5.3 系列的提示词心得
6.1 让模型“一次写对”的一句话模板
测试过程中我逐渐总结出一个比较通用的一句话需求模板,它不玄妙,但很有效:
用一个 [语言/框架] 程序,实现 [核心目标]。输入是 [输入格式],输出是 [输出格式],需要处理 [边界情况],注意 [技术约束],最后 [附加要求]。
这个模板的关键不是所谓的神奇关键词,而是把决定成败的边界信息前置。模型生成代码时是逐 token 推理的,开头能看到的信息对后续生成的约束力更强。如果你在提示词末尾才提到“输入可能是空文件”,模型可能已经生成了默认假设输入非空的代码,你要再让它改,它可能只改一个补丁而没有重构整个逻辑。
举个具体的例子,如果你要生成一个文件解析工具,好的提示词是:
用 Python 写一个 JSON 解析工具,输入是一个文件路径,输出是解析后的格式化内容,要处理文件不存在和 JSON 格式错误两种情况,依赖只用标准库,最后给出完整代码。
这里的“依赖只用标准库”直接避免了后续安装依赖的麻烦,“处理两种异常情况”迫使模型去写try-except,比你事后检查代码再要求补充要高效得多。
6.2 善用“再改一版”而不是“推翻重来”
很多人在和模型协作时有个坏习惯——不满意就让模型重新生成。这实际上会浪费大量已经存在的有效逻辑。GLM-5.3 的指令理解能力很强,循序渐进的修改比大方向重来效果更好。
比如我在测试多任务工具时,对 json2csv 模块的嵌套对象处理不满意,我用了两种方式对比修改效果。第一次,我说“重新写一遍 json2csv 的逻辑”,结果它把原来的状态机写法删了,换了一种更啰嗦的逐行解析方式,效果反而不如原来。第二次,我说“现在 json2csv 在处理嵌套对象时直接把内层 JSON 变成了字符串,请改成把内层对象的字段展开成独立的 CSV 列,如果字段名冲突就在前面加父级字段名前缀”,这次修改精准命中问题,其他两个子模块的逻辑完全没受影响。
所以我的经验是:把模型当成一个聪明但容易忘事的同事,修改意见要具体到“哪个函数、什么问题、期望什么改成什么”。你越能把问题描述得精确,模型的表现越接近资深工程师。
6.3 进阶技巧:让模型生成测试用例来验证它自己的代码
这是我从一次偶然测试里发现的好方法。在一次需求中,我要求 GLM-5.3 生成一段处理 M3U8 的代码,生成后我没有急着运行,而是追加了一句:
写一个 pytest 测试文件,覆盖正常输入、空输入、格式错误、超大文件四种情况。
它生成的测试代码里有几个极好的用例,比如用一个只有一行的 M3U8 文件测试“分组状态机”在输入不完整时不崩溃,用包含路径空格的 URI 测试不会出现路径解析错误。我拿着这些测试去跑它自己的实现,还真发现了两个 bug:一个是分组状态机在遇到非法行时没有正确重置状态,另一个是处理 Unicode 文件名时没有encoding参数。让模型自己生成测试用例来验证自己写的代码,这个循环能帮你发现不少人类 reviewer 容易忽略的边界问题。
这个方法值得单独拿出来说说。它本质上是在强制模型以“测试者”而非“生成者”的视角重新审视一段代码,两个视角关注的细节完全不同。生成者关注的是“怎么把功能实现”,测试者关注的是“什么样的输入会让实现崩溃”。当模型切换到测试者视角时,它对代码的理解会进入不同的模式,暴露问题的概率成倍提升。
7. 实测总结与后续扩展思路
7.1 各场景评分总表
| 测试场景 | GLM-5.3 | glm-5.3-flash |
|---|---|---|
| 单任务简单脚本 | 96 分 | 88 分 |
| 单任务复杂数据清洗 | 92 分 | 78 分 |
| 多任务组合工具 | 87 分 | 70 分 |
| 多文件模块化拆分 | 85 分 | 66 分 |
| 安全敏感需求拦截 | 94 分 | 85 分 |
| 长对话上下文一致 | 82 分 | 70 分 |
这个表格是我个人主观评分和客观运行结果的综合,不代表官方基准。但从整体趋势上可以看出,GLM-5.3 标准版在“生产可用性”上已经达到一个相当不错的水准,尤其是安全敏感需求的拦截能力和多任务模块拆分能力,让我有底气把一些不那么核心的脚本任务直接交给它来处理。Flash 版更适合快速试错和原型验证,它的简化处理模式在复杂任务面前确实不够看。
7.2 我后续打算怎么用这套工具
测试接近尾声时,我已经在实际工作中开始使用这套工具了。我目前的工作流是:常规的代码生成、代码解释、测试用例编写,交给 GLM-5.3;快速的思路验证、临时脚本、问题定位辅助,交给 glm-5.3-flash。两个模型的分工有点像“正式工”和“临时工”——正式工负责需要长期维护的代码,临时工负责一次性的快速活。
我踩过几次坑之后形成的最终习惯是:绝不把模型的输出当作最终交付物。模型给了我一个高质量的起点,省掉了“从一张白纸开始”的烦恼,但 review、测试、修改仍然是我的责任。这种心态让我能充分享受 AI 带来的效率提升,又不会被它的错误带进沟里。
我还会继续测试它在其他场景下的表现,比如前端 UI 生成、数据可视化代码、Shell 脚本、SQL 优化等。就目前这几轮测试来看,GLM-5.3 系列确实把我对“大模型写代码”的预期抬高了一个档次。下一次准备专门拿一个真实的小项目来整体测试它的“全链路生成能力”,从需求分析到代码落地一步到位看能不能行得通,到时候再和大家分享。