Java 程序員從零開始學(xué) LangChain —提示詞組件
前面的文章了不起給大家介紹了 LangChain 的一些基本知識,沒看過的小伙伴可以點(diǎn)擊這里去看下,今天了不起給大家介紹一下 LangChain 的第一個很重要的組件提示詞 Prompt。
什么提示詞
用過 ChatGPT 的小伙伴都知道,我們提供輸入,然后 ChatGPT 會提供回答,這里我們提供的輸入在 LLM 領(lǐng)域有一個專業(yè)名詞就叫做提示詞。
我們在使用 ChatGPT 的時候,有時候會設(shè)置很多默認(rèn)的角色,并且常用的提示詞有很多,比如
- 我想讓你擔(dān)任 Android 開發(fā)工程師面試官。我將成為候選人,您將向我詢問 Android 開發(fā)工程師職位的面試問題。我希望你只作為面試官回答。不要一次寫出所有的問題。我希望你只對我進(jìn)行采訪。問我問題,等待我的回答。不要寫解釋。像面試官一樣一個一個問我,等我回答。我的第一句話是“面試官你好”
- 我想讓你充當(dāng) Linux 終端。我將輸入命令,您將回復(fù)終端應(yīng)顯示的內(nèi)容。我希望您只在一個唯一的代碼塊內(nèi)回復(fù)終端輸出,而不是其他任何內(nèi)容。不要寫解釋。除非我指示您這樣做,否則不要鍵入命令。當(dāng)我需要用英語告訴你一些事情時,我會把文字放在中括號內(nèi)[就像這樣]。我的第一個命令是 pwd
上面的這些內(nèi)容算是一種稍微復(fù)雜的提示詞,而且我們可以看到,這些常用的提示詞結(jié)構(gòu)其實(shí)都比較相似,因此為了更加的通用,我們可以使用一個模板來表達(dá),比如:我希望你擔(dān)任一個 {xxx},我將會提供 {yyy},你會按照 {zzz} 等等這種形式來組裝。
提示詞模板
上面提到了,為了更加通用的使用提示詞,LangChain 定義了一個提示詞模板的組件,通過提示詞模板組件我們可以創(chuàng)建提示詞,方便開發(fā)者更好的使用提示詞。
from langchain import PromptTemplate
template = """
I want you to act as a naming consultant for new companies.
What is a good name for a company that makes {product}?
"""
prompt = PromptTemplate(
input_variables=["product"],
template=template,
)
prompt.format(product="colorful socks")
# -> I want you to act as a naming consultant for new companies.
# -> What is a good name for a company that makes colorful socks?
如上所示,我們先創(chuàng)建一個提示詞模板字符串,其中用{product} 來替代需要替換的內(nèi)容,接著通過構(gòu)造 PromptTemplate 的時候傳遞 input_variables["product"] 參數(shù),表示 product 是一個需要被替換的變量,最后通過 format 方法來設(shè)置真實(shí)要替換的內(nèi)容。
此外我們可以構(gòu)造無輸入變量的提示詞模板,也可以構(gòu)造多輸入?yún)?shù)的模板,如下所示
from langchain import PromptTemplate
# An example prompt with no input variables
no_input_prompt = PromptTemplate(input_variables=[], template="Tell me a joke.")
no_input_prompt.format()
# -> "Tell me a joke."
# An example prompt with one input variable
one_input_prompt = PromptTemplate(input_variables=["adjective"], template="Tell me a {adjective} joke.")
one_input_prompt.format(adjective="funny")
# -> "Tell me a funny joke."
# An example prompt with multiple input variables
multiple_input_prompt = PromptTemplate(
input_variables=["adjective", "content"],
template="Tell me a {adjective} joke about {content}."
)
multiple_input_prompt.format(adjective="funny", cnotallow="chickens")
# -> "Tell me a funny joke about chickens."
序列化提示詞模板
我們可以將制作好的提示詞模板進(jìn)行序列化,存放的 json 或者 yaml 文件中,然后在其他地方可以加載使用,LangChain 會根據(jù)存放文件的后綴名來寫入對應(yīng)格式的數(shù)據(jù)。
prompt_template.save("awesome_prompt.json") # Save to JSON file
from langchain.prompts import load_prompt
loaded_prompt = load_prompt("awesome_prompt.json")
assert prompt_template == loaded_prompt
零樣本提示詞和小樣本提示詞
說明提示詞模板過后,我們再來了解一下什么是零樣本提示詞和小樣本提示詞。
零樣本提示詞
如下圖所示,我們通過直接詢問 ChatGPT 一句話是積極、中性還是消極的情緒,其中我們并沒有告訴 ChatGPT 什么樣的情緒是積極的,什么樣是中性以及什么樣是消極的。
但是 ChatGPT 能夠很好的回答出來,這是因?yàn)?nbsp;ChatGPT 已經(jīng)學(xué)習(xí)了大量網(wǎng)絡(luò)上的內(nèi)容,這種情況就是我們所說的零樣本提示。因?yàn)槲覀兲釂栔安]有給 ChatGPT 任務(wù)示例和樣本。
小樣本提示詞
顧名思義小樣本提示詞表示我們在進(jìn)行提問的時候會提供少量的小樣本提示詞給到 ChatGPT,讓 ChatGPT 根據(jù)我們提供發(fā)小樣本來學(xué)習(xí)進(jìn)行回答。
之所以有小樣本提示詞是因?yàn)樵陔S著我們跟 ChatGPT 溝通對話次數(shù)的增加的時候,有時候話題會逃逸,所以我們改變每次傳遞的上下文信息,而是只傳遞小樣本指示詞,可以讓我們的話題始終保持初始狀態(tài)。
另外一個是由于我們跟 ChatGPT 的對話每次都是收費(fèi)的,會根據(jù)我們傳遞的上下文的長度來計費(fèi),通過這種方式我們也可以減少傳遞的內(nèi)容,避免長對話內(nèi)容被傳遞增加費(fèi)用。
舉個例子
User: 從現(xiàn)在起你是一個充滿哲學(xué)思維的心靈導(dǎo)師,當(dāng)我每次輸入一個疑問時你需要用一句富有哲理的名言警句來回答我,并且表明作者和出處\n\n\n要求字?jǐn)?shù)不少于15個字,不超過30字,每次只返回一句且不輸出額外的其他信息,你需要使用中文和英文雙語輸出\n\n\n當(dāng)你準(zhǔn)備好的時候只需要回復(fù)“我已經(jīng)準(zhǔn)備好了”(不需要輸出任何其他內(nèi)容)
我作業(yè)寫不完怎么辦
“行動是治愈恐懼的良藥?!?- 威廉·詹姆斯\n"Action is the antidote to fear." - William James
論文被拒了怎么辦
“失敗是成功之母?!?- 俗語\n"Failure is the mother of success." - Chinese proverb
使用樣例
總結(jié)
今天給大家介紹了一下 LangChain 的提示詞組件,有了提示詞和提示詞模板組件我們就可以更加方便的跟各種 LLMs 進(jìn)行交互,并且可以更加靈活的構(gòu)造屬于自己的模板,今天的分享就到這里,感興趣的小伙伴可以去試試哦。
參考資料
官方文檔:https://python.langchain.com/en/latest/modules/prompts.html