Appearance
上节课聊到,将模型当作黑盒,只关注输入与输出
对于输入,包括四类提示词:
- System Prompt
- User Prompt
- Assistant Prompt
- Tool Prompt
什么是提示词工程?
定义:通过不断优化输入,提升模型输出(Assistant Prompt)的质量,包括三个纬度:
- 质量维度:输出内容的专业、完整和有价值(让人感觉"说到点子上")
- 稳定性维度:在不同场景和时间下产生可预期的一致表现(让人感觉"靠得住")
- 正确性维度:信息的准确度和可信度,不产生虚假或误导性内容(让人感觉"说的对")
以“辅助编码”场景举例,三个维度可以概括为:
- 质量维度:代码的可读性、可维护性和专业性
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;
}
- 稳定性维度:代码在各种情况下的可预测性和一致性
javascript
// 差的示例 有时直接返回代码,没有包装在JSON中,格式不可预期
function sum(a, b) {
return a + b;
}
// 好的示例 返回格式稳定
{
"language": "javascript",
"description": "求和函数",
"code": "function sum(a, b) {\n return a + b;\n}"
}
- 正确性维度:代码的语法正确性和逻辑正确性
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)
- 从产品角度:优秀的产品应该降低用户上手门槛
提示词工程的流程
对于制造 AI 工具的人来说,提示词工程是一个有向无环图:
- 用专业知识明确需求
- 选择合适的模型
- 运用提示词技巧表达需求
- (按需)拆分提示词
提示词工程与 AI 框架
如何将提示词工程的完整流程用代码表示出来?
以 Langchain.js 举例,Langchain 的开发语言 LCEL(LangChain Expression Language)的理念是:
LCEL 理念
通过组合简单、类型安全的可运行组件(Runnable),声明式构建 AI 应用
观察有向无环图,有三点启示:
- 图中每个模块就是一个 Runnable
- Runnable 之间的组合构成链(Chain),完整的链构成有向无环图
- Chain 可能并行或串行执行