我必须坦诚地说,每当看到有人对着一个50行的函数要求“请优化”,并期待DeepSeek能给出精准的重构建议时,我认为这种期望有些过高。模型并非没有能力,而是输入的信息过于模糊。仅仅一句“请优化”,它很可能默认执行语义压缩式的改写——删掉几行print语句、调整缩进、甚至合并if条件,但绝不会告诉你哪些改动必须优先处理、哪些可以延后执行。真正有效的操作是什么呢?你需要将重构动作按照工程逻辑拆解为明确的阶段,并且在prompt中清晰标注每个阶段的边界。
那么,具体该如何划分阶段?下面介绍三个关键方法,逐一说明。
用结构化指令锚定重构阶段
如果你直接丢一段代码过去并说“请提出重构建议”,模型会基于训练数据中的常见模式进行一些通用的“美化”。但如果你期望获得有先后顺序、有依赖关系的操作清单,就必须自己提前规划好。在prompt开头明确写出阶段目标,这是第一步。
例如:“本次重构分三阶段执行:① 拆分职责 → ② 抽离副作用 → ③ 补全类型与校验”。请注意,这个顺序并非随意排列的。DeepSeek只会按照你书写的阶段顺序组织输出,它不会自行推断依赖关系。如果先把“补全类型”放在第一位,模型真的会把类型标注塞进尚未解耦的巨型函数中。
写完阶段目标后,每个阶段要用空行隔开,并且每阶段的第一句话必须是动词开头的明确指令。举个例子:
“第一阶段:将输入校验、数据转换、持久化这三个环节拆分为独立函数。”
“第二阶段:将所有logging.info()和open()调用移出核心逻辑,封装成单独的audit_log()和save_to_disk()。”
最后,在每个阶段末尾添加一句约束条件。比如“所有新函数不得接收全局变量或修改外部状态”,或者“拆分后,原函数体仅保留三行:校验 → 转换 → 持久化,严格按照这个顺序调用”。为什么要加这句?因为如果不加,模型可能会把“拆分”理解成“重写”,最终结果可能面目全非。
对了,还有个细节需要注意。比如你提交的是Java代码,结果模型给出的清单里出现了“pip install pytest”——这说明模型没有识别语言上下文。解决办法很简单,在prompt最开头加一句:“当前代码为Java 17 Spring Boot项目,勿引入Python工具链”。
强制返回带序号的执行清单
你需要的不是一堆函数名和注释,而是一份能够逐条执行的落地清单。最有效的方式,就是直接在prompt中要求模型输出这种格式。
具体做法:在prompt末尾加入“请以‘1. → 2. → 3.’形式输出重构执行清单,每条包含:操作动作、影响文件、验证方式(如‘运行test_auth.py应通过’)”。这个指令会让模型从“泛泛而谈”切换到“具体执行”模式。
如果你想让验证方式更加清晰,还可以进一步指定验证类型。例如“每条清单末尾必须注明验证方式:单元测试名 / 手动curl请求 / 日志关键词检查”。这样就把“运行一下看看”这种模糊表述直接过滤掉了,得到的清单才真正具备可操作性。
用AST节点路径锁定修改位置
这是最容易被忽视但往往最有效的一招。当函数嵌套层次深、分支多的时候,你说一句“提取第三个if块”,模型大概率会猜错范围。正确的做法是提供精确的锚点。
打开VS Code,安装对应的AST插件(Python或Java都有对应的),选中你要提取的那段代码,右键选择“Copy AST Path”。你可能会得到类似这样的字符串:body[2].value.body[0].body[1].body[0]。这看起来有些吓人,但非常好用。
把这个路径连同源码一起发给DeepSeek,指令写成:“请基于AST路径 body[2].value.body[0].body[1].body[0] 定位代码块,将其提取为新函数,函数名以validate_开头,参数显式传入user_dict”。
实话实说,这比“把用户校验逻辑拎出来”之类的指令可靠十倍。因为模型不再是靠语义去猜测你指的是哪块代码,而是按树形坐标精准切割。尤其对于嵌套的try-except或多重lambda表达式,AST路径几乎是唯一不会产生歧义的定位方式。
最后补充一句:这三个方法不是孤立的,它们是同一个思路的不同切面。先用结构化指令定好阶段和顺序,再用执行清单保证可落地,最后用AST路径确保定位准确。把这套组合拳用熟了,你从DeepSeek那里得到的重构建议,将和之前完全不是一个层级的东西。
