🎯 学习目标:学会模型优化:提示词工程、上下文管理、成本控制
⏱️ 阅读时间:约 12 分钟
💡 前置要求:无
🎯 模型优化三要素
核心方向总览
| 提示词工程 | ||
| 上下文管理 | ||
| 成本控制 |
📝 提示词工程 ⭐
基础原则
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(0, Math.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,score: awaitrateImportance(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',maxTokens: 500 },// 中等任务:使用平衡模型medium: {tasks: ['总结', '翻译', '改写'],model: 'glm-4',maxTokens: 2000 },// 复杂任务:使用高级模型complex: {tasks: ['推理', '创作', '分析'],model: 'glm-4-flash',maxTokens: 8000 }};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] = {totalCost: 0,totalTokens: 0,byModel: {} }; }this.dailyUsage[today].totalCost += cost;this.dailyUsage[today].totalTokens += tokens;if (!this.dailyUsage[today].byModel[model]) {this.dailyUsage[today].byModel[model] = { tokens: 0, cost: 0 }; }this.dailyUsage[today].byModel[model].tokens += tokens;this.dailyUsage[today].byModel[model].cost += cost; }getReport() {const today = newDate().toDateString();const usage = this.dailyUsage[today] || { totalCost: 0 };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] || { totalCost: 0 };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', 1500, 0.015);// 查看成本报告console.log(costTracker.getReport());// 检查预算const alert = costTracker.checkBudget();if (alert) {awaitnotifyAdmin(alert);}国内 Coding Plan 价格对比 ⭐
💡 说明:Coding Plan 是订阅制套餐,相比按量计费更适合高频使用场景。注意部分厂商有 5 小时/周/月请求数限制。价格以官网实时为准。
✅ 学完这篇你能做什么
学完 Day 22,你将能够:
✅ 编写高质量的提示词 ✅ 管理对话上下文 ✅ 控制 API 成本 ✅ 使用成本监控工具 ✅ 选择合适的模型
🔜 下篇预告
Day 23:安全加固:权限管理、敏感信息保护、审计日志
🔐 权限管理 🔒 敏感信息保护 📋 审计日志
💬 互动环节
你在模型优化方面有什么经验?留言分享!
公众号:OpenClaw 研习社
系列:OpenClaw 30 天入门到精通
作者:OpenClaw 研习社
夜雨聆风