購(gòu)物網(wǎng)站開(kāi)發(fā)面試西安網(wǎng)站seo診斷
【LangChain學(xué)習(xí)之旅】—(5) 提示工程(上):用少樣本FewShotTemplate和ExampleSelector創(chuàng)建應(yīng)景文案
- 提示的結(jié)構(gòu)
- LangChain 提示模板的類(lèi)型
- 使用 PromptTemplate
- 使用 ChatPromptTemplate
- FewShot 的思想起源
- 使用 FewShotPromptTemplate
- 1. 創(chuàng)建示例樣本
- 2. 創(chuàng)建提示模板
- 3. 創(chuàng)建 FewShotPromptTemplate 對(duì)象
- 4. 調(diào)用大模型創(chuàng)建新文案
- 使用示例選擇器
- 總結(jié)
Reference:LangChain 實(shí)戰(zhàn)課
在提示模板的構(gòu)建過(guò)程中加入了 partial_variables,也就是輸出解析器指定的 format_instructions 之后,為什么能夠讓模型生成結(jié)構(gòu)化的輸出?
用 print 語(yǔ)句打印出最終傳遞給大模型的提示
您是一位專(zhuān)業(yè)的鮮花店文案撰寫(xiě)員。
對(duì)于售價(jià)為 50 元的 玫瑰 ,您能提供一個(gè)吸引人的簡(jiǎn)短描述嗎?
The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":```json
{"description": string // 鮮花的描述文案"reason": string // 問(wèn)什么要這樣寫(xiě)這個(gè)文案
}
LangChain 的輸出解析器偷偷的在提示中加了一段話(huà),也就是 {format_instructions} 中的內(nèi)容。這段由 LangChain 自動(dòng)添加的文字,就清楚地指示著我們希望得到什么樣的回答以及回答的具體格式。提示指出,模型需要根據(jù)一個(gè) schema 來(lái)格式化輸出文本,這個(gè) schema 從 json 開(kāi)始,到
結(jié)束。
這就是在告訴模型,你就 follow 這個(gè) schema(schema,可以理解為對(duì)數(shù)據(jù)結(jié)構(gòu)的描述)的格式,就行啦!
這就是一個(gè)很棒、很典型的提示工程。有了這樣清晰的提示,智能程度比較高的模型(比如 GPT3.5 及以上版本),肯定能夠輸出可以被解析的數(shù)據(jù)結(jié)構(gòu),如 JSON 格式的數(shù)據(jù)。
如何利用 LangChain 中的提示模板,做好提示工程。
無(wú)獨(dú)有偶,在 Open AI 的官方文檔 GPT 最佳實(shí)踐中,也給出了和上面這兩大原則一脈相承的 6 大策略。分別是:
- 寫(xiě)清晰的指示
- 給模型提供參考(也就是示例)
- 將復(fù)雜任務(wù)拆分成子任務(wù)
- 給 GPT 時(shí)間思考
- 使用外部工具
- 反復(fù)迭代問(wèn)題
怎么樣,這些原則和策略是不是都是大白話(huà)?這些原則其實(shí)不僅能夠指導(dǎo)大語(yǔ)言模型,也完全能夠指導(dǎo)你的思維過(guò)程,讓你處理問(wèn)題時(shí)的思路更為清晰。所以說(shuō),大模型的思維過(guò)程和我們?nèi)祟?lèi)的思維過(guò)程,還是蠻相通的。
提示的結(jié)構(gòu)
從大原則到實(shí)踐,還是有一些具體工作需要說(shuō)明,下面我們先看一個(gè)實(shí)用的提示框架。
在這個(gè)提示框架中:
- 指令(Instruction)告訴模型這個(gè)任務(wù)大概要做什么、怎么做,比如如何使用提供的外部信息、如何處理查詢(xún)以及如何構(gòu)造輸出。這通常是一個(gè)提示模板中比較固定的部分。一個(gè)常見(jiàn)用例是告訴模型“你是一個(gè)有用的 XX 助手”,這會(huì)讓他更認(rèn)真地對(duì)待自己的角色。
- 上下文(Context)則充當(dāng)模型的額外知識(shí)來(lái)源。這些信息可以手動(dòng)插入到提示中,通過(guò)矢量數(shù)據(jù)庫(kù)檢索得來(lái),或通過(guò)其他方式(如調(diào)用 API、計(jì)算器等工具)拉入。一個(gè)常見(jiàn)的用例時(shí)是把從向量數(shù)據(jù)庫(kù)查詢(xún)到的知識(shí)作為上下文傳遞給模型。
- 提示輸入(Prompt Input)通常就是具體的問(wèn)題或者需要大模型做的具體事情,這個(gè)部分和“指令”部分其實(shí)也可以合二為一。但是拆分出來(lái)成為一個(gè)獨(dú)立的組件,就更加結(jié)構(gòu)化,便于復(fù)用模板。這通常是作為變量,在調(diào)用模型之前傳遞給提示模板,以形成具體的提示。
- 輸出指示器(Output Indicator)標(biāo)記??要生成的文本的開(kāi)始。這就像我們小時(shí)候的數(shù)學(xué)考卷,先寫(xiě)一個(gè)“解”,就代表你要開(kāi)始答題了。如果生成 Python 代碼,可以使用 “import” 向模型表明它必須開(kāi)始編寫(xiě) Python 代碼(因?yàn)榇蠖鄶?shù) Python 腳本以 import 開(kāi)頭)。這部分在我們和 ChatGPT 對(duì)話(huà)時(shí)往往是可有可無(wú)的,當(dāng)然 LangChain 中的代理在構(gòu)建提示模板時(shí),經(jīng)常性的會(huì)用一個(gè)“Thought:”(思考)作為引導(dǎo)詞,指示模型開(kāi)始輸出自己的推理(Reasoning)。
LangChain 提示模板的類(lèi)型
如何使用 LangChain 中的各種提示模板做提示工程,將更優(yōu)質(zhì)的提示輸入大模型。
LangChain 中提供 String(StringPromptTemplate)和 Chat(BaseChatPromptTemplate)兩種基本類(lèi)型的模板,并基于它們構(gòu)建了不同類(lèi)型的提示模板:
這些模板的導(dǎo)入方式如下:
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (ChatMessagePromptTemplate,SystemMessagePromptTemplate,AIMessagePromptTemplate,HumanMessagePromptTemplate,
)
我發(fā)現(xiàn)有時(shí)候不指定 .prompts,直接從 LangChain 包也能導(dǎo)入模板。
from langchain import PromptTemplate
下面我們通過(guò)示例來(lái)介紹上面這些模版,前兩個(gè)我們簡(jiǎn)單了解就好,其中最典型的 FewShotPromptTemplate 會(huì)重點(diǎn)講。至于 PipelinePrompt 和自定義模板,使用起來(lái)比較簡(jiǎn)單,請(qǐng)你參考 LangChain 文檔自己學(xué)習(xí)。
使用 PromptTemplate
下面通過(guò)示例簡(jiǎn)單說(shuō)明一下 PromptTemplate 的使用。
from langchain import PromptTemplatetemplate = """\
你是業(yè)務(wù)咨詢(xún)顧問(wèn)。
你給一個(gè)銷(xiāo)售{product}的電商公司,起一個(gè)好的名字?
"""
prompt = PromptTemplate.from_template(template)print(prompt.format(product="鮮花"))
輸出:
你是業(yè)務(wù)咨詢(xún)顧問(wèn)。
你給一個(gè)銷(xiāo)售鮮花的電商公司,起一個(gè)好的名字?
這個(gè)程序的主要功能是生成適用于不同場(chǎng)景的提示,對(duì)用戶(hù)定義的一種產(chǎn)品或服務(wù)提供公司命名建議。
在這里,“你是業(yè)務(wù)咨詢(xún)顧問(wèn)。你給一個(gè)銷(xiāo)售{product}的電商公司,起一個(gè)好的名字?” 就是原始提示模板,其中 {product} 是占位符。
然后通過(guò) PromptTemplate 的 from_template 方法,我們創(chuàng)建了一個(gè)提示模板對(duì)象,并通過(guò) prompt.format 方法將模板中的 {product} 替換為 “鮮花”。
這樣,就得到了一句具體的提示:你是業(yè)務(wù)咨詢(xún)顧問(wèn)。你給一個(gè)銷(xiāo)售鮮花的電商公司,起一個(gè)好的名字?——這就要求大語(yǔ)言模型,要有的放矢。
在上面這個(gè)過(guò)程中,LangChain 中的模板的一個(gè)方便之處是 from_template 方法可以從傳入的字符串中自動(dòng)提取變量名稱(chēng)(如 product),而無(wú)需刻意指定。上面程序中的 product 自動(dòng)成為了 format 方法中的一個(gè)參數(shù)。
當(dāng)然,也可以通過(guò)提示模板類(lèi)的構(gòu)造函數(shù),在創(chuàng)建模板時(shí)手工指定 input_variables,示例如下:
prompt = PromptTemplate(input_variables=["product", "market"], template="你是業(yè)務(wù)咨詢(xún)顧問(wèn)。對(duì)于一個(gè)面向{market}市場(chǎng)的,專(zhuān)注于銷(xiāo)售{product}的公司,你會(huì)推薦哪個(gè)名字?"
)
print(prompt.format(product="鮮花", market="高端"))
輸出:
你是業(yè)務(wù)咨詢(xún)顧問(wèn)。對(duì)于一個(gè)面向高端市場(chǎng)的,專(zhuān)注于銷(xiāo)售鮮花的公司,你會(huì)推薦哪個(gè)名字?
上面的方式直接生成了提示模板,并沒(méi)有通過(guò) from_template 方法從字符串模板中創(chuàng)建提示模板。二者效果是一樣的。
使用 ChatPromptTemplate
對(duì)于 OpenAI 推出的 ChatGPT 這一類(lèi)的聊天模型,LangChain 也提供了一系列的模板,這些模板的不同之處是它們有對(duì)應(yīng)的角色。
下面代碼展示了 OpenAI 的 Chat Model 中的各種消息角色。
import openai
openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Who won the world series in 2020?"},{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},{"role": "user", "content": "Where was it played?"}]
)
OpenAI 對(duì)傳輸?shù)?gpt-3.5-turbo 和 GPT-4 的 messsage 格式說(shuō)明如下:
消息必須是消息對(duì)象的數(shù)組,其中每個(gè)對(duì)象都有一個(gè)角色(系統(tǒng)、用戶(hù)或助理)和內(nèi)容。對(duì)話(huà)可以短至一條消息,也可以來(lái)回多次。
通常,對(duì)話(huà)首先由系統(tǒng)消息格式化,然后是交替的用戶(hù)消息和助理消息。
系統(tǒng)消息有助于設(shè)置助手的行為。例如,你可以修改助手的個(gè)性或提供有關(guān)其在整個(gè)對(duì)話(huà)過(guò)程中應(yīng)如何表現(xiàn)的具體說(shuō)明。但請(qǐng)注意,系統(tǒng)消息是可選的,并且沒(méi)有系統(tǒng)消息的模型的行為可能類(lèi)似于使用通用消息,例如“你是一個(gè)有用的助手”。
用戶(hù)消息提供助理響應(yīng)的請(qǐng)求或評(píng)論。
助理消息存儲(chǔ)以前的助理響應(yīng),但也可以由你編寫(xiě)以給出所需行為的示例。
LangChain 的 ChatPromptTemplate 這一系列的模板,就是跟著這一系列角色而設(shè)計(jì)的。
下面給出一個(gè)示例
# 導(dǎo)入聊天消息類(lèi)模板
from langchain.prompts import (ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
)
# 模板的構(gòu)建
template="你是一位專(zhuān)業(yè)顧問(wèn),負(fù)責(zé)為專(zhuān)注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="公司主打產(chǎn)品是{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])# 格式化提示消息生成提示
prompt = prompt_template.format_prompt(product="鮮花裝飾", product_detail="創(chuàng)新的鮮花設(shè)計(jì)。").to_messages()# 下面調(diào)用模型,把提示傳入模型,生成結(jié)果
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
result = chat(prompt)
print(result)
輸出:
content='1. 花語(yǔ)創(chuàng)意\n2. 花韻設(shè)計(jì)\n3. 花藝創(chuàng)新\n4. 花漾裝飾\n5. 花語(yǔ)裝點(diǎn)\n6. 花翩翩\n7. 花語(yǔ)之美\n8. 花馥馥\n9. 花語(yǔ)時(shí)尚\(zhòng)n10. 花之魅力'
additional_kwargs={}
example=False
FewShot 的思想起源
講完上面兩種簡(jiǎn)單易用的提示模板,下面開(kāi)始介紹今天的重點(diǎn)內(nèi)容,FewShotPromptTemplate。FewShot,也就是少樣本這一概念,是提示工程中非常重要的部分,對(duì)應(yīng)著 OpenAI 提示工程指南中的第 2 條——給模型提供參考(也就是示例)。
講解概念之前,我先分享個(gè)事兒哈,幫助你理解。今天我下樓跑步時(shí),一個(gè)老爺爺教孫子學(xué)騎車(chē),小孩總掌握不了平衡,蹬一兩下就下車(chē)。
- 爺爺說(shuō):“寶貝,你得有毅力!
- ”孫子說(shuō):“爺爺,什么是毅力?
- ”爺爺說(shuō):“你看這個(gè)叔叔,繞著樓跑了 10 多圈了,這就是毅力,你也得至少蹬個(gè) 10 幾趟才能騎起來(lái)?!?/li>
這老爺爺就是給孫子做了一個(gè) One-Shot 學(xué)習(xí)。如果他的孫子第一次聽(tīng)說(shuō)卻上來(lái)就明白什么是毅力,那就神了,這就叫 Zero-Shot,表明這孩子的語(yǔ)言天賦不是一般的高,從知識(shí)積累和當(dāng)前語(yǔ)境中就能夠推知新詞的涵義。有時(shí)候我們把 Zero-Shot 翻譯為“頓悟”,聰明的大模型,某些情況下也是能夠做到的。
Few-Shot(少樣本)、One-Shot(單樣本)和與之對(duì)應(yīng)的 Zero-Shot(零樣本)的概念都起源于機(jī)器學(xué)習(xí)。如何讓機(jī)器學(xué)習(xí)模型在極少量甚至沒(méi)有示例的情況下學(xué)習(xí)到新的概念或類(lèi)別,對(duì)于許多現(xiàn)實(shí)世界的問(wèn)題是非常有價(jià)值的,因?yàn)槲覀兺鶡o(wú)法獲取到大量的標(biāo)簽化數(shù)據(jù)。
這幾個(gè)重要概念并非在某一篇特定的論文中首次提出,而是在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的研究中逐漸形成和發(fā)展的。
- 對(duì)于 Few-Shot Learning,一個(gè)重要的參考文獻(xiàn)是 2016 年 Vinyals, O. 的論文《小樣本學(xué)習(xí)的匹配網(wǎng)絡(luò)》。
- 這篇論文提出了一種新的學(xué)習(xí)模型——匹配網(wǎng)絡(luò)(Matching Networks),專(zhuān)門(mén)針對(duì)單樣本學(xué)習(xí)(One-Shot Learning)問(wèn)題設(shè)計(jì),而 One-Shot Learning 可以看作是一種最常見(jiàn)的 Few-Shot 學(xué)習(xí)的情況。
- 對(duì)于 Zero-Shot Learning,一個(gè)代表性的參考文獻(xiàn)是 Palatucci, M. 在 2009 年提出的《基于語(yǔ)義輸出編碼的零樣本學(xué)習(xí)(Zero-Shot Learning with semantic output codes)》,這篇論文提出了零次學(xué)習(xí)(Zero-Shot Learning)的概念,其中的學(xué)習(xí)系統(tǒng)可以根據(jù)類(lèi)的語(yǔ)義描述來(lái)識(shí)別之前未見(jiàn)過(guò)的類(lèi)。
在提示工程(Prompt Engineering)中,Few-Shot 和 Zero-Shot 學(xué)習(xí)的概念也被廣泛應(yīng)用。
- 在 Few-Shot 學(xué)習(xí)設(shè)置中,模型會(huì)被給予幾個(gè)示例,以幫助模型理解任務(wù),并生成正確的響應(yīng)。
- 在 Zero-Shot 學(xué)習(xí)設(shè)置中,模型只根據(jù)任務(wù)的描述生成響應(yīng),不需要任何示例。
而 OpenAI 在介紹 GPT-3 模型的重要論文《Language models are Few-Shot learners(語(yǔ)言模型是少樣本學(xué)習(xí)者)》中,更是直接指出:GPT-3 模型,作為一個(gè)大型的自我監(jiān)督學(xué)習(xí)模型,通過(guò)提升模型規(guī)模,實(shí)現(xiàn)了出色的 Few-Shot 學(xué)習(xí)性能。
這篇論文為大語(yǔ)言模型可以進(jìn)行 Few-Shot 學(xué)習(xí)提供了扎實(shí)的理論基礎(chǔ)。
下圖就是 OpenAI 的 GPT-3 論文給出的 GPT-3 在翻譯任務(wù)中,通過(guò) FewShot 提示完成翻譯的例子。
以上,就是 ZeroShot、OneShot、FewShot 這些重要概念的起源。
使用 FewShotPromptTemplate
下面,就讓我們來(lái)通過(guò) LangChain 中的 FewShotPromptTemplate 構(gòu)建出最合適的鮮花文案。
1. 創(chuàng)建示例樣本
首先,創(chuàng)建一些示例,作為提示的樣本。其中每個(gè)示例都是一個(gè)字典,其中鍵是輸入變量,值是這些輸入變量的值。
# 1. 創(chuàng)建一些示例
samples = [{"flower_type": "玫瑰","occasion": "愛(ài)情","ad_copy": "玫瑰,浪漫的象征,是你向心愛(ài)的人表達(dá)愛(ài)意的最佳選擇。"},{"flower_type": "康乃馨","occasion": "母親節(jié)","ad_copy": "康乃馨代表著母愛(ài)的純潔與偉大,是母親節(jié)贈(zèng)送給母親的完美禮物。"},{"flower_type": "百合","occasion": "慶祝","ad_copy": "百合象征著純潔與高雅,是你慶祝特殊時(shí)刻的理想選擇。"},{"flower_type": "向日葵","occasion": "鼓勵(lì)","ad_copy": "向日葵象征著堅(jiān)韌和樂(lè)觀,是你鼓勵(lì)親朋好友的最好方式。"}
]
samples 這個(gè)列表,它包含了四個(gè)字典,每個(gè)字典代表了一種花的類(lèi)型、適合的場(chǎng)合,以及對(duì)應(yīng)的廣告文案。 這些示例樣本,就是構(gòu)建 FewShotPrompt 時(shí),作為例子傳遞給模型的參考信息。
2. 創(chuàng)建提示模板
配置一個(gè)提示模板,將一個(gè)示例格式化為字符串。這個(gè)格式化程序應(yīng)該是一個(gè) PromptTemplate 對(duì)象。
# 2. 創(chuàng)建一個(gè)提示模板
from langchain.prompts.prompt import PromptTemplate
template="鮮花類(lèi)型: {flower_type}\n場(chǎng)合: {occasion}\n文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"], template=template)
print(prompt_sample.format(**samples[0]))
提示模板的輸出如下:
鮮花類(lèi)型: 玫瑰
場(chǎng)合: 愛(ài)情
文案: 玫瑰,浪漫的象征,是你向心愛(ài)的人表達(dá)愛(ài)意的最佳選擇。
在這個(gè)步驟中,我們創(chuàng)建了一個(gè) PromptTemplate 對(duì)象。這個(gè)對(duì)象是根據(jù)指定的輸入變量和模板字符串來(lái)生成提示的。在這里,輸入變量包括 "flower_type"、"occasion"、"ad_copy"
,模板是一個(gè)字符串,其中包含了用大括號(hào)包圍的變量名,它們會(huì)被對(duì)應(yīng)的變量值替換。
到這里,我們就把字典中的示例格式轉(zhuǎn)換成了提示模板,可以形成一個(gè)個(gè)具體可用的 LangChain 提示。比如我用 samples[0]
中的數(shù)據(jù)替換了模板中的變量,生成了一個(gè)完整的提示。
3. 創(chuàng)建 FewShotPromptTemplate 對(duì)象
然后,通過(guò)使用上一步驟中創(chuàng)建的 prompt_sample,以及 samples 列表中的所有示例, 創(chuàng)建一個(gè) FewShotPromptTemplate 對(duì)象,生成更復(fù)雜的提示。
# 3. 創(chuàng)建一個(gè)FewShotPromptTemplate對(duì)象
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(examples=samples,example_prompt=prompt_sample,suffix="鮮花類(lèi)型: {flower_type}\n場(chǎng)合: {occasion}",input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="野玫瑰", occasion="愛(ài)情"))
輸出:
鮮花類(lèi)型: 玫瑰
場(chǎng)合: 愛(ài)情
文案: 玫瑰,浪漫的象征,是你向心愛(ài)的人表達(dá)愛(ài)意的最佳選擇。鮮花類(lèi)型: 康乃馨
場(chǎng)合: 母親節(jié)
文案: 康乃馨代表著母愛(ài)的純潔與偉大,是母親節(jié)贈(zèng)送給母親的完美禮物。鮮花類(lèi)型: 百合
場(chǎng)合: 慶祝
文案: 百合象征著純潔與高雅,是你慶祝特殊時(shí)刻的理想選擇。鮮花類(lèi)型: 向日葵
場(chǎng)合: 鼓勵(lì)
文案: 向日葵象征著堅(jiān)韌和樂(lè)觀,是你鼓勵(lì)親朋好友的最好方式。鮮花類(lèi)型: 野玫瑰
場(chǎng)合: 愛(ài)情
可以看到,FewShotPromptTemplate 是一個(gè)更復(fù)雜的提示模板,它包含了多個(gè)示例和一個(gè)提示。這種模板可以使用多個(gè)示例來(lái)指導(dǎo)模型生成對(duì)應(yīng)的輸出。目前我們創(chuàng)建一個(gè)新提示,其中包含了根據(jù)指定的花的類(lèi)型“野玫瑰”和場(chǎng)合“愛(ài)情”。
4. 調(diào)用大模型創(chuàng)建新文案
最后,把這個(gè)對(duì)象輸出給大模型,就可以根據(jù)提示,得到我們所需要的文案了!
# 4. 把提示傳遞給大模型
import os
os.environ["OPENAI_API_KEY"] = '你的Open AI Key'
from langchain.llms import OpenAI
model = OpenAI(model_name='gpt-3.5-turbo-instruct')
result = model(prompt.format(flower_type="野玫瑰", occasion="愛(ài)情"))
print(result)
輸出:
文案: 野玫瑰代表著愛(ài)情的堅(jiān)貞,是你向心愛(ài)的人表達(dá)愛(ài)意的最佳禮物。
好!模型成功地模仿了我們的示例,寫(xiě)出了新文案,從結(jié)構(gòu)到語(yǔ)氣都蠻相似的。
使用示例選擇器
如果我們的示例很多,那么一次性把所有示例發(fā)送給模型是不現(xiàn)實(shí)而且低效的。另外,每次都包含太多的 Token 也會(huì)浪費(fèi)流量(OpenAI 是按照 Token 數(shù)來(lái)收取費(fèi)用)。
LangChain 給我們提供了示例選擇器,來(lái)選擇最合適的樣本。(注意,因?yàn)槭纠x擇器使用向量相似度比較的功能,此處需要安裝向量數(shù)據(jù)庫(kù),這里我使用的是開(kāi)源的 Chroma,你也可以選擇之前用過(guò)的 Qdrant。)
下面,就是使用示例選擇器的示例代碼。
# 5. 使用示例選擇器
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings# 初始化示例選擇器
example_selector = SemanticSimilarityExampleSelector.from_examples(samples,OpenAIEmbeddings(),Chroma,k=1
)# 創(chuàng)建一個(gè)使用示例選擇器的FewShotPromptTemplate對(duì)象
prompt = FewShotPromptTemplate(example_selector=example_selector, example_prompt=prompt_sample, suffix="鮮花類(lèi)型: {flower_type}\n場(chǎng)合: {occasion}", input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="紅玫瑰", occasion="愛(ài)情"))
輸出:
鮮花類(lèi)型: 玫瑰
場(chǎng)合: 愛(ài)情
文案: 玫瑰,浪漫的象征,是你向心愛(ài)的人表達(dá)愛(ài)意的最佳選擇。鮮花類(lèi)型: 紅玫瑰
場(chǎng)合: 愛(ài)情
在這個(gè)步驟中,它首先創(chuàng)建了一個(gè) SemanticSimilarityExampleSelector 對(duì)象,這個(gè)對(duì)象可以根據(jù)語(yǔ)義相似性選擇最相關(guān)的示例。然后,它創(chuàng)建了一個(gè)新的 FewShotPromptTemplate 對(duì)象,這個(gè)對(duì)象使用了上一步創(chuàng)建的選擇器來(lái)選擇最相關(guān)的示例生成提示。
然后,我們又用這個(gè)模板生成了一個(gè)新的提示,因?yàn)槲覀兊奶崾局行枰獎(jiǎng)?chuàng)建的是紅玫瑰的文案,所以,示例選擇器 example_selector 會(huì)根據(jù)語(yǔ)義的相似度(余弦相似度)找到最相似的示例,也就是“玫瑰”,并用這個(gè)示例構(gòu)建了 FewShot 模板。
這樣,我們就避免了把過(guò)多的無(wú)關(guān)模板傳遞給大模型,以節(jié)省 Token 的用量。
總結(jié)
我們介紹了提示工程的原理,幾種提示模板的用法,以及最重要的 FewShot 的思路。其實(shí)說(shuō)白了,就是給模型一些示例做參考,模型才能明白你要什么。
總的來(lái)說(shuō),提供示例對(duì)于解決某些任務(wù)至關(guān)重要,通常情況下,FewShot 的方式能夠顯著提高模型回答的質(zhì)量。不過(guò),當(dāng)少樣本提示的效果不佳時(shí),這可能表示模型在任務(wù)上的學(xué)習(xí)不足。在這種情況下,我們建議對(duì)模型進(jìn)行微調(diào)或嘗試更高級(jí)的提示技術(shù)。