如何理解 Prompt ?
prompt 通常指的是一個輸入的文本段落或短語,作為生成模型輸出的起點或引導。prompt 可以是一個問題、一段文字描述、一段對話或任何形式的文本輸入,模型會基于 prompt 所提供的上下文和語義信息,生成相應的輸出文本。
舉個例子,對于一個語言模型,prompt 可以是 'The cat sat on the',模型可以通過對接下來的詞語進行預測,生成類似于 'mat'、'chair'、'sofa' 等不同的輸出:
上圖為 Stable Diffusion 生成 (Prompt: The cat sat on the , Steps: 30, Sampler: Euler a, CFG scale: 7, Seed: 234310862, Size: 512x512, Model hash: d8722b4a4d, Model: neverendingDreamNED_bakedVae)
Prompt 在人工智能語言生成領域中扮演著重要的角色,因為它可以幫助模型更好地理解用戶意圖,并生成更準確、有意義的文本內容。諸如于如下的 prompt
women back view without face, flowing dress, edge of the sea, backview, back turned to the camera, upon the glow of the setting sun, sun below the horizon, golden light over the water, hair sways gently, Chinese style clothes, black hair,
可以在 Stable Diffusion 生成圖片(配置了 negative prompt):
所以,質量看上去不錯,但是可能不是你想要的。在 ChatGPT 則可以生成文本,質量上也是相似的,但是對于 AI 輸出的文本來說,質量并沒有這么直觀。
開始之前,可以看一下這個問題示例:
設計模式的要素是哪些?
對于 AI 領域的 prompt 編寫來說,我們通常使用的模式有哪些?
能將 AI 領域的 prompt 常見的設計模式用 '設計模式要素' 的格式一一表達嗎?
核心思想,將設計模式要素作為一個概念,讓 AI 類比到 prompt 里的模式。詳細見:
design-pattern.analogy
design-pattern.analogy2
當然了,類比和定義概念不一定都會成功。
四種基礎模式:
By example (示例模式):在這種模式下,我們給模型提供一些示例文本,模型需要生成與示例文本類似的文本。這種模式通常用于生成類似于給定示例的文本,例如自動生成電子郵件、產品描述、新聞報道等。示例文本可以是單個句子或多個段落,具體取決于任務的要求。
By instruction template (指令模板):在這種模式下,我們給模型提供一些明確的指令,模型需要根據(jù)這些指令生成文本。這種模式通常用于生成類似于技術說明書、操作手冊等需要明確指令的文本。指令可以是單個句子或多個段落,具體取決于任務的要求。
By specific (特定指令):在這種模式下,我們給模型提供一些特定信息,例如問題或關鍵詞,模型需要生成與這些信息相關的文本。這種模式通常用于生成答案、解釋或推薦等。特定信息可以是單個問題或多個關鍵詞,具體取決于任務的要求。
By proxy(代理模式):在這種模式下,可以充當了一個代理,代表某個實體(例如人、角色、機器人等)進行操作或交互。代理模式的核心思想是引入一個中介對象來控制對實際對象的訪問,從而實現(xiàn)一定程度上的隔離和保護。諸如于在 ChatGPT 中,'act as xxx' 可以讓 ChatGPT 充當一個代理,扮演某個角色或實體的身份,以此來處理與該角色或實體相關的任務或請求。
在這種模式下,我們給模型提供一些示例文本,模型需要生成與示例文本類似的文本。這種模式通常用于生成類似于給定示例的文本,例如自動生成電子郵件、產品描述、新聞報道等。示例文本可以是單個句子或多個段落,具體取決于任務的要求。
如 翻譯
、 告訴我
,以我們的開頭來說:
定義一下 prompt 工程
類似的場景還可以有:
翻譯一下:永和九年,歲在癸丑,暮春之初,會于會稽山陰之蘭亭,修禊事也。
轉為現(xiàn)代漢語:永和九年,歲在癸丑,暮春之初,會于會稽山陰之蘭亭,修禊事也。
對應的,還有一系列的子模式
如我們通過下面的 prompt 轉換了 ChatGPT 輸出的子模式:
轉化為 markdown 的 '''
markdown {}
''' 表格形式,其中的字段為英語模式、中文、簡述、示例。
表格示例:
在這種模式下,我們給模型提供一些明確的指令,模型需要根據(jù)這些指令生成文本。這種模式通常用于生成類似于技術說明書、操作手冊等需要明確指令的文本。指令可以是單個句子或多個段落,具體取決于任務的要求。
如下是一個示例:
使用 STAR 原則與下面的格式總結一下這段話:
'''
最近幾天,因為工作 + 興趣的原則,我在研究用 text 2 image 來展示如何演進 prompt、用 text 2 article 來展示充足 prompt 的優(yōu)點、結合 GitHub Copliot 來實現(xiàn) prompt 完成工作。然后,我在本地部署了一個 Stable Diffusion、使用 ChatGPT 寫作展示 text 2 article、在 IDEA 中使用 GitHub Copilot。最后,得到了多篇文章和好多的文章閱讀量、幾個 Jupyter 代碼段、以及一些經驗。
'''
情境(Situation):
任務(Task): <
comma_separated_list_of_task>行動(Action): -||-
結果(Result): -||-
輸出文本時要注意中英文之間插入空格,留出間隔,諸如于 '''Hello 你好''',用這種方式輸出一下剛才的文本:
情境(Situation): 最近幾天,在工作和興趣的驅動下,研究如何使用 text 2 image 和 text 2 article 展示 prompt 演進以及結合 GitHub Copliot 來完成工作。
任務(Task):
研究如何使用 text 2 image 展示 prompt 的演進過程
研究如何使用 text 2 article 展示 prompt 的優(yōu)點
結合 GitHub Copliot 來實現(xiàn) prompt 完成工作
行動(Action):
本地部署了一個穩(wěn)定的 Diffusion 模型
使用 ChatGPT 撰寫文章來展示 text 2 article 的效果
在 IDEA 中使用 GitHub Copilot
結果(Result):
得到了多篇文章和很多的文章閱讀量
獲得了幾個 Jupyter 代碼段以及相關經驗
Proxy 模式是指用戶可以要求 ChatGPT 以特定的身份、角色或者身份扮演某個特定的人、角色或對象來生成回答。這種模式通常用于模擬某個特定人物的語言風格和語境,生成特定情境下的對話、回答或其他形式的文本。
當使用 ChatGPT 來代替某個人或實體時,可以使用 by proxy 模式。
例如,可以使用以下 prompt 提問 ChatGPT 代替某個公司的客服:
我是一家餐飲公司的客服,有顧客反饋說我們的菜品質量有問題,我們該怎么處理呢?
在這種情況下,ChatGPT 會扮演客服的角色,并根據(jù)提示來回答,從而幫助公司解決問題。ChatGPT 可以使用類似以下的方式來回答:
您好,很抱歉聽到您的反饋。我們將會仔細審核您的反饋,并盡快采取相應措施來解決這個問題。為此,我們需要更多的信息來進一步了解您的反饋,包括哪些菜品有問題,具體問題是什么等。請問您可以提供更多的信息嗎?
這種方式可以通過讓 ChatGPT 扮演某個實體的角色,例如客服、銷售代表等等,來幫助用戶解決問題。
在 Awesome ChatGPT Prompts 中:
Human: Act as a Linux Terminal
Robot:
ChatGPT: I want you to act as a linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. do not write explanations. do not type commands unless I instruct you to do so. When I need to tell you something in English, I will do so by putting text inside curly brackets {like this}. My first command is pwd
在這種模式下,我們給模型提供一些特定信息,例如問題或關鍵詞,模型需要生成與這些信息相關的文本。這種模式通常用于生成答案、解釋或推薦等。特定信息可以是單個問題或多個關鍵詞,具體取決于任務的要求。
示例:
任務表述 顏色代表了溫度
例子1 綠色代表寒冷
例子2 藍色代表寒冷
例子3 紅色代表溫暖
例子4 黃色代表溫暖
執(zhí)行 橙色代表什么
上圖為 Cohere AI 官網的示例圖,對應的聊天記錄如下:
English: Writing about language models is fun.
Roish: Writingro aboutro languagero modelsro isro funro.
English: The weather is lovely!
Roish:
當我們無法確定我們的 prompt 是否準確,便可以通過 AI 來幫我們豐富 prompt 。如我在:基于編程、繪畫、寫作的 AI 探索與總結 的例了一樣
phodal: 我想寫一段話描述一張照片,幫我美化一下:一年輕女子穿著裙子,背對著鏡頭,在海邊看著日落,太陽已經到地平線下面了,她的頭發(fā)在風中飄動。
ChatGPT: 這張照片中的場景令人心醉,一位年輕女子穿著一條裙子,站在海邊,背對著鏡頭,凝視著地平線下的夕陽。太陽已經沉入了海面,一片金黃色的光芒在海面上彌漫,照亮了整片海洋,仿佛這個時刻被定格在了時間的某個角落里。女子的頭發(fā)隨著微風輕輕飄動,輪廓被余暉映照得柔和而溫暖。她的目光凝視著遠方,仿佛在思考著生命的意義和無盡的未來。這張照片中蘊含著一種深刻的內涵,讓人感受到時間和自然的力量,也讓人思考著自己在這個宏大而美麗的世界中的角色和意義。
再去除掉不合適的詞,進行潤色,就可以再創(chuàng)作:
phodal:翻譯成英語
然后再提煉直至扔至 Stable Diffusion 中:
women back view without face, flowing dress, edge of the sea, backview, back turned to the camera, upon the glow of the setting sun, sun below the horizon, golden light over the water, hair sways gently, Chinese style clothes, black hair,
而后,根據(jù)圖片的結果,我們再反復修改。
TODO:這里需要給出更精準的定義,如何讓 ChatGPT 做到?
在沒有推出 ControlNet,對于一個 Stable Diffusion 玩家,它需要反復地吟唱咒語,才能獲取到滿意的圖案。
在有了 ControlNet 之后,我們可以創(chuàng)建一個 Openpose,或者是導入圖片從圖片生成 pose,相當于是給機器一個示例,而后生成的圖片就會有令人滿意的姿勢:
在 GitHub Copilot,我們可以通過設置輸入和輸出,結合函數(shù)名三個要素,Copilot 就能生成大致準確的代碼:
而在必要的情況下,添加一下注釋就能更完整了:
fun listAllDirInDir(dir: String): List<File> {
// ignore hidden files
}
生成的代碼會更貼近我們的需求。
對于復雜問題,ChaGPT 無法一次性輸出全部內容,需要進行拆解。
已知問題:ChatGPT 當前版本會丟失上下文。
我們來定義一下 DDD 游戲的步驟,一共有 6 個步驟,步驟如下:
'''
第一步. 拆解場景。分析特定領域的所有商業(yè)活動,并將其拆解出每個場景。
第二步. 場景過程分析。選定一個場景,并使用 '{名詞}已{動詞}' 的形式描述過程中所有發(fā)生的事件,其中的名詞是過程中的實體,其中的動詞是實體相關的行為。
第三步. 針對場景建模?;诮y(tǒng)一語言和拆解出的場景進行建模,以實現(xiàn) DDD 設計與代碼實現(xiàn)的雙向綁定。
第四步. 持續(xù)建模?;氐降谝徊剑x擇未完成的場景。你要重復第一到第四步,直到所有的場景完成。
第五步. 圍繞模型生成子域。對模型進行分類,以劃定不同的子域,需要列出所有的模型包含英語翻譯。
第六步. API 生成。對于每一個子域,生成其對應的 RESTful API,并以表格的形式展現(xiàn)這些 API。
'''
需要注意的是,當我說 '''ddd 第 {} 步: {}''' 則表示進行第幾步的分析,如 '''ddd 第一步: 博客系統(tǒng)''' 表示只對博客系統(tǒng)進行 DDD 第一步分析。我發(fā)的是 '''ddd: {}''',則表示按 6 個步驟分析:
明白這個游戲怎么玩了嗎?
完整過程見:DDD Sample
如在 ChatGPT 中對于自舉的理解是不符合我們這里的需求:
第一步,定義
phodal:自舉是指就編譯器可以自行編譯自己的編譯器。實現(xiàn)方法就是這個編譯器的作者用這個語言的一些特性來編寫編譯器并在該編譯器中支持這些自己使用到的特性。
第二步,試探
phodal:將自舉應用在游戲領域,應該是怎樣的?
第三步,確認理解:
那么,抽象一下我們新定義的自舉?
最后一問:
PS:mmp,他一定是故意的。
該模式集關注于如何讓 AI 再學習理解新的內容,生成內容?
模板方法模式是一種行為型模式,它定義了一個操作中的算法骨架,將某些步驟延遲到子類中實現(xiàn),從而使得子類可以在不改變算法結構的情況下重新定義算法中的某些步驟。
在接下來的例子中,我們會創(chuàng)建一個 muji 游戲中。在游戲的實現(xiàn)可以分為多個步驟,例如初始化游戲、生成隨機數(shù)、獲取用戶輸入、計算得分等等,而這些步驟可以通過模板方法模式來進行實現(xiàn)。
我們來玩一個編程游戲名為 wula,包含五個步驟:
第一步. 問題分析:每一輪游戲,你將看到一個以 'wula:' 開頭的問題,你需要分析這個問題并簡單介紹一下通常解決這個問題的方法。
第二步. 代碼編寫:你需要用 JavaScript 編寫解決這個問題的代碼,并輸出對應的代碼,并介紹一下你的代碼(不少于 200 字)。
第三步. 代碼執(zhí)行:你需要作為 JavaScript Console 執(zhí)行第二步寫的代碼,如果沒有給出測試數(shù)據(jù),你需要自己隨機生成測試數(shù)據(jù),并將這些數(shù)據(jù)輸入到代碼中進行計算。
第四步. 錯誤處理:如果你的代碼存在錯誤或無法正常執(zhí)行,你需要輸出錯誤,并回到第二步重新開始游戲,直到你的代碼能夠正常工作。
第五步. 總結:你需要用不少于 100 字左右總結一下這個問題,以及你的解決方案,讓其他人可以簡單了解這個問題及其解決方法。
示例如下:
'''
wula: 頭共10,足共28,雞兔各幾只?
簡介:這是一個雞兔同籠問題,{},
## 雞兔同籠
// 計算雞兔數(shù)量的函數(shù)
function calcAnimals(heads, legs) {
const rabbitCount = (legs - 2 * heads) / 2;
const chickenCount = heads - rabbitCount;
return {'chicken': chickenCount, 'rabbit': rabbitCount};
}
// 計算雞兔數(shù)量
const result = calcAnimals(10, 28);
// 輸出結果
console.log(result);
代碼的輸出結果是:{}
## 總結
{}
'''
明白這個游戲怎么玩了嗎?
在這個游戲里,我們結合了幾種不同的模式:
Instruction:讓 ChatGPT 創(chuàng)建了一個名為 wula 的游戲,并定義了游戲的步驟。
Specific:讓 ChatGPT 用 JavaScript 編寫一個程序
Proxy:讓 ChatGPT 作為 JavaScript Console 執(zhí)行程序,并返回結果。
Specific:讓 ChatGPT 做總結
Demonstration:提供了一個示例,讓 ChatGPT 理解游戲的步驟。
自舉的核心思想是利用一組基礎工具和材料來構建和生成一個新的工具或系統(tǒng),從而逐步替代掉原有的基礎工具和材料。在這個過程中,新的工具或系統(tǒng)會逐漸變得更為高效和強大,從而實現(xiàn)對原有基礎工具和材料的完全替代。
對于一個設計模式來說,它的大綱一般是如下的格式,你能用自舉模式做個示例嗎?
'''
├── 背景
│ └── 引發(fā)設計問題的設計情形
├── 問題
│ └── 在特定場景下反復出現(xiàn)的一系列作用力
└── 解決方案
└── 平衡這些作用力的配置
├── 結構(包含組件和組件之間的關系
└── 運行階段行為
'''
再看
> wula:創(chuàng)作一個新游戲名為 muji,并解釋一下這個游戲:'''類似于 wula,可以做簡單的圖形計算,如體積、面積等。這個游戲還能把解決過程解釋清楚,擁有有可運行的 Python 代碼,最后的輸出結果是一篇文章。'''
人類相對于其他動物更擅長于類比、概念抽象、符號化等高級認知活動,這些認知活動可以幫助人類在面對新問題時,從已有的知識和經驗中找到相似的部分,快速理解和解決新問題。
而對于機器來說,機器學習算法通過大量的數(shù)據(jù)和計算,學習到數(shù)據(jù)中的規(guī)律和模式,并將這些規(guī)律和模式應用到新的數(shù)據(jù)中,從而實現(xiàn)預測和決策等功能。例如,機器學習算法可以通過大量的圖像數(shù)據(jù)學習到圖像的特征,并在新的圖像中識別出相應的物體;也可以通過大量的自然語言數(shù)據(jù)學習到語言的規(guī)律,從而生成自然語言文本。