




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
大模型AI應(yīng)用寶典大模型AI應(yīng)用寶典0101|學(xué)會和AI說話創(chuàng)建OpenAI的API創(chuàng)建OpenAI的APIKey為了學(xué)習(xí)這門課程,你需要先去注冊一個可以使用OpenAI的API的賬號,這是賬號注冊的入口。目前,OpenAI還沒有向中國大陸和香港地區(qū)開放,所以賬號的注冊需要你自己想想辦法了,如果你有好辦法,也歡迎你分享在評論區(qū)。賬號注冊完成之后,你點(diǎn)擊右上角的賬號,然后點(diǎn)擊“ViewAPIKeys”,就會進(jìn)入一個管理APIKeys的頁面。你點(diǎn)擊下面的“+Createnewsecretkey”可以創(chuàng)建一個新的APIKey。APIKey對應(yīng)的APIKey你需要把它存儲在一個安全的地方,后面我們調(diào)用OpenAI的接口都需要使用這個APIKey?,F(xiàn)在OpenAI你點(diǎn)擊下面的“+Createnewsecretkey”可以創(chuàng)建一個新的APIKey。APIKey對應(yīng)的APIKey你需要把它存儲在一個安全的地方,后面我們調(diào)用OpenAI的接口都需要使用這個APIKey。現(xiàn)在OpenAI為所有免費(fèi)注冊的用戶都提供了5美元(最早是18美元)的免費(fèi)使用API的額度,這個額度用來體驗API的功能,以及學(xué)習(xí)這個課程已經(jīng)夠用了。如果你想要進(jìn)一步將這個API用在實際的產(chǎn)品上,就需要考慮把這個賬號升級成付費(fèi)賬號了。搭建本地的JupyterLabs開發(fā)環(huán)境有了APIKey之后,我們還需要搭建一個開發(fā)環(huán)境。這門課,我主要通過Python來講解和搭建本地的JupyterLabs開發(fā)環(huán)境有了APIKey之后,我們還需要搭建一個開發(fā)環(huán)境。這門課,我主要通過Python來講解和演示如何使用好AI。如果你是一個程序員,你可以自己去Python語言的官網(wǎng)下載并安裝對應(yīng)的開發(fā)環(huán)境。一般來說,你還需要一個Python的包管理和環(huán)境管理工具,我自己比較習(xí)慣使用Conda。最后,還需要通過包管理工具,配置一個獨(dú)立的Python3.10的環(huán)境,并安裝好JupyterLab、OpenAI以及后面要用到的一系列開發(fā)包。我把對應(yīng)的Conda命令也列在了下面,供你參考。后續(xù),隨著我們課程的進(jìn)展,你可能還需要通過Conda或者pip來安裝更多Python包。安裝完JupyterLab之后,你只需要把剛才我們獲取到的APIKey設(shè)置到環(huán)境變量里,然后啟動JupyterLab。你可以從瀏覽器里,通過JupyterNotebook交互式地運(yùn)行這個課程后面的代碼,體驗OpenAI的大語言模型神奇的效果。你可以選擇新建Python3的Notebook,來體驗交互式地運(yùn)行Python代碼調(diào)用OpenAI的API。復(fù)制代碼exportOPENAI_API_KEY=在這里寫你獲取到的ApiKeyjupyter-lab.復(fù)制代碼condacreate--namepy310python=3.10condaactivatepy310condainstall-cconda-forgejupyterlabcondainstall-cconda-forgeipywidgetscondainstall-cconda-forgeopenai通過Colab使用JupyterLab通過Colab使用JupyterLab如果你不是一個程序員,或者你懶得在本地搭建一個開發(fā)環(huán)境。還有一個選擇,就是使用Google提供的叫做Colab的線上PythonNotebook環(huán)境。即使你已經(jīng)有了本地的開發(fā)環(huán)境,我也建議你注冊一個賬號。因為Colab可以讓你免費(fèi)使用一些GPU的資源,在你需要使用GPU嘗試訓(xùn)練一些深度學(xué)習(xí)模型,而又沒有一張比較好的顯卡的時候,就可以直接使用它。另一方面,Colab便于你在網(wǎng)絡(luò)上把自己撰寫的Python代碼分享給其他人。用Colab嘗試各種Python代碼Colab已經(jīng)是一個PythonNotebook的環(huán)境了。所以我們不需要再去安裝Python和JupyterLab了。不過我們還是需要安裝OpenAI的庫,以及設(shè)定我們的APIKey。你只需要在Notebook開始的時候,執(zhí)行下面這樣一小段代碼就可以做到這一點(diǎn)。復(fù)制代碼12!pipinstallopenai用Colab嘗試各種Python代碼Colab已經(jīng)是一個PythonNotebook的環(huán)境了。所以我們不需要再去安裝Python和JupyterLab了。不過我們還是需要安裝OpenAI的庫,以及設(shè)定我們的APIKey。你只需要在Notebook開始的時候,執(zhí)行下面這樣一小段代碼就可以做到這一點(diǎn)。復(fù)制代碼12!pipinstallopenai%envOPENAI_API_KEY=在這里寫你獲取到的ApiKey不過需要注意,如果你需要將Notebook分享出去,記得把其中OpenAI的APIkey刪除掉,免得別人的調(diào)用,花費(fèi)都算在了你頭上。體驗并測試OpenAI的API好了,現(xiàn)在環(huán)境已經(jīng)搭建好了。無論你是使用本地的JupyterLab環(huán)境,還是使用Google免費(fèi)提供的Colab環(huán)境,我都迫不及待地想要和你一起來體驗一下OpenAI了。我在這里放了一段代碼,你可以把它貼到你的Notebook里面,直接運(yùn)行一下。復(fù)制代碼12345678910111213141516復(fù)制代碼1234567891011121314151617181920212223242526272829importopenaiimportosopenai.api_key=os.environ.get("OPENAI_API_KEY")COMPLETION_MODEL="text-davinci-003"prompt="""Considerationproduct工廠現(xiàn)貨PVC充氣青蛙夜市地攤熱賣充氣玩具發(fā)光蛙兒童水上玩具1.2.3.ComposehumanWrite5sellingEvaluateapricerangeproducttitleusedonfortheproductsinAmazon.forthisproductinU.S.inenglishwithin20wordsOutputtheresultinjson"""formatwiththreepropertiescalledtitle,selling_poindefget_response(prompt):completions=openai.Completion.createengine=COMPLETION_MODEL,prompt=prompt,max_tokens=512,n=1,stop=None,temperature=0.0,)message=completions.choices[0].textreturnmessageprint(get_response(prompt))我們來看看返回結(jié)果。復(fù)制代碼1234567891011{"title"復(fù)制代碼1234567891011{"title":"Glow-in-the-DarkInflatablePVCFrogNightMarket"selling_points":["MadeofdurablePVCmaterial","Glow-in-the-darkdesignfornightplay","Inflatabledesignforeasystorageandtransport","Perfectforwaterplayandoutdooractivities","Greatgiftforkids"],"price_range":"$10-$20"SellingWater}這個商品名稱不是我構(gòu)造的,而是直接找了1688里一個真實存在的商品。這段代碼里面,我們調(diào)用了OpenAI的Completion接口,然后向它提了一個需求,也就是為一個我在1688上找到的中文商品名稱做三件事情。1.為這個商品寫一個適合在亞馬遜上使用的英文標(biāo)題。給這個商品寫5個賣點(diǎn)。估計一下,這個商品在美國賣多少錢比較合適。2.3.同時,我們告訴OpenAI,我們希望返回的結(jié)果是JSON格式的,并且上面的三個事情用title、selling_points和price_range三個字段返回。神奇的是,OpenAI真的理解了我們的需求,返回了一個符合我們要求的JSON字符串給我們。在這個過程中,它完成了好幾件不同的事情。第一個是翻譯,我們給的商品名稱是中文的,返回的內(nèi)容是英文的。神奇的是,OpenAI真的理解了我們的需求,返回了一個符合我們要求的JSON字符串給我們。在這個過程中,它完成了好幾件不同的事情。第一個是翻譯,我們給的商品名稱是中文的,返回的內(nèi)容是英文的。第二個是理解你的語義去生成文本,我們這里希望它寫一個在亞馬遜電商平臺上適合人讀的標(biāo)題,所以在返回的英文結(jié)果里面,AI沒有保留原文里有的“工廠現(xiàn)貨”的含義,因為那個明顯不適合在亞馬遜這樣的平臺上作為標(biāo)題。下面5條描述也沒有包含“工廠現(xiàn)貨”這樣的信息。而且,其中的第三條賣點(diǎn)“Inflatabledesignforeasystorageandtransport”,也就是作為一個充氣的產(chǎn)品易于存放和運(yùn)輸,這一點(diǎn)其實是從“充氣”這個信息AI推理出來的,原來的中文標(biāo)題里并沒有這樣的信息。第三個是利用AI自己有的知識給商品定價,這里它為這個商品定的價格是在10~20美元之間。而我用“Glow-in-the-Darkfrog”在亞馬遜里搜索,搜索結(jié)果的第一行里,就有一個16美元發(fā)光的青蛙。最后是根據(jù)我們的要求把我們想要的結(jié)果,通過一個JSON結(jié)構(gòu)化地返回給我們。而且,盡管我們沒有提出要求,但是AI還是很貼心地把5個賣點(diǎn)放在了一個數(shù)組里,方便你后續(xù)只選取其中的幾個來用。返回的結(jié)果是JSON,這樣方便了我們進(jìn)一步利用返回結(jié)果。比如,我們就可以把這個結(jié)果解析之后存儲到數(shù)據(jù)庫里,然后展現(xiàn)給商品運(yùn)營人員。好了,如果看到這個結(jié)果你有些激動的話,請你先平復(fù)一下,我們馬上來看一個新例子。輸出結(jié)果:復(fù)制代碼1{好了,如果看到這個結(jié)果你有些激動的話,請你先平復(fù)一下,我們馬上來看一個新例子。輸出結(jié)果:復(fù)制代碼1{2 "names":["TenHag"]3}復(fù)制代碼prompt="""ManUtdmustwintrophies,saysTenHagaheadofLeagueCupfinal34請將上面這句話的人名提取出來,并用json的方式展示出來5"""67print(get_response(prompt))我們給了它一個英文的體育新聞的標(biāo)題,然后讓AI把其中的人名提取出來??梢钥吹?,返回的結(jié)果也準(zhǔn)確地把新聞里面唯一出現(xiàn)的人名——曼聯(lián)隊的主教練滕哈格的名字提取了出來。和之前的例子不同,這個例子里,我們希望AI處理的內(nèi)容是英文,給出的指令則是中文。不過AI都處理得很好,而且我們的輸入完全是自然的中英文混合在一起,并沒有使用特定的標(biāo)識符或者分隔符。我們給了它一個英文的體育新聞的標(biāo)題,然后讓AI把其中的人名提取出來??梢钥吹剑祷氐慕Y(jié)果也準(zhǔn)確地把新聞里面唯一出現(xiàn)的人名——曼聯(lián)隊的主教練滕哈格的名字提取了出來。和之前的例子不同,這個例子里,我們希望AI處理的內(nèi)容是英文,給出的指令則是中文。不過AI都處理得很好,而且我們的輸入完全是自然的中英文混合在一起,并沒有使用特定的標(biāo)識符或者分隔符。注:第一個例子,我們希望AI處理的內(nèi)容是中文,給出的指令是英文。我們這里的兩個例子,其實對應(yīng)著很多不同的問題,其中就包括機(jī)器翻譯、文本生成、知識推理、命名實體識別實現(xiàn)上面的效果,還需要海量的工程研發(fā)工作。沒有一個數(shù)十人的團(tuán)隊,工作量根本看不到頭。然而,OpenAI通過一個包含1750億參數(shù)的大語言模型,就能理解自然的語言輸入,直接完(AGI)要來了”的原因。小結(jié)好了,希望到這里,你對OpenAI提供的大語言模型能干什么有了一個最直觀的認(rèn)識。同時,你也應(yīng)該已經(jīng)注冊好了對應(yīng)的賬號,生成了調(diào)用大語言模型的APIKey。無論是在本地搭建了開發(fā)環(huán)境,還是通過Colab這樣免費(fèi)在線的開發(fā)環(huán)境,你都應(yīng)該已經(jīng)嘗試著調(diào)用過OpenAI的API拿到一些返回結(jié)果了。OpenAI提供的GPT-3.5系列的大語言模型,可以讓你使用一個模型來解決所有的自然語言型之下都消失了。這大大降低了我們利用OpenAI提供的GPT-3.5系列的大語言模型,可以讓你使用一個模型來解決所有的自然語言型之下都消失了。這大大降低了我們利用AI解決問題的門檻,無論之前我們通過各種開源工且,往往我們還需要組合好多個模型,進(jìn)行大量的工程開發(fā)工作。而在大語言模型時代,我們只需要有會向AI提問的應(yīng)用開發(fā)工程師,就能開發(fā)AI應(yīng)用了。這也是我設(shè)計這門課程的目的,希望能讓你體會到當(dāng)前開發(fā)AI工具的便利性。0202利用大語言模型做情感分析傳統(tǒng)的二分類方法:樸素貝葉斯與邏輯回歸“情感分析”問題,是指我們根據(jù)一段文字,去判斷它的態(tài)度是正面的還是負(fù)面的。在傳統(tǒng)的者對自己的產(chǎn)品評價是正面還是負(fù)面的,并且會根據(jù)這些評價來改進(jìn)自己的產(chǎn)品。對于“情感分析”類型的問題,傳統(tǒng)的解決方案就是把它當(dāng)成是一個分類問題,也就是先拿一部分評論數(shù)據(jù),人工標(biāo)注一下這些評論是正面還是負(fù)面的。如果有個用戶說“這家餐館真好評論標(biāo)注成負(fù)面的。我們把標(biāo)注好的數(shù)據(jù),喂給一個機(jī)器學(xué)習(xí)模型,訓(xùn)練出一組參數(shù)。然后把剩下的沒有人工標(biāo)注過的數(shù)據(jù)也拿給訓(xùn)練好的模型計算一下。模型就會給你一個分?jǐn)?shù)或者概率,告訴你這一段評論傳統(tǒng)的二分類方法:樸素貝葉斯與邏輯回歸“情感分析”問題,是指我們根據(jù)一段文字,去判斷它的態(tài)度是正面的還是負(fù)面的。在傳統(tǒng)的者對自己的產(chǎn)品評價是正面還是負(fù)面的,并且會根據(jù)這些評價來改進(jìn)自己的產(chǎn)品。對于“情感分析”類型的問題,傳統(tǒng)的解決方案就是把它當(dāng)成是一個分類問題,也就是先拿一部分評論數(shù)據(jù),人工標(biāo)注一下這些評論是正面還是負(fù)面的。如果有個用戶說“這家餐館真好評論標(biāo)注成負(fù)面的。我們把標(biāo)注好的數(shù)據(jù),喂給一個機(jī)器學(xué)習(xí)模型,訓(xùn)練出一組參數(shù)。然后把剩下的沒有人工標(biāo)注過的數(shù)據(jù)也拿給訓(xùn)練好的模型計算一下。模型就會給你一個分?jǐn)?shù)或者概率,告訴你這一段評論的感情是正面的,還是負(fù)面的??梢杂脕碜銮楦蟹治龅哪P陀泻芏?,這些算法背后都是基于某一個數(shù)學(xué)模型。比如,很多教科書里,就會教你用樸素貝葉斯算法高得多,那這個詞語所在的評論,就更有可能是一個差評。P(x∣c)PcP(c∣x)=P(x)P(c∣X)∝P(x1∣c)×P(x2∣c)×???×P(xn∣c)×Pc假設(shè)我們有一個訓(xùn)練集包含4封郵件,其中2封是垃圾郵件,2封是非垃圾郵件。訓(xùn)練集里的郵件包含這些單詞。然后來了一封新郵件,里面的單詞是:buy、money、sell。通過這些單詞出現(xiàn)的概率,我們很容易就可以預(yù)先算出這封郵件是垃圾郵件還是普通郵件。P(buy∣垃圾然后來了一封新郵件,里面的單詞是:buy、money、sell。通過這些單詞出現(xiàn)的概率,我們很容易就可以預(yù)先算出這封郵件是垃圾郵件還是普通郵件。P(buy∣垃圾)=2÷2=1P(money∣垃圾)=22=1P(sell∣垃圾)=1÷2=0.5P(buy∣普通)=0÷2=0P(money∣普通)=02=0P(sell∣普通1div20.5然后我們把這封郵件里所有詞語的條件概率用全概率公式乘起來,就得到了這封郵件是垃圾郵件還有普通郵件的概率。P(垃圾∣X)∝P(buy∣垃圾P(money∣垃圾P(sell∣垃圾P(垃圾)=1P(普通∣X)∝P(buy∣普通P(money∣普通P(sell∣普通P(普通)=0P(垃圾∣XP(垃圾∣XP(普通∣X)P(普通∣X0。那如果用樸素貝葉斯算法,我們就會認(rèn)為這封郵件100%是垃圾郵件。如果你覺得自己數(shù)學(xué)不太好,這個例子沒有看明白也沒有關(guān)系,因為我們接下來的AI知識,所以不要有心理負(fù)擔(dān)。類似的,像邏輯回歸、隨機(jī)森林等機(jī)器學(xué)習(xí)算法都可以拿來做分類。你在網(wǎng)上,特別是Kaggle這個機(jī)器學(xué)習(xí)比賽的網(wǎng)站里,可以搜索到很多其他人使用這些傳統(tǒng)方法來設(shè)計情感分析的解決方案。這些方案都以JupyterNotebook的形式出現(xiàn),我在這里放個鏈接,你有興趣的話也可以去研究一下。傳統(tǒng)方法的挑戰(zhàn):特征工程與模型調(diào)參但這些傳統(tǒng)的機(jī)器學(xué)習(xí)算法,想要取得好的效果,還是頗有門檻的。除了要知道有哪些算法可以用,還有兩方面的工作非常依賴經(jīng)驗。特征工程第一個是特征工程。對于很多自然語言問題,如果我們只是拿一段話里面是否出現(xiàn)了特定的詞語來計算概率,不一定是最合適的。比如“這家餐館太糟糕了,一點(diǎn)都不好吃”和“這家餐館是相同的。在傳統(tǒng)的自然語言處理中,我們會通過一些特征工程的方法來解決這個問題。比如,我們不只是采用單個詞語出現(xiàn)的概率,還增加前后兩個或者三個相連詞語的組合,也就是通過所謂的2-Gram(Bigram雙字節(jié)詞組)和3-Gram(Trigram三字節(jié)詞組)也來計算兩個組合。有了這樣的2-Gram的組合,我們判斷用戶好評差評的判斷能力就比光用單個詞語是否出現(xiàn)要好多了。這樣的特征工程的方式有很多,比如去除停用詞,也就是“的地得”這樣的詞語,去掉過于低頻的詞語,比如一些偶爾出現(xiàn)的專有名詞?;蛘邔τ谟行┰~語特征采用TF-IDF(詞頻-逆文檔頻率)這樣的統(tǒng)計特征,還有在英語里面對不同時態(tài)的單詞統(tǒng)一換成現(xiàn)在時。不同的特征工程方式,在不同的問題上效果不一樣,比如我們做情感分析,可能就需要保留標(biāo)對當(dāng)前特定場景的技巧,這非常依賴工程師的經(jīng)驗。機(jī)器學(xué)習(xí)相關(guān)經(jīng)驗第二個就是你需要有相對豐富的機(jī)器學(xué)習(xí)經(jīng)驗。除了通過特征工程設(shè)計更多的特征之外,我們還需要了解很多機(jī)器學(xué)習(xí)領(lǐng)域里常用的知識和技巧。比如,我們需要將數(shù)據(jù)集切分成訓(xùn)練、驗證(Validation)、測試不同的特征工程方式,在不同的問題上效果不一樣,比如我們做情感分析,可能就需要保留標(biāo)對當(dāng)前特定場景的技巧,這非常依賴工程師的經(jīng)驗。機(jī)器學(xué)習(xí)相關(guān)經(jīng)驗第二個就是你需要有相對豐富的機(jī)器學(xué)習(xí)經(jīng)驗。除了通過特征工程設(shè)計更多的特征之外,我們還需要了解很多機(jī)器學(xué)習(xí)領(lǐng)域里常用的知識和技巧。比如,我們需要將數(shù)據(jù)集切分成訓(xùn)練、驗證(Validation)、測試三組數(shù)據(jù),然后通過AUC或者混淆矩陣(ConfusionMatrix)來衡量效果。如果數(shù)據(jù)量不夠多,為了訓(xùn)練效果的穩(wěn)定性,可能需要采用K-Fold的方式來進(jìn)行訓(xùn)練。如果你沒有接觸過機(jī)器學(xué)習(xí),看到這里,可能已經(jīng)看懵了。沒關(guān)系,上面的大部分知識你未來可能都不需要了解了,因為我們有了大語言模型,可以通過它提供的Completion和Embedding這兩個API,用不到10行代碼就能完成情感分析,并且能獲得非常好的效果。大語言模型:20行代碼的情感分析解決方案通過大語言模型來進(jìn)行情感分析,最簡單的方式就是利用它提供的Embedding這個API。這個API可以把任何你指定的一段文本,變成一個大語言模型下的向量,也就是用一組固定長度的參數(shù)來代表任何一段文本。我們需要提前計算“好評”和“差評”這兩個字的Embedding。而對于任何一段文本評論,我們也都可以通過API拿到它的Embedding。那么,我們把這段文本的Embedding和“好評”以及“差評”通過余弦距離(CosineSimilarity)計算出它的相似度。然后我們拿這個Embedding和“好評”之間的相似度,去減去和“差評”之間的相似度,就會得到一個分?jǐn)?shù)。如果這個分?jǐn)?shù)大于0,那么說明我們的評論和“好評”的距離更近,我們就可以判斷它為好評。如果這個分?jǐn)?shù)小于0,那么就是離差評更近,我們就可以判斷它為差評。下面我們就用這個方法分析一下兩條在京東上購買了iPhone用戶的評論。這個使用大模型的方法一共有20行代碼,我們看看它能否幫助我們快速對這兩條評論進(jìn)行情感分析。復(fù)制代碼12345678這個使用大模型的方法一共有20行代碼,我們看看它能否幫助我們快速對這兩條評論進(jìn)行情感分析。復(fù)制代碼123456789101112131415161718192021222324importopenaiimportosfromopenai.embeddings_utilsimportcosine_similarity,get_embedding#獲取訪問openai的密鑰openai.api_keyos.getenv("OPENAI_API_KEY")選擇使用最小的ada模型EMBEDDING_MODEL="text-embedding-ada-002"#獲取"好評"和"差評"的positive_reviewget_embedding("好評negative_reviewget_embedding("差評positive_example=get_embedding("買的銀色版真的很好看,一天就到了,晚上就開始拿起來完系統(tǒng)negative_example=get_embedding("降價厲害,保價不合理,不推薦")defget_score(sample_embedding):returncosine_similarity(sample_embedding,positive_review)-cosine_similaritypositive_score=get_score(positive_example)negative_score=get_score(negative_example)print("好評例子的評分%f"(positive_score))print("差評例子的評分%f"(negative_score))輸出結(jié)果:正如我們所料,京東上的好評通過Embedding相似度計算得到的分?jǐn)?shù)是大于0的,京東上面的差評,這個分?jǐn)?shù)是小于0的。這樣的方法,是不是特別簡單?我們再拿剛才的例子試一下,看看這個方法是不是對所有詞語都管用,只是出現(xiàn)的位置不同但含義截然相反的評論,能得到什么樣的結(jié)果。輸出結(jié)果:可以看到,雖然兩句話分別是“太好吃”“不糟糕”和“太糟糕”“不好吃”,其實詞語都一樣,但是大語言模型一樣能夠幫助我們判斷出來他們的含義是不同的,一個更接近好評,一個更接近差評。更大的數(shù)據(jù)集上的真實案例在這里,我們只舉了幾個例子,看起來效果還不錯。這會不會只是我們運(yùn)氣好呢?我們再來拿一個真實的數(shù)據(jù)集驗證一下,利用這種方法進(jìn)行情感分析的準(zhǔn)確率能夠到多少。正如我們所料,京東上的好評通過Embedding相似度計算得到的分?jǐn)?shù)是大于0的,京東上面的差評,這個分?jǐn)?shù)是小于0的。這樣的方法,是不是特別簡單?我們再拿剛才的例子試一下,看看這個方法是不是對所有詞語都管用,只是出現(xiàn)的位置不同但含義截然相反的評論,能得到什么樣的結(jié)果。輸出結(jié)果:可以看到,雖然兩句話分別是“太好吃”“不糟糕”和“太糟糕”“不好吃”,其實詞語都一樣,但是大語言模型一樣能夠幫助我們判斷出來他們的含義是不同的,一個更接近好評,一個更接近差評。更大的數(shù)據(jù)集上的真實案例在這里,我們只舉了幾個例子,看起來效果還不錯。這會不會只是我們運(yùn)氣好呢?我們再來拿一個真實的數(shù)據(jù)集驗證一下,利用這種方法進(jìn)行情感分析的準(zhǔn)確率能夠到多少。復(fù)制代碼1好評餐館的評分:0.0627192差評餐館的評分:-0.074591復(fù)制代碼good_restraurantget_embedding("這家餐館太好吃了,一點(diǎn)都不糟糕")bad_restraurantget_embedding("這家餐館太糟糕了,一點(diǎn)都不好吃")3good_score=get_score(good_restraurant)bad_score=get_score(bad_restraurant)print("好評餐館的評分%f"(good_score))print("差評餐館的評分%f"(bad_score))復(fù)制代碼1好評例子的評分:0.0709632差評例子的評分:-0.081472下面這段代碼,是來自O(shè)penAICookbook里面的一個例子。它是用同樣的方法,來判斷亞用戶打出1~2星的,我們認(rèn)為是差評,對于4~5星的,我們認(rèn)為是好評。我們可以通過Pandas,將這個CSV數(shù)據(jù)讀取到內(nèi)存里面。為了避免重新調(diào)用OpenAI的API浪費(fèi)錢,這個數(shù)據(jù)集里,已經(jīng)將獲取到的Embedding信息保存下來了,不需要再重新計算。復(fù)制代碼12345678910下面這段代碼,是來自O(shè)penAICookbook里面的一個例子。它是用同樣的方法,來判斷亞用戶打出1~2星的,我們認(rèn)為是差評,對于4~5星的,我們認(rèn)為是好評。我們可以通過Pandas,將這個CSV數(shù)據(jù)讀取到內(nèi)存里面。為了避免重新調(diào)用OpenAI的API浪費(fèi)錢,這個數(shù)據(jù)集里,已經(jīng)將獲取到的Embedding信息保存下來了,不需要再重新計算。復(fù)制代碼12345678910111213importpandasaspdimportnumpyasnpfromsklearn.metricsimportclassification_reportdatafile_path="data/fine_food_reviews_with_embeddings_1k.csv"df=pd.read_csv(datafile_path)df["embedding"]=df.embedding.apply(eval).apply(np.array)#convert5-starratingtobinarysentimentdf=df[df.Score!=3]df["sentiment"]=df.Score.replace({1:"negative",2:"negative",4:"positive",每一條評論都用我們上面的方法,和一個預(yù)先設(shè)定好的好評和差評的文本去做對比,然后看它離哪個近一些。這里的好評和差評,我們寫得稍微長了一點(diǎn),分別是“AnAmazonreviewwithanegative“AnAmazonreviewwithapositive在計算完結(jié)果之后,我們利用Scikit-learn這個機(jī)器學(xué)習(xí)的庫,將我們的預(yù)測值和實際用戶打出的星數(shù)做個對比,然后輸出對比結(jié)果。需要的代碼,也就不到20行。復(fù)制代碼123456fromsklearn.metricsimportPrecisionRecallDisplaydefevaluate_embeddings_approach(labels=['negative',model=EMBEDDING_MODEL,):789101112131415161718192021label_embeddings=[get_embedding(label,789101112131415161718192021label_embeddings=[get_embedding(label,engine=model)forlabelinlabels]deflabel_score(review_embedding,label_embeddings):returncosine_similarity(review_embedding,label_embeddings[1])-cosine_probas=df["embedding"].apply(lambdax:label_score(x,label_embeddings))preds=probas.apply(lambdax:'positive'ifx>0else'negative')report=classification_report(df.sentiment,preds)print(report)display=PrecisionRecallDisplay.from_predictions(df.sentiment,probas,pos_l_=display.ax_.set_title("2-classPrecision-Recallcurve")evaluate_embeddings_approach(labels=['AnAmazonreviewwithanegativesentiment.輸出結(jié)果:復(fù)制代碼1234560.980.96recall0.731.000.840.980.960.910.96136789925925925negativepositiveaccuracymacroweightedavg0.970.960.860.96在結(jié)果里面可以看到,我們這個簡單方法判定的好評差評的精度,也就是precision在negative和positive里,分別是0.98和0.96,也就是在95%以上。而召回率,也就是圖里的recall,在差評里稍微欠缺一點(diǎn),只有73%,這說明還是有不少差評被誤判為了好評。不過在好評里,召回率則是100%,也就是100%的好評都被模型找到了。這樣綜合考慮下來的整體準(zhǔn)確率,高達(dá)96%。而要達(dá)到這么好的效果,我們不需要進(jìn)行任何機(jī)器學(xué)習(xí)訓(xùn)練,只需要幾行代碼調(diào)用一下大模型的接口,計算一下幾個向量的相似度就好了。小結(jié)在結(jié)果里面可以看到,我們這個簡單方法判定的好評差評的精度,也就是precision在negative和positive里,分別是0.98和0.96,也就是在95%以上。而召回率,也就是圖里的recall,在差評里稍微欠缺一點(diǎn),只有73%,這說明還是有不少差評被誤判為了好評。不過在好評里,召回率則是100%,也就是100%的好評都被模型找到了。這樣綜合考慮下來的整體準(zhǔn)確率,高達(dá)96%。而要達(dá)到這么好的效果,我們不需要進(jìn)行任何機(jī)器學(xué)習(xí)訓(xùn)練,只需要幾行代碼調(diào)用一下大模型的接口,計算一下幾個向量的相似度就好了。小結(jié)這一講,我們利用不同文本在大語言模型里Embedding之間的距離,來進(jìn)行情感分析。這種使用大語言模型的技巧,一般被稱做零樣本分類(Zero-ShotClassification)。所謂零樣本分類,也就是我們不需要任何新的樣本來訓(xùn)練機(jī)器學(xué)習(xí)的模型,就能進(jìn)行分類。我是好評還是差評。這個方法,在一些經(jīng)典的數(shù)據(jù)集上,輕易就達(dá)到了95%以上的準(zhǔn)確度。同時,也讓一些原本需要機(jī)器學(xué)習(xí)研發(fā)經(jīng)驗才能完成的任務(wù)變得更加容易,從而大大降低了門檻。如果你所在的公司今天想要做一個文本分類的應(yīng)用,通過OpenAI的API用幾分鐘時間就能得到想要的結(jié)果。03|巧用提示語做個聊天機(jī)器人AI客服03|巧用提示語做個聊天機(jī)器人AI客服在這一波AIGC浪潮之前,我也做過一個智能客服的產(chǎn)品。我發(fā)現(xiàn)智能客服的回答,往往是套用固定的模版。這個的缺點(diǎn),就是每次的回答都一模一樣。當(dāng)然,我們可以設(shè)計多個模版輪換著表達(dá)相同的意思,但是最多也就是三四個模版,整體的體驗還是相當(dāng)呆板。不過,有了GPT這樣的生成式的語言模型,我們就可以讓AI自動根據(jù)我們的需求去寫文案了。只要把我們的需求提給OpenAI提供的Completion接口,他就會自動為我們寫出這樣一段文字。親,您的訂單已經(jīng)順利發(fā)貨啦!訂單號是2021AEDG,預(yù)計在3天之內(nèi)會寄到您指定的地址。不好意思,給您帶來了不便,原計劃到貨時間受天氣原因影響而有所延遲。期待您收到衣服后給我們反饋意見哦!謝謝你選購我們的商品!親,您的訂單2021AEDG剛剛已經(jīng)發(fā)出,預(yù)計3天之內(nèi)就會送達(dá)您的手中。抱歉由于天氣的原因造成了物流延遲,但我們會盡快將訂單發(fā)到您的手中。感謝您對我們的支持!復(fù)制代碼1print一段文字。親,您的訂單已經(jīng)順利發(fā)貨啦!訂單號是2021AEDG,預(yù)計在3天之內(nèi)會寄到您指定的地址。不好意思,給您帶來了不便,原計劃到貨時間受天氣原因影響而有所延遲。期待您收到衣服后給我們反饋意見哦!謝謝你選購我們的商品!親,您的訂單2021AEDG剛剛已經(jīng)發(fā)出,預(yù)計3天之內(nèi)就會送達(dá)您的手中。抱歉由于天氣的原因造成了物流延遲,但我們會盡快將訂單發(fā)到您的手中。感謝您對我們的支持!復(fù)制代碼1print(get_response(prompt))復(fù)制代碼1print(get_response(prompt))復(fù)制代碼importopenaiimportos3openai.api_key=os.environ.get("OPENAI_API_KEY")COMPLETION_MODEL="text-davinci-003"67prompt='請你用朋友的語氣回復(fù)給到客戶,并稱他為“親”,他的訂單已經(jīng)發(fā)貨在路上了,預(yù)計在3天之內(nèi)會89defget_response(prompt,temperature=1.0):completions=openai.Completion.create(engine=COMPLETION_MODEL,prompt=prompt,max_tokens=1024,14 n=1,stop=None,temperature=temperature,17 )message=completions.choices[0].textreturnmessage20相同的提示語,連續(xù)調(diào)用兩次之后,給到了含義相同、遣詞造句不同的結(jié)果。我在這里列出了一段非常簡單的代碼。代碼里面,我們給OpenAI提供的Completion接口發(fā)送了一段小小的提示語(Prompt)。這段提示語要求AI雖然已經(jīng)發(fā)貨,但是因為天氣原因延遲了。并且我們還加了一個小小的語言風(fēng)格上的要求,我們希望AI用朋友的口吻向用戶說話,并且稱用戶為“親”。然后,我們嘗試連續(xù)用完全相同相同的提示語,連續(xù)調(diào)用兩次之后,給到了含義相同、遣詞造句不同的結(jié)果。我在這里列出了一段非常簡單的代碼。代碼里面,我們給OpenAI提供的Completion接口發(fā)送了一段小小的提示語(Prompt)。這段提示語要求AI雖然已經(jīng)發(fā)貨,但是因為天氣原因延遲了。并且我們還加了一個小小的語言風(fēng)格上的要求,我們希望AI用朋友的口吻向用戶說話,并且稱用戶為“親”。然后,我們嘗試連續(xù)用完全相同的參數(shù)調(diào)用了兩次AI。可以看到,AI的確理解了我們的意思,滿足了我們的要求,給出了一段正確合理的回復(fù)。其中有兩點(diǎn)我覺得殊為不易。1.他的確用“親”來稱呼了用戶,并且用了一些語氣詞,顯得比較親切。他正確地提取到了輸入內(nèi)容里的訂單號,并且在回復(fù)內(nèi)容里也把這個訂單號返回給了用戶。2.而且,兩次返回的文案內(nèi)容意思是相同的,但是具體的遣詞造句又有所不同。這樣通過一句合理的提示語,我們就可以讓自己的智能客服自己遣詞造句,而不是只能套用一個固定的模版。而每次回復(fù)的內(nèi)容不一樣,則歸功于我們使用的一個參數(shù)temperature。這個參數(shù)的輸入范圍是0-2之間的浮點(diǎn)數(shù),代表輸出結(jié)果的隨機(jī)性或者說多樣性。在這里,我們選擇了1.0,也就是還是讓每次生成的內(nèi)容都有些不一樣。你也可以把這個參數(shù)設(shè)置為0,這樣,每次輸出的結(jié)果的隨機(jī)性就會比較小。我將temperature設(shè)置為0,你可以看到兩句內(nèi)容的遣詞造句就基本一致了。復(fù)制代碼1print(get_response(prompt,0.0))親,您的訂單2021AEDG已經(jīng)發(fā)貨,預(yù)計在3天之內(nèi)會送達(dá),由于天氣原因,物流時間比原來長,我們深表歉意。感謝您選購我們的商品,祝您購物愉快!復(fù)制代碼1print(get_response(prompt,0.0))復(fù)制代碼1print(get_response(prompt,0.0))親,您的訂單2021AEDG已經(jīng)發(fā)貨,預(yù)計在3天之內(nèi)會送達(dá)。很抱歉因為天氣的原因物流時間比原來長,感謝您選購我們的商品,祝您購物愉快!這個參數(shù)該怎么設(shè)置,取決于實際使用的場景。如果對應(yīng)的場景比較嚴(yán)肅,不希望出現(xiàn)差錯,那么設(shè)得低一點(diǎn)比較合適,比如銀行客服的場景。如果場景沒那么嚴(yán)肅,有趣更加重要,比如講笑話的機(jī)器人,那么就可以設(shè)置得高一些。既然看了temperature參數(shù),我們也就一并看一下Completion這個接口里面的其他參數(shù)吧。第一個參數(shù)是engine,也就是我們使用的是OpenAI的哪一個引擎,這里我們使用的是text-davinci-003,也就是現(xiàn)在可以使用到的最擅長根據(jù)你的指令輸出內(nèi)容的模型。當(dāng)然,也是調(diào)用成本最高的模型。第二個參數(shù)是prompt,自然就是我們輸入的提示語。接下來,我還會給你更多使用提示語解決不同需求的例子。第三個參數(shù)是max_tokens,也就是調(diào)用生成的內(nèi)容允許的最大token數(shù)量。你可以簡單地把token理解成一個單詞。實際上,token是分詞之后的一個字符序列里的一個單元。有時候,一個單詞會被分解成兩個token。比如,icecream是一個單詞,但是實際在大語言模型里,會被拆分成ice和cream兩個token。這樣分解可以幫助模型更好地捕捉到單詞的含義和語法結(jié)構(gòu)。一般來說,750個英語單詞就需要1000個token。我們這里用的text-davinci-003模型,允許最多有4096個token。需要注意,這個數(shù)量既包括你輸入的提示語,也包括AI產(chǎn)出的回答,兩個加起來不能超過4096個token。比如,你的輸入有1000個token,那么你這里設(shè)置的max_tokens就不能超過3096。不然調(diào)用就會報錯。第四個參數(shù)n,代表你希望AI給你生成幾條內(nèi)容供你選擇。在這樣自動生成客服內(nèi)容的場景里,我們當(dāng)然設(shè)置成1。但是如果在一些輔助寫作的場景里,你可以設(shè)置成3或者更多,供用戶在多個結(jié)果里面自己選擇自己想要的。第五個參數(shù)stop,代表你希望模型輸出的內(nèi)容在遇到什么內(nèi)容的時候就停下來。這個參數(shù)我們常常會選用"\n\n"這樣的連續(xù)換行,因為這通常意味著文章已經(jīng)要另起一個新的段落了,既會消耗大量的token數(shù)量,又可能沒有必要。我們在下面試了一下,將“,”作為stop的參數(shù),你會發(fā)現(xiàn)模型在輸出了“親”之后就停了下來。1print(get_response(prompt,0.0,","第五個參數(shù)stop,代表你希望模型輸出的內(nèi)容在遇到什么內(nèi)容的時候就停下來。這個參數(shù)我們常常會選用"\n\n"這樣的連續(xù)換行,因為這通常意味著文章已經(jīng)要另起一個新的段落了,既會消耗大量的token數(shù)量,又可能沒有必要。我們在下面試了一下,將“,”作為stop的參數(shù),你會發(fā)現(xiàn)模型在輸出了“親”之后就停了下來。1print(get_response(prompt,0.0,","))親Completion這個接口當(dāng)然還有其他參數(shù),不過一時半會兒我們還用不著,后面實際用得上的時候我們再具體介紹。如果你現(xiàn)在就想知道,那么可以去查看一下官方文檔。如果你覺得英語不太好,可以試著用“請用中文解釋一下這段話的意思”作為提示語,調(diào)用OpenAI的模型來理解文檔的含義。AI聊天機(jī)器人上面我們知道了怎么用一句提示語讓AI完成一個任務(wù),就是回答一個問題。不過,我們怎么能讓AI和人“聊起來”呢?特別是怎么完成多輪對話,讓GPT能夠記住上下文。比如,當(dāng)用戶問我們,“iPhone14拍照好不好”,我們回答說“很好”。然后又問“它的價格是多少的時候”,我們需要理解,用戶這里問的“它”就是指上面的iPhone。對于聊天機(jī)器人來說,只理解當(dāng)前用戶的句子是不夠的,能夠理解整個上下文是必不可少的。而GPT的模型,要完成支持多輪的問答也并不復(fù)雜。我們只需要在提示語里增加一些小小的工作就好了。想要實現(xiàn)問答,我們只需要在提示語里,在問題之前加上“Q:”表示這是一個問題,然后另起一行,加上“A:”表示我想要一個回答,那么Completion的接口就會回答你在“Q:”里面跟的問題。比如下面,我們問AI“魚香肉絲怎么做”。它就一步一步地列出了制作步驟。復(fù)制代碼2345question= """Q:魚香肉絲怎么做?A:"""print2345question= """Q:魚香肉絲怎么做?A:"""print(get_response(question))準(zhǔn)備好食材:500克豬里脊肉,2個青椒,2個紅椒,1個洋蔥,2勺蒜蓉,3勺白糖,適量料酒,半勺鹽,2勺生抽,2勺醬油,2勺醋,少許花椒粉,半勺老抽,適量水淀粉。將豬里脊肉洗凈,瀝干水分,放入料酒、鹽,抓捏抓勻,腌制20分鐘。將青紅椒洗凈,切成絲,洋蔥洗凈,切成蔥花,蒜末拌入小蘇打水中腌制。將豬里脊肉切成絲,放入鍋中,加入洋蔥,炒制至斷生,加入青紅椒,炒勻,加入腌制好的蒜末,炒制至斷生。將白糖、生抽、醬油、醋、花椒粉、老抽、水淀粉倒入鍋中,翻炒勻,用小火收汁,調(diào)味即可。.5.而要完成多輪對話其實也不麻煩,我們只要把之前對話的內(nèi)容也都放到提示語里面,把整個上下文都提供給AI。AI就能夠自動根據(jù)上下文,回答第二個問題。比如,你接著問“那蠔油牛肉呢?”。我們不要只是把這個問題傳給AI,而是把前面的對話也一并傳給AI,那么AI自然知道你問的“那蠔油牛肉呢?”是指怎么做,而不是去哪里買或者需要多少錢。Q:魚香肉絲怎么做?A:詳細(xì)的魚香肉絲的做法Q:那蠔油牛肉呢?A:復(fù)制代碼123456question= """Q:魚香肉絲怎么做?A:準(zhǔn)備好食材:500克豬里脊肉,2個青椒,2個紅椒,1個洋蔥,2勺蒜蓉,3勺白糖,適量料酒,半勺鹽,2勺將豬里脊肉洗凈,瀝干水分,放入料酒、鹽,抓捏抓勻,腌制20分鐘。將青紅椒洗凈,切成絲,洋蔥洗凈,切成蔥花,蒜末拌入小蘇打水中腌制。將豬里脊肉切成絲,放入鍋中,加入洋蔥,炒制至斷生,加入青紅椒,炒勻,加入腌制好的蒜末,炒制至斷將白糖、生抽、醬油、醋、花椒粉、老抽、水淀粉倒入鍋中,翻炒勻,用小火收汁,調(diào)味即可。78910111213Q:那蠔油牛肉呢?A:"""print(get將豬里脊肉切成絲,放入鍋中,加入洋蔥,炒制至斷生,加入青紅椒,炒勻,加入腌制好的蒜末,炒制至斷將白糖、生抽、醬油、醋、花椒粉、老抽、水淀粉倒入鍋中,翻炒勻,用小火收汁,調(diào)味即可。78910111213Q:那蠔油牛肉呢?A:"""print(getresponse(question))準(zhǔn)備好食材:500克牛肉,2茶匙蔥姜蒜末,6茶匙蠔油,4茶匙米醋,3茶匙白糖,3茶匙醬油,1茶匙料酒,半茶匙鹽。將牛肉洗凈,放入清水中,加入料酒、鹽,煮至牛肉熟透,撈出瀝干水分,放入碗中。在另一鍋中,倒入蠔油,米醋,白糖,醬油翻炒均勻,加入蔥姜蒜末,翻炒均勻。將牛肉碗中放入蠔油汁中,炒勻,加入醬油,翻炒至汁呈紅色,收汁成濃稠狀即可。我在下面貼了一段完整的Python代碼叫做food_chatbot,它會從命令行讀入你的問題,然后給出回答。你可以繼續(xù)提問,然后我們把整個對話過程都發(fā)送給AI來回答。你可以嘗試著體驗一下,AI是不是能夠理解整個對話過程的上下文。你想要退出的時候,就在需要提問的時候,輸入“bye”就好了。復(fù)制代碼123456789101112131415161718192021importopenaiimportosopenai.api_key=os.environ["OPENAI_API_KEY"]defask_gpt3(prompt):response=openai.Completion.create(engine="text-davinci-003",prompt=prompt,max_tokens=512,n=1,stop=None,temperature=0.5,)message=response.choices[0].text.strip()returnmessageprint("你好,我是一個聊天機(jī)器人,請你提出你的問題吧?")questions=[]22232425262728293031323334353637383940414243answers=[]defgenerate_prompt(prompt,22232425262728293031323334353637383940414243answers=[]defgenerate_prompt(prompt,questions,answers):numfor=len(answers)iinrange(num):promptprompt+=prompt+=returnprompt"\n"\nQ:QA"::+""+questions[i]+answers[i]questions[num]+"\nA:"whileTrue:user_input=input(">")questions.append(user_input)ifuser_input.lower()in["bye","goodbye","exit"]:print("Goodbye!")breakprompt=generate_prompt("",questions,answers)answer=ask_gpt3(prompt)print(answer)answersappend(answer)讓AI幫我解決情感分析問題可以看到,巧妙地利用提示語,我們就能夠讓AI完成多輪的問答。那你是不是想到了,我們數(shù)學(xué)概念,完全用自然語言的提示語,讓AI幫助我們判斷一下用戶評論的情感是正面還是負(fù)面的呢?那我們不妨來試一下,告訴AI我們想要它幫助我們判斷用戶的評論情感上是正面的還是負(fù)面的,并且把上一講兩個iPhone評論的例子給它,告訴它什么是正面的,什么是負(fù)面的。然后,再給他一段新的評論,看看他是不是會回復(fù)正確的答案。我把對應(yīng)的代碼放在了下面,我們?nèi)匀恢皇呛唵蔚卣{(diào)用Completion的API一次。只是需要再把提示語分成三個組成部分。1.第一部分是我們給到AI的指令,也就是告訴它要去判斷用戶評論的情感。2.第二部分是按照一個固定格式給它兩個例子,一行以“評論:”開頭,后面跟著具體的評論,另一行以“情感:”開頭,后面跟著這個例子的情感。第三部分是給出我們希望AI判定的評論,同樣以“評論:”開頭跟著我們想要它判定的評論,另一行也以“情感:”開頭,不過后面沒有內(nèi)容,而是等著AI給出判定。3.復(fù)制代碼bad_case=prompts+2.第二部分是按照一個固定格式給它兩個例子,一行以“評論:”開頭,后面跟著具體的評論,另一行以“情感:”開頭,后面跟著這個例子的情感。第三部分是給出我們希望AI判定的評論,同樣以“評論:”開頭跟著我們想要它判定的評論,另一行也以“情感:”開頭,不過后面沒有內(nèi)容,而是等著AI給出判定。3.復(fù)制代碼bad_case=prompts+"""評論:信號不好電池也不耐電不推薦購買情感4"""56print(get_response(bad_case))復(fù)制代碼1 正面復(fù)制代碼prompts"""判斷一下用戶的評論情感上是正面的還是負(fù)面的評論:買的銀色版真的很好看,一天就到了,晚上就開始拿起來完系統(tǒng)很絲滑流暢,做工扎實,手感細(xì)膩,很情感:正面4評論:隨意降價,不予價保,服務(wù)態(tài)度差情感:負(fù)面7"""8good_case=prompts+"""評論:外形外觀:蘋果審美一直很好,金色非常漂亮拍照效果:14pro升級的4800萬像素真的是沒的說,太好了,運(yùn)行速度:蘋果的反應(yīng)速度好,用上三五年也不會卡頓的,之前的7P用到現(xiàn)在也不卡其他特色:14pro的磨砂金真的太好看了,不太高調(diào),也不至于沒有特點(diǎn),非常耐看,很好的情感:15"""1617print(get_response(good_case))1負(fù)面我們重新從京東商城的iPhone評論區(qū)隨機(jī)找兩個和上次不太一樣的好評和差評,可以看到,結(jié)果是準(zhǔn)確的。這是不是很棒?我們不需要任何機(jī)器學(xué)習(xí)的相關(guān)知識,用幾句話就能夠輕松搞定情感分析問題。注:常見的大模型的上下文學(xué)習(xí)能力,通過幾個例子,就能回答正確的結(jié)果。而上面這個“給一個任務(wù)描述、給少數(shù)幾個例子、給需要解決的問題”這樣三個步驟的組合,1負(fù)面我們重新從京東商城的iPhone評論區(qū)隨機(jī)找兩個和上次不太一樣的好評和差評,可以看到,結(jié)果是準(zhǔn)確的。這是不是很棒?我們不需要任何機(jī)器學(xué)習(xí)的相關(guān)知識,用幾句話就能夠輕松搞定情感分析問題。注:常見的大模型的上下文學(xué)習(xí)能力,通過幾個例子,就能回答正確的結(jié)果。而上面這個“給一個任務(wù)描述、給少數(shù)幾個例子、給需要解決的問題”這樣三個步驟的組合,也是大語言模型里使用提示語的常見套路。一般我們稱之為Few-ShotsLearning(少樣本學(xué)習(xí)),也就是給一個或者少數(shù)幾個例子,AI就能夠舉一反三,回答我們的問題。小結(jié)好了,到這里相信你已經(jīng)體會到Completion這個接口的魔力了。只要給出合理的提示語,OpenAI的大語言模型就能神奇地完成我們想要完成的任務(wù)。在這一講里,我們就看到了三個例子,第一個是給AI一個明確的指令,讓它幫我重寫一段話。第二個,是將整個對話的歷史記錄都發(fā)送出去,并且通過Q和A提示AI這是一段對話,那么AI自然能夠理解整個上下文,搞清楚新的問題是指“蠔油牛肉怎么做”而不是“哪里買或者怎么吃”。而第三個例子,我們則是給了AI幾個正面情感和負(fù)面情感的例子,它就能夠直接對新的評論做出準(zhǔn)確的情感判斷??梢钥吹?,善用合適的提示語,能夠讓大語言模型完成很多任務(wù)。這也是為什么,我們認(rèn)為它已經(jīng)是我們邁向通用人工智能的第一步。課后練習(xí)上一講我給出了一些數(shù)據(jù)集,通過向量距離來進(jìn)行正面和負(fù)面情感的判斷。那么,你能不能試著用這一講的在這一講里,我們就看到了三個例子,第一個是給AI一個明確的指令,讓它幫我重寫一段話。第二個,是將整個對話的歷史記錄都發(fā)送出去,并且通過Q和A提示AI這是一段對話,那么AI自然能夠理解整個上下文,搞清楚新的問題是指“蠔油牛肉怎么做”而不是“哪里買或者怎么吃”。而第三個例子,我們則是給了AI幾個正面情感和負(fù)面情感的例子,它就能夠直接對新的評論做出準(zhǔn)確的情感判斷??梢钥吹剑朴煤线m的提示語,能夠讓大語言模型完成很多任務(wù)。這也是為什么,我們認(rèn)為它已經(jīng)是我們邁向通用人工智能的第一步。課后練習(xí)上一講我給出了一些數(shù)據(jù)集,通過向量距離來進(jìn)行正面和負(fù)面情感的判斷。那么,你能不能試著用這一講的Few-ShotsLearning的方法,在對應(yīng)的數(shù)據(jù)集上也運(yùn)行一下,看看通過這種方式進(jìn)行情感分析的準(zhǔn)確率是多少?歡迎你在留言區(qū)分享你的思考,也歡迎你把這節(jié)課分享給感興趣的朋友,我們下一講再見。推薦嘗試在使用GPT類型的模型的時候,提示語非常重要。所以,有人專門制作了一個叫做AIPRM的瀏覽器插件,包含了很多總結(jié)出來有效的提示語。你可以試著安裝,看看別人都用了什么有趣的提示語。?版權(quán)歸極客邦科技所有,未經(jīng)許可不得傳播售賣。頁面已增加防盜追蹤,如有侵權(quán)極客邦將依法追究其法律責(zé)任。0404|GPT大模型效果性能什么是預(yù)訓(xùn)練模型?給出一段文本,OpenAI就能返回給你一個Embedding向量,這是因為它的背后是GPT-3這個超大規(guī)模的預(yù)訓(xùn)練模型(Pre-trainedModel)。事實上,GPT的英文全稱翻譯過來就是“生成式預(yù)訓(xùn)練Transformer(GenerativePre-trainedTransformer)”。所謂預(yù)訓(xùn)練模型,就是雖然我們沒有看過你想要解決的問題,比如這里我們在情感分析里看到的用戶評論和評分。但是,我可以拿很多我能找到的文本,比如網(wǎng)頁文章、維基百科里的文章,各種書籍的電子版等等,什么是預(yù)訓(xùn)練模型?給出一段文本,OpenAI就能返回給你一個Embedding向量,這是因為它的背后是GPT-3這個超大規(guī)模的預(yù)訓(xùn)練模型(Pre-trainedModel)。事實上,GPT的英文全稱翻譯過來就是“生成式預(yù)訓(xùn)練Transformer(GenerativePre-trainedTransformer)”。所謂預(yù)訓(xùn)練模型,就是雖然我們沒有看過你想要解決的問題,比如這里我們在情感分析里看到的用戶評論和評分。但是,我可以拿很多我能找到的文本,比如網(wǎng)頁文章、維基百科里的文章,各種書籍的電子版等等,作為理解文本內(nèi)容的一個學(xué)習(xí)資料。我們不需要對這些數(shù)據(jù)進(jìn)行人工標(biāo)注,只根據(jù)這些文本前后的內(nèi)容,來習(xí)得文本之間內(nèi)在的關(guān)狗后面都會跟著“很可愛”,那么我們就會知道小貓和小狗應(yīng)該是相似的詞,都是寵物。同就帶來了少量用戶評論和評分?jǐn)?shù)據(jù)里缺少的“常識”,這些“常識”也有助于我們更好地預(yù)測。比如,文本里有“白日依山盡”,那么模型就知道后面應(yīng)該跟“黃河入海流”。文本前面是據(jù)這個向量,來推算這個文本后面的內(nèi)容??梢赃@樣來理解:用來訓(xùn)練的語料文本越豐富,模型中可以放的參數(shù)越多,那模型能夠?qū)W到的關(guān)系也就越多。類似的情況在文本里出現(xiàn)得越多,那么將來模型猜得也就越準(zhǔn)。預(yù)訓(xùn)練模型在自然語言處理領(lǐng)域并不是OpenAI的專利。早在2013年,就有一篇叫做Word2Vec的經(jīng)典論文談到過。它能夠通過預(yù)訓(xùn)練,根據(jù)同一個句子里一個單詞前后出現(xiàn)的單詞,來得到每個單詞的向量。而在2018年,Google關(guān)于BERT的論文發(fā)表之后,整個業(yè)界也都會使用BERT這樣的預(yù)訓(xùn)練模型,把一段文本變成向量用來解決自己的自然語言處理任務(wù)。在GPT-3論文發(fā)表之前,大家普遍的結(jié)論是,BERT作為預(yù)訓(xùn)練的模型效果也是優(yōu)于GPT的。Fasttext、T5、GPT-3模型效果大比拼今天我們就拿兩個開源的預(yù)訓(xùn)練模型,來看看直接用它們對文本進(jìn)行向量化,是不是也能取得和OpenAI的API一樣好的效果。第一個是來自界也都會使用BERT這樣的預(yù)訓(xùn)練模型,把一段文本變成向量用來解決自己的自然語言處理任務(wù)。在GPT-3論文發(fā)表之前,大家普遍的結(jié)論是,BERT作為預(yù)訓(xùn)練的模型效果也是優(yōu)于GPT的。Fasttext、T5、GPT-3模型效果大比拼今天我們就拿兩個開源的預(yù)訓(xùn)練模型,來看看直接用它們對文本進(jìn)行向量化,是不是也能取得和OpenAI的API一樣好的效果。第一個是來自Facebook的Fasttext,它繼承了的思路,能夠把一個個單詞表示成向量。第二個是來自Google的T5,T5的全稱是適合做遷移學(xué)習(xí)的一個模型。所謂遷移學(xué)習(xí),也就是它推理出來向量的結(jié)果,常常被拿來再進(jìn)行機(jī)器學(xué)習(xí),去解決其他自然語言處理問題。通常很多新發(fā)表的論文,會把T5作為預(yù)訓(xùn)練模型進(jìn)行微調(diào)和訓(xùn)練,或者把它當(dāng)作Benchmark來對比、評估。Fasttext效果測試我們先來試一下Fasttext,在實際運(yùn)行代碼之前,我們需要先安裝Fasttext和Gensim這兩個Python包。我在下面列出了通過Conda安裝對應(yīng)Python包的代碼,如果你使用的是PIP或者其他的Python包管理工具,你就換成對應(yīng)的PIP命令就好了。復(fù)制代碼12condainstallgensimcondainstallfasttext然后,我們要把Fasttext對應(yīng)的模型下載到本地。因為這些開源庫和對應(yīng)的論文都是Facebook和Google這樣的海外公司發(fā)布的,效果自然是在英語上比較好,所以我們就下載對應(yīng)的英語模型,名字叫做“cc.en.300.bin”。同樣的,對應(yīng)模型的下載鏈接,我也放在這里了。下載之后解壓,然后把文件放在和Notebook相同的目錄下,方便我們接下來運(yùn)行代碼。這里我們拿來測試效果的數(shù)據(jù)集還是和第02講一樣,用的是2.5w條亞馬遜食物評論的數(shù)據(jù)。注:各種語言的Fasttext模型。代碼的邏輯也不復(fù)雜,我們先利用Gensim這個庫,把Facebook預(yù)訓(xùn)練好的模型加載進(jìn)來。然后,我們定義一個獲取文本向量的函數(shù)。因為Fasttext學(xué)到的是單詞的向量,而不是句定義成了get_fasttext_vector這個函數(shù),供后面的程序使用。這里我們拿來測試效果的數(shù)據(jù)集還是和第02講一樣,用的是2.5w條亞馬遜食物評論的數(shù)據(jù)。注:各種語言的Fasttext模型。代碼的邏輯也不復(fù)雜,我們先利用Gensim這個庫,把Facebook預(yù)訓(xùn)練好的模型加載進(jìn)來。然后,我們定義一個獲取文本向量的函數(shù)。因為Fasttext學(xué)到的是單詞的向量,而不是句定義成了get_fasttext_vector這個函數(shù),供后面的程序使用。復(fù)制代碼1234567891011importimport#LoadgensimnumpyasnptheFastTextpre-trainedmodelmodel=gensim.models.fasttext.load_facebook_model('cc.en.300.bin')defget_fasttext_vector(line):vecfor=np.zeros(300)#Initializeanempty300-dimensionalwordinline.split():vec+=model.wv[word]/=len(line.split())#Taketheaverageoverallwordsinthelinevecreturnvec而對應(yīng)的零樣本學(xué)習(xí),我們還是和第02講一樣,將需要進(jìn)行情感判斷的評論分別與“AnAmazonreviewwithapositivesentiment.”以及“AnAmazonreviewwithanegativesentiment.”這兩句話進(jìn)行向量計算,算出它們之間的余弦距離。離前一個近,我們就認(rèn)為是正面情感,離后一個近就是負(fù)面情感。輸出結(jié)果:而對應(yīng)的零樣本學(xué)習(xí),我們還是和第02講一樣,將需要進(jìn)行情感判斷的評論分別與“AnAmazonreviewwithapositivesentiment.”以及“AnAmazonreviewwithanegativesentiment.”這兩句話進(jìn)行向量計算,算出它們之間的余弦距離。離前一個近,我們就認(rèn)為是正面情感,離后一個近就是負(fù)面情感。輸出結(jié)果:我們從亞馬遜食物評論的數(shù)據(jù)集里,選取了一個用戶打5分的正面例子和一個用戶打1分的例子試了一下。結(jié)果非常不幸,通過這個零樣本學(xué)習(xí)的方式,這兩個例子,程序都判斷錯了。復(fù)制代碼Fasttext好評例子的評分0.000544Fasttext差評例子的評分0.000369復(fù)制代碼positive_text="""WantedtosavesometobringtomyChicagofamilybutmyNorthnegative_text="""First,theseshouldbecalledMac-Coconutbars,asCoconuti3positive_example_in_fasttext=get_fasttext_vector(positive_text)negative_example_in_fasttext=get_fasttext_vector(negative_text)6positive_review_in_fasttext=get_fasttext_vector("AnAmazonreviewwithapositinegative_review_in_fasttext=get_fasttext_vector('AnAmazonreviewwithanegati910fromopenai.embeddings_utilsimportcosine_similarity11defget_fasttext_score(sample_embedding):returncosine_similarity(sample_embedding,positive_review_in_fasttext)-cosin14positive_score=get_fasttext_score(positive_example_in_fasttext)negative_score=get_fasttext_score(negative_example_in_fasttext)17print("Fasttext好評例子的評分%f"(positive_score))print("Fasttext差評例子的評分%f"(negative_score))不過,仔細(xì)想一下,這樣的結(jié)果也正常。因為這里的整句向量就是把所有單詞的向量平均了一下。這意味著,可能會出現(xiàn)我們之前說過的單詞相同順序不同的問題?!皀otgood,reallybad”和“notbad,reallygood”,在這個情況下,意思完全不同,但是向量完全相同。更何況,我們拿來做對比的正面情感和負(fù)面情感的兩句話,只差了positive/negative這樣一個單詞。不考慮單詞的順序,而只考慮出現(xiàn)了哪些單詞,并且不同單詞之間還平均一下。這種策略要是真的有很好的效果,你反而要擔(dān)心是不是哪里有Bug。T5效果測試Fasttext出師不利,畢竟Word2Vec已經(jīng)是10年前的技術(shù)了,可以理解。那么,我們來看看和GPT一樣使用了現(xiàn)在最流行的Transformer結(jié)構(gòu)的T5模型效果怎么樣。T5模型的全稱是Text-to-TextTransferTransformer,翻譯成中文就是“文本到文本的遷移Transformer”,也就是說,這個模型就是為了方便預(yù)訓(xùn)練之后拿去“遷移”到別的任務(wù)上而創(chuàng)造出來的。當(dāng)時發(fā)表的時候,它就在各種數(shù)據(jù)集的評測上高居榜首。不過,仔細(xì)想一下,這樣的結(jié)果也正常。因為這里的整句向量就是把所有單詞的向量平均了一下。這意味著,可能會出現(xiàn)我們之前說過的單詞相同順序不同的問題?!皀otgood,reallybad”和“notbad,reallygood”,在這個情況下,意思完全不同,但是向量完全相同。更何況,我們拿來做對比的正面情感和負(fù)面情感的兩句話,只差了positive/negative這樣一個單詞。不考慮單詞的順序,而只考慮出現(xiàn)了哪些單詞,并且不同單詞之間還平均一下。這種策略要是真的有很好的效果,你反而要擔(dān)心是不是哪里有Bug。T5效果測試Fasttext出師不利,畢竟Word2Vec已經(jīng)是10年前的技術(shù)了,可以理解。那么,我們來看看和GPT一樣使用了現(xiàn)在最流行的Transformer結(jié)構(gòu)的T5模型效果怎么樣。T5模型的全稱是Text-to-TextTransferTransformer,翻譯成中文就是“文本到文本的遷移Transformer”,也就是說,這個模型就是為了方便預(yù)訓(xùn)練之后拿去“遷移”到別的任務(wù)上而創(chuàng)造出來的。當(dāng)時發(fā)表的時候,它就在各種數(shù)據(jù)集的評測上高居榜首。T5最大的模型也有110億個參數(shù),也是基于Transformer,雖然比起GPT-3的1750億小了不少,但是對硬件的性能要求也不低。所以,我們先測試一下T5-Small這個小模型看看效果。同樣的,在實際運(yùn)行代碼之前,我們也需要安裝對應(yīng)的Python包。這里我們分別安裝了SentencePiece和PyTorch。在安裝PyTorch的時候,我一并安裝了Torchvision,后面課程會用到。復(fù)制代碼123condacondacondainstallinstallinstalltransformers-cconda-forgepytorchtorchvision-csen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全款轉(zhuǎn)讓房產(chǎn)合同范本
- 加班法務(wù)合同范本
- 公司入股合同范本文檔
- 仔豬購銷糾紛合同范本
- 包裝插畫合同范本
- 農(nóng)村協(xié)議買房合同范本
- 2024年金山區(qū)衛(wèi)生健康事業(yè)單位招聘衛(wèi)生專業(yè)技術(shù)人員考試真題
- 2024年南丹縣丹融文化傳媒有限公司招聘筆試真題
- 農(nóng)村修水渠合同范本
- 2024年阜陽市皖西北(阜南)糧食產(chǎn)業(yè)園有限公司招聘考試真題
- 2024年江蘇航空職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 幼兒羽毛球培訓(xùn)課件
- 紅色旅游線路
- 膝骨關(guān)節(jié)炎中醫(yī)診療指南
- 胰性腦病和wernicke腦病
- 大國工匠課件
- 遼寧省冷鏈物流行業(yè)報告
- 清潔氫能生產(chǎn)與輸儲技術(shù)創(chuàng)新
- 產(chǎn)品標(biāo)準(zhǔn)化大綱(課件)
- 貸款的培訓(xùn)課件
- 《雷達(dá)干擾技術(shù)概述》課件
評論
0/150
提交評論