1. 项目整体设计与思路拆解
1.1 Vibe Coding的痛点,远比“生成代码不准”更麻烦
先说个我自己的真实经历。大概半年前,我在做一个内部工具项目,重度依赖AI辅助编程。那阵子流行“Vibe Coding”,就是靠自然语言描述需求,让AI生成代码,你只管“感觉对了就行”,不用太纠结每行语法。听起来很爽对吧?但实际用下来,最大的问题不是AI生成不了代码,而是它总在同一个坑里反反复复翻车。
举个例子,我让AI写一个文件上传模块。第一次生成,它用了某个第三方库的旧接口,运行直接报错。我把错误信息丢给它,它说抱歉,然后换了个写法。第二次不报错了,但上传大文件时内存爆掉。我把堆栈信息再丢给它,它又改了,结果第三次把文件类型校验的逻辑搞丢了。三次交互,三轮踩坑,每次它都“诚恳道歉”,但下一次遇到类似场景,它照样踩一遍。我当时就想,这不行。Vibe Coding如果只有“对话”没有“记忆”,那AI永远是个金鱼脑子,开发者就是在陪着它反复试错。
我意识到,问题的关键不在于AI的水平,而在于整个流程没有被数据化。每一次对话、每一段报错、每一次修复动作,都是极其宝贵的经验样本,但这些样本在Vibe Coding的默认模式下,随着对话窗口关闭就蒸发了。没有沉淀,就没有进化。
所以这个项目标题里那串词——“流程数据化、规则自我进化,让AI从错误里自动学习”——本质上就是要给Vibe Coding装上两样东西:一个长期记忆,一套自我修正机制。听起来高大上,拆开来看,其实就是三件事:把开发过程变成可查询的数据,把修复经验变成可执行的规则,再把规则送回AI的上下文中形成闭环。这篇文章我就展开讲讲,我实际是怎么把这套东西跑起来的,哪些环节有用,哪些地方踩了坑。
1.2 闭环设计:从“对话流”到“数据流”再到“规则流”
这套方案的核心不是AI本身,而是你围绕AI搭建的那一圈基础设施。我的思路很简单,整个Vibe Coding过程可以切分成三个阶段:感知、决策、行动。
感知阶段是让AI能“看见”自己做错了什么。这一步最难的一点不是技术,而是你要在开发环境里埋下记录点。我把每一次发出去的提示词、每一次AI返回的代码、每一次运行报错信息,全部追加写入一个本地日志文件。这个日志文件就是数据化的基础。很多人在这一步就劝退了,觉得记录对话很繁琐。但实际操作下来,根本不需要手动复制粘贴。我用了几个监听脚本,监控编辑器保存事件和终端输出,自动采集信息。原理不复杂,相当于给开发流程装了一个黑匣子,只记录,不干预。
决策阶段的玩法就有意思了。有了日志,接下来是把错误信息和修复动作做成“样本对”。所谓样本对,就是“出现什么错误 → 怎么修好的”。这一步我一开始想得很简单,以为让AI自己总结就行。结果发现不行,AI自己的总结有时候大而化之,写出来的规则缺乏可操作性。比如它会总结“遇到网络超时要增加重试机制”,这没错,但什么样的超时、什么层级的重试、重试几次,全没讲清。所以我改成了一套混合策略:先由程序自动解析报错类型,把结构化信息提取出来;再由AI生成修复方案,最后由我或者更资深的同事做人工抽审。带数字的、带具体改动的规则才进规则库,泛泛而谈的,直接打回。
行动阶段是最核心的闭环。规则库沉淀到一定数量之后,在后续的新对话里,我把这些规则作为“历史教训上下文块”,注入到AI的参考内容里。这块内容明确告诉AI:“在当前任务中,有几条历史规则可能跟你的任务相关,请先阅读,再生成代码。”这样每次AI生成代码之前,都会先看到过往踩坑的规则,错误率会肉眼可见地下降。后续运行结果再次反馈回日志系统,新错误会触发新规则生成,旧规则如果连续命中不了,置信度就会下降甚至自动下架。这就构成了一个自我进化的循环。
1.3 为什么选择“规则”而不是“微调模型”
这里要说一下方案选型的纠结过程。本来我看上了更“硬核”的方案——用积累的样本数据微调一个专属于我项目的模型。听起来很帅,但我实际评估之后放弃了,原因有三个。
第一,微调的性价比对个人开发者来说太低。不管是全参数微调还是LoRA这类参数高效微调,你需要准备干净的数据集、跑训练、做评测,就为了一两个项目场景,投入产出比极差。而且训练完的模型是一个静态快照,新错误样本要等下一次训练才能生效,根本做不到“从错误中自动学习”的“自动”二字。
第二,微调会让模型变“钝”。大模型本身拥有海量的通用知识,微调本质上是在压缩它的多样性来迁就你的场景。今天你的项目用到了旧接口,明天它换成了新接口,微调模型里的旧模式就变成了负担。但是规则库没有这个问题,规则是可以随时增加、修改、废弃的轻量资产。
第三,规则的可解释性强。一条规则就是一句明确的话,比如“调用文件上传接口时必须显式设置超时参数为30秒”。出了问题我一眼就能看到是规则本身错了,还是规则没被触发。而微调模型是个黑盒子,它为什么要这么改,你完全不知道。
所以最后我确定的技术路线是:在模型外面加一个可检索的规则层。模型还是那个模型,但它在思考之前会先看规则库。这跟人脑的机制有点像,本能的反应来自模型本身,但职业习惯和操作规程,是靠后天积累形成的,一条一条写下来,随时翻。
2. 核心细节解析与实操要点
2.1 流程数据化的采集层设计:字段怎么定、日志怎么存
既然要做数据化,第一步就要定义清楚:什么数据值得记,用什么格式记。我用的方案是在项目根目录下建了一个.vibe_log/目录,下面按日期存日志文件,文件名类似2025-06-01.jsonl。每一条日志,就是一个JSON对象。字段设计上,我经历了三次迭代才稳定下来。
第一次迭代只记了“提示词”和“AI回复”,完全不够用。第二次增加了“运行结果”,但报错信息的提取很粗糙。到了第三次,我确定了一套贴近实际开发调试的字段方案。结构大致是这样的:
{ "ts": "2025-06-01T14:23:11Z", "task_id": "upload-module-003", "session_id": "conv-0091", "prompt": "生成一个文件上传接口,要求支持断点续传", "code_snippet": "def upload_file(path): ...", "error_type": "TypeError", "error_message": "argument of type 'NoneType' is not iterable", "fix_action": "在调用前增加空值判断", "result_status": "success", "duration_ms": 2317 }这几个字段每个都有它的用途。task_id用来把多次交互归拢到一个任务里,我很推荐大家维护这个字段,因为单条日志是可解释的孤岛,只有把一次任务中的多条日志串起来,你才能看到“AI一开始怎么错的,后来又怎么改的”完整路径,这是后续判断规则有效性的关键依据。error_type是错误分类的标准字段,我参考了常见编程语言的异常体系,但统一成了几个大类,比如语法错误、类型错误、逻辑错误、资源泄漏、接口不匹配等。后面解析环节就靠这个字段做初步分类。
日志的写入方式,我用了一个Python脚本挂在后台,监听目录文件变化,同时定时扫描终端输出。这里有一个重要提醒:采集层不要影响正常的编码体验。如果你每记录一条日志都要弹窗确认,那这个系统一定活不过三天。我的方案是静默写入,所有记录都是异步的,完全不影响编辑器操作。数据存储格式上我用JSONL而不是JSON数组,核心原因是JSONL支持追加写入,不会因为一次崩溃导致整个文件损坏。
2.2 规则库的数据结构:一张表看懂规则的“硬骨架”
流程数据化的终极产物,是规则库。规则库我是存在一个rules.json文件里,整个规则的内部结构,可以用下面这张表来概括。
| 字段名 | 类型 | 含义与作用 |
|---|---|---|
rule_id | 字符串 | 规则唯一编号,用于日志回溯和引用 |
category | 枚举 | 规则所属分类,如接口使用、异常处理、性能优化 |
trigger_error_type | 枚举 | 触发这条规则的错误类型 |
trigger_keywords | 数组 | 错误信息中的关键关键词,用于匹配 |
condition | 字符串 | 规则生效的附加条件描述 |
action | 字符串 | 具体要执行的修复动作,必须可操作 |
confidence | 浮点数 | 置信度,范围0到1,越高越优先采用 |
hit_count | 整数 | 命中次数,每命中一次累加1 |
success_count | 整数 | 生效后确认成功的次数 |
last_hit_time | 时间戳 | 最近命中时间,用于时间衰减计算 |
status | 枚举 | active/under_review/retired 三种状态 |
confidence这个字段是整个规则库的命根子。它的计算方式我放在后面实操章节详细说,这里先讲一个设计哲学:规则不是一成不变的真理,而是基于经验统计的假设。每条规则都是带着“有效期”和“可信度”的临时结论。比如一条规则原本置信度很高,但连续十次触发后都没有成功修复问题,置信度就会跌破阈值,状态自动变成retired(下架)。这就是“规则自我进化”的核心含义——不仅仅是增加新规则,还包括淘汰旧规则。
trigger_keywords的设计也很有讲究。最开始我天真地以为关键词就是报错里的核心名词,操作之后发现不行,报错信息里的关键词重复度不够,甚至同样的底层问题会呈现两种完全不同的报错文本。后来我改成关键词加正则表达式的组合模式,一条规则可以配置多个关键词权重,匹配时按条件打分,超过阈值才引用。另外要强调的是,action字段绝不允许写“检查相关代码”这种废话,必须是可执行的指令,比如“在upload函数第二行前插入空值判断”。规则库的规则要接受人工抽审,凡是这类不可执行的动作,一律打回。
2.3 规则怎么让AI“看见”:注入上下文的正确姿势
规则库建好了,但AI在生成代码的时候是看不到这个库的。怎么把规则塞进它的上下文里,这里头有细节。我尝试过两种模式,一种是全量注入,即每一轮对话都把整个规则库贴给AI。效果很糟糕。一方面是上下文长度扛不住,规则多了以后,光规则就几千字,严重挤占生成空间;另一个方面是AI会无所适从,几十条规则同时摆在面前,它不知道哪个更紧急,最后规则之间互相打架。
另一种模式是动态检索注入,这个效果好得多。具体做法是:在新任务启动时,先从规则库里做一次预筛,根据当前任务的task_id、error_type和关键词,检索出最相关的一到三条规则,拼装成“历史教训上下文块”。这个上下文块的格式一定要固定,我用的是这样的模板:
[历史教训:在类似任务中有几条历史规则被证明有效,请在生成代码前阅读并严格遵循] 规则R003:本类上传任务中必须处理文件名为空的异常情况,否则报AttributeError。 规则R017:调用第三方SDK的进度回调时,要在写入文件前确认目录存在。 [特别注意] - 不要使用旧版接口,2.0版本已废弃。 - 超时设置必须显式传给请求对象,不能依赖默认值。注意,我用了“必须在生成代码前阅读并严格遵循”这种强约束性措辞。但做过这类实践的人都知道,LLM没那么听话,所以我在检索之外,还会对规则条数做上限控制,最多注入五条。测试下来效果最好的是二到三条,因为规则越少,AI的执行力越强。规则一多,它就开始“选择性忽略”,跟人一样。
还有一个关键细节,就是在AI返回代码之后,我用脚本对本轮引用的规则做一次“规则命中确认”——判断一下这次生成的代码里,是否真的包含了规则要求的动作。如果没包含,我就直接把差异点反馈给它,让它自查重改。这一步我称之为“规则强制执行”,也是闭环能够真正合上的关键。很多方案都止步于“把规则告诉AI”,却忘了确认AI是否真的照做了。
3. 实操过程与核心环节实现
3.1 第一步:搭建最小可用的数据采集环境
我现在尽量还原一下实际搭建的过程,按照时间顺序和依赖关系来。先说基础环境,我用的是Python 3.10,配合编辑器提供的文件监听接口。整条链路分两层:捕获层和解析层。
捕获层负责收集原始信息,我在编辑器的事件回调里注册了一个钩子,每次文件保存都触发一次日志写入。终端侧的处理略微复杂,因为要拿到报错文本,不适合单纯监听文件保存事件。实际做法是前置启动一个终端复用工具,在输出流上做管道转发,把stderr里的输出重定向到日志模块。技术上其实一个被动的popen子进程就能搞定。
下面是我捕获层核心代码的简化演示:
import subprocess import json import time def capture_output(command): proc = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) for line in proc.stderr: if "Traceback" in line or "Error" in line: log_entry = { "ts": time.time(), "raw_error": line.strip(), } write_log(log_entry)这段代码做到了一件事:只要终端里有错误信息冒出,就自动记录。它可以做得更精巧,拓展监听报错附近的上下文,但我建议第一版保持简单,先保证可观测性再做增强。切忌一上来就搞复杂的数据管道,那样运维成本会直接把项目压垮。
解析层接到原始错误之后,负责把它结构化。这里的坑在于,报错堆栈很长,天然不适合直接丢给后续的AI解析,里面大量文件路径、行号对规则生成是噪音。我的做法是提取关键行,即错误类型和错误信息中的核心片段,再把整个堆栈丢给AI做二次摘要。这一步也需要设一个超时限制,如果15秒内AI没有输出有效摘要,就直接把原始错误截断后存库,不阻塞主流程。
3.2 第二步:从历史日志里挖掘候选规则
规则库建成了空库,不叫“进化”。第一次的规则从哪来?答案是:从你已有的折腾经历里挖。我把过去一个月积累的Vibe Coding对话日志翻出来,作为种子数据源。具体的挖掘方式,不是让AI随便读,而是设计了一个“错误样本对提取器”。先把所有日志按task_id分组,然后在一个组内,观察是否存在前后相继的状态转换:出错 → 修复 → 成功。
举个例子,日志序列里,A轮出现了AttributeError: 'NoneType' object has no attribute 'seek',B轮里AI回复“加空值判断”后运行成功。这一对信息就会被提取成一条候选规则样本。提取后要经过一次规范化处理:把错误信息里的变量名、文件路径、时间戳全部替换成占位符。这步不做的话,规则会过度拟合到具体项目,换个变量名就失效了。
候选规则的质量参差不齐,因此我加了人工验证环节。实际操作里,我一个人审核所有规则会累死,所以设了一个优先级阈值。程序先给每条候选规则自动打分,打分依据是:错误出现频率(占了日志里同类错误的百分比)、修复动作的明确程度(包含动词、包含具体位置)、修复后的成功概率。总分低于0.6的规则,直接进入观察列表,不写入激活规则库。高于0.6的,我才人工抽审。这里所谓“人工抽审”,是用一个问答式界面,一条条过一下修复动作是否合理。整个过程听起来挺费劲,但实际每天集中处理十五到二十分钟,就能维持规则库的良性运转。
3.3 第三步:置信度算法,让规则库自动“汰弱留强”
规则库要自我进化,就不能只进不出。我给每条规则设计了一套置信度计算机制。具体公式是:
confidence = (success_count + 1) / (hit_count + 2) * time_decay_factor其中time_decay_factor是一个基于last_hit_time的衰减因子。如果一条规则超过30天没有被命中,衰减因子会从1.0逐步降到0.5。这样设计的理由是,技术栈是会变化的,依赖库会升级,一条规则如果长期没有机会被印证,它的参考价值就应该打折扣。这不是说规则一定错了,而是说它的时效性已经过期,不让它占据太高的检索权重。
置信度直接影响两条路径。第一,检索注入时,规则按置信度排序,只有排名靠前的规则才有资格被注入到AI上下文。第二,状态转换时,置信度跌破0.3的规则自动进入retired状态,不再参与检索;进入该状态后会保留一份归档,避免误杀后无法复原。
我踩过一个坑:early阶段我把衰减因子设得太激进,第30天直接调到0.2,结果有一些其实还适用的旧规则被提前下架,导致AI的行为倒退。后来改了策略,用温和衰减,30天从1.0降到0.7,60天降到0.5,90天才接近0.2。规则进化的节奏要稳健,不需要也不应该推倒重来。
3.4 第四步:把规则注入Vibe Coding的对话流
接入AI的对话流是整个环节里最需要“机灵”处理的部分。我使用的方案是在提示词层面做拼接。具体来说,写了一个中间层函数,专门用来构造发送给AI的完整消息。中间层会先根据当前任务检索规则,然后改写用户输入的原始提示词。
这里用一个简化代码来说明入口逻辑:
def build_prompt(base_prompt, task_meta): rules = retrieve_rules(task_meta, top_k=3) rule_block = "\n".join( f"[规则{rule['rule_id']}] {rule['action']}" for rule in rules ) assembled = f""" {base_prompt} ——以下是项目历史教训,请先仔细阅读再编码—— {rule_block} ——历史教训结束—— """ return assembled这段代码形态朴素,但真正的细节在retrieve_rules函数里。它不只是搜索关键词,还需要利用task_meta里的error_type做筛选,再利用上一步的置信度排序。与用户原有任务交叉的匹配逻辑是:同一任务,优先取当前有active状态且最近命中过的规则。这样既保证了相关性,又避免陈年老规则出来干扰。
有条件的团队可以继续深化,在我后续的进阶版本里,我加了“规则冲突消解”的能力:如果两条规则指示的动作互相矛盾,系统会把它们同时标注为低置信度,交给下一轮人工审查。这个功能只是简单加强了规则之间的隔离,但对提升整体稳定性有很大帮助。
3.5 第五步:回归验证,通过“评测集”量化规则进化的效果
数据化不能只追求手感,要有可量化的反馈信号。所以我在实操中引入了“评测集回归”机制。具体做法是,把之前踩过坑的三个任务重构成标准评测样本,每天固定跑一遍:给AI同一个任务,一件件对比它在不同规则库状态下的表现。
评测集我设计成这样的格式,AI要依据“规则库里的规则是否被正确使用”来做完成度评估:
| 维度 | 权重 | 评分标准 |
|---|---|---|
| 功能正确性 | 40% | 生成代码是否实现了目标功能,能否通过单元测试 |
| 规则遵从度 | 30% | 关键规则是否被显式地体现在代码里 |
| 错误相关度 | 20% | 代码是否避开了历史错误的触发条件 |
| 无副作用 | 10% | 是否因为修复一个错误而引入了新问题 |
评测集的价值体现在日拱一卒。上线这套系统第一个月,我的“规则遵从度”得分从41%升到67%,“功能正确性”从73%升到84%。虽然第二个月开始,提升幅度放缓,基本稳定在85%左右,但我认为这是合理的。因为规则库解决的是“已知错误不再重复”的问题,它解决不了“完全未知的新场景”。等过了这个瓶颈期,我就会考虑把“预测新错误风险”的模块融进系统——让AI在生成代码后主动自查是否可能触发规则库中尚未覆盖的边界条件。这一步虽然还不成熟,但方向是对的。
4. 常见问题与排查技巧实录
4.1 错误识别逻辑层解析不正确:报错信息五花八门,怎么破
实操中第一个撞上的大坑是错误解析。刚开始,我把错误信息直接按error_type字段统计,然后发现规则库里出现了大量几乎重复但措辞不一的错误分类。比如Python的ModuleNotFoundError和ImportError本质是同一类问题,但在日志里它们会被解析成两种不同记录,规则命中率被白白稀释。
解决办法是建立“错误归一化映射表”。我定义了一个统一的中间错误类别,把编程语言报错映射到更上层的业务语义。例如:
| 原始报错示例 | 归一化错误类别 |
|---|---|
| AttributeError: 'NoneType' object has no attribute 'xxx' | 空对象访问 |
| IndexError: list index out of range | 边界越界 |
| KeyError: 'xxx' | 键值缺失 |
| ModuleNotFoundError / ImportError | 导入依赖错误 |
| ConnectionResetError / TimeoutError | 网络异常 |
有了这张表,规则的触发条件就稳定得多了。匹配时,不会因为换了一种写法就找不到规则。这里要强调一点,错误归一化是探索性过程,没有标准答案,需要根据自己项目的报错分布定期更新。
4.2 规则注入了但AI不听,怎么办
这是整个方案中最让人崩溃的问题。你明明在提示词里把规则写得很清楚,AI回你一句“好的,我会按照规则处理”,然后生成的代码里啥也没有。态度很好,行动为零。
我试过很多种手段,效果排名如下:单条规则的强约束效果远好于多条规则;把规则写在用户提示词里,不如写在System Prompt里;加“必须把规则应用结果以注释形式展示”这种输出要求,效果非常好。这个“输出要求”是个杀手锏,它的原理是倒逼AI在生成代码时显式思考规则。比如我在规则块后面加上一句:“如果你应用了任何历史规则,请在代码开头用注释标出对应规则编号。# R003: 未找到,已补空值判断。”一旦AI必须给自己“贴标签”,它就会更有动力去遵守规则。
还有一种极端情况,是项目里某个任务的模式太特殊,规则检索始终找不到匹配,AI就自由发挥。我针对这种情况设置了兜底策略:当任务没有命中任何规则时,不强行塞规则,而是在对话尾部追加一句:“本任务无历史教训,请谨慎实现所有边界条件。”听起来很玄学,实际跑下来确实降低了随机报错率。因为这句话能唤起模型对边界处理的注意力,相当于给它加了个“仔细点”的心理暗示。
4.3 样本污染:AI同时踩了两个坑,记录怎么分
日志采集的无差别特质,带来了一个麻烦:一次运行报错,可能同时包含多个错误原因。比如文件上传失败,既有权限问题,又有文件路径不存在,还有一个第三方库版本不兼容。这种情况下,日志系统会把整条报错记录成一个无差别错误,规则挖掘阶段就会困惑——到底该把这条经验归因到哪一类?
我的处理方法是引入“错误因果链”分析。每条错误样本不只是一个点,而是一条链:主错误、前置错误、后置错误。在解析层,我把一次运行的多条报错按时间顺序串起来,取最先出现且引发后续连锁反应的那条作为主因。其余错误作为副作用进行标注。规则提取时,只对主因生成规则。副作用信息则进入另一个“风险提示库”,用来在AI生成代码后检查是否引入了相关风险。
这一步的排查思路很有价值。很多团队做类似系统时,都把“错误”当成一个原子事件,但真实的编码调试是网络化的。错误与错误之间是因果传递的,处理不了这个因果性,规则库就会变得精神分裂。
4.4 性能与成本的平衡:每轮都注入规则,但别让费用爆炸
规则注入会增加提示词长度,而提示词长度直接影响API费用和响应延迟。实操中我做过粗略估算,每注入三条规则,大约增加150到300个token,换算成费用几乎可以忽略。但问题不在于直接成本,而在于如果检索逻辑没写好,规则库膨胀到上千条后,单次检索的性能和token消耗都会显著增长。
我这边实际有效的方法,是给规则查询加缓存。同一个task_id在短时间内发起的多次查询,直接返回此前相同的注入结果。同时,对规则库做层级化冷热分离:热规则(置信度高、命中频繁)直接加载进内存,冷规则(置信度低、长期未命中)则放在磁盘冷文件里,检索时先查热区。冷区的规则只有在新任务中错误类型匹配时才被唤醒。这套冷热分离大约能减少35%的检索耗时,token消耗也降下来很多。
4.5 规则库越滚越大,如何避免维护失控
最后要讲的这个坑,是“规则库的生命力诅咒”。规则库越成熟,产生的规则越多。三个月后,我的规则库积累了四百多条规则,其中很多在逻辑上存在重叠甚至矛盾。比如R012说“上传前必须校验文件大小”,R133说“大型文件不需要完整校验,只看头部就行”。二者看似矛盾,其实是不同体量文件的不同处理策略。但这种微妙区别,AI很难精确理解。
后来我引入了“规则生命周期会议”,每周花十五分钟,把本周置信度变化最大的十条规则重新手审一遍。同时给规则打了标签,包括适用任务类型和适用数据规模。这一步操作让规则库的混乱程度明显下降。维护规则库是有成本的,它本质上是在维护一份团队经验的知识文档,需要持续投入时间和精力。如果你想部署这套方案,一定先把规则治理机制想清楚,不要只顾着收割规则,导致最后淹没在自己生产的规则里。
结尾
说回到开头那个文件上传模块的事。有了这套规则库之后,我重新起了一个类似的上传任务,AI生成的代码第一版就带上了超时设置和对空值的判断,运行直接通过。那一刻还是挺爽的。我个人在实际操作中体会到,流程数据化的价值,远不止“AI少犯错”这一件事。它让我作为开发者的思维也变了。以前报错解决完就翻篇了,现在每处理一个错,都会下意识想一句:这条经验能不能固化成规则?这个问题能不能抽象成通用模式?这套思维反过来帮助我理解项目中重复出现的薄弱点——比如规则库里网络异常相关的规则数量异常多,我才意识到是这个项目的基础网络层设计有隐患。规则进化到最后,不再只是AI的学习工具,它像一面镜子,照出了项目本身的健康状况。
最后再分享一个小技巧:给规则库加个版本控制。我用git管理规则文件,每次批量更新前提交一个commit,出问题时可以一键比对回滚。这条经验是在一次规则误伤事件之后总结出来的——某次新规则生效后,连续三个任务的功能指标都下降了,回滚旧版本救了我一命。如果你准备动手搭这套系统,我建议先不要追求自动化程度多高,先把日志采起来,把规则手动写上二十条,跑两周看看效果,再逐步加入自动挖掘和置信度算法。让AI从错误中学习,最有意思的地方,恰恰是人要先学会从自己的错误里抽象出方法。