Java 程序員從零開始學 LangChain —提示詞組件
前面的文章了不起給大家介紹了 LangChain 的一些基本知識,沒看過的小伙伴可以點擊這里去看下,今天了不起給大家介紹一下 LangChain 的第一個很重要的組件提示詞 Prompt。
什么提示詞
用過 ChatGPT 的小伙伴都知道,我們提供輸入,然后 ChatGPT 會提供回答,這里我們提供的輸入在 LLM 領域有一個專業名詞就叫做提示詞。
我們在使用 ChatGPT 的時候,有時候會設置很多默認的角色,并且常用的提示詞有很多,比如
- 我想讓你擔任 Android 開發工程師面試官。我將成為候選人,您將向我詢問 Android 開發工程師職位的面試問題。我希望你只作為面試官回答。不要一次寫出所有的問題。我希望你只對我進行采訪。問我問題,等待我的回答。不要寫解釋。像面試官一樣一個一個問我,等我回答。我的第一句話是“面試官你好”
- 我想讓你充當 Linux 終端。我將輸入命令,您將回復終端應顯示的內容。我希望您只在一個唯一的代碼塊內回復終端輸出,而不是其他任何內容。不要寫解釋。除非我指示您這樣做,否則不要鍵入命令。當我需要用英語告訴你一些事情時,我會把文字放在中括號內[就像這樣]。我的第一個命令是 pwd
上面的這些內容算是一種稍微復雜的提示詞,而且我們可以看到,這些常用的提示詞結構其實都比較相似,因此為了更加的通用,我們可以使用一個模板來表達,比如:我希望你擔任一個 {xxx},我將會提供 {yyy},你會按照 {zzz} 等等這種形式來組裝。
提示詞模板
上面提到了,為了更加通用的使用提示詞,LangChain 定義了一個提示詞模板的組件,通過提示詞模板組件我們可以創建提示詞,方便開發者更好的使用提示詞。
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?
如上所示,我們先創建一個提示詞模板字符串,其中用{product} 來替代需要替換的內容,接著通過構造 PromptTemplate 的時候傳遞 input_variables["product"] 參數,表示 product 是一個需要被替換的變量,最后通過 format 方法來設置真實要替換的內容。
此外我們可以構造無輸入變量的提示詞模板,也可以構造多輸入參數的模板,如下所示
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."
序列化提示詞模板
我們可以將制作好的提示詞模板進行序列化,存放的 json 或者 yaml 文件中,然后在其他地方可以加載使用,LangChain 會根據存放文件的后綴名來寫入對應格式的數據。
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 能夠很好的回答出來,這是因為 ChatGPT 已經學習了大量網絡上的內容,這種情況就是我們所說的零樣本提示。因為我們提問之前并沒有給 ChatGPT 任務示例和樣本。
小樣本提示詞
顧名思義小樣本提示詞表示我們在進行提問的時候會提供少量的小樣本提示詞給到 ChatGPT,讓 ChatGPT 根據我們提供發小樣本來學習進行回答。
之所以有小樣本提示詞是因為在隨著我們跟 ChatGPT 溝通對話次數的增加的時候,有時候話題會逃逸,所以我們改變每次傳遞的上下文信息,而是只傳遞小樣本指示詞,可以讓我們的話題始終保持初始狀態。
另外一個是由于我們跟 ChatGPT 的對話每次都是收費的,會根據我們傳遞的上下文的長度來計費,通過這種方式我們也可以減少傳遞的內容,避免長對話內容被傳遞增加費用。
舉個例子
User: 從現在起你是一個充滿哲學思維的心靈導師,當我每次輸入一個疑問時你需要用一句富有哲理的名言警句來回答我,并且表明作者和出處\n\n\n要求字數不少于15個字,不超過30字,每次只返回一句且不輸出額外的其他信息,你需要使用中文和英文雙語輸出\n\n\n當你準備好的時候只需要回復“我已經準備好了”(不需要輸出任何其他內容)
我作業寫不完怎么辦
“行動是治愈恐懼的良藥。” - 威廉·詹姆斯\n"Action is the antidote to fear." - William James
論文被拒了怎么辦
“失敗是成功之母。” - 俗語\n"Failure is the mother of success." - Chinese proverb
使用樣例
總結
今天給大家介紹了一下 LangChain 的提示詞組件,有了提示詞和提示詞模板組件我們就可以更加方便的跟各種 LLMs 進行交互,并且可以更加靈活的構造屬于自己的模板,今天的分享就到這里,感興趣的小伙伴可以去試試哦。
參考資料
官方文檔:https://python.langchain.com/en/latest/modules/prompts.html