Prompt Engine:释放创造力的新工具
- Prompt Engine
- Prompt Engine的背景和目的
- 简介
- 背景
- 目的
- 如何让 Codex 生成您想要的代码
- 什么是prompt-engine-py
- 安装
- 简介
- 架构图
- 下面是PromptEngine类中可以用到的函数以及继承的函数
- 使用PromptEngine生成prompt
- 使用CodeEngine生成prompt
- 使用ChrtEngine生成prompt
- YAML Representation
Prompt Engine
Prompt Engine的背景和目的
简介
Prompt Engine是一种自然语言生成工具,旨在帮助人们更轻松地编写和生成文本内容,特别是针对机器学习领域。Prompt Engine可以通过输入简短的文本提示或指令,自动生成符合上下文的语言内容,从而缩短文本生成的时间和提高生成内容的质量。
背景
像GPT-3和Codex这样的LLM一直在突破AI能力的限制——它们可以生成语言和代码,但也能够生成诸如问题回答、总结、分类和对话等及时性行为。在LLM中启用特定行为的最佳技术之一被称为prompt engineering——精心设计输入,引导模型产生某些类型的输出。给出少量输入和输出的示例,模型就可以根据示例输出你想要的输出类型。
目的
Prompt Engine的目的是为了使自然语言生成变得更加容易和高效,可以保证输出的文本具有一定的质量和准确性,也可以处理大量的文本数据,从中提取有用的信息,并为应用程序提供更好的智能化服务。
如何让 Codex 生成您想要的代码
-
第一版:普通的prompt
-
第二版:加入High level Task Description
告诉ChrtGPT生成代码详细的需求,比如导入所需要的包、每行都要求注释等…
-
第三版:加入Examples,让CodeX的输入和输出更加符合你想要的答案
加入示例,让ChrtGPT生成的代码,更像你示例那样,遵从你的风格。
-
第四版:加入High Level Context
有时候生成的代码,需要的库是它不知道的,也有可能在后续生产代码使用到你之前写的函数。这个时候我们可以告诉他这些函数的清单,他就能在生成代码的时候,加入你告诉他的这些函数
-
第五版:加入Session Buffer
在特定场景中,我们直接问"他们一起多少斤",ChrtGPT是不知道"他们"是指的谁的,这个时候我们就需要把历史的会话记录告诉ChrtGPT,从而知道了上下文,他就能给出准确的答案。
什么是prompt-engine-py
github: prompt-engine-py
安装
pip install prompt-engine-py
简介
prompt-engine-py是微软abhimasand Abhishek Masand提供的一款开源的python第三方库,它同时支持PromptEngine、CodeEngine、ChatEngine,这三种都促进了prompt engineering的模式,其中prompt 由描述、输入和输出的示例、用户和模型通信时正在进行的输入/输出的“对话框”(会话缓冲区),以及“对话框”确保模型(无状态)具有到目前为止对话中发生的内容的上下文组成。
架构图
下面是PromptEngine类中可以用到的函数以及继承的函数
使用PromptEngine生成prompt
示例:
from prompt_engine.prompt_engine import PromptEngine, PromptEngineConfig
from prompt_engine.interaction import Interactionconfig = PromptEngineConfig(description_prefix="###", input_prefix="##", output_prefix="") # 定义描述的前缀、输入与输出前缀
description = "test" # 定义描述
dialog = [Interaction("Hi", "print('Hi')"), Interaction("Bye", "print('Bye')")] # 定义历史会话
examples = [Interaction("Hello", "print('Hello')"), Interaction("Goodbye", "print('Goodbye')")] # 定义示例
flow_reset_text = "This is the flow reset text" # 流程重置文本
prompt_engine = PromptEngine(config, description, dialog=dialog, flow_reset_text=flow_reset_text, examples=examples) # 初始化PromptEngine
prompt_engine.add_interaction("Bye", "print('Bye')") # 添加一个会话
prompt_engine.remove_first_interaction() # 删除第一个会话
prompt_engine.add_interaction("Hello there", "print('Hello there')") # 添加一个会话
prompt_engine.remove_last_interaction() # 删除最后一个会话
prompt_engine.add_example("Hello there", "print('Hello there')") # 添加一个示例
print(prompt_engine.build_prompt("Hello")) # 生成 prompt 文本
输出:
### test## Hello
print('Hello')## Goodbye
print('Goodbye')## Hello there
print('Hello there')### This is the flow reset text## Bye
print('Bye')## Bye
print('Bye')## Hello
使用CodeEngine生成prompt
Code Engine 为 自然语言转化为代码的场景创建prompt
Code prompt通常需要一个描述,描述应该给出关于模型应该生成的编程语言和应该使用的库,还需要提供一下需求
并且还要给出交互的示例,说明生成的代码类型
CodeEngine默认使用 Python 作为编程语言,您可以将不同的CodeEngineConfig传递给构造函数来为不同的语言创建prompt
假如如果我们想要生成 JavaScript 的prompt,我们可以通过 CodeEngine 实例化 javascript_config 来指定它应该使用的注释运算符:
javascript_config = CodeEngineConfig(description_comment_operator = "/*/", description_comment_close_operator = "/*/", comment_operator = "/*", comment_close_operator = "*/")
code_engine = CodeEngine(config = javascript_config, description = description, examples = examples)
示例:
from prompt_engine.code_engine import CodeEngine, CodeEngineConfig
from prompt_engine.interaction import Interactiondescription = "将自然语言命令转化至JavaScript代码。代码将命令的结果记录到控制台"
examples = [Interaction("18与10的和", "console.log(10 + 18)"),Interaction("18乘以10", "console.log(10 * 18)")
]
javascript_config = CodeEngineConfig(description_comment_operator="/*/", description_comment_close_operator="/*/",comment_operator="/*", comment_close_operator="*/")
code_engine = CodeEngine(config=javascript_config, description=description, examples=examples)query = "1018乘以4的9次方等于多少?"
prompt = code_engine.build_prompt(query)
print(prompt)
输出:
/*/ 将自然语言命令转化至JavaScript代码。代码将命令的结果记录到控制台 /*//* 18与10的和 */
console.log(10 + 18)/* 18乘以10 */
console.log(10 * 18)/* 1018乘以4的9次方等于多少? */
使用ChrtEngine生成prompt
就像Code Engine一样,Chat Engine创建prompt 应该带有描述和示例,不同之处在于Chat Engine为对话场景创建prompt,其中用户和模型都使用自然语言。
示例:
from prompt_engine.chat_engine import ChatEngine, ChatEngineConfig
from prompt_engine.model_config import ModelConfig
from prompt_engine.interaction import InteractionchatEngineConfig = ChatEngineConfig(ModelConfig(max_tokens=1024),user_name="唐哥哥",bot_name="戈登"
)
description = "与机器人戈登的对话。戈登用厌恶的语气进行对话,后续并问了很多问题。"
examples = [Interaction("你是谁?", "我又不认识你,干嘛问我是谁. 你先回答一下你是谁?"),Interaction("说得好,我叫唐哥哥,性别男,27岁,你呢?", "好的,我已经认识你了,我叫戈登。这样可以了吧?")
]
chat_engine = ChatEngine(chatEngineConfig, description, examples)
user_query = "你的家住哪里?"
prompt = chat_engine.build_prompt(user_query)
print(prompt)
输出:
与机器人戈登的对话。戈登用厌恶的语气进行对话,后续并问了很多问题。唐哥哥: 你是谁?
戈登: 我又不认识你,干嘛问我是谁. 你先回答一下你是谁?唐哥哥: 说得好,我叫唐哥哥,性别男,27岁,你呢?
戈登: 好的,我已经认识你了,我叫戈登。这样可以了吧?唐哥哥: 你的家住哪里?
YAML Representation
我们可以把不同的prompt变成不同的yaml文件,这样我们就可以不同的场景进行随意的切换,prompt-engine提供了YAML文件加载到prompt-engine类中的方法。
示例:
chat.yaml
type: chat-engine
config:model-config:max-tokens: 1024user-name: "Abhishek"bot-name: "Bot"
description: "What is the possibility of an event happening?"
examples:- input: "Roam around Mars"response: "This will be possible in a couple years"- input: "Drive a car"response: "This is possible after you get a learner drivers license"
flow-reset-text: "Starting a new conversation"
dialog:- input: "Drink water"response: "Uhm...You don't do that 8 times a day?"- input: "Walk on air"response: "For that you'll need a special device"
from prompt_engine.chat_engine import ChatEngineprompt_engine = ChatEngine()with open("./examples/yaml_examples/chat.yaml") as f:prompt_engine.load_yaml(yaml_config=f.read())print(prompt_engine.build_context())
输出:
What is the possibility of an event happening?Abhishek: Roam around Mars
Bot: This will be possible in a couple yearsAbhishek: Drive a car
Bot: This is possible after you get a learner drivers licenseStarting a new conversationAbhishek: Drink water
Bot: Uhm...You don't do that 8 times a day?Abhishek: Walk on air
Bot: For that you'll need a special device