Skip to content

上节课聊到,将模型当作黑盒,只关注输入与输出

对于输入,包括四类提示词:

  • System Prompt
  • User Prompt
  • Assistant Prompt
  • Tool Prompt

什么是提示词工程?

定义:通过不断优化输入,提升模型输出(Assistant Prompt)的质量,包括三个纬度:

  1. 质量维度:输出内容的专业、完整和有价值(让人感觉"说到点子上")
  2. 稳定性维度:在不同场景和时间下产生可预期的一致表现(让人感觉"靠得住")
  3. 正确性维度:信息的准确度和可信度,不产生虚假或误导性内容(让人感觉"说的对")

以“辅助编码”场景举例,三个维度可以概括为:

  1. 质量维度:代码的可读性、可维护性和专业性
javascript
// 差的示例
function calc(a, b) {
  return a + b;
}

// 好的示例
/**
 * 计算两个数字的和
 * @param {number} a - 第一个数字
 * @param {number} b - 第二个数字
 * @returns {number} 两数之和
 * @throws {TypeError} 参数必须为数字类型
 */
function add(firstNumber, secondNumber) {
  if (typeof firstNumber !== "number" || typeof secondNumber !== "number") {
    throw new TypeError("参数必须为数字类型");
  }
  return firstNumber + secondNumber;
}
  1. 稳定性维度:代码在各种情况下的可预测性和一致性
javascript
// 差的示例 有时直接返回代码,没有包装在JSON中,格式不可预期
function sum(a, b) {
  return a + b;
}

// 好的示例 返回格式稳定
{
  "language": "javascript",
  "description": "求和函数",
  "code": "function sum(a, b) {\n  return a + b;\n}"
}
  1. 正确性维度:代码的语法正确性和逻辑正确性
javascript
// 语法不正确:变量未声明就使用
function process() {
  result = data.map((item) => item.value); // data未定义 result未声明
  return result;
}
javascript
// 逻辑准确性

// 需求:实现购物车结算功能,要求:
// 1. 满100减20
// 2. 满200减50
// 3. 满300减80
// 4. 取最优惠的一个方案

function calculateDiscount(total) {
  // 错误理解:认为优惠可以叠加
  let discount = 0;
  if (total >= 100) discount += 20;
  if (total >= 200) discount += 50;
  if (total >= 300) discount += 80;

  return total - discount;
}

受众

谁才是提示词工程的受众:

  • 使用 AI 工具的人?
  • 制造 AI 工具的人?

答案是“制造 AI 工具的人”,从两个角度考虑:

  • 从 AI 应用角度:模型响应用户输入(User Prompt)后,在系统设定(System Prompt)的约束下生成回复(Assistant Prompt)

cursor chat 的例子

  • 从产品角度:优秀的产品应该降低用户上手门槛

提示词工程的流程

对于制造 AI 工具的人来说,提示词工程是一个有向无环图:

  1. 用专业知识明确需求
  2. 选择合适的模型
  3. 运用提示词技巧表达需求
  4. (按需)拆分提示词

提示词工程与 AI 框架

如何将提示词工程的完整流程用代码表示出来?

以 Langchain.js 举例,Langchain 的开发语言 LCEL(LangChain Expression Language)的理念是:

LCEL 理念

通过组合简单、类型安全的可运行组件(Runnable),声明式构建 AI 应用

观察有向无环图,有三点启示:

  1. 图中每个模块就是一个 Runnable
  2. Runnable 之间的组合构成链(Chain),完整的链构成有向无环图
  3. Chain 可能并行或串行执行