LLM 提示词工程入门:开发者笔记与代码实践
基于 DLAI 课程笔记,介绍大语言模型(LLM)提示词工程的核心原则与实践。涵盖清晰指令编写、给予思考时间、迭代优化 Prompt、文本概括、情感推断、信息提取、文本转换及聊天机器人构建等内容。通过 Python 代码示例演示了如何使用 API 实现总结、翻译、纠错等功能,并探讨了温度系数对输出的影响。旨在帮助开发者掌握高效利用 LLM 进行应用开发的方法。

基于 DLAI 课程笔记,介绍大语言模型(LLM)提示词工程的核心原则与实践。涵盖清晰指令编写、给予思考时间、迭代优化 Prompt、文本概括、情感推断、信息提取、文本转换及聊天机器人构建等内容。通过 Python 代码示例演示了如何使用 API 实现总结、翻译、纠错等功能,并探讨了温度系数对输出的影响。旨在帮助开发者掌握高效利用 LLM 进行应用开发的方法。

本文基于 DLAI 课程 ChatGPT Prompt Engineering for Developers 的笔记整理。这门课面向入门 LLM 的开发者,深入浅出地介绍了如何构造 Prompt 并基于 OpenAI 提供的 API 实现包括总结、推断、转换等功能,是入门 LLM 开发的经典教程。
Prompt(提示),最初是 NLP 研究者为下游任务而设计的一种任务输入形式或模板,在 ChatGPT 的影响下,Prompt 成为与 LLM 交互输入的代称。一般我们把给大模型的输入称为 Prompt,将大模型返回的输出称为 Completion。一个合理的 Prompt 设计极大地决定了 LLM 能力的上限与下限。
Prompt Engineering,是针对特定任务构造能充分发挥大模型能力的 Prompt 的技巧。
对于开发人员,LLM 更强大的功能是能通过 API 接口调用,从而快速构建软件应用程序。课程中有很多代码的实操,推荐大家使用 Google Colab 来实现,免去本地环境的配置。
提示词设计的两个关键原则:编写清晰、具体的指令,以及给模型充足思考时间。
Prompt 需要清晰明确地表达需求,提供充足上下文,使语言模型准确理解我们的意图,就像向一个外星人详细解释人类世界一样。过于简略的 Prompt 往往使模型难以把握所要完成的具体任务。
使用分隔符清晰地表示输入的不同部分
可以选择用 ```,""",< >,: 等做分隔符,只要能明确起到隔断作用即可。

结构化输出
按照某种格式组织的内容,例如 JSON、HTML 等。这种输出非常适合在代码中进一步解析和处理。

要求模型检查是否满足条件
如果任务包含不一定能满足的条件,可以告诉模型先检查这些条件,如果不满足,就指出并停止执行后续的完整流程。

提供少量示例
在要求模型执行实际任务之前,给出一两个已完成的样例,让模型了解期望的输出样式。
语言模型与人类一样,需要时间来思考并解决复杂问题。如果匆忙给出结论,结果很可能不准确。因此 Prompt 应加入逐步推理的要求,给模型留出充分思考时间,可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。
指定完成任务所需的步骤
text = f"""
李琪,爱荷华州立大学计算机科学系助理教授,她于 2017 年取得纽约州立大学布法罗分校计算机科学与工程系博士学位;于 2012 年取得伊利诺伊大学香槟分校统计学硕士学位;于 2010 年取得西安电子科技大学信息与计算科学学士学位。她的研究兴趣为数据管理、数据挖掘和机器学习。
彭楠赟,现任加州大学洛杉矶分校计算机科学系助理教授。她于 2012 年在北京大学获得学士和硕士学位,于 2017 年获约翰·霍普金斯大学计算机科学博士学位。她的研究方向为低资源信息提取、语言生成和跨语言迁移。
Qianqian Wang,康纳尔大学计算机科学专业博士四年级,此前在浙江大学获得学士学位,研究方向是 3D 计算机视觉、计算机图形学和机器学习的交叉领域。
陈师哲,INRIA Paris 的一名博士后研究员。她分别于 2020 年和 2015 年在中国人民大学获得博士和学士学位,2018 年访问了卡内基梅隆大学,2019 年访问了阿德莱德大学,2019 年在 MSRA 工作。她在 2017 年获得百度奖学金,2020 年获得北京市优秀毕业生奖。她的研究兴趣是具身智能、视觉与语言、多模态深度学习。
李爽,目前是麻省理工学院电气工程与计算机科学专业的一名五年级博士生,她的研究兴趣是人工智能,包括计算机视觉、自然语言处理、决策和机器学习。
Xin Lu,现任 Adobe 的高级工程经理,于 2015 年获得美国宾夕法尼亚州立大学的博士学位。她的研究涵盖从端到端 AI/ML 研发到软件开发、分析、开发运营、新计划和现有业务线的产品开发和管理。此外,她还在顶级的计算机视觉和机器学习领域发表了 30 多篇论文,并拥有超过 35 项美国专利。
刘伊凡,现任苏黎世联邦理工大学讲师,阿德莱德大学客座助理教授。于 2018 年获得北航自动化学院硕士学位,2021 年获得阿德莱德大学计算机科学学院博士学位。研究领域主要包含深度学习、开放世界感知。
"""
prompt_2 = f"""
1-用一句话概括下面用<>括起来的文本。2-将摘要翻译成英语。3-在英语摘要中列出每个名称。4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。请使用以下格式:Text:<要总结的文本>摘要:<摘要>翻译:<摘要的翻译>名称:<英语摘要中的名称列表>输出 JSON:<带有 English_summary 和 num_names 的 JSON>
Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nprompt 2:")
print(response)
让模型在下结论之前给出自己的解法
在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的 Prompt。关键是要有一个良好的迭代优化过程,不断改进 Prompt。
| 轮次 | Prompt | 目的 |
|---|---|---|
| 初始 | 您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。根据标记的技术说明书中提供的信息,编写一个产品描述。技术规格:{fact_sheet_chair} | |
| 迭代 1 | 您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。根据标记的技术说明书中提供的信息,编写一个产品描述。使用最多 50 个词。技术规格:{fact_sheet_chair} | 添加长度限制,生成更简洁的文案 |
| 迭代 2 | 您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。根据标记的技术说明书中提供的信息,编写一个产品描述。该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。使用最多 50 个单词。技术规格:{fact_sheet_chair} | 说明受众,应具有什么性质以及侧重点 |
| 迭代 3 | 您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。根据 ``` 标记的技术说明书中提供的信息,编写一个产品描述。该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。在描述末尾,包括技术规格中每个 7 个字符的产品 ID。使用最多 50 个单词。技术规格:{fact_sheet_chair} | 要求在描述的结尾,给出产品 ID |
| 迭代 4 | 您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。根据 ``` 标记的技术说明书中提供的信息,编写一个产品描述。该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。在描述末尾,包括技术规格中每个 7 个字符的产品 ID。在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。给表格命名为'产品尺寸'。将所有内容格式化为可用于网站的 HTML 格式。将描述放在元素中。技术规格:{fact_sheet_chair} | 提取产品尺寸信息并组织成表格 |
LLM 文本摘要功能的优势可以为你节省时间、提高效率,以及精准获取信息。
任务:商品评论总结
限制输出文本长度
注:模型在计算和判断文本长度时依赖于分词器,统计字符时并不精确。
设置侧重点
关键信息提取
将多条用户评价集合在一个列表中,并利用 for 循环和文本概括提示词,将评价概括至小于 20 个词以下,并按顺序打印。
商品评论
lamp_review = """
我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。\我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。\几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件!\在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!
"""
判断商品评论的情感 prompt
识别情感类型 prompt
识别愤怒 prompt
商品信息提取
综合情感推断和信息提取
prompt = f"""
从评论中识别以下内容:
- 情绪(正面/负面)
- 评论者是否感到生气?(是/否)
- 评论者购买的物品
- 制造该物品的公司
评论用三个反引号分隔。将回答转换为 JSON 对象,以'情感倾向'、'是否生气'、'物品类型'和'品牌'作为 key。
如果信息不存在,请使用'未知'作为值。
回答应尽可能简短。
将'是否生气'值转换为布尔值。
评论文本:```{lamp_review}```
"""
response = get_completion(prompt)
print(response)
判断一段文本的主旨,它涉及了哪些主题。
story = """
在政府最近进行的一项调查中,要求公共部门的员工对他们所在部门的满意度进行评分。
调查结果显示,NASA 是最受欢迎的部门,满意度为 95%。
一位 NASA 员工 John Smith 对这一发现发表了评论,他表示:
'我对 NASA 排名第一并不感到惊讶。这是一个与了不起的人们和令人难以置信的机会共事的好地方。我为成为这样一个创新组织的一员感到自豪。'
NASA 的管理团队也对这一结果表示欢迎,主管 Tom Johnson 表示:
'我们很高兴听到我们的员工对 NASA 的工作感到满意。
我们拥有一支才华横溢、忠诚敬业的团队,他们为实现我们的目标不懈努力,看到他们的辛勤工作得到回报是太棒了。'
调查还显示,社会保障管理局的满意度最低,只有 45%的员工表示他们对工作满意。
政府承诺解决调查中员工提出的问题,并努力提高所有部门的工作满意度。
"""
推断讨论主题 prompt
为特定主题制作新闻提醒
假设有一个新闻网站,我们感兴趣的主题:美国航空航天局、当地政府、工程、员工满意度、联邦政府等。判断一篇文章,是否包含这些主题。
可以在此基础上制定新闻提醒:
相比于传统统计机器翻译系统,大语言模型翻译更加流畅自然,还原度更高。通过在大规模高质量平行语料上进行 Fine-Tune,大语言模型可以深入学习不同语言间的词汇、语法、语义等层面的对应关系,模拟双语者的转换思维,进行意义传递的精准转换,而非简单的逐词替换。
大模型可以轻松实现 JSON 到 HTML、XML、Markdown 等格式的相互转化,掌握这一转换技巧可更高效地处理结构化数据。
# 假设有一个 JSON 数据,包含餐厅员工的姓名和邮箱。现在将这个 JSON 转换为 HTML 表格格式,以便在网页中展示
data_json = { "resturant employees" :[
{"name":"Shyam", "email":"[email protected]"},
{"name":"Bob", "email":"[email protected]"},
{"name":"Jai", "email":"[email protected]"}
]}
prompt = f"""
将以下 Python 字典从 JSON 转换为 HTML 表格,保留表格标题和列名:{data_json}
"""
response = get_completion(prompt)
print(response)
假设一篇文章的部分句子存在错误。可以遍历每个句子,要求模型进行检查,如果句子正确就输出'未发现错误',如果有错误就输出修改后的正确版本。
text = [
"The girl with the black and white puppies have a ball.", # The girl has a ball.
"Yolanda has her notebook.", # ok
"Its going to be a long day. Does the car need it's oil changed?", # Homonyms
"Their goes my freedom. There going to bring they're suitcases.", # Homonyms "Your going to need you're notebook.", # Homonyms
"That medicine effects my ability to sleep. Have you heard of the butterfly affect?", # Homonyms
"This phrase is to cherck chatGPT for spelling abilitty" # spelling
]
for i in range(len(text)):
time.sleep(20)
prompt = f"""请校对并更正以下文本,注意纠正文本保持原始语种,无需输出原始文本。
如果您没有发现任何错误,请说'未发现错误'。
例如:
输入:I are happy.
输出:I am happy.
```{text[i]}```"""
response = get_completion(prompt)
print(i, response)
同时对一段文本进行翻译、拼写纠正、语气调整和格式转换等操作。
文本扩展可以输入简短文本,生成更加丰富的长文。
将根据客户评价和情感倾向生成回复邮件。
大语言模型中的'温度'(temperature) 参数可以控制生成文本的随机性和多样性。temperature 的值越大,语言模型输出的多样性越大;temperature 的值越小,输出越倾向高概率的文本。
举个例子,在某一上下文中,语言模型可能认为'比萨'是接下来最可能的词,其次是'寿司'和'塔可'。若 temperature 为 0,则每次都会生成'比萨';而当 temperature 越接近 1 时,生成结果是'寿司'或'塔可'的可能性越大,使文本更加多样。
如果需要可预测、可靠的输出,则将 temperature 设置为 0;如果需要更具创意的文本,可适当提高 temperature。
在 ChatGPT 网页界面中,消息分为用户消息和助手消息。但在构建聊天机器人时,在发送了系统消息之后,您的角色可以仅作为用户 (user);也可以在用户和助手 (assistant) 之间交替来提供对话上下文。
每次与语言模型的交互都互相独立,这意味着要提供所有相关的消息,以便模型在当前对话中进行引用。如果想让模型引用或'记住'对话的早期部分,则必须在输入中提供对话历史,也就是上下文 (context)。
机器人会自动收集用户信息,并接收来自比萨饼店的订单。
collect_messages() 函数收集用户消息,从用户界面中收集 Prompt,然后将其附加到一个名为上下文 (context) 的列表中,并在每次调用模型时使用该上下文。模型的回答也会添加到上下文中,上下文逐渐变长。这样模型就知道下一步要做什么。
def collect_messages(_):
prompt = inp.value_input
inp.value = ''
context.append({'role':'user', 'content':f"{prompt}"})
response = get_completion_from_messages(context)
context.append({'role':'assistant', 'content':f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
return pn.Column(*panels)
现在,我们将设置并运行这个 UI 来显示订单机器人。初始的上下文包含了包含菜单的系统消息,在每次调用时都会使用。此后随着对话进行,上下文也会不断增长。需要用 pip 安装 panelCopy 库(用于可视化界面)。
运行如上代码可以得到一个点餐机器人,下图展示了一个点餐的完整流程:
创建 JSON 摘要
接下来要求模型创建一个 JSON 摘要,发送给订单系统。(此处也可以定义为用户消息,不一定是系统消息)
请注意,这里使用了一个较低的温度,因为对于这些类型的任务,我们希望输出相对可预测。
messages = context.copy()
messages.append(
{'role':'system', 'content':
'''创建上一个食品订单的 json 摘要。\逐项列出每件商品的价格,字段应该是 1) 披萨,包括大小 2) 配料列表 3) 饮料列表,包括大小 4) 配菜列表包括大小 5) 总价
你应该给我返回一个可解析的 Json 对象,包括上述字段'''},
)
response = get_completion_from_messages(messages, temperature=0)
print(response)
Prompt 的两个核心原则:
我们还学习了迭代式 Prompt 开发的方法,逐步找到适合的 Prompt;另外,课程还讨论了大型语言模型的许多功能,包括摘要、推断、转换和扩展。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online