海外一条 700w 浏览量的技术推文提出核心观点:低效的手动调试提示词已经过时,AI 工程的核心是设计自动化 Loop 循环。就连 Claude Code 作者也公开表示,日常开发几乎不手动反复改 Prompt,全部依靠循环自动化迭代。
循环是计算机最基础三大要素:起始点、重复动作、终止条件。
把人工流程交给代码自动执行,固定两步核心逻辑:
completion:AI 生成目标内容check:AI 自动校验内容是否符合规则循环往复,满足终止条件后自动退出javascript
运行
const { OpenAI } = require('openai');const dotenv = require('dotenv');dotenv.config();// 初始化DeepSeek大模型客户端const client = new OpenAI({apiKey: process.env.DEEPSEEK_API_KEY,baseURL: process.env.DEEPSEEK_BASE_URL});
依赖说明
openai:通用 OpenAI 兼容 SDK,DeepSeek、通义千问、Claude 等兼容 OpenAI 接口的模型都能复用此包dotenv:读取项目根目录.env文件,存放 API 密钥、接口地址,避免硬编码密钥泄露逻辑流程
dotenv.config() 加载环境变量;client发起。javascript
运行
// Loop 可控的边界,三重保险防止死循环/超预算const limit = {maxRound: 5, // 最大迭代轮次,最多循环5次强制停止maxToken: 2000,// 总Token消耗上限,超过直接终止sameStop:2 // 连续2轮输出完全相同,判定模型卡死,停止循环}
三大终止保险,解决 Loop 两大致命问题:
maxRound 限制最大迭代次数,防止规则永远不满足导致无限调用模型;maxToken 累计统计所有请求 Token,超出预算直接终止;sameStop 连续多轮输出一模一样文案,代表模型进入重复输出,无需继续循环。javascript
运行
const task = {desc: "cs2技巧文案", // 任务核心目标rules: ["标题带数字", "正文<300字", "上魔王S", "结尾有行动号召"]// 校验规则列表}
解耦业务与循环逻辑,统一管理任务信息:
desc:告诉 AI 本次需要生成什么内容;rules:校验标准数组,生成、校验函数会自动读取该数组拼接规则,修改需求只需改动此处,不用修改生成、校验代码。javascript
运行
let round = 0, totalToken=0, lastText="", sameCount=0;
变量作用拆解:
round:记录当前循环轮次,每次循环自增;totalToken:累加每一轮 AI 调用消耗的 Token,用于预算刹车判断;lastText:保存上一轮生成的文案,用于对比是否重复;sameCount:连续重复文案计数器,达到limit.sameStop则终止。javascript
运行
function needStop() {return round >= limit.maxRound ||totalToken >= limit.maxToken ||sameCount >= limit.sameStop;}
统一封装循环终止条件,返回布尔值:只要满足任意一条限制,循环必须停止。判断优先级无差别,任一条件触发直接刹车。
javascript
运行
async function gen() {const res = await client.chat.completions.create({model: 'deepseek-v4-flash',messages: [{role: 'user',content: `假如你是一位cs2玩家,写一篇${task.desc}, 严格遵守: ${task.rules.join("、")}, 只输出文案`}]});// 打印本轮消耗token + 生成文案console.log(res.usage.total_tokens, res.choices[0].message.content);// 返回结构化数据:文案文本、本轮消耗tokenreturn {text: res.choices[0].message.content.trim(),token: res.usage.total_tokens}}
async 异步函数:大模型接口为网络请求,必须异步等待响应;
请求参数:指定 DeepSeek 轻量化模型deepseek-v4-flash,传入整合后的任务提示词;
数据处理:
.trim() 去除首尾换行空格,避免空白字符误判重复;输出结构化对象,方便主函数解构读取文本与 token。
javascript
运行
async function check(text) {const res = await client.chat.completions.create({model: "deepseek-v4-flash",messages: [{role: "user",content: `校验文案:${text} 规则:${task.rules.join("、")},仅输出JSON {pass: 布尔, fail:数组}`}]});// 解析模型返回的JSON字符串为JS对象return JSON.parse(res.choices[0].message.content.trim())}
AI Loop 核心灵魂:用大模型校验大模型的输出
入参:上一步gen生成的完整文案;
提示词约束:强制模型只返回标准 JSON,固定格式:
pass:布尔值,true = 全部规则达标;false = 存在违规项fail:数组,存放不满足的规则名称;JSON.parse() 将模型返回文本转为 JS 对象,程序可直接读取校验结果,实现自动化判断,无需人工肉眼检查。
javascript
运行
async function runLoop() {console.log('AI Loop 开始');// 循环开关:未触发任何刹车条件就持续迭代while(!needStop()) {round++;console.log(`n 第${round}轮`);// 1. 调用生成函数,解构获取文案、本轮tokenconst { text, token } = await gen();// 累计总消耗tokentotalToken += token;// 判断是否和上一轮文案完全一致,更新重复计数器sameCount = text === lastText ? sameCount + 1 : 0;// 保存当前文案,用于下一轮对比lastText = text;// 2. 调用AI自动校验const { pass, fail } = await check(text);if (pass) {// 全部规则通过,直接结束循环,输出成品文案console.log(`全部规则通过,循环结束`);console.log(`最终的文案: ${text}`)return }// 打印不满足的规则,进入下一轮迭代console.log(`不满足${fail}`)}// while循环跳出代表触发刹车限制,输出最后一轮生成内容console.log(`n 触发刹车强制停止,最后一次内容:${lastText}`)}
运行结果
进入while循环,轮次 + 1;
调用gen()生成文案,累加 Token 消耗;
对比当前与上一轮文本,更新重复计数;
调用check()让 AI 自动质检;
分支判断:
return终止整个函数;若循环触发 maxRound/maxToken/sameStop 任一限制,跳出 while,输出最后一次生成内容。
javascript
运行
runLoop();
调用主循环函数,自动开启整套 AI 生成 - 校验迭代闭环。