Prompt从入门到抄作业
欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
目录
- 1 引言
- 2 好的Prompt是什么样的
- 2.1 Prompt构成
- 2.1.1 人类视角
- 2.1.2 LLM视角
- 3 怎么把用户输入解析为高质量输入给LLM
- 3.1 使用大模型应用处理输入
- 3.1.1 使用关键词或规则进行解析
- 3.1.2 使用LLM预处理Prompt
- 3.2 从源头上更改(主流做法)
- 4 怎么写好提示词
- 4.1 抄作业
- 4.1.1 https://flowgpt.com/
- 4.1.2 https://poe.com/ 或者 https://www.tongyi.com/discover
- 4.1.3 https://github.com/f/awesome-chatgpt-prompts
- 4.1.4 https://github.com/langgptai/LangGPT
- 4.1.5 https://github.com/dair-ai/Prompt-Engineering-Guide
- 4.1.6 https://github.com/Acmesec/PromptJailbreakManual
- 4.2 建立个人/团队Prompt库
- 4.3 抽象作业为模板
- 4.4 评估与优化
- 4.4.1 评估
- 4.4.1.1 人工评估
- 4.4.1.2 自动化评估
- 4.4.1.2.1 权威评估集
- 4.4.1.2.2 建立自己/团队的评估集
- 4.4.2 优化
- 4.4.2.1 参考资料
- 4.4.2.2 速查表
1 引言
在之前的快速筑基系列中,我们有了解到可以使用Prompt来限制大模型的输出。
限制输出还有其他手段如temperature、top_p、max_tokens参数等等…
好的提示词(Prompt)哪里好?
提示词要怎么写?
提示词在LLM是怎么起作用的?
怎么评估提示词好坏?
世另我?怎么让LLM按照自己的思路去做事情?
怎么优化提示词?
提示词怎么越狱?
不了解特定行业知识能写出特定行业的优质提示词么?
有没有好的提示词作业可以抄?
与memory的联动暂且不提。
今天让我们先较为深入地了解一下基础中的基础——Prompt。
2 好的Prompt是什么样的
简单来说,输出符合预期的就是好的。
Prompt对于大模型是典型的输入决定输出质量,我们编写的prompt质量决定了LLM输出质量。
一个好的Prompt应该可以节省与LLM沟通成本、提升准确性、最大化AI潜力、支持更复杂的任务解决方案。
优点 | 描述 |
---|---|
提升AI输出的准确性与相关性 | 明确的Prompt帮助AI理解任务目标,避免偏离 |
节省时间与沟通成本 | 精准的Prompt能减少你与AI之间的反复试探,直接达到期望结果 |
最大化AI潜力 | AI本身有强大的生成能力,但它依赖于清晰明确的指令来发挥最佳效果 |
支持更复杂的任务解决方案 | 高质量Prompt不仅能帮助完成简单任务,还能处理更复杂的、多层次的问题 |
Prompt应该是清晰的表达:目标明确、背景详实,有明确的角色和视角等等…
需要反复交代的都可以在Prompt中交代好。
我们也可以在Prompt中要求LLM给出思考过程,强制LLM推理,从而更好的调整Prompt。
好的Prompt能给予LLM合适的引导。
2.1 Prompt构成
2.1.1 人类视角
为了系统性地理解Prompt,我们可以将一个复杂的Prompt拆解为几个核心构成要素。当你发现输出不理想时,可以逐个检查是哪个要素出了问题。
- CheckList
构成要素 | 核心作用(你要思考的问题) | 例子 |
---|---|---|
1. 角色 (Role) | 我希望模型扮演谁?它的专业知识、口吻和视角应该是什么样的? | 你是一位经验丰富的儿童故事作家… 你是一个Python代码审查工具… |
2. 任务 (Task) | 我需要模型具体完成什么动作?(总结、分析、创作、翻译、分类、提取…) | …请创作一个关于友谊的短篇故事。 …请审查以下代码,找出其中的逻辑错误和不符合PEP8规范的地方。 |
3. 上下文 (Context) | 模型完成任务所需的所有背景信息是什么?(文章、数据、对话历史、用户画像…) | 故事的背景设定在一个魔法森林里。 这是用户之前的提问:[…] |
4. 指令与约束 (Instructions & Constraints) | 我希望输出遵循哪些具体的规则?长度、风格、要点、禁忌是什么? | 故事必须在500字以内。 必须包含“勇气”和“智慧”两个主题。 输出中绝对不能包含任何价格信息。 |
5. 示例 (Examples / Few-shot) | 我能否给出一两个“好”的范例,让模型模仿?这在处理复杂或模糊任务时极其有效。 | 例如,如果输入是“我爱这部电影”,输出应为“正面”;如果输入是“浪费了我的时间”,输出应为“负面”。 |
6. 输出格式 (Output Format) | 我希望模型以什么格式返回结果?(JSON, Markdown, XML, 列表…)这对于程序化处理至关重要。 | 请将结果以JSON格式输出,包含"title", “summary”, "keywords"三个键。 请使用Markdown的无序列表格式回答。 |
当然,也有简单的可套用公式:
核心公式RPC:规则(Rules)+角色(Persona)+上下文(Context)。
2.1.2 LLM视角
简单粗暴的理解,LLM的工作方式就是预测下一个token。
输入的Prompt也会被分解成一系列的tokens,然后LLM会利用庞大的神经网络,根据输入的tokens与它在海量训练数据中学到的模式和统计关系,一个token接一个token计算输出。
神经网络:人工智能和机器学习中的一种计算模型。模拟神经元之间的连接和信息传递,通过数学运算处理输入数据,生成输出结果。
这也是为什么LLM API划分有多种消息类型的原因。
3 怎么把用户输入解析为高质量输入给LLM
3.1 使用大模型应用处理输入
不是所有人都能第一时间提供高质量的提示词,但是大模型应用可以通过预设的方式转换用户输入为高质量Prompt。
以LangChain支持的消息类型为例:
- ‘human’: 人类消息
- ‘user’: 用户消息
- ‘ai’: AI 消息
- ‘assistant’: 助手消息
- ‘function’: 函数消息
- ‘tool’: 工具消息
- ‘system’: 系统消息
- ‘developer’: 开发者消息
比如典型的指令例子,我们可以给对话预设角色和约束,用户输入当做任务放在user或者human中处理:
[SystemMessage(content='你是一位顶级的文案策划专家,精通社交媒体营销。\n你的任务是根据用户提供的产品信息,创作出简短、有力、富有创意的推广文案。\n所有文案都必须遵守以下规则:\n- 风格现代,能吸引年轻用户。\n- 每条文案严格控制在50个字以内。\n'),HumanMessage(content='请为这款产品创作三条朋友圈文案:\n产品名称:星尘咖啡\n产品特点:采用阿拉比卡豆,口感顺滑,带有独特的坚果风味,能瞬间提神醒脑。')
]
如果用户期望自己能输入一些设定、约束,大模型应用该怎么处理输入为高质量Prompt呢?
3.1.1 使用关键词或规则进行解析
可以尝试使用一些简单的规则来解析用户的单次输入。
比如定义一些出发次,比如“扮演”、“角色”、“设定”等…
但是这样前提是用户知道使用这些词,且有些词难以定义规则处理,如“使用”、“不想要”、“期待”等…
- 缺点
规则往往非常脆弱,实际生产中也难以维护且复杂。
3.1.2 使用LLM预处理Prompt
我们可以使用LLM来提升用户输入的Prompt质量,先调用一次LLM,让LLM帮忙优化输入结构。
或者在应用中集成一个提示词优化器,比如prompt-optimizer
- 缺点
成本高,且LLM解析优化出来的Prompt也不一定直接符合需求。
3.2 从源头上更改(主流做法)
我们应该通过UI/应用设计进行分离。作为应用开发者,应该为用户提供一个清晰的界面,让他们自然而然地将不同类型的信息输入到不同的地方。
核心思想: 不要给用户一个万能的输入框,而是提供结构化的输入界面。
这样大模型应用处理输入的时候可以很自然地承接、填充信息给LLM。
比如通义千问的创建智能体:
4 怎么写好提示词
4.1 抄作业
自己从0~1有一两次就够了,抄作业才是程序员应该做的事情(🤪)。不要重复造轮子。
写轮眼!启动! 我可太喜欢抄作业了。
4.1.1 https://flowgpt.com/
全球最大的Prompt社区。有排行榜、有分类、有用户投票。你可以找到各种场景(学术、营销、编程、娱乐)下经过大量验证的优质Prompt。
抄法:直接搜索关键词,看排行榜,找到高赞Prompt,复制并研究它的结构。
4.1.2 https://poe.com/ 或者 https://www.tongyi.com/discover
每个机器人背后都是一个精心设计的Prompt。不管国内国外,抄!
抄法:找到一个你觉得特别好用的机器人,点击它的头像,通常可以看到它的“Prompt”定义。
4.1.3 https://github.com/f/awesome-chatgpt-prompts
这是一个由开发者维护的GitHub仓库,用.csv文件整理了大量高质量的英文Prompt。内容非常结构化,适合开发者进行批量处理或寻找灵感。
中文库:https://github.com/PlexPt/awesome-chatgpt-prompts-zh
抄法:git clone下来,或者直接在网页上浏览,找到你需要的角色或任务,翻译并化用。
4.1.4 https://github.com/langgptai/LangGPT
结构化抄作业法。这个仓库不仅仅是给你Prompt,更是教你一种构建高质量Prompt的“语言”和“模式”。它提倡使用模板、变量、多级标题等方式来编写结构清晰、可维护的Prompt。
抄法: 重点学习它的README.md,理解其结构化思想。然后模仿它的模板来构建你自己的、用于复杂任务的专属Prompt。适合进阶选手。
4.1.5 https://github.com/dair-ai/Prompt-Engineering-Guide
在Github用prompt搜出来的,恐怖的58kstar。
4.1.6 https://github.com/Acmesec/PromptJailbreakManual
越狱手册
4.2 建立个人/团队Prompt库
就像优秀的程序员都有自己的代码片段库。优秀的Prompt工程师也一样。
把作业抄成体系比什么都重要。
4.3 抽象作业为模板
成熟的CV工程师要运用抽象能力,将作业变成自己的。
抄来的作业:
“扮演一名字节跳动的产品经理,请根据我本周完成的【登录页面重构】和【用户数据分析】这两项工作,以及取得的【加载速度提升50%】的成果,生成一份给上级领导看的周报。要求逻辑清晰,突出重点。”
你的抽象模板化:
扮演一名【你的行业】的【你的职位】,请根据我本周完成的以下工作:
【在此处填写本周完成的工作项,用列表形式】以及取得的如下成果:
【在此处填写本周取得的关键成果】生成一份给【汇报对象,如:上级领导/团队】看的周报。
要求:
【在此处填写具体要求,如:逻辑清晰、突出重点、语言正式等】
4.4 评估与优化
~~从01的能力肯定是要有的,抄作业也得抄的明白。~
没有评估就不能优化,没有优化就不会变好。
4.4.1 评估
提示词可以通过评估集进行评估。
4.4.1.1 人工评估
让用户来评估,使用不同的Prompt生成结果,看哪个结果用户更满意。
需要设定一套评分标准,比如“相关性”、“准确性”、“流畅度”、“遵循指令程度”等,每一项都按1-5分打分。找多名评估员对Prompt生成的多个结果进行打分,取平均分。
4.4.1.2 自动化评估
速度快、成本低、可重复,是工程迭代的核心。
需要维护评估集(Evaluation Set)。
评估集是什么? 它是一个包含“输入”和“理想输出(参考答案)”的数据对列表。例如:
- 输入: {“article”: “一篇很长的体育新闻…”}
- 理想输出: {“summary”: “C罗打入了关键一球。”}
自动化评估的核心思路就是:用你的新Prompt处理评估集里的所有“输入”,然后将模型的“实际输出”与评估集里的“理想输出”进行比较,得出一个分数。
当然,都自动化了,打分可以让LLM依据评估集来判断,把问题、标准答案、被评估的LLM回答一起发给裁判LLM。
4.4.1.2.1 权威评估集
AI有推荐一些评估集,但是感觉落到具体LLM应用上,想要贴合业务,还是得靠自己/团队的评估集。
评估集名称 | 链接/来源 | 简介和特点 |
---|---|---|
C-Eval | 点击访问 GitHub | 中文基础能力评测集。由上海交通大学发布,被认为是中文领域最权威的基础能力评测集之一。它涵盖了从中学到大学的52个学科,完全对标了著名的英文评测集MMLU。 |
CMMLU | 点击访问 GitHub | 中文大规模多任务语言理解评测。另一个高质量的MMLU中文对标项目,涵盖了67个主题,从基础学科到中国特色的法律、公务员考试等。 |
SuperCLUE | 点击访问官网 | 中文通用大模型综合性评测基准。它不仅仅是一个数据集,更是一个评测体系,包含了对模型的十大基础能力(如代码、逻辑、安全、长文本等)的评估。 |
4.4.1.2.2 建立自己/团队的评估集
对于日常开发,具体业务场景,我们应该有特定的小型评估集。
(AI建议)应当有20~50个有代表性的“输入”和它们对应的“完美输出”。这个数据集是你的“考卷和标准答案”。
这里有一个问题,如果开发者不熟悉特定业务场景,不知道什么样的输出是完美的应该怎么办呢?
- 1.找专家
这是一个流程和协作的问题,不是技术问题。
我们应当找领域“专家”。没有专家时,我们可以引导LLM成为专家。
这里有一些AI提出的沟通技巧供参考:
与专家对话:
- 进行访谈,而非提问: 不要直接问“完美的输出是什么样的?”。他们可能也无法用语言精确描述。你应该:
- 展示示例: 运行一个非常粗糙的Prompt V0.1版本,生成几个结果(即使很烂),拿给他们看。人们对于“批评和修正”远比“从零创造”更在行。
- 引导修正: 他们会说:“不对,我们从不会用‘亲’这个词称呼客户”、“这里漏掉了风险提示”、“这句话太生硬了,应该更委婉一点”。
- 记录细节: 把这些修正意见全部记录下来。这些就是构建“完美输出”的第一批原材料。你的目标不是去猜测,而是去记录。
- 2.抄呗
在很多行业,所谓的“完美输出”已经存在于各种文档之中了。
分析现有文档与竞品。 - 内部文档: 寻找公司的培训手册、客服SOP(标准作业程序)、优秀的邮件模板、历史报告等。这些都是“完美输出”的现成范例。
- 公开信息: 分析你们公司或竞争对手的网站文案、市场推广材料、公开报告。它们的措辞、语气、结构,都代表了该行业认为的“好”的标准。
4.4.2 优化
使用评估集进行优化。
和开发其他工程一样,持续迭代、演进。
四步法循环:审阅 -> 识别 -> 修正 -> 验证 -> 审阅。
-
1.审阅结果
拿到评估报告后,你首先要做的不是马上改Prompt,而是分类和审阅。 -
2.识别模式
不要孤立地看待每一个错误,而是要寻找错误的共性模式。 -
错误聚类: 是不是所有关于“价格计算”的输入都错了?是不是模型总是在处理超过500字的长文本时遗漏信息?是不是只要提到“法律风险”,模型的回答就过于保守和模糊?
-
形成假设 (Form a Hypothesis): 针对你发现的模式,提出一个关于“为什么会出错”的假设。
- 模式: 模型总是在输出JSON时,在最后一个键值对后多加一个逗号,导致JSON格式错误。
- 假设: “我的Prompt中没有明确强调要遵循严格的JSON规范,模型可能受到了某些训练数据的影响。”
-
3.修正提示词
根据你的假设,对Prompt进行一次只改一个变量的精准修正。 -
精准打击: 针对上面的假设,你的修正应该是:“…请将结果以严格的、不包含任何结尾逗号的JSON格式输出。” 而不是宽泛地改成“请注意你的格式”。
-
建立版本控制: 将修改后的Prompt保存为 V2、V3… 这样你才能清晰地追踪哪次修改带来了效果。
-
4.验证效果
使用新版本的Prompt,重新在你的整个评估集上跑一遍。 -
修复验证 (Fix Verification): 之前失败的案例现在是否通过了?
-
回归测试 (Regression Testing): 之前成功的案例,有没有因为你的修改而“意外”失败?(这非常重要!)
循环或结束: 如果新版本的总体得分显著提升,且没有引入新的问题,那么这次优化就是成功的。然后,你可以基于新的失败案例,开始新一轮的循环。
4.4.2.1 参考资料
下面这些是业内公认的高质量学习资源,它们详细讲解了上面提到的优化思想和具体技巧。
资源名称 | 链接 | 为什么推荐 (可以直接抄的“思路”) |
---|---|---|
LangSmith Prompt Engineering Cookbook | https://docs.smith.langchain.com/prompt_engineering/how_to_guides https://github.com/langchain-ai/langsmith-cookbook | LangChain官方“食谱”。这是LangChain官方推出的实践指南,专门教你如何使用LangSmith工具来进行评估和调试。它把我们上面讨论的循环流程变成了触手可及的工具,是开发者的首选必读。 |
OpenAI - Prompt engineering Guide | 点击访问 OpenAI 文档 | “圣经”。这是来自模型创造者的官方指南。里面详细介绍了大量提升Prompt效果的策略,比如“给模型思考的时间(Chain-of-Thought)”、“提供参考文本”、“将复杂任务拆解”等。当你发现某种错误模式时,可以来这里寻找对应的修正策略。 |
Deeplearning.AI - “ChatGPT Prompt Engineering for Developers” | 点击访问课程网站 | 吴恩达老师的免费“大师课”。这个短课程系统地讲解了提示词工程的核心原则和迭代开发的思想。它提供了大量可以直接运行的代码示例,让你亲手体验从一个坏Prompt到一个好Prompt的优化过程。 |
Cohere LLM University - Prompt Engineering | 点击访问 Cohere 文档 | 优秀的“第三方教材”。Cohere作为大模型公司之一,其文档质量非常高。这一章详细介绍了Prompt的构成、调试技巧以及常见的错误类型,内容非常系统化,适合作为知识框架来学习。 |
4.4.2.2 速查表
当你发现的错误模式是… | 你可以尝试的优化策略是… |
---|---|
不遵循格式指令 | 1. 把指令放在Prompt的最后。 2. 使用###或XML标签等分隔符,把指令和内容清晰分开。 3. 提供一个Few-shot示例,让它模仿。 |
事实性错误 (幻觉) | 1. 明确告诉它“仅根据以下提供的上下文回答”。 2. 引入RAG (检索增强生成),先搜索再回答。 3. 指示它如果不知道答案,就明确说“我不知道”。 |
遗漏关键信息 | 1. 使用Chain-of-Thought (CoT),让它“先思考,再回答”。例如:“第一步,请列出文章中的所有关键人物。第二步,总结他们之间的关系…” |
回答过于宽泛或简略 | 1. 增加对角色(Role)的刻画,比如“你是一位注重细节的资深分析师”。 2. 明确要求回答的深度和广度,比如“请提供至少三个论点,并分别进行阐述”。 |
添加不必要的开场白 | 1. 在指令中明确:“直接回答问题,不要包含任何前言或客套话。” |