langchain:Prompt在手,天下我有

2023-07-11 12:01:08

簡介

prompts是大語言模型的輸入,他是基於大語言模型應用的利器。沒有差的大語言模型,只有差的prompts。

寫好prompts才能發揮大語言模型300%的功力。

理論上,要寫好prompts其實不是那麼容易的,但是langchain把這個理論變成了現實,一起來看看吧。

好的prompt

有時候,不是我們使用的語言模型不夠好,而是因為我們寫的prompt不夠優秀。

以下是一些寫好大語言模型的prompts的幾條原則:

  1. 具體和詳細:prompts應該具有明確的問題或任務,同時包含足夠的細節和背景資訊,以便大語言模型能夠理解和回答。

  2. 可理解和可回答:prompts應該明確清晰,讓大語言模型能夠理解並且回答。避免使用過於抽象、模糊或帶有攻擊性的語言。

  3. 有情境和背景:prompts應該包含足夠的情境和背景資訊,讓大語言模型能夠理解問題的重要性和意義,並在回答中提供有意義的資訊。

  4. 有目標和方向:prompts應該明確問題或任務的目標和方向,以便大語言模型能夠為需要的資訊提供清晰和有用的答案。

  5. 可延伸和可客製化:prompts應該設計成易於擴充套件和客製化,以適應不同的應用場景和使用者需求。

因為很多時候,在類似的場景中,我們的prompts的大體結構是一樣的,只有具體的細節描述有所不同,這時候,就需要用到prompt template.

什麼是prompt template

prompt template就是一個prompt的模板,通過prompt template,我們可以快速的生成多個prompt。

基本上prompt template已經幫我們描述好了場景,要做的事情。我們只需要填入具體的內容即可。

下面是一個prompt template的簡單例子:

from langchain import PromptTemplate


template = """/
假如你是一個金融公司的理財經理,請你分析一下{stock}這隻股票。
"""

prompt = PromptTemplate.from_template(template)
prompt.format(stock="騰訊控股")

假如你是一個金融公司的理財經理,請你分析一下騰訊控股這隻股票。

這樣,對於使用者來說,只需要輸入需要問詢的股票名稱即可。其他的一長串文字就不需要了,大大節省了prompt構建的時間。

當然,這只是一個非常簡單的例子,你還可以在prompt template中設定回答的格式,提供具體的例子等等,從而得到更好的回覆。

在langchain中建立prompt template

簡單點說prompt template就是一個格式化輸入的東西。在langchain中,對應的工具類叫做PromptTemplate。

上面的簡單例子中,我們已經大體看到了如何使用PromptTemplate。

在上例中,我們呼叫了PromptTemplate.from_template方法,傳入了一個template的字串。

在template的字串中,我們用括號定義了一個變數。最後呼叫prompt.format方法,指定變數的名稱和值,完成prompt的最終建立。

另外,prompt template中還可以指定多個變數:

template = "請告訴我一個關於{personA}的{thingsB}"

prompt_template = PromptTemplate.from_template(template)
prompt_template.format(personA="小張", thingsB="故事")

只需要在format中指定變數名稱即可。

除了是用PromptTemplate.from_template方法之外,我們還可以直接使用PromptTemplate的建構函式來建立prompt。

PromptTemplate的建構函式可以接受兩個引數:input_variables和template。

input_variables是template中的變數名字,它是一個陣列。

template就是模板的具體內容,是個字串。

比如,我們可以構造無變數的模板:

no_input_prompt = PromptTemplate(input_variables=[], template="這是一個無引數模板。")
no_input_prompt.format()

我們還可以構造帶引數模板:

one_input_prompt = PromptTemplate(input_variables=["stock"], template="假如你是一個金融公司的理財經理,請你分析一下{stock}這隻股票。")
one_input_prompt.format(stock="騰訊控股")

還有多個引數的模板:

multiple_input_prompt = PromptTemplate(
    input_variables=["personA", "thingsB"], 
    template="請告訴我一個關於{personA}的{thingsB}"
)
multiple_input_prompt.format(personA="小張", thingsB="故事")

Chat特有的prompt template

之前在介紹langchain的時候有跟大家提到過,chat雖然是基於LLM的,但是和基本的LLM還有有區別的。

最主要的區別在於,chat訊息是不同角色的。比如在openai中,chat訊息就可以被分為AI, human或者system這幾種角色。

這樣做雖然複雜了一點,但是可以更好的對訊息進行分類處理。

我們看下langchain中關於chat的PromptTemplate有哪些:

from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

和普通的prompt template一樣,我們可以呼叫MessagePromptTemplate的from_template來建立對應的prompt:

template="現在你的角色是{role},請按該角色進行後續的對話."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

當然你可以通過建構函式來建立prompt:

prompt=PromptTemplate(
    template="現在你的角色是{role},請按該角色進行後續的對話.",
    input_variables=["role"],
)

有了一個或者多個MessagePromptTemplates之後,就可以使用這些MessagePromptTemplates來構建ChatPromptTemplate了:

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

chat_prompt.format_prompt(role="醫生", text="幫我看看我的顏值還行嗎?").to_messages()

總結

好了, 基本的langchain中的prompt template已經介紹完畢。大家去試試看吧。