Skip to content

大模型应用开发-Part2

目录

学习参考网站:

  1. Prompt Engineering Guide
  2. OpenAI Prompt

为什么

需要给 AI 下发命令, 让 AI 去完成, 只有剔除了具体的要求, AI 才知道如何去完成。

好的 Prompt 需要不断调优 - 好的提示词是一次次优化出来的:

  • 说清楚自己要什么, 要具体!
  • 不要让机器猜测太多。 为了不让机器去猜测, 我们需要给出细节。
  • 提示工程存在技巧, 灵活掌握, 事半功倍。

提示词构成

  • 指示(Instruction): 描述要让他做什么?
  • 上下文(Context): 给出与任务相关的背景
  • 例子(Examples): 给出一些例子, 例子可以提供有效信息
  • 输入(Input): 任务的输入信息
  • 输出(Output Formate): 输出的格式, 想要什么形式的输出?

1.定义清楚提示词

示例提示词中,要求答案简短准确,要求不确定答案的时候请回答不确定答案。

prompt = f""""
根据下面的上下文回答问题。 保持答案简短且准确。 如果不确定答案,请回答“不确定答案”。

星舰(英文:Starship,又译:星舟)原名大型猎鹰火箭(BFR),是美国太空探索技术公司(SpaceX)研发的大型运载火箭系统。
星舰采用船箭一体化设计,包括超重火箭级和星舰飞船级。运载能力为100吨,能将100人送往月球、火星或其它遥远目的地,或是绕地球飞行。星舰系统全长120米,起飞质量为5000吨,起飞推力7400吨,两级均可重复使用。 美国太空探索技术公司计划采用星舰实现载人绕月飞行、前往火星等太空探索。
北京时间2023年11月18日晚9时3分,美国太空探索技术公司新一代重型运载火箭“星舰”以及飞船集成系统实施第二次试验发射,火箭升空后一二级成功分离,但随后助推器和飞船先后发生爆炸。SpaceX公司已经官宣火箭发射失败。
2024年3月,美国联邦航空局(FAA)授予SpaceX公司许可,允许该公司从得克萨斯州测试发射“星舰”火箭系统。当地时间3月14日,“星舟”(Starship)重型运载火箭在得克萨斯州第三次试验发射。该公司称,“星舟”第二级飞船在重新穿越大气层阶段失联。

问题:星舰在什么时候失联的?
"""
response = generate_responses(prompt)
print(response)

将上面的 prompt 进行拆分, 按照 prompt 的构成进行拆分并使用 ### 进行分割, 有利于进行变化并且对最终结果是有帮助的。

instruction = "根据下面的上下文回答问题。 保持答案简短且准确。 如果不确定答案,请回答“不确定答案”。"

context = f"""
星舰(英文:Starship,又译:星舟)原名大型猎鹰火箭(BFR),是美国太空探索技术公司(SpaceX)研发的大型运载火箭系统。
星舰采用船箭一体化设计,包括超重火箭级和星舰飞船级。运载能力为100吨,能将100人送往月球、火星或其它遥远目的地,或是绕地球飞行。星舰系统全长120米,起飞质量为5000吨,起飞推力7400吨,两级均可重复使用。 美国太空探索技术公司计划采用星舰实现载人绕月飞行、前往火星等太空探索。
北京时间2023年11月18日晚9时3分,美国太空探索技术公司新一代重型运载火箭“星舰”以及飞船集成系统实施第二次试验发射,火箭升空后一二级成功分离,但随后助推器和飞船先后发生爆炸。SpaceX公司已经官宣火箭发射失败。
2024年3月,美国联邦航空局(FAA)授予SpaceX公司许可,允许该公司从得克萨斯州测试发射“星舰”火箭系统。当地时间3月14日,“星舟”(Starship)重型运载火箭在得克萨斯州第三次试验发射。该公司称,“星舟”第二级飞船在重新穿越大气层阶段失联。
"""
query = "星舰在什么时候失联的?"

prompt = f"""
{instruction}
### 上下文
{context}
### 问题:
{query}
"""
response = generate_responses(prompt)
print(response)

可以要求输出格式, 例如:

instruction = f"""
根据下面的上下文回答问题。 保持答案简短且准确。 如果不确定答案,请回答“不确定答案”。

以 Json 格式进行输出:
{"具体问题": "答案"}
"""

2.Few-Shot learning

大模型的默认行为和预期的行为可能存在差异,因此需要使用 Few-Shot 进行指引。 例如, 原始大模型输出如下:

prompt = """
Classify the text in to neutral, negative or positive.
Text: I think the vacation is okey.
Sentiment:
"""
# output: Neutral

使用 Few-Shot 引导如下:


prompt = """
Classify the text in to neutral, negative or positive.

# Examples
Text: I think the vacation is okay. Sentiment: neutral
Text: I don't like the computer. Sentiment: negative

Text: This book is awesome! Sentiment:
"""
# output: positive

可以看到, 输出后模型从原来的大写改为了小写。

如果与大模型本身的行为区别越大, 那就需要更多的例子, 例如, 将单词 neutral 改为 neut, 可能需要举多个样例。 但是要注意大模型本身的上下文长度。

总结: 当模型输出的标准与自己的预期输出存在差异, 单纯 prompt 无法解决的时候可以使用 Few-Shot 来指引。

关于如何区分几个 learning:

  • One Shot learning - 给一个例子
  • Few Shot learning - 给少数几个例子
  • Zero Shot learning - 完全不给例子

Q: 一个问题要提供多少个例子? 如果很多个例子都不 work 该怎么办? A: 一般5-10个例子, 需要注意上下文长度。 十个例子都不太行就考虑 fine-tune。

Few-Shot-Learning 的局限性:

  • 大模型本身存在局限的地方: 推理、数学解答等
    • 仅仅给出例子和答案, 但是没有中间的推理关系, 对大模型是没有帮助的
    • 可以给出推理的过程, 对大模型有帮助, 可能产生帮助

Few-Shot 进阶: 思维链, Self-consitency

3.应用案例

3.1 短视频脚本制作

首先需要构造 instruction:

"你是热门短视频脚本的编写的专家, 根据你的专业能力给用户生成关于美食类的短视频脚本, 内容不超过一分钟的脚本。"

尽管上面可以构造短视频脚本, 但是存在身份不够清晰、输入输出格式不够清晰等问题, 并且很可能不会根据用户的输入来产生输出, 会直接产出随机的脚本。因此需要增加更多的身份信息, 同时提出更加细致的要求:

"你是热门短视频脚本编写的专家。
你的创造力很强, 很了解网络上的流行的话题和梗, 你对服装、食品等领域跟短视频的结合非常了解, 以及什么样的内容能够作出爆款也很熟悉。你需要把你的这些专长发挥出来, 以及把知识融合进来, 给用户编写短视频脚本。

根据用户的创作需求[PROMPT], 进行短视频脚本的创作, 输出格式为:
    1.拍摄要求
        a.演员: xxx(演员数量、演员性别、主配角)
        b.背景: xxx(拍摄背景要求)
        c.服装: xxx(演员拍摄的服装要求)
    2.分镜脚本
      以如下格式来输出分镜脚本
      镜头 | 时间 | 对话 | 画面 |备注
      1 00:00-00:03 xxx xxx xx

3.2 小红书爆款文章

基础版instruction:

"你是小红书爆款文章写作专家, 帮我写一篇如何减肥的一篇爆款文章, 字数最多200字。"

与案例3.1 相同, 可以随机的产生一定的输出。而小红书文章会喜欢使用很多小表情来点缀文字, 所以再添加更多身份信息时候也要把特点加进去。示例:

你是小红书爆款写作专家,请你用以下步骤来进行创作,内容的主题为: 饲养2岁泰迪的烦恼。 首先产出5个标题(含适当的emoji表情),其次产出1个正文(每一个段落含有适当的emoji表情,文末有合适的tag标签)

一、在小红书标题方面,你会以下技能:
1. 采用二极管标题法进行创作
2. 你善于使用标题吸引人的特点
3. 你使用爆款关键词,写标题时,从这个列表中随机选1-2个
4. 你了解小红书平台的标题特性
5. 你懂得创作的规则

二、在小红书正文方面,你会以下技能:
1. 写作风格
2. 写作开篇方法
3. 文本结构
4. 互动引导方法
5. 一些小技巧
6. 爆炸词
7. 从你生成的稿子中,抽取3-6个seo关键词,生成#标签并放在文章最后
8. 文章的每句话都尽量口语化、简短
9. 在每段话的开头使用表情符号,在每段话的结尾使用表情符号,在每段话的中间插入表情符号

三、结合我给你输入的信息,以及你掌握的标题和正文的技巧,产出内容。请按照如下格式输出内容,只需要格式描述的部分,如果产生其他内容则不输出:
一. 标题
[标题1到标题5]
[换行]
二. 正文
[正文]
标签:[标签]

3.3 UserCases-模拟面试

####GPT人物:
-该GPT充当面试教练,通过模拟面试来帮助用户,而且真正像实际面试一样,围绕用户的回复可以深问。
-面试教练在提供反馈(如STAR方法)时利用最佳实践
-面试教练在面试中扮演面试官的角色
-面试教练在模仿任何角色时都是专家
-面试教练总是以友好的方式提供关键的反馈
-面试教练语言简洁

####开始对话说明:
在开始谈话时,面试总是会询问以下信息,以便提供量身定制的个性化体验。面试教练一次只会问一个问题。
1.要求用户通过上传或粘贴内容到聊天中来提供简历
2.通过将内容上传或粘贴到聊天中,要求用户提供他们正在面试的职位描述或角色
3.询问用户面试官的角色(如产品总监);如果提供,则充当该角色
4.询问用户想问多少问题。最多3个问题。
5.询问用户的面试模式:
在模拟面试模式中,面试教练会问用户一个问题,等待回答;然后根据用户的回复,面试官接着可以去深问。当发现用户没有办法回答出答案或者已经判断
用户不了解相应的内容时,跳出深问的环节并跳转到另外一个新的问题。
6.每一个完整的问题结束之后,给出用户的回复的点评。

####提供反馈:
1.当面试教练提供反馈时,它总是根据用户面试的角色使用最佳实践
2.面试结束后,面试教练总是提供详细的反馈。
3.在适用的情况下,面试教练将提供一个用户如何重新构建回应的例子
4.当面试教练提供反馈时,总是使用清晰的结构
5.当面试教练提供反馈时,它总是会提供0-10的分数,并给出分数的基本原理

4.总结

For prompt engineering, one should 对于快速工程,应该

  • Write clear instructions 写清楚的说明
  • Split complex tasks into simpler subtasks 将复杂的任务拆分为更简单的子任务
  • Give GPT-3.5/GPT-4 time to “think” 给 GPT-3.5/GPT-4 时间“思考”
  • Test changes systematically 系统地测试更改

After going through the above steps, they can be extended to 完成上述步骤后,可以扩展到

  • Providing Reference Text 提供参考文本
  • Using external Tools 使用外部工具

Prompt engineering is good for 提示工程适用于

  • Testing and learning early 尽早测试和学习
  • When paired with evaluation it provides the baseline 当与评估配对时,它提供了基线

Not good for 不适合

  • Introducing new information 介绍新信息
  • Reliability replicating a complex style or method (for ex, a new programming language) 复制复杂样式或方法(例如,一种新的编程语言)的可靠性
  • Minimizing token usage 最小化令牌使用