最近GitHub上冒出一个热度很高的开源项目,仓库标星已经到17K,主打的是System 1决策方向,社区里到处都能看到有人拿它和Jev放在一起讨论。我花了两天时间把安装、推理、微调整条链路都过了一遍,这篇就把完整教程和踩坑记录写出来。不管你是做Agent、做自动化决策,还是单纯想训练一个自己的轻量决策模型,这篇文章应该能省掉你不少查资料的功夫。
1. Laya项目整体拆解:为什么System 1决策会是趋势
1.1 System 1和System 2:两条不同的决策路径
要搞懂Laya在做什么,得先从System 1这个说法说起。这个概念最早来自心理学里的双系统理论:System 1是快速、直觉、自动化的大脑工作模式,System 2则是慢速、理性、需要刻意分析的模式。你走在路上看到前面有坑,下意识绕开,这是System 1;让你算一笔复杂的账,你得停下来慢慢推,这是System 2。
放到大模型语境里,大部分主流模型长时间以来都在模仿System 2路径:给模型一个问题,它要做多步内部推理、反复权衡,最后才给出答案。这种方式准确率高,但延迟也高,Token消耗更大。而Laya这个项目的定位很明确,它想做一个偏向System 1风格的模型:延迟更低、响应更快、更适合在生成路径很短的情况下给出一个“够用就好”的快速判断。
我自己的理解是,这类模型并不是要在复杂推理上硬刚传统大模型,而是把决策链条拆成“快速预筛”和“深度思考”两段。Laya负责前面那段:意图识别、分类标签、路由判断、风险预判、候选生成,这些场景要的就是毫秒级出结果。真正需要复杂推理的再丢给Jev这类深度推理模型去处理。Architectural上就是给Agent加了一层前置的“快思考”能力。
1.2 Laya和Jev的定位差异:不是替代,而是分工
很多人一看到“爆打Jev”这种说法就以为Laya是要全面超越Jev,这个理解其实是跑偏的。从我实测和看到的社区分享来看,Laya和Jev更像是一个分工关系:Jev擅长的是需要多步思考、工具调用、复杂代码生成的任务,它会在内部展开很长的推理链再收敛结论;Laya则刻意把推理链压得很短,输出风格干净、利索,几乎没有冗余的分析过程。
两者放到同一个Agent任务里会非常有意思。比如一个任务进来,先用Laya判断“这属于代码类的还是文本类的,大概需要多少推理深度”,得到一个粗粒度结果后,再决定要不要调用Jev这样的重型模型。如果每件事都直接上重型模型,推理费用和响应延迟都会让你很难受。我测试下来,类似意图分类这类简单任务,Laya的响应速度和Token消耗都比Jev有明显优势,准确率也足以支持生产环境使用。
所以,与其纠结“Laya能不能替代Jev”,不如把Laya当成你Agent系统里的第一道闸门,Jev是后面的深度大脑。很多把Laya和Jev做对比的人,最后都发现这种双层结构才是真正合理的落地方式。
1.3 这类模型适合放在什么场景,资源投入才划算
从实际业务角度出发,System 1风格的模型最适合三个方向:第一类是高频低复杂度决策,比如消息路由、意图识别、标签生成、垃圾内容过滤,这种任务量大且对单次精度要求没那么苛刻,关键是延迟和成本。第二类是Agent内部状态判断,比如判断当前用户意图是否明确、是否要切换工具、是否需要追问,这类决策藏在实际业务主链路里,每多一次调用都会影响用户体验。第三类是辅助深度模型生成候选,让Laya先产出多个粗粒度候选项,再由Jev或人工进行最终筛选。
这三个方向有一个共同特点:调用频次高、单次任务轻。如果所有请求都堆到Jev这种模型上,就算单次推理质量很高,整体吞吐也会被拖垮。我见过不少团队把主模型换成轻量模型后,整体响应时间直接从三秒压到几百毫秒,连带基础设施成本也降了一个量级。这就是System 1决策模型的价值所在。
2. 环境准备与安装:把Laya跑起来的前置工作
2.1 GPU与显存规划的估算方法
聊安装之前先算一笔账。任何大模型本地部署都会面临显存问题,Laya也不例外。我的经验是先确认你要跑的是量化版本还是原始精度版本,不同版本显存占用差别很大。通常一个7B参数级别的模型,FP16精度跑推理大概需要14GB到16GB显存,INT8量化之后能压到8GB到9GB,INT4量化更是只需要5GB到6GB。
显存估算可以用一个很简单的公式:模型参数总量乘以每个参数占用的字节数。FP16就是2字节,INT8是1字节,INT4是0.5字节,计算完之后还要额外预留30%左右的空间给KV Cache和中间激活值。举个例子,跑一个7B的INT4量化模型,5GB是推理负载底数,加上KV Cache和上下文窗口开销,一张8GB显存的消费级显卡就能流畅跑起来。如果是微调,那就完全是另一个量级了,LoRA方案下7B模型最低建议要16GB显存,全参微调建议直接上24GB以上的卡,不然光梯度就会把显存占满。
所以第一步不是急着敲命令,而是先看清楚自己手上是什么硬件,再决定走哪条路线。如果你手里的卡是8GB级别,我建议老老实实跑量化推理加LoRA微调;如果是24GB级别的卡,可以尝试更大的batch size和更多训练步数,效果会明显好一些。
2.2 克隆仓库、创建虚拟环境和安装依赖
确认硬件能行之后,正式进入安装流程。我建议全程用conda或者venv虚拟环境,不要图省事直接装到系统Python里,否则后面依赖冲突能折腾到你怀疑人生。以下是我操作时的完整流程:
# 克隆项目仓库 git clone https://github.com/your-path/laya.git cd laya # 创建Python 3.10虚拟环境 conda create -n laya python=3.10 conda activate laya # 安装PyTorch(如果已有CUDA环境可跳过) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 安装项目依赖 pip install -r requirements.txt这里有几个容易踩的坑需要特别说明。第一,PyTorch版本和CUDA版本必须匹配,我见过不少人CUDA是11.8但装了cu121编译的PyTorch,跑起来要么找不到CUDA驱动,要么直接报错。先执行nvidia-smi看CUDA版本,再决定PyTorch的安装源。第二,requirements.txt里的依赖不一定都兼容Python 3.11以上,所以我建议项目说用哪个版本就用哪个版本,没必要追求最新。第三,如果你在Windows上跑,有的项目依赖编译会不顺畅,本地开发建议用WSL2或者直接上Linux环境,能省掉大量折腾时间。
2.3 快速体验路线:通过Ollama本地部署
如果只是想体验一下Laya的效果,不想一上来就折腾整套Python环境,Ollama是最快的路径。Ollama相当于大模型界的Docker,它把模型权重、推理运行时、API接口全部打包了,装好之后三行命令就能把模型拉起来。很多社区实测分享也都是基于Ollama来做快速验证的。
# 安装Ollama(Linux / macOS) curl -fsSL https://ollama.com/install.sh | sh # 通过Ollama拉取Laya量化版并启动 ollama run laya:7b-q4_K_M拉取过程取决于你的网络环境,7B量化版大概在4GB左右,等待时间可以接受。跑起来之后,Ollama会在本地自动启动一个OpenAI兼容的API服务,默认端口是11434,可以直接用curl或各种SDK调它。
Ollama的优势在于它把推理时的很多细节都封装好了,比如KV Cache管理、上下文窗口长度、并发请求处理,你不用关心底层是怎么实现的。但它的缺点也比较明显,Ollama默认配置不一定能发挥出硬件的极限性能,追求极致吞吐的话后面还是要用vLLM这类专用推理引擎。我的建议是,第一周先用Ollama把业务流程跑通,确认效果之后再考虑上vLLM优化。
2.4 验证安装:跑通一次最小推理
装完之后不要急着丢复杂Prompt进去,先跑一个最小用例验证整条链路是否正常。我用Python脚本做验证,确保模型加载、前向传播、输出解码都没有报错:
from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "your-path/laya-7b" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype="auto", device_map="auto" ) prompt = "请判断下面这条消息属于哪一类:用户反复询问同一订单的物流状态。" messages = [ {"role": "user", "content": prompt} ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, return_tensors="pt" ) outputs = model.generate( inputs.to(model.device), max_new_tokens=64 ) response = tokenizer.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True) print(response)如果代码能正常输出一段简短清晰的分类结果,说明模型已经跑通了。首次运行慢是正常的,因为需要下载权重、建立缓存,第二次开始速度会快很多。
3. 核心使用实战:System 1决策在业务里的正确打开方式
3.1 写一个最小推理脚本,理解输出风格
模型跑通之后,我建议先花一点时间感受Laya的输出风格。System 1决策模型和传统的聊天模型在输出习惯上有很大差异。传统模型会给你解释“基于您的描述,我认为……,因此……”,而Laya这类模型倾向于直接给答案,不解释推理过程。
我测试了一个典型场景,让模型判断“用户反复询问同一订单的物流状态”这个消息的意图优先级。Laya的输出大概是“物流咨询-高优先级-需要人工介入”,三个关键信息一次性给全,没有多余的分析过程。这种风格在使用时需要特别注意:它适合的消费端是程序和自动化流程,而不是人类阅读。
所以,在设计Prompt的时候,我建议你把自己的需求拆成机器可解析的格式。比如要求模型输出JSON结构,或者只要一个标签词,而不是让它写一段自然语言回答。我常用的做法是直接在Prompt里限定输出格式,比如“只输出一个词:高、中、低”,实测下来稳定性很好。
3.2 温度参数与输出长度:快思考模型的调参思路
System 1模型的推理参数不能照搬传统模型。传统模型把Temperature调高一点能生成更多样化的内容,但Laya这种快速决策模型,高Temperature反而会带来随机错误。我做了一组对比实验,Temperature在0到0.3之间时,分类任务的准确率稳定在95%以上;调到0.7以上后,出现了不少模棱两可的输出,比如同时输出两个标签。
我最终给的建议是:Laya做决策任务时Temperature直接设成0或0.1,让输出尽量确定化。max_new_tokens同样要压短,决策任务通常只需要几十个Token,我一般控制在32到64之间。如果你把输出长度放得很大,模型反而可能越写越偏,从决策输出变成了自由发挥。
Top-p参数也值得关注。当采样概率累计超过0.9时截断,可以让输出既保持一定程度多样性,又不会飘太远。经验值就是Top-p=0.9,Temperature=0.1,这是一个适合绝大多数System 1决策任务的起点。
3.3 把Laya接入Agent与Codex类工具做前置决策
实际项目中,Laya最大的价值在于嵌入Agent流程做前置决策。我自己搭建过一个场景:一个基于代码生成的工作流,任务进来后先用Laya判断任务的类型和难度,简单任务直接由轻量模型处理,复杂任务再交给重模型。这么改造之后,整体响应时间下降非常明显。
接入方式不复杂。Ollama启动后暴露的是OpenAI兼容API,所以AGENTS框架里只要把Base URL改成http://localhost:11434/v1,模型名称改成Laya对应标签,就能直接替换原来的模型接入点。比如在OpenAI SDK的客户端里,把base_url和api_key配置好,改成调用Laya:
from openai import OpenAI client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" # Ollama 任意字符串即可 ) response = client.chat.completions.create( model="laya:7b-q4_K_M", messages=[ {"role": "system", "content": "你是任务路由器。只输出任务类型名称。"}, {"role": "user", "content": "帮我写一个Python脚本,读取CSV并绘制图表。"} ], temperature=0.1, max_tokens=64 ) print(response.choices[0].message.content)在Codex这类工具里,思路也是一样的。Codex本身是做代码生成和执行的,但它内部也有任务路由的需求,比如区分“这个问题要查文档”“这个问题要写代码”“这个问题是闲聊”。把Laya挂到路由层,Codex就能在唤醒重模型之前先做一轮预判,既节省算力又加快响应。
3.4 和Jev配合:双通道决策的实际分工
前面说过,Laya和Jev更合理的定位是配合而不是替代。实际操作中,我搭建了一个双通道决策结构:Laya通道负责快速判断、候选生成和标签输出,Jev通道负责深度推理、代码实现和复杂分析。
举例来说,如果任务是“这段日志代表哪类错误,应该怎么处理”,流程可以这样走:Laya先做一次错误的粗分类,判断是网络超时、权限问题还是业务逻辑问题;分类明确后,Jev才进入局部代码分析,给出修复建议。如果Laya的判断置信度不高,还可以设置一个兜底逻辑,直接跳到Jev做完整分析。
这种双层架构在一个任务内单次来看可能显得绕,但放到大批量任务上,收益就很清晰:大部分简单任务根本不会触发深度模型,只有少数任务需要真正进入慢思考。热词里很多人讨论“爆打Jev”,我觉得真正有意义的用法不是打,而是让Jev把精力集中到它最擅长的深度推理上,这比单纯追求“谁更强”实在得多。
4. 微调实战:从数据准备到LoRA参数配置
4.1 直接微调还是依托Qwen这类基座模型微调
这是热词里被问得最多的一个问题:微调Laya时,是不是需要依托千问一类的基座模型?我的回答是,如果你的目标是垂直领域专用模型,直接基于Qwen这类成熟基座做LoRA微调,往往比从零微调Laya本身更现实。
原因有两个层面。第一个层面是数据量,从零微调一个领域模型需要海量高质量语料才能让模型稳定迁移,个人开发者很难凑到这个量级。第二个层面是基础能力,Qwen这类基座模型已经在通用知识上做了充分训练,它的“底子”是完整的,LoRA微调只需要让它适配特定输出格式和判断逻辑,这属于“在会的基础上学规范”,难度远低于“从零学会”。
我在实际操作中用的就是这条路线:以Qwen系列7B模型作为底座,用Laya项目里公开的决策类训练数据做LoRA微调。跑出来的效果非常稳定,模型不仅保留了基座模型的语言理解能力,还学会了Laya那种简短的System 1输出风格。整体成本和从零开始训一个模型相比,低了不止一个量级。
所以我的建议是:想体验微调流程,直接拿Laya的数据集在Qwen基座上跑LoRA;如果你本身就是为了做垂直任务,比如订单分类、日志判断、意图识别,同样的方法套到你的业务数据集上也成立。没有特殊情况,不建议个人环境下尝试全参微调或从零预训练。
4.2 数据集格式与构建思路
开始微调之前,先把数据集准备好。目前主流的微调工具基本都兼容两种格式:Alpaca格式和ShareGPT格式。Alpaca格式比较简洁,适合单轮指令微调,结构是instruction、input、output三个字段。ShareGPT格式支持多轮对话,结构更复杂一些,适合需要上下文连续性的任务。
我以Alpaca格式为例,给出一个符合分类任务微调要求的样本:
{ "instruction": "判断以下用户消息是否需要人工介入,只输出是或否。", "input": "我的订单前天就到了,今天还没收到,你们到底怎么回事?", "output": "是" }数据数量上,我的经验是:单标签分类任务,准备2000到5000条高质量样本就能取得明显效果。低于1000条的话,效果不稳定;高于1万条虽然更好,但边际收益会递减,而且人工标注成本会急剧上升。数据质量永远是第一位的,宁可5000条干净数据,不要2万条噪声数据。
构建数据的时候有一个说话:直接用一个强模型去批量生成标注,然后人工抽检。这种做法的效率很高,但要特别注意人工抽检的比例,至少要抽检20%以上。如果你把强模型给的答案直接当标准答案,那你的微调模型最多也只是强模型的“影子”,学不到额外的判断能力。
4.3 基于LLaMA-Factory跑一次LoRA微调
LoRA是目前个人开发者微调大模型的首选方案。它的原理可以理解为:冻结原始模型的全部权重,只训练一小部分额外注入的低秩矩阵。你只需要调整原始模型5%以下的参数,就能在某个具体任务上逼近全量微调的效果,而且显存占用低很多。
LLaMA-Factory是目前我使用下来最顺手的微调工具,它把数据集接入、训练参数、模型导出这些流程都封装得很成体系。先把LLaMA-Factory安装好:
pip install llama-factory然后在data目录下把你的训练集放到laya_train.json,打开dataset_info.json,加一条数据集注册信息。接着启动Web界面:
llamafactory-cli webui在Web界面里,模型名称选Qwen7B基座,微调方法选LoRA,数据集选刚才注册的laya_train,然后重点配置几个关键参数。我实际跑下来的一组效果不错的LoRA参数如下:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| LoRA Rank | 16 | 矩阵秩,越大能记住的信息越多,但太大会过拟合 |
| LoRA Alpha | 32 | 缩放系数,通常取Rank的两倍 |
| Learning Rate | 2e-4 | 学习率,LoRA常用范围是1e-4到5e-4 |
| Batch Size | 8 | 根据显存调整,显存小就调为4 |
| Gradient Accumulation | 2 | 等效增大Batch Size |
| Num Epochs | 3 | 分类任务一般2到3个epoch足够,多了容易过拟合 |
| Max Sequence Length | 1024 | 太长占显存,太短可能截断有效信息 |
训练过程中的Loss曲线值得关注。正常情况Loss会在前几百步快速下降,然后进入一个平台期慢慢下降。如果你发现Loss降到某个值后不再变了,但准确率还在提高,可以继续观察。如果训练集Loss很低但验证集Loss很高,那就是过拟合信号,需要降低Rank、增大数据量或提前早停。
训练完成后,LLaMA-Factory会把LoRA适配器权重保存下来,那个权重文件本身很小,通常只有几十MB到一两百MB,但它必须搭配原始的Qwen基座模型才能工作。导出权重的时候要勾选“导出合并权重”,这样会生成一个可以直接加载的完整模型目录。
4.4 微调后的评估与导出
训练结束不是终点,评估才是决定能不能上线的关键步骤。我建议准备一份独立的测试集,数量在300到500条左右,并且保证测试集和训练集没有重叠。在LLaMA-Factory的Web界面上有“Evaluate”和“Predict”功能,可以直接对测试集做批量推理,输出预测结果。
分类任务我最关注的三个指标是准确率、召回率和AUC。准确率直接反映整体判断质量,召回率决定这个模型是否会把关键情况漏掉。比如订单咨询里的高危投诉场景,漏掉一个可能就引发大事故,这时候召回率优先级大于准确率。如果评估结果不理想,先别急着调模型,检查一下测试集的标签分布是否均衡,以及训练集里这个错误类别是不是样本太少。
评估通过后,导出合并权重:
llamafactory-cli export \ --model_name_or_path Qwen/Qwen2.5-7B \ --adapter_name_or_path ./output/lora_laya \ --template qwen \ --finetuning_type lora \ --export_dir ./laya_lora_merged \ --export_size 4 \ --export_legacy_format false导出的目录就是一个完整体,可以直接用Transformers加载。我导出过一次后测试,推理效果和训练时几乎一致,说明导出流程没有引入额外损失。
4.5 把微调产物接入Ollama的高效加载方案
模型微调完、导出合并权重之后,怎么在业务里快速用起来?我的习惯是把合并后的模型转成GGUF格式,再导入Ollama。这样做的好处是Ollama本身做了很充分的内存管理和量化优化,部署成本大幅降低,而且可以像调用标准模型一样用一行命令启动服务。
转换流程一般是先安装llama.cpp项目提供的转换脚本,把HuggingFace格式的模型转换成FP16 GGUF文件,然后用llama-quantize做量化:
python convert_hf_to_gguf.py ./laya_lora_merged --outfile laya-fp16.gguf ./llama-quantize laya-fp16.gguf laya-q4_K_M.gguf q4_K_M接着创建一个Modelfile,指向这个GGUF文件,再用下面的命令建出Ollama模型:
ollama create laya-finetuned -f Modelfile ollama run laya-finetuned整个流程做完以后,业务代码不需要做任何改动,把模型名从laya:7b-q4_K_M换成laya-finetuned就可以。实测下来,量化到Q4_K_M之后,微调模型在分类任务上的准确率损失在1%到2%以内,换来的是显存占用大幅下降和更快的推理速度,这笔账非常划算。
5. 高频问题排查与避坑清单
5.1 显存OOM:区分训练态和推理态
显存不足是本地跑模型最大的拦路虎,而且训练和推理OOM的原因完全不同,排查思路也要分开。
推理OOM最常见原因是上下文窗口开太大。KV Cache会随着输入长度线性增长,你把上下文调到8000,即使模型本身很小,显存也会被Cache占掉一大块。解决办法有两个:一是调低max_length或max_new_tokens;二是在Transformers加载模型时设置torch_dtype=torch.float16降低精度。
训练OOM则是另一回事,最典型的问题是Batch Size拉太高。LoRA已经省了很多显存,但如果你把Batch Size开到16以上,照样会爆。我的排查步骤是:先把Batch Size降到1,确认能正常开始训练,再逐步往上加,直到找到一个临界点,再把Batch Size退一档。另一个训练OOM点是序列长度,训练样本里的超长文本会按Max Sequence Length填充,导致多余显存开销。分类任务通常1024就够,没必要设成4096。
5.2 推理速度慢:用vLLM做服务化
如果你用Ollama或Transformers跑Laya,发现并发一高速度就明显下滑,说明到了该上vLLM的阶段。vLLM最核心的优化是PagedAttention,它把KV Cache按页分配,显存利用率比传统方案高很多,同时支持连续批处理,吞吐量提升非常显著。
vLLM接入Laya很简单,代码结构基本不变:
from vllm import LLM, SamplingParams llm = LLM(model="./laya_lora_merged", dtype="float16") sampling_params = SamplingParams(temperature=0.1, max_tokens=64) outputs = llm.generate( ["判断这条消息是不是投诉:订单未按承诺时间送达。"], sampling_params ) print(outputs[0].outputs[0].text)我的实测数据是,同样的量化模型,vLLM在并发场景下吞吐大约是HuggingFace Transformers原生推理的3到5倍。如果你的业务需要把Laya暴露成一个真正对外的决策API,vLLM是必须的一环。
5.3 微调后模型“变笨”:灾难性遗忘的应对手段
很多人在微调后遇到一个诡异问题:分类准确率上去了,但模型的语言理解能力、通用回答能力反而下降了,这本质上就是灾难性遗忘。LoRA虽然把原始模型冻结了,但注入的低秩矩阵还是会向模型参数中写入过量的“领域偏置”,导致通用表达能力被削弱。
应对手段有三个方向。第一个是控制训练强度,把LoRA Rank降到8,学习率调低到1e-4,训练轮数控制在2轮以内,给模型更少的空间去覆盖原始知识。第二个是数据配比,在垂直数据集里混入10%到20%的通用对话数据,训练时一起参与更新,相当于在学新技能的同时做“复习”。第三个是参数策略,只往模型的部分层注入LoRA矩阵,优先选择靠近输出端的层,避免破坏底层的通用表示。
如果遗忘已经发生,不用太慌,直接在原基座模型上重新接一个新的适配器,用更温和的参数再训一遍即可。LoRA一个很大的优势就是可以迭代,你不需要每次都从零开始。
5.4 热门项目信息筛选与多版本管理的经验
现在开源大模型项目非常多,很多项目标星数看着很夸张,实际代码质量和维护情况未必匹配热度。我自己筛选项目的经验是:先看Issues区的响应速度,再看最近Commit的频率,最后看有没有完整的文档和示例代码。一个17K Star的项目并不保证它适合生产环境,但社区活跃度通常能说明大部分问题。
还有一个很实用的建议,就是养成锁版本的意识。同一个项目,不同Commit之间接口可能有破坏性变化,你按照某个版本的教程跑通了,升级之后可能就崩了。我通常会在项目目录里用一个requirements-lock.txt把依赖版本固定下来,或者用conda环境管理。如果看到社区教程里提示某个版本特别稳定,就直接锁那个版本,不要追求新。
结尾:我实际操作中的几点体会
跑完整个流程,我最深的体会是Laya这类System 1模型的价值不在于单点能力有多强,而在于它把大模型决策成本打下来了一个台阶。微调和部署也没有想象中那么难,只要GPU显存够、数据格式正确、LoRA参数在一个合理范围内,大部分人都能复现出一条完整的生产链路。
最后再分享一个小技巧:无论你用Laya还是Jev,都不要把模型的输出当成绝对可靠的结果。决策类任务一定要在代码层加上置信度判断和兜底逻辑,比如让模型同时输出一个置信度字段,低置信度时自动升级到深度模型。这个做法成本极低,但能让整个系统的稳定性上一个档次。后面我准备把Laya的数据系统和多轮反思机制也跑一遍,到时候再写一篇更具体的工程落地记录。