HarmonyOS NEXT AI 智能生活助手:Prompt 工程最佳实践

在这里插入图片描述

图1:Prompt 工程优化流程示意图

前言

在 [第 08 篇]中,我们实现了 Prompt 管理系统。本文将总结 Prompt 工程的最佳实践,帮助写出高质量的 AI Prompt。

Prompt Engineering 是 AI 应用开发的核心技能。一个好的 Prompt 能让模型输出质量提升数倍。本文将系统性地介绍 Prompt 设计原则、优化策略和常见陷阱。


一、Prompt 设计原则

1.1 六大核心原则

原则 说明 反面案例 改进后
具体明确 详细描述任务目标和约束 “帮我翻译” “将以下英文技术文档翻译为中文,保持专业术语准确”
角色设定 给 AI 一个专业角色 “总结这篇文章” “你是一位资深科技编辑,请总结这篇文章的核心观点”
格式指定 明确输出格式 不做约束 “以Markdown格式输出,用 ### 分隔每个章节”
示例引导 给出输入输出示例 不给示例 “示例:输入’Hello’ → 输出’你好’”
边界定义 说明不能做什么 不做限制 “不要添加额外解释,只输出翻译结果”
分步指导 复杂任务分解步骤 一步到位 “第一步理解原文,第二步提取关键信息,第三步生成摘要”
export class PromptBuilder {
  static buildWithPrinciples(task: string, principles: string[]): string {
    let prompt = `你是一个专业的AI助手。请完成以下任务:\n\n`;
    prompt += `## 任务描述\n${task}\n\n`;
    prompt += `## 执行原则\n`;
    principles.forEach((p, i) => { prompt += `${i+1}. ${p}\n`; });
    prompt += `\n## 输出要求\n`;
    prompt += `- 准确:确保信息准确无误\n`;
    prompt += `- 简洁:优先使用简短的语言\n`;
    prompt += `- 结构化:使用Markdown格式组织内容\n`;
    return prompt;
  }
}

1.2 好 Prompt VS 坏 Prompt 对比

❌ 坏 Prompt:
"写一首诗"

✅ 好 Prompt:
"你是一位中国古典诗人。请以'秋雨'为主题创作一首五言绝句。

要求:
- 使用五言绝句格式(每句5字,共4句)
- 押平水韵下平十一尤韵
- 表达思念之情
- 不需要解释,只输出诗歌"

❌ 坏 Prompt:
"这段代码有什么问题?"

✅ 好 Prompt:
"你是一位资深 TypeScript 开发者。请审查以下代码:

function process(data: any) {
  return data.value + 1;
}

请从以下维度分析:
1. 类型安全性
2. 边界情况
3. 性能问题
4. 重构建议

使用JSON格式输出。"

关键洞察:好 Prompt 的共性——明确角色、具体任务、约束条件、输出格式。这四个要素缺一不可。


二、高级 Prompt 技术

2.1 Chain-of-Thought (CoT)

export class CoTPromptBuilder {
  // 构建思维链 Prompt
  static buildWithCoT(task: string, steps: string[]): string {
    return `请按以下步骤逐步思考并回答问题:

任务:${task}

思考步骤:
${steps.map((s, i) => `${i+1}. ${s}`).join('\n')}

请先展示你的思考过程,然后给出最终答案。`;
  }

  // 示例:数学问题
  static mathProblem(): string {
    return this.buildWithCoT('小明有5个苹果,小红给了小明3个,小明又给了小华2个,小明还剩几个?', [
      '计算小明原本的苹果数量',
      '加上小红给的苹果',
      '减去给小华的苹果',
      '得出最终数量'
    ]);
  }
}

2.2 Few-shot Learning

export class FewShotBuilder {
  static buildWithExamples(systemPrompt: string, examples: Example[], input: string): string {
    let prompt = systemPrompt + '\n\n';
    prompt += `## 示例\n\n`;

    examples.forEach((ex, i) => {
      prompt += `### 示例 ${i+1}\n`;
      prompt += `**输入:** ${ex.input}\n`;
      prompt += `**输出:** ${ex.output}\n\n`;
    });

    prompt += `## 实际输入\n${input}\n\n`;
    prompt += `## 请输出:\n`;

    return prompt;
  }
}

interface Example {
  input: string;
  output: string;
}
技术 适用场景 效果提升
Zero-shot 简单任务 基线
Few-shot 格式控制 +20-30%
Chain-of-Thought 推理任务 +30-50%
Role Prompting 专业性任务 +15-25%

三、Prompt 优化策略

3.1 迭代优化流程

export class PromptOptimizer {
  // 分析 Prompt 质量问题
  static analyze(prompt: string): AnalysisResult {
    const issues: string[] = [];

    if (prompt.length < 50) issues.push('Prompt 太短,缺乏上下文');
    if (!prompt.includes('输出') && !prompt.includes('格式')) issues.push('缺少输出格式说明');
    if (prompt.includes('可能') || prompt.includes('大概')) issues.push('使用模糊词汇,应更明确');
    if (prompt.split('\n').length < 5) issues.push('缺乏结构化,建议分段');

    return {
      score: Math.max(0, 100 - issues.length * 20),
      issues,
      suggestions: this.generateSuggestions(issues)
    };
  }

  // 自动优化 Prompt
  static optimize(prompt: string): string {
    let optimized = prompt;
    // 添加角色设定
    if (!prompt.includes('你是一个') && !prompt.includes('你是')) {
      optimized = `你是一位专业的AI助手。\n\n${optimized}`;
    }
    // 添加输出格式
    if (!prompt.includes('JSON') && !prompt.includes('格式')) {
      optimized += `\n\n请用结构化的格式输出。`;
    }
    return optimized;
  }

  private static generateSuggestions(issues: string[]): string[] {
    return issues.map(issue => {
      const suggestions: Record<string, string> = {
        'Prompt 太短': '添加任务描述、角色设定和输出格式说明',
        '缺少输出格式说明': '指定输出格式,如JSON/Markdown/表格',
        '使用模糊词汇': '用明确具体的描述替换模糊词汇',
        '缺乏结构化': '使用分段、标题、列表结构化Prompt'
      };
      return suggestions[issue] || '参考最佳实践优化';
    });
  }
}

interface AnalysisResult {
  score: number;
  issues: string[];
  suggestions: string[];
}

3.2 常见 Prompt 模式

export const PROMPT_PATTERNS = {
  // 分类任务
  classification: `请将以下内容分类到合适的类别中。

类别列表:{{categories}}

分类规则:
- 每项内容只能分到一个类别
- 如果匹配多个,选择最相关的一个
- 如果无法分类,标记为"其他"

输出格式:JSON数组 [{ content: "...", category: "..." }]`,

  // 提取任务
  extraction: `请从以下文本中提取指定信息。

需要提取的信息:
{{fields}}

输出格式:JSON对象`,

  // 比较任务
  comparison: `请比较以下两个{{subject}}的异同。

比较维度:
{{dimensions}}

输出格式:表格形式,包含"维度"、"{{item1}}"、"{{item2}}"、"说明"四列`,

  // 重写任务
  rewriting: `请重写以下文本,使其更加{{style}}。

重写规则:
1. 保留原文核心信息
2. 使用{{tone}}的语气
3. 输出长度控制在{{maxLength}}字以内`
};

四、Prompt 评估体系

4.1 质量评分卡

评估维度 权重 评分标准 自检
清晰度 25% 任务描述是否明确无歧义
完整性 20% 是否包含角色、输入、输出、约束
结构化 20% 是否有分段、标题、列表
示例质量 15% 示例是否准确反映预期输出
边界定义 10% 是否说明了不能做什么
长度适中 10% 是否简洁不冗余

4.2 A/B 测试框架

export class PromptABTestManager {
  private experiments: Map<string, ExperimentConfig> = new Map();

  register(name: string, promptA: string, promptB: string): void {
    this.experiments.set(name, {
      name, promptA, promptB,
      results: { a: { total: 0, success: 0 }, b: { total: 0, success: 0 } }
    });
  }

  async evaluate(name: string, input: string, expectedOutput: string): Promise<void> {
    const exp = this.experiments.get(name);
    if (!exp) return;

    // 测试 Prompt A
    const resultA = await this.testPrompt(exp.promptA, input, expectedOutput);
    exp.results.a.total++;
    if (resultA) exp.results.a.success++;

    // 测试 Prompt B
    const resultB = await this.testPrompt(exp.promptB, input, expectedOutput);
    exp.results.b.total++;
    if (resultB) exp.results.b.success++;

    // 输出对比
    hilog.info(0x0000, 'ABTest', `Prompt A 成功率: ${exp.results.a.success}/${exp.results.a.total}`);
    hilog.info(0x0000, 'ABTest', `Prompt B 成功率: ${exp.results.b.success}/${exp.results.b.total}`);
  }

  private async testPrompt(prompt: string, input: string, expected: string): Promise<boolean> {
    try {
      const response = await AIService.getInstance().chat([
        { role: 'system', content: prompt },
        { role: 'user', content: input }
      ]);
      return response.content.includes(expected);
    } catch {
      return false;
    }
  }
}

interface ExperimentConfig {
  name: string;
  promptA: string;
  promptB: string;
  results: {
    a: { total: number; success: number };
    b: { total: number; success: number };
  };
}

五、常见陷阱与规避

5.1 常见错误类型

  1. Prompt 注入攻击:用户输入中包含恶意指令,覆盖系统级 Prompt
  2. 上下文窗口溢出:历史消息过长,导致关键信息被挤出上下文
  3. 幻觉问题:AI 生成看似合理但实际不存在的信息
  4. 过度拟合示例:Few-shot 示例过少或质量差,导致输出格式不稳定
  5. 边界情况遗漏:未定义异常处理逻辑,AI 在边界情况下表现不稳定

5.2 安全与稳健性策略

export class PromptSecurity {
  // 输入消毒:移除潜在的注入指令
  static sanitizeInput(input: string): string {
    return input
      .replace(/system:|user:|assistant:/gi, '')
      .replace(/\{\{.*?\}\}/g, '')
      .slice(0, 2000); // 限制输入长度
  }

  // 上下文截断:保留最近且最相关的对话
  static truncateHistory(messages: ChatMessage[], maxChars: number = 8000): ChatMessage[] {
    let total = 0;
    const result: ChatMessage[] = [];
    for (let i = messages.length - 1; i >= 0; i--) {
      total += messages[i].content.length;
      if (total > maxChars) break;
      result.unshift(messages[i]);
    }
    return result;
  }

  // 输出验证:检查关键信息是否存在
  static validateOutput(output: string, requiredKeywords: string[]): boolean {
    return requiredKeywords.every(kw => output.includes(kw));
  }
}

interface ChatMessage {
  role: string;
  content: string;
}
陷阱 风险等级 检测方法 规避策略
Prompt 注入 正则匹配关键字 输入消毒 + 权限隔离
上下文溢出 统计 Token 数 滑动窗口 + 摘要压缩
幻觉输出 事实核查 API 添加"不确定则回答不知道"约束
格式失控 JSON 解析验证 Few-shot + 格式约束

安全优先:生产环境的 Prompt 必须经过注入测试和边界测试,确保输出可控。


六、Git 提交

git add .
git commit -m "feat(prompt): Prompt 工程最佳实践

- 六大核心设计原则
- Chain-of-Thought / Few-shot 高级技术
- 迭代优化流程与自动优化器
- A/B 测试评估框架
- 常见 Prompt 模式库

Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>"
git tag v0.1.8

七、Prompt 工程在 HarmonyOS AI 中的应用

7.1 本系列 Prompt 设计回顾

功能模块 核心 Prompt 技巧 预期效果
AI 翻译助手 角色设定 + 格式指定 + 边界定义 术语准确、格式统一
AI 每日花语 角色设定 + 示例引导 + 结构化输出 内容专业、格式规范
AI 文章总结 分步指导 + 边界定义 + JSON 格式 结构清晰、信息完整
AI 代码解释 角色设定 + 多维度约束 + 示例引导 分析深入、建议可行
AI 待办生成 具体明确 + 结构化输出 + 分类规则 提取准确、分类合理
AI 日程规划 具体明确 + 时间约束 + 冲突规则 时间准确、冲突可检测
图片上传识别 多模态输入 + 开放式描述 理解全面、描述生动
模型参数配置 场景预设 + 参数联动 切换便捷、效果可预期

7.2 持续优化建议

  1. 建立 Prompt 版本库:使用 Git 管理 Prompt 变更,记录每次调整的原因和效果
  2. 收集用户反馈:对输出质量进行评分,识别低分场景并针对性优化
  3. 定期 A/B 测试:同一功能维护 2-3 个 Prompt 版本,对比实际效果
  4. 跟踪模型更新:新模型发布时重新评估现有 Prompt 的兼容性
  5. 文档化最佳实践:将验证有效的模式沉淀为团队规范

工程化思维:Prompt 工程不是一次性工作,而是需要持续迭代的产品能力。


总结

本文总结了 Prompt 工程的最佳实践。核心要点:

  1. 六大原则:具体明确、角色设定、格式指定、示例引导、边界定义、分步指导
  2. 高级技术:CoT 思维链、Few-shot 示例学习
  3. 迭代优化:分析 → 优化 → 测试 → 评估的闭环
  4. A/B 测试:量化对比不同 Prompt 的效果
  5. 质量评分卡:从清晰度、完整性等六个维度评估

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐