prompts是大語言模型的輸入,他是基於大語言模型應用的利器。沒有差的大語言模型,只有差的prompts。
寫好prompts才能發揮大語言模型300%的功力。
理論上,要寫好prompts其實不是那麼容易的,但是langchain把這個理論變成了現實,一起來看看吧。
有時候,不是我們使用的語言模型不夠好,而是因為我們寫的prompt不夠優秀。
以下是一些寫好大語言模型的prompts的幾條原則:
具體和詳細:prompts應該具有明確的問題或任務,同時包含足夠的細節和背景資訊,以便大語言模型能夠理解和回答。
可理解和可回答:prompts應該明確清晰,讓大語言模型能夠理解並且回答。避免使用過於抽象、模糊或帶有攻擊性的語言。
有情境和背景:prompts應該包含足夠的情境和背景資訊,讓大語言模型能夠理解問題的重要性和意義,並在回答中提供有意義的資訊。
有目標和方向:prompts應該明確問題或任務的目標和方向,以便大語言模型能夠為需要的資訊提供清晰和有用的答案。
可延伸和可客製化:prompts應該設計成易於擴充套件和客製化,以適應不同的應用場景和使用者需求。
因為很多時候,在類似的場景中,我們的prompts的大體結構是一樣的,只有具體的細節描述有所不同,這時候,就需要用到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中設定回答的格式,提供具體的例子等等,從而得到更好的回覆。
簡單點說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="故事")
之前在介紹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已經介紹完畢。大家去試試看吧。