乐于分享
好东西不私藏

OpenClaw 30 天系列 - Day 22:模型优化:提示词工程、上下文管理、成本控制

OpenClaw 30 天系列 - Day 22:模型优化:提示词工程、上下文管理、成本控制

🎯 学习目标:学会模型优化:提示词工程、上下文管理、成本控制

⏱️ 阅读时间:约 12 分钟 

💡 前置要求:无


🎯 模型优化三要素

核心方向总览

方向
说明
收益
提示词工程
优化输入指令
提高回答质量
上下文管理
精简对话历史
减少 token 消耗
成本控制
优化模型选择
降低 API 费用

📝 提示词工程 ⭐

基础原则

1. 清晰明确

// ❌ 模糊的提示"写点东西"// ✅ 清晰的提示"写一篇 500 字的产品介绍,突出以下特点:1.易用性 2.安全性 3.性价比"

2. 提供示例

// ❌ 没有示例"帮我分类这些评论"// ✅ 提供示例"帮我分类这些评论,格式如下:正面:'产品很好用,推荐购买'负面:'质量太差,不推荐'中性:'一般般,没什么特别的'待分类:'物流很快,包装完好'"

3. 指定角色

// ❌ 没有角色"解释这个技术概念"// ✅ 指定角色"你是一个资深技术讲师,用通俗易懂的方式向初学者解释这个技术概念"

高级技巧

1. 思维链(Chain of Thought)

// 提示词模板const prompt = `请逐步思考这个问题:1. 首先,分析问题是什么2. 然后,列出解决步骤3. 接着,执行每个步骤4. 最后,给出答案问题:${question}`;// 使用效果// 让 AI 展示思考过程,提高答案准确性

2. 少样本学习(Few-Shot Learning)

const prompt = `根据以下示例,完成最后一个任务:示例 1:输入:"这个产品质量很好"情感:正面示例 2:输入:"物流太慢了,等了一周"情感:负面示例 3:输入:"包装精美,但价格偏高"情感:中性示例 4:输入:"${userInput}"情感:`;

3. 自我验证

const prompt = `请回答以下问题,然后验证你的答案:问题:${question}回答:(AI 生成答案)验证:1. 答案是否完整回答了问题?2. 答案中的事实是否准确?3. 是否有逻辑漏洞?4. 是否需要补充说明?修正后的答案:(AI 自我修正)`;

提示词模板库 ⭐

const promptTemplates = {// 代码审查codeReview`你是一个资深代码审查员,请审查以下代码:审查要点:1. 代码规范2. 潜在 bug3. 性能问题4. 安全漏洞5. 可维护性代码:\`\`\`${code}\`\`\`请按以上要点逐一分析,并给出改进建议。  `,// 文档写作docWriting`你是一个专业文档工程师,请撰写以下文档:文档类型:${docType}目标读者:${audience}核心内容:${content}要求:1. 结构清晰,有目录2. 语言简洁,易于理解3. 包含示例和图表说明4. 长度约${length}  `,// 数据分析dataAnalysis`你是一个数据分析师,请分析以下数据:数据:${data}分析要点:1. 数据趋势2. 异常值识别3. 关键发现4. 行动建议请用图表和文字结合的方式呈现分析结果。  `,// 问题诊断troubleshooting`你是一个技术专家,请诊断以下问题:问题描述:${problem}环境信息:${environment}错误日志:${errorLogs}请按以下步骤诊断:1. 复现问题2. 分析可能原因3. 逐一排除4. 给出解决方案  `,// 会议纪要meetingMinutes`你是一个专业秘书,请整理以下会议内容:会议主题:${topic}会议时间:${time}参会人员:${attendees}会议录音/记录:${content}请整理出:1. 会议要点2. 决议事项3. 待办任务(含负责人和截止时间)  `,// 邮件写作emailWriting`你是一个专业商务顾问,请帮我写一封邮件:收件人:${recipient}目的:${purpose}要点:${points}语气:${tone}  `,// 学习教程tutorial`你是一个资深讲师,请编写一个教程:主题:${topic}目标学员:${audience}学员基础:${prerequisites}要求:1. 从基础到进阶2. 包含实践示例3. 每章有小测验4. 提供参考答案  `,// 产品对比productComparison`你是一个行业分析师,请对比以下产品:产品列表:${products}对比维度:${dimensions}请输出对比表格,并给出购买建议。  `};// 使用示例const prompt = promptTemplates.codeReview({code: userCode});

📚 上下文管理

为什么需要管理?

问题

  • 模型上下文有限(通常 8K-128K tokens)
  • 长上下文增加成本
  • 无关信息干扰回答质量 解决:智能管理上下文,保留关键信息

上下文压缩策略

1. 滑动窗口

classContextManager {constructor(maxTokens = 8000) {this.maxTokens = maxTokens;this.messages = [];  }addMessage(message) {this.messages.push(message);// 如果超出限制,删除最早的消息while (this.countTokens() > this.maxTokens) {this.messages.shift();    }  }getContext() {returnthis.messages;  }countTokens() {returnthis.messages.reduce((sum, msg) =>      sum + this.estimateTokens(msg.content), 0    );  }estimateTokens(text) {// 粗略估计:4 字符 ≈ 1 tokenreturnMath.ceil(text.length / 4);  }}

2. 摘要压缩

classContextManager {asynccompressOldMessages() {if (this.messages.length <= 5) {return;  // 消息太少,不需要压缩    }// 取最早的一半消息进行摘要const oldMessages = this.messages.slice(0Math.floor(this.messages.length / 2));const summary = awaitsummarize(oldMessages);// 替换为摘要this.messages = [      {role'system',content`之前的对话摘要:${summary}`      },      ...this.messages.slice(Math.floor(this.messages.length / 2))    ];  }}asyncfunctionsummarize(messages) {const prompt = `请总结以下对话的关键信息:${messages.map(m => `${m.role}${m.content}`).join('\n')}摘要要求:1. 保留关键事实和决策2. 省略寒暄和无关内容3. 控制在 200 字以内  `;returnawaitcallLLM(prompt);}

3. 重要性评分

classContextManager {asyncprioritizeMessages() {// 为每条消息评分const scored = awaitPromise.all(this.messages.map(async (msg) => ({        ...msg,scoreawaitrateImportance(msg.content)      }))    );// 按重要性排序    scored.sort((a, b) => b.score - a.score);// 保留最重要的消息const kept = [];let tokens = 0;for (const msg of scored) {const msgTokens = this.estimateTokens(msg.content);if (tokens + msgTokens <= this.maxTokens) {        kept.push(msg);        tokens += msgTokens;      }    }this.messages = kept.sort((a, b) => a.index - b.index);  }}asyncfunctionrateImportance(content) {// 使用 AI 评分const prompt = `请评估以下消息的重要性(1-10 分):消息:${content}评分标准:- 10 分:关键决策、重要事实- 7-9 分:有用信息、任务细节- 4-6 分:一般讨论- 1-3 分:寒暄、无关内容分数:  `;const score = awaitcallLLM(prompt);returnparseInt(score) || 5;}

实用技巧

1. 系统提示优化

const systemPrompt = `你是一个专业的 AI 助理,请遵循以下规则:1. 回答简洁,直奔主题2. 不确定时承认不知道3. 复杂问题分步骤解答4. 代码要有注释和示例5. 避免重复用户已经知道的信息当前上下文:- 用户是开发者- 使用 Node.js 技术栈- 偏好简洁的代码风格`;

2. 动态上下文

asyncfunctiongetContextForQuestion(question, fullContext) {// 提取与问题相关的上下文const relevant = fullContext.filter(msg =>isRelevant(msg.content, question)  );// 添加最近的几条消息const recent = fullContext.slice(-5);// 合并并去重returnmergeAndDeduplicate(relevant, recent);}functionisRelevant(content, question) {// 简单的关键词匹配const questionWords = question.toLowerCase().split(/\W+/);const contentLower = content.toLowerCase();const matchCount = questionWords.filter(word => word.length > 3 && contentLower.includes(word)  ).length;return matchCount >= 2;}

💰 成本控制 ⭐

模型选择策略

const modelStrategy = {// 简单任务:使用便宜模型simple: {tasks: ['分类''提取''格式化'],model'glm-3',maxTokens500  },// 中等任务:使用平衡模型medium: {tasks: ['总结''翻译''改写'],model'glm-4',maxTokens2000  },// 复杂任务:使用高级模型complex: {tasks: ['推理''创作''分析'],model'glm-4-flash',maxTokens8000  }};functionselectModel(task) {const taskType = classifyTask(task);return modelStrategy[taskType];}

Token 优化

// 1. 精简输入functionoptimizeInput(input) {return input    .replace(/\s+/g' ')  // 压缩空白    .replace(/(的 | 了 | 是)/g'')  // 去除冗余词(中文)    .trim();}// 2. 缩短输出const shortOutputPrompt = `请用简洁的语言回答,控制在 100 字以内。`;// 3. 批量处理asyncfunctionbatchProcess(items) {// 一次处理多个,减少 API 调用次数const prompt = `请处理以下 ${items.length} 个任务:${items.map((item, i) => `${i + 1}${item}`).join('\n')}请逐一回答。  `;returnawaitcallLLM(prompt);}

成本监控工具 ⭐

classCostTracker {constructor() {this.dailyUsage = {};this.budget = 100;  // 每日预算(元)  }recordUsage(model, tokens, cost) {const today = newDate().toDateString();if (!this.dailyUsage[today]) {this.dailyUsage[today] = {totalCost0,totalTokens0,byModel: {}      };    }this.dailyUsage[today].totalCost += cost;this.dailyUsage[today].totalTokens += tokens;if (!this.dailyUsage[today].byModel[model]) {this.dailyUsage[today].byModel[model] = { tokens0cost0 };    }this.dailyUsage[today].byModel[model].tokens += tokens;this.dailyUsage[today].byModel[model].cost += cost;  }getReport() {const today = newDate().toDateString();const usage = this.dailyUsage[today] || { totalCost0 };return`💰 **成本报告** (${today})今日花费:${usage.totalCost.toFixed(2)} 元预算剩余:${(this.budget - usage.totalCost).toFixed(2)} 元使用率:${((usage.totalCost / this.budget) * 100).toFixed(1)}%按模型统计:${Object.entries(usage.byModel).map(  ([model, data]) => `- ${model}${data.tokens} tokens, ${data.cost.toFixed(2)}元`).join('\n')}    `.trim();  }isOverBudget() {const today = newDate().toDateString();return (this.dailyUsage[today]?.totalCost || 0) > this.budget;  }// 告警功能checkBudget() {const today = newDate().toDateString();const usage = this.dailyUsage[today] || { totalCost0 };const usageRate = usage.totalCost / this.budget;if (usageRate > 0.9) {return'⚠️ 预算即将用完,已使用 90%';    }if (usageRate > 0.7) {return'💡 预算使用提醒,已使用 70%';    }returnnull;  }}// 使用示例const costTracker = newCostTracker();// 记录每次 API 调用costTracker.recordUsage('glm-4'15000.015);// 查看成本报告console.log(costTracker.getReport());// 检查预算const alert = costTracker.checkBudget();if (alert) {awaitnotifyAdmin(alert);}

国内 Coding Plan 价格对比 ⭐

💡 说明:Coding Plan 是订阅制套餐,相比按量计费更适合高频使用场景。注意部分厂商有 5 小时/周/月请求数限制。价格以官网实时为准。

厂商
套餐名称
价格
支持模型
特点
稀宇科技
MiniMax Coding Plan
¥29/月
MiniMax 系列(M2/M2.1/M2.5)
价格最低档之一,性价比极高
快手
KwaiKAT Coding Plan
¥29/月
KAT-Coder-Pro V1
快手自研编程模型
字节跳动
方舟 Coding Plan
¥40/月(首月¥9.9)
Kimi/DeepSeek/GLM/豆包等
国内首个多厂商模型聚合套餐
阿里巴巴
阿里云百炼 Coding Plan
¥40/月(首月¥10)
Qwen3-Max/Qwen3-Coder-Plus
大厂背书,每月 18000-90000 次请求
百度
千帆 Coding Plan
¥40/月(首月¥9.9)
DeepSeek/Kimi/GLM/MiniMax
支持多厂商模型,控制台一键切换
智谱 AI
GLM Coding Plan
¥49/月(包季 9 折)
GLM 系列(GLM-4.7/5/4.6)
国内最早推出,支持 20+ 编程工具
月之暗面
Kimi Code
¥49/月
Kimi 系列(K2/K2.5/K2 Thinking)
256K 超长上下文,100 Tokens/s 极速

✅ 学完这篇你能做什么

学完 Day 22,你将能够:

  • ✅ 编写高质量的提示词
  • ✅ 管理对话上下文
  • ✅ 控制 API 成本
  • ✅ 使用成本监控工具
  • ✅ 选择合适的模型

🔜 下篇预告

Day 23:安全加固:权限管理、敏感信息保护、审计日志

  • 🔐 权限管理
  • 🔒 敏感信息保护
  • 📋 审计日志

💬 互动环节

你在模型优化方面有什么经验?留言分享!

公众号:OpenClaw 研习社

系列:OpenClaw 30 天入门到精通 

作者:OpenClaw 研习社