提示工程 Prompt Engineering¶
本文为编译原理课程配套的提示工程专项教学内容,讲解了如何进行有效的 Prompt Engineering,并在后续章节中提供 Task 1-4 的 Prompt Example。
一、提示工程简介¶
1.1 什么是提示工程¶
提示工程(Prompt Engineering) 是一门聚焦提示词设计、开发与优化的新兴学科,核心是通过标准化的输入设计,引导大语言模型(Large Language Model, 简称 LLM)输出符合预期的结果,是高效使用 LLM 的核心必备技能。
掌握提示工程,不仅能帮助我们深入理解 LLM 的能力边界与底层逻辑,更能充分释放其应用潜力,解决学习、开发中的各类实际问题。
1.2 提示工程的核心价值¶
提示工程的范畴并不局限于提示词本身的编写,还涵盖了与 LLM 交互、二次开发的全链路技能,是实现与 LLM 高效对接、深度理解模型能力的核心抓手,核心价值体现在:
- 提升输出质量:通过精准的提示设计,大幅提升 LLM 输出的准确性、相关性与可用性;
- 拓展模型能力:通过引入专业领域知识、对接外部工具,突破 LLM 的原生能力边界;
- 保障输出安全:通过规范的提示设计,规避 LLM 的幻觉、错误输出等问题,提升结果可靠性。
1.3 提示工程在本课程中的应用¶
在本编译原理课程中,提示工程可帮助大家优化 LLM 在以下核心场景的表现,助力课程学习与实验完成:
- 编译原理核心知识点答疑、概念解析与原理推导;
- 词法分析、语法分析、中间代码生成等实验的代码编写、调试与优化;
- 实验代码的逐行解释、逻辑梳理与 bug 定位;
- 课程限定工具(flex/bison/antlr/LLVM 等)的使用指导与问题排查。
1.4【补充学习资料】 提示工程指南 | Prompt Engineering Guide¶
二、提示工程通用技巧¶
2.1 关注提示词四要素¶
一个完整、有效的提示词,必须包含以下四个核心要素,缺一不可:
| 要素名称 | 严谨定义 |
|---|---|
| 指令 | 明确告知模型需要完成的具体任务,是提示词的核心目标 |
| 上下文 | 补充任务相关的背景信息、约束条件与前置知识,引导模型精准响应 |
| 输入数据 | 本次任务需要模型处理的核心素材(如代码片段、文法规则、报错日志等) |
| 输出指示 | 明确指定模型输出的格式、结构、篇幅与风格要求 |
2.2 从简到繁,逐步迭代¶
- 提示词设计是一个需要反复调试、持续优化的迭代过程,无需追求一次写完美;
- 建议从极简的核心指令起步,验证模型输出符合基础预期后,再逐步补充上下文、约束条件、输出要求等元素,持续打磨效果。
2.3 保证指令的具体性¶
- 提示词需清晰、详细地描述任务目标、预期结果与约束条件,包括输出的风格、格式、专业度要求,避免模糊、模棱两可的表述;
- 可通过补充 1-2 个输入输出示例(少样本提示),让模型精准对齐你的预期格式与标准;
- 需控制提示词的相关性,避免补充与本次任务无关的冗余信息,保证核心需求突出。
2.4 拆解任务,分步实现¶
- 对于编译原理实验这类多环节、高复杂度的任务,建议将其拆解为多个逻辑连贯、可独立完成的简单子任务,逐个解决;
- 避免一次性给模型下达过于复杂的全流程指令,防止出现逻辑混乱、输出不符合要求的问题。
三、编写 Meta-Prompt¶
我们可以将上述技巧告诉 AI,让 AI 帮我们写 Prompt。这种技巧能够充分发挥大模型提取信息、整理信息的超强能力,同时大幅降低我们构思复杂提示词的负担。
3.1 操作步骤¶
- 定义专家角色:首先赋予大语言模型“资深提示词工程师”的身份,让其主动调用该角色下的专业知识库与结构化思维模式;
- 输入目标与通用原则:明确告知模型你需要完成的具体任务(如代码调试、算法设计等),并将前文提到的“提示词通用技巧”(如四要素、具体性约束等)作为背景规则输入给它;
- 设置反向提问机制:不要让模型立刻生成最终的 Prompt,而是要求它先向你提问,主动帮你挖掘任务中容易遗漏的上下文、特定约束或输入数据格式;
- 多轮迭代输出:根据模型提出的问题提供补充信息,最终由模型为你生成一份结构严谨、可直接使用的高质量 Prompt 模板。
3.2 编译原理实验 Meta-Prompt 示例¶
在进行编译器相关的复杂实验时,你可以直接复制以下模板发送给模型。只需根据当前实验进度,替换大括号
{} 中的内容即可:
**指令:
你现在是一位精通提示词工程和编译原理的“资深 AI 提示词专家”。我需要你帮我设计一段高质量的提示词,用来引导另一个大语言模型帮我高标准地完成【编译原理课程的实验任务】。
**我的目标任务:**
我正在使用 C++ 编写一个小型的编译器,目前的进度是 {需要实现从词法分析到 LLVM IR 的中间代码生成与优化}。
**提示词设计要求:**
1. 生成的提示词必须结构化,包含清晰的四要素:核心指令、上下文约束、输入数据占位符(供我后续填入代码)、输出指示;
2. 提示词中必须要求模型在输出代码时,运用“分步拆解”的逻辑(例如:先分析数据结构,再梳理遍历逻辑,最后给出完整代码);
3. 提示词需引导模型关注 C++ 的现代特性以及相关工具(如 LLVM API)的使用规范。
**你的执行步骤:**
1. **注意**:请不要直接帮我写编译器的代码。
2. **提问**:首先,请基于上述目标向我提问(不超过 4 个问题),以收集为了编写这份完美 Prompt 所必须了解的细节信息(例如我的 AST 节点基类定义、具体的 LLVM 版本等)。
3. **生成**:在我回答你的问题后,再输出最终设计好的 Markdown 格式的提示词。
与大模型对话几轮后,大模型会给你一个信息完备、充分打磨的 Prompt,你可以用这个 Prompt 来指导你完成实验。
接下来,我们举一个代码改写的例子¶
假设你在实现一个简单的词法分析器,但代码效率较低或风格不符合要求,你可以要求大模型改写代码,如下所示。
我有一个用 C 语言写的词法分析器片段,功能是识别小写字母作为标识符(ID)、数字作为数字(NUM),但存在以下问题:
1)使用 getchar() 逐字符读取性能低;
2)仅识别单个字符(如输入‘abc’输出‘ID: a’‘ID: b’‘ID: c’,而期望‘ID: abc’作为单个标识符);
3)代码逻辑都在 main 中,缺乏模块化。
我希望你优化这段代码的性能(例如减少输入读取开销并支持多字符标识符和数字),并改写成逻辑清晰、结构简洁的版本。以下是原始代码:
#include <stdio.h>
int main() {
char c;
while ((c = getchar()) != EOF) {
if (c >= 'a' && c <= 'z') {
printf("ID: %c\n", c);
} else if (c >= '0' && c <= '9') {
printf("NUM: %c\n", c);
}
}
}
请输出优化后的完整 C 代码,包含以下要求:
1)添加详细注释,说明每个主要改动的原因和效果(如性能提升或功能增强);
2)确保代码可运行并支持多字符 token(如‘abc’输出‘ID: abc’,‘123’输出‘NUM: 123’);
3)如果可能,简要说明性能改进的原理。
代码解释¶
你有一个用 C 实现的 First 集合计算代码,但不理解其逻辑。
我有一个用 C 实现的 First 集合计算代码,用于 LL(1) 分析表构建。代码从产生式数组(如‘S=aA’表示 S -> aA,其中位置 0 为左部符号,位置 2 为右部首字符)中计算某个非终结符的 First 集合,但仅处理右部首字符为小写字母(终结符)的情况。例如,输入产生式 {‘S=aA’, ‘A=b’},调用 first(‘S’, ...) 输出‘First(S) = a’。
我希望你逐行解释这段代码的实现逻辑(包括每个变量的作用和代码步骤的目的),并详细说明 First 集合在 LL(1) 编译器语法分析中的具体作用及其局限性。以下是代码:
#include <stdio.h>
#define MAX_PROD 10
void first(char symbol, char productions[MAX_PROD][10], int n, char *result) {
int i, j = 0;
for (i = 0; i < n; i++) {
if (productions[i][0] == symbol) {
if (productions[i][2] >= 'a' && productions[i][2] <= 'z') {
result[j++] = productions[i][2];
}
}
}
result[j] = '\0';
}
int main() {
char productions[MAX_PROD][10] = {"S=aA", "A=b"};
char result[10];
first('S', productions, 2, result);
printf("First(S) = %s\n", result);
return 0;
}
请以代码块加文字说明的形式逐行解释代码,并以单独段落详细说明 First 集合在 LL(1) 分析表构建中的作用(包括如何用于预测分析)及其局限性。输出应包含:
1)代码的完整逐行分析;
2)First 集合的编译器作用说明;
3)代码当前的限制或潜在改进建议。
代码生成¶
我需要为编译原理实验生成一个递归下降解析器。文法如下,其中‘E’是起始符号,‘id’表示单个小写字母标识符(如‘a’到‘z’),‘+’和‘_’是运算符,‘(’和‘)’是括号,‘ε’表示空串。输入为字符串(如‘a + b _ c’或‘(a + b)’),期望解析成功时输出成功消息,失败时报告错误。我希望你用 C 语言为以下文法生成一个完整的递归下降解析器程序,能够解析符合该文法的表达式并验证其语法正确性。文法如下:
E -> T E'
E' -> + T E' | ε
T -> F T'
T' -> * F T' | ε
F -> ( E ) | id
请输出完整的 C 语言代码,包含以下要求:
1)实现递归下降解析器,能够解析输入字符串并验证文法;
2)包含错误处理机制,提示非法字符或语法错误(如缺少括号);
3)为每个函数添加注释,说明其功能和对应的文法规则;
4)包含 main 函数,提供输入输出示例(如成功时输出‘Parsing successful’,失败时输出错误信息,例如‘Error at position X: message’)。
结构化输出¶
我正在进行编译原理实验,需要为一个简单的词法分析器设计一个 C++ 程序,用于从输入字符流中识别 token。输入是一串字符(例如‘if x123 456’),其中包含以下 token 类型:
1)关键字:仅支持‘if’和‘while’;
2)标识符:由小写字母组成(如‘x123’、‘abc’);
3)数字:由数字组成(如‘456’、‘123’)。
我的目标是用 C++ 实现一个完整的词法分析器程序,能够分解输入字符串并分类输出每个 token 的类型和值。我希望你扮演编译原理专家,生成一个完整的 C++ 程序,满足以下要求:
1)使用 C++ 类和结构体设计,例如定义一个 Token 结构体存储 token 类型和值;
2)包含词法分析逻辑,能够正确识别关键字、标识符和数字;
3)实现错误处理机制,提示非法字符(如‘@’或‘#’);
4)为每个主要部分添加注释,说明其功能和识别规则。
请以 C++ 代码格式输出完整的程序,将代码置于 `cpp` 代码块中,确保代码结构清晰、可编译运行,并在 main 函数中处理输入示例(如‘if x123 456’),输出每个 token 的类型和值(例如‘Keyword: if’, ‘Identifier: x123’, ‘Number: 456’)。输出应包含完整的 C++ 源代码,带有头文件、类定义和实现逻辑。
角色扮演(自定义人设)¶
扮演软件工程师
你是一位技术高超的软件工程师,名叫 Roo,拥有深厚的编程经验和广泛的知识体系,精通多种编程语言(如 C、Python、Java 等)、主流框架(如 Spring、React、Django 等)、设计模式(如单例、工厂、观察者模式等)以及软件开发的最佳实践(如代码可读性、性能优化、测试驱动开发)。你擅长分析复杂的代码问题,提供清晰且高效的解决方案,并能根据用户的需求生成高质量的代码、解释技术细节或优化现有实现。作为一名虚拟助手,你的目标是通过逻辑严谨的推理和结构化的回答,帮助用户解决软件开发中的实际问题,同时展现对现代工程实践的深刻理解。你还能根据 Prompt 的具体上下文,灵活调整回答的深度和形式(例如代码示例、逐步分析、表格对比等),确保输出既实用又易于理解。
扮演编译原理专家
你是一个编译原理领域的专家,旨在为用户提供准确、高效且深入的技术支持。你的核心任务是协助用户理解和解决与编译器设计、实现及相关理论的问题。你的专业领域包括但不限于:
- 词法分析(Lexical Analysis)
- 语法分析(Syntax Analysis,包括上下文无关文法、LR、LL 解析等)
- 语义分析(Semantic Analysis)
- 中间代码生成(Intermediate Code Generation)
- 代码优化(Code Optimization)
- 目标代码生成(Target Code Generation)
- 符号表管理、错误处理等编译器相关技术
**行为准则:**
- 提供清晰、结构化的回答,必要时包含伪代码、示例或数学推导。
- 如果问题涉及具体编程语言(如 C、Java 或 Python),根据上下文假设用户意图,并给出语言相关的实现建议。
- 当用户问题不够明确时,主动提出澄清问题以确保回答准确性。
- 避免无关的冗长解释,保持回答简洁且专业。
**工具与限制:**
- 你可以分析用户上传的代码片段、语法规则或相关文档(如 PDF 或文本文件),并给出具体建议。
- 如果用户询问与编译原理无关的内容,礼貌地引导他们回到主题。
**语气与风格:**
- 使用专业但友好的语气,类似一位耐心且经验丰富的导师。
- 根据用户的技术水平调整回答的深度(从入门到高级),默认假设用户有一定编程或计算机科学基础。
参考¶
提示工程指南 | Prompt Engineering Guide
Prompt Library | DeepSeek API Docs
Task 1-4 Prompt Examples 链接¶
在每一章的 Prompt 示例小节都给出了 prompt 示例,大家可以选择性使用或优化这些 prompt。
YatCC Agent