吳恩達大模型教程筆記-七-

绝不原创的飞龙發表於2024-10-01

吳恩達大模型教程筆記(七)

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P29:5——基於文件的問答 - 吳恩達大模型 - BV1gLeueWE5N

人們構建的最常見覆雜應用之一。

使用llm是一個可回答文件內或關於文件問題的系統,給定一段文字可能來自PDF檔案或網頁,或公司內部文件庫,你能用nlm回答關於這些文件內容的問題嗎,幫助使用者深入瞭解並獲取所需資訊,這非常強大。

因為它開始將語言模型與它們未受過訓練的資料結合起來,這使得它們更加靈活和適應您的用例,這也非常令人興奮,因為我們將開始超越語言模型,提示和輸出解析器,並開始引入連結鏈的一些關鍵元件。

如嵌入模型和向量儲存,如安德魯提到的,這是我們擁有的最受歡迎的鏈之一,所以,我希望你興奮,實際上,嵌入和向量儲存是現代最強大的技術之一,所以如果你還沒有見過它們,它們非常值得學習,那麼讓我們深入。

讓我們開始,我們將開始匯入環境變數,我們現在總是這樣做。

我們將匯入一些在構建此鏈時將幫助我們,我們將匯入檢索qa鏈,這將對一些文件進行檢索,或匯入,我們最喜歡的聊天openai語言模型,我們將匯入一個文件載入器,這將用於載入一些專有資料。

我們將與語言模型結合,在這種情況下,它將在csv中,因此我們將匯入csv載入器,最後我們將匯入一個向量儲存,有許多不同型別的向量儲存,我們稍後將涵蓋它們的確切含義。

但我們將從docker ray記憶體搜尋向量儲存開始,這真的很棒,因為它是一個記憶體向量儲存。

並且不需要連線到任何外部資料庫,這使得它非常容易開始,我們還將匯入。

顯示和markdown,用於在jupyter筆記本中顯示資訊的常用工具,我們提供了一個戶外服裝的csv,我們將與語言模型結合,在這裡我們將初始化一個載入器。

使用此檔案的路徑初始化csv載入器,接下來我們將匯入一個索引。

向量儲存索引建立器。

這將幫助我們非常容易地建立一個向量儲存,我們將匯入,顯示和markdown,用於在jupyter筆記本中顯示資訊的常用工具,如下面所示,只需幾行程式碼即可建立,建立它,我們將指定兩件事,首先。

我們將指定向量儲存類,如前所述。

我們將使用此向量儲存,因為它特別容易入門。

建立後,我將從載入器呼叫,接受文件載入器列表。

我們只關心一個載入器,這就是傳入的內容。

現已建立,可開始提問。

將解釋內部發生了什麼,現在別擔心這個。

現在從查詢開始,使用索引查詢建立響應,再次傳入查詢。

現在先不解釋內部情況。

等待響應,完成後。

現在可檢視返回內容,返回Markdown表格,含防曬襯衫名和描述,語言模型提供小結。

已過文件問答方法,但內部究竟如何?

先思考總體思路,想用語言模型結合文件,存在關鍵問題,語言模型一次只能檢查幾千個單詞。

所以如果我們有非常大的文件,如何讓語言模型回答文件中所有內容的問題,這時嵌入和向量儲存開始發揮作用。

讓我們談談嵌入,嵌入,為文字片段建立數值表示。

該數值表示捕獲了文字片段的語義含義,它已被執行過,具有相似內容的文字片段,將有相似向量,這讓我們能在向量空間比較文字片段,在示例下,我們有3個句子,前兩個關於寵物很好。

第三個關於汽車,若看數值空間表示,當我們比較文字片段的2個向量,對應於關於寵物的句子。

它們非常相似很好,若與談論汽車的相比。

它們完全不同,這將使我們容易找出哪些文字相似。

這將非常有用,因為我們考慮包含哪些文字。

當傳遞給語言模型回答問題時,接下來要講的元件是向量資料庫。

向量資料庫是儲存之前步驟中建立的向量表示的一種方式。

我們建立向量資料庫的方式是。

用來自入站文件的文字塊填充它,當我們得到一個大的入站文件時,我們首先將其拆分為較小的塊,這有助於建立比原始文件更小的文字塊,這很有用,因為我們可能無法將整個文件傳遞給語言模型。

因此,我們想建立這些小塊,以便我們只能將最相關的傳遞給語言模型。

然後,我們為這些塊建立嵌入。

然後將它們儲存在向量資料庫中,這就是建立索引時發生的情況。

現在我們已經有了這個索引,我們可以在執行時使用它,找到與入站查詢最相關的文字塊。

當查詢進來時,我們首先為該查詢建立嵌入。

然後我們將其與向量資料庫中的所有向量進行比較。

並選擇最相似的n個,這些然後被返回,我們可以將它們放入提示中傳遞給語言模型以獲取最終答案。

因此,上面我們建立了這個鏈條,只有幾行程式碼,非常適合快速開始,但現在讓我們更詳細地做,並瞭解底層到底發生了什麼。

第一步與上面類似,我們將建立一個文件載入器,從包含所有產品描述的csv中載入,我們想回答的問題。

然後,我們可以從這個文件載入器中載入文件。

如果我們檢視單個文件,我們可以看到每個文件對應csv中的一個產品,之前我們討論了建立塊,因為這些文件已經很小,實際上我們不需要在這裡做任何切塊。

因此,我們可以直接建立嵌入。

要建立嵌入,我們將使用open eyes的嵌入類,我們可以匯入它並在這裡初始化它,如果我們想看看這些嵌入做了什麼,實際上,我們可以看看當我們嵌入特定文字時會發生什麼,讓我們使用嵌入查詢方法在嵌入物件上。

為特定文字建立嵌入,在這種情況下,句子'hi',我的名字是哈里森。

看看這個嵌入,有超過一千個不同元素。

每個元素是一個數值,結合這些,形成文字的整體數值表示。

要為載入的所有文字建立嵌入。

然後將其儲存在向量儲存中,可以使用向量儲存的from_documents方法。

該方法接受文件列表和嵌入物件,然後建立整體向量儲存。

現在可以使用向量儲存查詢與查詢相似的文字。

看看查詢,請推薦一件帶些遮擋的襯衫。

如果使用向量儲存的相似搜尋方法並傳入查詢。

將返回文件列表。

可以看到返回了4個文件,檢視第一個。

確實是一件關於遮擋的襯衫,如何使用這個來回答我們自己的文件問題,首先需要從這個向量儲存建立檢索器。

檢索器是一個通用介面,可以由任何接受查詢並返回文件的方法支援。

向量儲存和嵌入是實現這一方法的一種,儘管有大量不同的方法,有些不那麼先進,有些更先進,因為我們想進行文字生成並返回自然語言響應,將匯入語言模型,將使用chat openai。

如果手工操作,我們會將文件合併成單篇文字。

像這樣,將所有頁面內容合併到變數中。

然後傳遞這個變數或問題的變體,如請列出所有帶有保護措施的搜尋表格,用標記語言並總結每個到語言模型,如果列印出響應,可以看到我們得到了表格。

正如我們所要求的,所有這些步驟都可以用lane chain鏈封裝,所以這裡可以建立檢索。

Qing,這做檢索,然後在檢索的文件上做問答以建立這樣的鏈。

將傳入幾個不同的東西,首先將傳入語言模型,這將在最後用於文字生成。

接下來將傳入鏈型別,我們將使用stuff,這是最簡單的方法,因為它只是把所有文件放入上下文並呼叫一次語言模型,還有一些其他方法可以使用來提問,回答將在最後提及,但不會詳細檢視,第三步傳入檢索器。

上面建立的檢索器僅是獲取文件的介面,將用於獲取文件並將其傳遞給語言模型。

最後設定verbose等於true。

現在可以建立查詢並執行鏈在此查詢上,收到響應時,再次使用display和markdown工具顯示。

您可以暫停影片並嘗試使用大量不同查詢。

這就是詳細做法,但請記住,我們仍然可以很容易地,使用上面的單行程式碼,因此,這兩件事等同於相同的結果,這是關於linchain有趣的部分,你可以在一行中完成,或者檢視單獨的項並將其分解為五個更詳細的項。

五個更詳細的項允許您設定關於正在發生什麼的更多具體資訊,單行程式碼易於開始,所以取決於你。

關於你更喜歡如何前進,我們還可以在建立索引時自定義索引。

所以如果你記得我們手動建立它,我們指定了嵌入。

我們還可以在這裡指定嵌入,因此,這給了我們控制嵌入本身如何建立的靈活性。

我們還可以將向量儲存器替換為不同型別的向量儲存器。

當你手動建立它時所做的相同級別的定製。

在建立索引時也可用,我們在筆記本中使用stuff方法,stuff方法真的很棒,因為它很簡單,你只需將所有內容放入一個提示中,並將其傳送給語言模型以獲取一個響應,所以很容易理解正在發生的事情。

它非常便宜並且工作得很好。

但並不總是有效,好吧,所以如果你記得我們在筆記本中檢索文件。

我們只得到了四份文件,它們相對較小,但如果你想要做同樣型別的問題。

回答大量不同型別的塊,我們可以使用幾種不同的方法。

第一個是mapreduce,基本上將所有塊,與問題一起傳遞給語言模型,得到響應。

然後使用另一個語言模型呼叫來總結所有個別響應到一個最終答案。

這非常強大,因為它可以操作任何數量的文件,它也非常強大,因為你可以並行處理個別問題,但它確實需要更多的呼叫,所有文件視為獨立。

這不總是最想要的,精煉,再次遍歷多文件的方法,實際上迭代進行,基於前文件的答案構建,非常適合組合資訊,隨時間構建答案,通常導致較長的答案,也不那麼快,因為呼叫不再獨立,依賴於前次呼叫的結果。

這意味著通常需要更長的時間,與MapReduce一樣多的呼叫。

MapRerank是一個有趣且更實驗性的方法,對每個文件進行一次語言模型呼叫。

並要求它返回一個分數,然後選擇最高分,這依賴於語言模型知道分數應該是什麼。

所以經常需要告訴它,嘿,如果與文件相關,應該是高分,真正細化指示。

類似於MapReduce,所有呼叫都是獨立的,因此可以批次處理,相對較快,但再次進行了很多語言模型呼叫。

所以會稍微貴一些,最常用的方法是stuff方法。

我們在筆記本中用它把所有內容組合成一個文件,第二常用的是MapReduce方法,將這些塊傳送到語言模型。

這些方法,Stuff,MapReduce精煉,以及WeRank也可以用於許多其他鏈條。

不僅僅是問答,例如,MapReduce鏈的一個非常常見的用例是摘要,您有一個非常長的文件,並希望遞迴總結資訊片段,這就是文件問答的全部,你可能已經注意到,我們這裡的不同鏈條中有很多正在進行的事情。

所以在下一節。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P3:3-微調在訓練過程中的位置 - 吳恩達大模型 - BV1gLeueWE5N

在這堂課中,你將瞭解精細調整如何真正融入訓練過程,它發生在一個被稱為預訓練的步驟之後,你將對其有一些詳細的瞭解,然後,你將學習到所有可以應用的不同任務,精細調整就緒,讓我們繼續,好嗎。

讓我們先看看精細調整在哪裡。

讓我們看看預訓練,這是精細調整發生之前的第一個步驟,實際上,它在開始時有一個模型,那完全是隨機的,它對世界一無所知,所以所有它的權重,如果你熟悉權重,那麼它們是完全隨機的,它完全無法形成英語單詞。

它還沒有語言技能,而且它學習的目標下一個標記預測或真的,你知道,從簡化的角度來看,在這裡它就是下一個詞的預測,所以你看到一次這個詞,所以我們現在希望它能預測這個詞。

但是當你看到llm只是產生sd感嘆號時,感嘆號在所以,離這個詞upon非常遠,這就是它開始的地方,但它正在從巨大的資料集中讀取和理解,常常從整個網路中抓取,我們常常稱這個為未標記的。

因為它不是我們一起結構化的。

我們只是直接從網路上抓取它,我會說它已經經歷了許多許多清潔過程,所以,為了獲取這個資料集,仍然需要大量的手動工作,對於模型預訓練來說,要有效,因為模型本質上是在透過下一個標記詞的預測來監督自己。

它只需要預測下一個詞,實際上沒有標籤,否則,在這裡訓練後,你看,模型現在能夠預測單詞或標記或,嗯,而且它是一種學習的語言,它從網際網路上學習了大量的知識,所以,這個過程實際上能工作真是太棒了,用這種方式。

而且因為它只是試圖預測下一個標記,所以令人驚歎,現在,它正在閱讀整個網際網路的資料量來做到這一點。

好的,也許'整個網際網路'上有一個星號,資料和從整個網際網路上抓取的資料,這個背後的實際理解和知識往往並不公開,人們,實際上並不清楚那個資料集的具體樣子,對於大型公司的許多封閉源模型。

但是luther ai進行了一次驚人的開源努力,建立了一個資料集叫做堆,你在這個實驗室中將有機會探索它,它的意思是它是一個由兩個組成的集合,兩個來自整個網際網路的多樣化資料集。

你可以在這裡看到這個圖表,你知道有四百八十七年,還有林肯的胡蘿蔔蛋糕食譜,當然也是從pubmed中抓取,有關不同醫學文字的資訊,最後這裡還有來自github的程式碼,所以它是一個包含相當智慧的資料集。

被精心挑選在一起,以實際將這些模型注入知識,現在,這個預訓練步驟實際上是非常昂貴和時間消耗的,因為它需要花費大量的時間來讓模型遍歷所有這些資料,從絕對的隨機性到理解一些這些文字,你知道。

製作胡蘿蔔蛋糕食譜,同時編寫程式碼。

好的,這些基於預訓練的模型很棒,實際上,外面有很多開源的它們,你知道,它們被訓練在這些來自網路的資料集上,你可能在這裡看到左上角的地理作業,它問,印度的首都是什麼,肯亞的首都是什麼,在所有這些中。

法國的首都是什麼,你知道,在沒有看到答案的情況下,當你輸入墨西哥的首都是什麼時,lm可能會說匈牙利的首都是什麼,你可以看到,它不是從聊天機器人介面的角度來看非常有用的。

那麼如何使它達到聊天機器人介面,微調是實現這一目標的一種方式,它應該是你工具箱中的一種工具,預訓練實際上是第一步,它給你那個基礎模型,當你新增更多的資料時,實際上不是那麼多資料。

你可以使用微調來獲取一個微調模型,甚至一個微調模型,你可以在後續新增更多的微調步驟,微調實際上是一個後續步驟,你可以使用相同的型別的資料,實際上,你可能可以從不同的來源抓取資料並一起篩選。

稍後你會看到這一點,這樣它就可以是這個引言,未標記的資料,但你也可以自己編輯資料,以便為模型學習提供更多的結構化資訊,我認為一個關鍵的區別在於,微調與預訓練,需要的資料要少得多。

你正在構建在這個基礎模型上,這個模型已經學習瞭如此多的知識和基本語言技能,你實際上是將其提升到下一個級別,你不需要那麼多資料,所以這確實在你的工具箱中,如果你來自其他機器學習領域。

你知道這是對判別性任務的微調,也許你在處理影像,你已經在imagenet上進行了微調,在這裡,微調的定義稍微寬鬆一些,對於生成性任務,它定義得不如判別性任務明確,因為我們實際上是在更新整個模型的權重。

不僅僅是它的一部分,這通常是微調的情況,那些其他的模型型別,所以,我們在這裡與預訓練的目標相同,對於微調,下一個標記的生產,我們所做的只是改變資料,以便以某種方式更有結構。

並且模型可以更一致地輸出和模仿這種結構,此外,還有更先進的方法可以減少您想要更新此模型的程度,稍後我們將討論這個問題。

所以,微調對你們做了什麼,所以你現在開始理解它是什麼樣子了,但是任務有哪些不同,這樣你就可以用它做得很好,我想象的一個巨大類別就是行為改變,你在改變模型的行為,你正在告訴它確切的,你知道在這個聊天介面。

我們現在在一個聊天設定中,我們不在看調查,所以這導致模型能夠更一致地響應,這意味著模型可以更專注於,也許這對稽核來說會更好,例如,而且這也是一般性地在挖掘其能力,所以這裡它在對話上更好。

所以它可以現在談論各種各樣的事情,與以前相比,我們需要做很多提示工程,以便挖掘出那個資訊,微調也可以幫助模型獲得新知識。

所以這可能是關於不在那個基礎中的特定主題。

預訓練模型,這可能意味著糾正舊的錯誤資訊,所以也許有,你更希望模型實際吸收的更新一些最近的資訊,當然,最常見的是你正在做這兩件事,所以經常你會改變行為,你想要它獲得新知識,所以往下降一個檔次。

所以微調任務,對於llms來說,實際上就是文字和文字輸出,我喜歡把它分為兩個不同的分類,所以你可以這麼想,一個作為提取文字,所以你輸入文字,然後你得到較少的文字輸出,所以很多工作都在閱讀上。

這可能是提取關鍵詞,你可能要路由的主題,你知道,基於你看到的所有資料,你路由聊天,例如,路由到API或其他不同代理在這裡,像不同代理的能力,這與擴充套件相反,這就是你輸入文字的地方。

然後你得到更多的文字輸出,我喜歡把它想成寫作,所以這可能是聊天,寫電子郵件,寫程式碼,真正理解你的任務,這兩個不同任務之間的確切區別,或者你可能有多個任務想要微調,我發現這是最明確的成功指標。

如果你想成功,微調模型是明確你想要做什麼任務的關鍵,清晰意味著知道什麼是,你知道一個好的,你知道什麼樣的好輸出看起來。

那個輸出看起來什麼樣子,但也知道什麼樣的輸出更好,當你知道某件事在寫程式碼方面做得更好,或者在實際幫助路由任務方面做得更好。

你實際上微調這個模型來做得很好,好的,如果你這是首次微調,我推薦幾個不同步驟,首先,透過提示工程識別一個任務,只要大型llm,例如,聊天bot,可以是,所以,你就只是在與chgbt玩耍。

像你通常做的那樣,然後你找到了一些,你知道,它正在執行的任務,好的,是的,所以不是非常好,但也不像非常糟糕,所以你知道這在可能的範圍內是可能的,但它不是,它不是最好的,你想要它為你的任務做得更好。

所以選擇那個任務,然後只選擇一個,然後數字四,嗯,為那個任務獲取一些輸入和輸出,所以你輸入一些文字,然後你得到了一些文字輸出,嗯,獲取輸入,你在哪裡輸入文字,得到文字輸出,輸出,對於這個任務。

這些對的數量,其中我喜歡使用的一個黃金數字是一千,因為我發現那是開始需要資料的一個好地方。

並確保這些輸入和輸出比'好'更好。

在您無法生成這些輸入之前,LLM的結果,輸出的必要並非總是,所以確保你有這些資料對,你也將在實驗室中探索這一點,整個管道在這裡,從那裡開始,然後,你可以在這個資料上微調一個小的LLM。

只是為了感受到效能的提升,如果這是你第一次,這是我推薦的,現在讓我們進入實驗室,在那裡,你可以探索用於預訓練和微調的資料集,所以你完全理解這些輸入輸出對的樣子。

好的,我們將開始透過匯入一些不同的庫來開始,我們將執行那個,我們首先將使用的庫是datasets,來自Hugging Face的庫,他們有一個偉大的函式叫做load data set。

你可以直接從他們的hub拉取資料集並執行它。

我在這裡將拉取預訓練資料集,叫做你看到的那個堆疊,我在這裡抓取分割,訓練集與測試集,並且非常具體地,我實際上正在抓取流式,等於true,因為這個資料集非常大,我們不能在沒有破壞這個筆記本的情況下下載它。

所以實際上,我將逐個流式傳輸它,以便我們可以探索那裡的不同資料部分,所以只是載入它。

現在我要只看前五個,所以這正在使用itertools。

很好,好的,在這裡,你可以在預訓練資料集中看到,這裡有很多看起來像是從網路上抓取的資料,你知道,這個文字說它已經完成並提交,你可以在安卓上玩生存模式tcs,這就是一個例子,讓我們看看是否能找到另一個。

在這裡,這裡有另一個,這就是從網路上抓取的程式碼,被抓取的XML程式碼,這是另一個資料點,在這裡,你會看到文章內容,你會看到這個主題的內容,你知道,亞馬遜在aws上宣佈了一個新服務,然後這裡是關於,你知道。

大滿貫釣魚遊艇,這是一家家庭企業,這就是,你知道,就是一種從網際網路上抓取的不同資料集的混亂,我想對比,與將在不同實驗室中使用的一組進行微調的資料集,我們正在抓取一家公司的,問題答案對資料集,你知道。

是從FAQ抓取的,也是關於內部工程文件的彙編,它被稱為lamini docs,是關於公司的,Lamini,嗯,所以我們只是讀取那個json檔案,並看看裡面有什麼,好的,所以這是非常結構化的資料,對嗎。

這裡有問題答案對,它對這個公司非常具體。

使用這個資料集的最簡單的方法是將問題與答案拼接起來。

實際上,這些問題和答案,並服務給模型,這就是我在這裡要做的,我將將其轉換為字典,然後我會看看將其中一個拼接起來實際上看起來像什麼。

所以你知道,只是將問題直接拼接起來,然後。

在這裡直接給出答案,當然,你可以以任何可能的方式準備你的資料。

我只是想指出幾種不同的常見方式,來格式化和結構化你的資料,所以問題答案對,但是,也包括指令和響應對,輸入輸出對,在這裡非常通用,而且,實際上,你可以只是,因為我們正在拼接它。

它就是你看到的上面的文字堆疊,好的,所以拼接它,你知道這非常簡單,但有時這就是足夠的看到結果,有時它不是嗯你,所以你會發現模型可能需要更多的結構來幫助它。

這實際上與提示工程非常相似,所以進一步來說,你也可以使用指令跟隨的資料處理,在這種情況下,問題回答提示模板,這裡有一個常見的模板注意。

在問題前面有一個###,一種標記,所以這可以很容易地被用作結構來告訴模型期待什麼接下來。

它期待看到問題後的問題,這也可以幫助你後處理模型的輸出。

即使在它被微調後,我們有那個,所以讓我們來看看這個提示模板在實際中的作用。

並看看它與拼接的問題答案如何不同。

你可以看到如何,這就是提示模板的樣子,問題答案在那裡做得很整潔。

常常幫助保持輸入和輸出分開,所以我實際上要刪除這個答案在這裡,並將它們分開出來,因為這個房子只是使用資料集很容易地進行評估,你知道,當你將資料集分成訓練和測試時,所以現在我要做的就是將所有這些。

你知道,將所有模板應用到整個資料集上。

所以只是執行一個for迴圈,並僅填充提示,那就是,你知道,將問題答案新增到這個中,使用f字串或格式化東西。

在這裡使用Python,好吧,所以讓我們看看文字之間的差異。

唯一的事情,嗯,和問題答案格式。

酷,所以只包含文字,所有的內容都在這裡拼接,你是輸入的,在這裡只有問題答案,更加結構化,你可以使用任何一種,當然,我推薦結構化它以幫助評估,基本上就是這樣。

儲存這種資料的最常見的方式通常是在json行檔案中。

所以json l檔案,Json l,它基本上就是,你知道,每一行都是一個json物件。

這就是全部,所以只是將那個寫入檔案,你也可以將這個資料集上傳到hugging face。

嗯,在這裡顯示,因為你也會 later 使用它。

你可以從那樣從雲中拉取它,接下來,你將深入到一個特定的微調變體,叫做指令。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P30:6——評估 - 吳恩達大模型 - BV1gLeueWE5N

構建複雜應用時,重要但有時棘手,步驟是如何評估應用表現,是否滿足準確度標準,若決定更改實現,可能替換不同LM,或改變向量資料庫使用策略,或更改系統其他引數,如何知道改進與否,Harrison將深入框架。

思考評估LM應用,及輔助工具,應用是許多步驟鏈,老實說,首先應理解每一步,進出內容,部分工具視覺化為偵錯程式,但全面評估資料點,模型表現很有用,可透過肉眼觀察,也可用語言模型評估,深入探討,許多酷話題。

開發轉向提示式,使用LM開發應用,評估流程被重新思考,影片中有許多激動人心概念,深入開始,首先設定評估,需要評估的鏈或應用,使用上節課文件問答鏈,匯入所需,載入相同資料,建立索引一行程式碼。

建立檢索QA鏈,指定語言模型,鏈型別,檢索器,列印詳細程度,有了這個應用,首先需要,確定評估資料點,將覆蓋幾種方法,第一種最簡單,基本上,我們想出好例子,幾種方法將覆蓋,第一種最簡,基本上。

我們想出好例子,因此,我們可以這樣做,我們可以檢視一些資料並想出示例問題,然後示例地面真實答案,我們稍後可以用來評估,所以如果我們檢視一些文件,我們可以大致瞭解裡面的內容,看起來第一個。

有一個套頭衫套裝,第二個有一個,有一個夾克,它們都有很多細節,從這些細節中我們可以建立一些示例查詢答案對,所以第一個我們可以問一個簡單的問題,舒適套頭衫套裝是否有側口袋,我們可以透過看上面看到。

它實際上有一些側口袋,然後對於第二個我們可以看到這件夾克來自某個系列,羽絨技術系列,所以我們可以問一個問題,這件夾克來自哪個系列,答案是,羽絨技術系列,所以這裡我們建立了兩個例子。

但這並不真正擴充套件得很好,檢視每個示例並弄清楚正在發生的事情需要一些時間,是否有方法可以自動化它,我們認為我們可以使用語言模型本身來實現自動化,我們有一個鏈和lang鏈可以做到這一點。

因此我們可以匯入qa生成鏈,這將接受文件,並從每個文件中建立一個問答對,它將使用語言模型本身來做這件事,因此我們需要透過傳遞聊天Open AI語言模型來建立此鏈,然後從那裡我們可以建立大量示例。

因此我們將使用apply和parse方法,因為這是在結果上應用輸出解析器,因為我們想要得到一個包含查詢和答案對的字典,而不僅僅是一個單一的字串,所以現在如果我們看看這裡返回的確切內容。

我們可以看到一個查詢,我們可以看到一個答案,讓我們檢查一下這是對哪個文件的查詢和答案,我們可以看到它詢問這個的重量,我們可以看到它從這裡獲取重量,看,我們剛剛生成了大量問答對,我們不必自己編寫。

這為我們節省了大量時間,我們可以做更多令人興奮的事情,所以現在讓我們繼續並將這些示例新增到我們已經建立的示例中,所以現在我們有這些示例了,但是究竟如何評估正在發生的事情。

首先我們想做的就是執行一個示例透過鏈,檢視輸出結果,傳入查詢,返回答案,在可檢視內容方面有些限制,鏈內部實際發生的事,實際提示是什麼,進入語言模型的提示,檢索到的文件,若為多步複雜鏈,中間結果是什麼。

僅看最終答案不夠,理解鏈中出錯或可能出錯,為此,long chain有個實用工具,稱為link chain debug,若設定lane chain,Debug為true,重新執行上述示例。

開始輸出更多資訊,檢視具體輸出內容,首先深入檢索qa鏈,然後深入stuff documents鏈,如前所述,使用stuff方法,現在進入llm鏈,有幾個不同輸入,原始問題就在那裡,現在傳入此上下文。

並且,可以看到,此上下文由檢索到的不同文件建立,進行問答時,若返回錯誤結果,不一定是語言模型出錯,實際上是檢索步驟出錯,仔細檢視問題本身和上下文,有助於除錯問題所在,可以再深入一層。

檢視進入語言模型的內容,Chat openai本身,可以看到傳入的完整提示,有系統訊息,這是問答鏈使用的提示描述,我們甚至還沒看過,可以看到提示列印出,使用以下上下文回答使用者問題,若不知道答案。

就說不知道,不要編造答案,然後看到插入前的許多上下文,然後看到一個人類問題,這是我們問它的問題,還可以看到更多關於實際返回型別的資訊,與其只是字串,我們得到的資訊如token使用。

所以是提示token,完成token,總token數,模型名稱,這可以非常有用來跟蹤你使用的token,或隨時間對語言模型的呼叫,並跟蹤總token數,這非常接近總成本,因為這個鏈相對簡單。

我們現在可以看到最終響應,舒適的舒適套頭衫條紋確實有,側口袋正透過鏈傳遞並返回給使用者,所以我們剛剛走過,如何檢視和除錯這個鏈的一個輸入,但關於我們建立的所有例子,我們如何評估它們,類似於建立它們時。

一種方法是手動,我們可以執行鏈對所有例子,然後檢視輸出並嘗試弄清楚發生了什麼,是否正確,錯誤,部分正確,類似於建立例子,這開始隨著時間的推移變得有點乏味,所以讓我們回到我們最喜歡的解決方案。

我們能先問語言模型嗎,在這樣做之前,我們需要為所有例子建立預測,實際上我將關閉除錯模式,以避免將所有內容列印到螢幕上,然後我將為所有不同的例子建立預測,我想我們總共有了七個例子。

我們將迴圈遍歷這個鏈七次,為每個例子得到一個預測,現在我們有這些例子,我們可以考慮評估它們,所以我們將匯入qa問答評估鏈,我們將使用語言模型建立此鏈,因為再次,我們將使用語言模型來幫助做評估。

然後我們將呼叫evaluate在這個鏈上,我們將傳入示例和預測,我們將得到一堆評分輸出,為了看到每個例子到底發生了什麼,我們將迴圈遍歷它們,我們將列印出問題,這由語言模型生成,我們將列印出真實答案。

這同樣由語言模型生成,當它有,整個文件在前面時,所以它可以生成地面真相答案,我們將列印出預測答案,這是由語言模型在執行qa鏈時生成的,當檢索向量庫中的嵌入時,傳入語言模型,嘗試猜測預測答案。

然後列印出成績,同樣,這也是語言模型生成的,當詢問評估鏈評分時,是否正確或錯誤,因此,當我們遍歷所有示例並列印它們時,我們可以詳細檢視每個示例,看起來這裡,全答對了,這是一個相對簡單的檢索問題。

這讓人放心,讓我們看第一個例子,問題是舒適套頭衫,是否有側袋,真實答案是,我們建立的答案是 是的,預測答案是,語言模型產生的是重置條紋的舒適感,有側口袋,因此我們可以理解這是一個正確答案。

實際上語言模型也做到了,它給它評分為正確,但讓我們思考一下我們為什麼首先需要使用語言模型,這兩個字串實際上完全不同,它們是非常不同的,一個很短一個很長。

我甚至認為'是'這個詞在這串中任何地方都沒有出現,如果我們嘗試字串匹配,甚至正則,X在這裡,它將不知所措,它們不是一回事,這顯示使用語言模型評估的重要性,你有這些答案,任意強度。

沒有單一的真理字串是最好的答案,有許多不同的變體,只要語義相同,應評分相近,語言模型幫助於此,而非精確匹配,比較字串的難度使語言模型評估困難,首先,我們用於這些非常開放的任務,要求生成文字。

這之前從未做過,因為直到最近模型都不夠好,因此,之前存在的許多評估指標,都不夠好,我們正在發明新的指標和新的啟發式方法,當前最有趣最流行的,實際上使用語言模型評估,完成評估課程。

但最後想展示的是連結鏈評估平臺,這是做我們在筆記本中做的一切的方式,但持久化並顯示在UI中,讓我們看看這裡,我們可以看到有一個會話,我們稱之為深度學習AI,我們可以看到我們實際上已經持久化了。

我們在筆記本中執行的所有執行,這是一個很好的方式來跟蹤高層次的輸入和輸出,但也是一個很好的方式來檢視下面到底發生了什麼,這是與筆記本中列印出的相同的資訊,當我們開啟除錯模式時。

但只是在UI中以更漂亮的方式視覺化,我們可以看到鏈的輸入,以及每一步鏈的輸出,然後我們可以進一步點選鏈,並檢視更多關於實際傳遞的資訊,所以如果我們一直向下滾動到底部。

我們現在可以看到確切傳遞給聊天模型的內容,我們有系統訊息在這裡,我們有人類問題在這裡,我們有聊天模型的響應在這裡,我們有一些輸出後設資料,我們在這裡新增了一個功能,可以將這些示例新增到資料集中。

所以如果你記得在開始時建立那些示例資料集,我們部分手動建立,部分使用語言模型,這裡我們可以透過點選這個小按鈕將其新增到資料集中,我們現在有輸入查詢和輸出結果,所以我們可以建立資料集。

我們可以稱之為深度學習,然後我們可以開始向這個資料集新增示例,所以再次回到我們課程開始時處理的事情,我們需要建立這些資料集以便進行評估,這是一個很好的方式讓它在後臺執行。

然後隨著時間的推移新增到示例資料集中,並開始構建這些例子,您可以使用它們進行評估,並開始評估的飛輪轉動。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P31:7——代理 - 吳恩達大模型 - BV1gLeueWE5N

有時人們認為大語言模型是知識庫,因為它學習記憶大量資訊,可能來自網際網路,當你提問時,它能回答問題,但更實用的看法是將其視為推理引擎,你可以給它文字塊或其他資訊源,然後大型語言模型(LM)。

可能使用從網際網路學到的背景知識,來回答問題,用新資訊幫你回答問題,或決定下一步做什麼,這就是lang chain的代理框架,代理可能是我最喜歡的部分,我認為它們也是最強大的部分,但它們也是最新的部分。

我們正在看到很多新東西出現,這對領域內所有人都是全新的,這應該是一堂非常令人興奮的課程,當我們深入探討代理是什麼,如何使用代理,如何裝備不同工具,如內建語言鏈的搜尋引擎,以及如何建立自己的工具。

這樣可以讓代理與任何資料儲存互動,任何API,任何你想要的功能,這是令人興奮的前沿技術,但已有重要的應用案例,那麼讓我們深入探討,首先,我們將設定環境變數,並匯入稍後使用的許多東西。

我們將初始化語言模型。

我們將使用Chat Open AI,重要的是,我們將溫度設定為0。

這很重要,因為我們將使用語言模型作為代理的推理引擎,它與其他資料和計算源連線。

因此我們希望這個推理引擎儘可能好和精確,因此我們將它設定為0,消除任何可能出現的不確定性,接下來載入一些工具,將載入兩個工具:llm數學工具和維基百科工具。

llm數學工具實際上是一個鏈本身,結合語言模型和計算器解決數學問題。

維基百科工具是一個API,連線到維基百科,允許您對維基百科執行搜尋查詢並獲取結果。

接下來初始化一個代理,將使用工具初始化代理。

語言模型,然後輸入代理型別,我們將使用chat零射反應描述。

注意這裡首先是chat,這是一個最佳化與聊天模型合作的代理。

其次是react,這是一種設計用來從語言模型中獲得最佳推理效能的提示技術。

我們還將傳入handle_parsing_errors等於true。

當語言模型可能輸出無法解析的內容時,這很有用,嗯,無法解析成動作和動作輸入。

這是期望的輸出,當這種情況發生時。

實際上我們會將格式錯誤的文字傳回語言模型,並要求它糾正自己。

最後我們將傳入verbose等於true,這將在jupyter筆記本中列印出很多步驟,使我們非常清楚,正在發生什麼,我們稍後將在筆記本的全球級別設定debug等於true。

這樣我們可以更詳細地瞭解到底發生了什麼,首先我們將向代理詢問一個數學問題,三百的百分之二十五是多少。

這是一個相當簡單的問題,但瞭解確切發生了什麼將是有益的,因此,我們可以看到,當它進入代理執行鏈時。

它首先考慮需要做什麼。

所以它有一個想法。

然後它有一個動作,這個動作實際上是一個塊,對應兩個東西,一個動作和一個動作輸入,動作對應要使用的工具。

所以這裡是計算器,動作輸入是該工具的輸入。

這裡它是三百乘以點二五的字串,接下來我們可以看到,帶有答案的觀察以不同的顏色出現。

這個觀察答案等於七十五點零實際上是來自計算器工具本身。

接下來我們回到語言模型,當文字變成綠色時。

我們有問題的答案,最終答案,七十五點零,這是我們得到的輸出,現在是一個暫停並嘗試自己不同數學問題的好時機,接下來我們將透過wikipedia api的例子,這裡我們將問你關於湯姆·米切爾的問題。

我們可以檢視中間步驟來了解它做了什麼。

我們可以再次看到它思考。

並且它正確地意識到應該使用wikipedia,它說動作等於wikipedia,動作輸入等於湯姆·米切爾。

這次觀察以黃色返回,我們使用不同的顏色來表示不同的工具,注意這裡首先是chat,這是一個最佳化與聊天模型合作的代理,維基百科湯姆·米切爾頁面的總結結果,從維基百科返回的觀察結果是兩個結果,兩個頁面。

因為有兩位不同的湯姆·米切爾,我們可以看到第一個頁面涵蓋了電腦科學家,第二個頁面,看起來是一位澳大利亞足球運動員,我們可以看到回答這個問題所需的資訊,即他寫的那本書的名字。

機器學習出現在第一個湯姆·米切爾的摘要中,我們可以看到接下來代理試圖查詢更多關於這本書的資訊,所以它查詢了維基百科上的機器學習書籍,這並不嚴格必要,這是一個有趣的例子,展示了代理並不完全可靠。

但我們可以看到在這次查詢之後,代理意識到它擁有所有需要回答的資訊,並回答了正確的答案,機器學習,接下來我們要看的是一個很酷的例子,如果你見過像Copilot或帶有程式碼直譯器外掛的Chat GPT。

他們正在使用語言模型編寫程式碼,然後執行該程式碼。

我們在這裡可以做完全相同的事情,所以我們要建立一個Python代理,並且我們將使用之前相同的LLM,我們將給它一個工具,Python REPL工具,REPL基本上是一種與程式碼互動的方式。

你可以把它想象成一個Jupyter筆記本,所以代理可以使用這個REPL執行程式碼,它將執行。

然後我們會得到一些結果,這些結果將被返回給代理,所以它可以決定接下來做什麼。

我們要讓這個代理解決的問題是。

我們將給它一個名字列表,然後要求它按姓氏排序,所以你可以看到這裡。

我們有一個名字列表,哈里森,蔡斯,語言鏈LLM,傑夫,融合變壓器,生成AI。

我們將要求代理首先按姓氏排序這些名字,然後按名字排序。

然後列印輸出,重要的是我們要求它列印輸出,這樣它實際上可以看到結果是什麼。

以便它可以決定接下來做什麼。

這些列印的語句稍後將回傳給語言模型,以便它能推理剛執行的程式碼的輸出。

讓我們試試,進入代理執行鏈時。

它首先意識到可以使用sorted函式列出客戶。

內部使用了不同型別的代理,這就是為什麼動作和動作輸入的格式略有不同,這裡,它採取的行動是使用Python REPL,你可以看到動作輸入實際上是程式碼,首先寫出客戶,等於這個列表,然後對客戶排序。

然後遍歷這個列表並列印。

你可以看到,代理考慮要做什麼並意識到需要編寫一些程式碼,動作和動作輸入的格式與之前略有不同。

它使用的是內部不同的代理型別來執行動作,它將使用Python REPL,對於動作輸入,它將有一堆程式碼,所以如果我們看看這段程式碼在做什麼,它首先建立一個變數來列出這些客戶名稱。

然後對它排序並建立一個新的變數。

然後遍歷這個新變數並列印每行。

就像我們要求它做的,我們可以看到我們得到了觀察結果,這是一個名字列表。

然後代理意識到它完成了並返回這些名字,從列印出的內容中,我們可以看到正在發生的高層情況。

但讓我們深入一點並使用lane chain debug執行,設定為true,因為這會列印出所有不同鏈的所有級別的所有內容,讓我們看看它們到底在做什麼,所以首先我們從代理執行器開始,這是頂級代理執行器。

我們可以看到我們這裡有,我們的輸入,按姓氏和名字排序客戶,然後列印輸出,從這裡我們呼叫一個llm鏈。

這是代理使用的lm鏈,所以lm鏈記住了一個提示和lms的組合,此時它只在代理草稿中有輸入,我們稍後會回到這一點,以及一些停止序列來告訴語言模型何時停止生成,在下一級,我們看到對語言模型的確切呼叫。

所以我們可以看到完全格式的提示,它包括關於它可訪問的工具的說明以及如何格式化其輸出的說明,從那裡可以看到語言模型的確切輸出,可以看到文字鍵,包含思想和行動,並將所有內容放入一個字串。

然後它透過那裡結束llm鏈,接下來它呼叫的是一個工具,可以看到工具的確切輸入。

也可以看到工具的名稱,Python repl,然後可以看到輸入,即這段程式碼,然後可以看到該工具的輸出,即列印出的字串,同樣,這是因為特別要求Python repl列印出正在發生的事情。

然後可以看到下一個輸入到llm鏈,這裡如果看變數,llm鏈是代理,所以這裡,如果看變數,輸入未改變,這是我們要求的高層目標,但現在agent scratch pad有一些新值。

可以看到這是之前生成的組合加上工具輸出,並將此返回,以便語言模型理解之前發生了什麼並使用它來推理接下來要做什麼,接下來的幾個列印語句涵蓋了,當語言模型意識到它基本上完成了工作時會發生什麼。

可以看到完全格式的語言模型提示,響應,它意識到它已經完成。

並說最終答案,這裡是代理用來識別它已經完成工作的序列,然後可以看到它退出llm鏈然後退出代理執行器,這應該能讓你很好地瞭解內部發生了什麼,在這些代理中。

這應該能讓你很好地瞭解內部發生了什麼,並且希望是有指導意義的,當你暫停並設定自己的編碼代理目標時,試圖完成。

這種除錯模式也可以用來突出顯示哪裡出了問題,如上面的維基百科示例所示。

有時代理行為有點古怪,所以擁有所有這些資訊對於理解正在發生的事情真的很有幫助。

到目前為止,我們使用了LinkedIn上已經找到的工具。

但代理的一大力量是你可以將其連線到你自己的資訊源,你自己的API,你自己的資料。

所以這裡我們將介紹如何建立自定義工具,以便你可以將其連線到你想要的一切。

讓我們先做一個工具,它會告訴我們當前日期。

我們將匯入這個工具裝飾器,這可以應用於任何函式,並將其轉換為LinkedIn可以使用的工具。

我們要寫一個函式,叫time,它在任何文字字串中震動,我們實際上不會使用它,它將透過呼叫date time返回今天的日期。

除了函式名外,我們還將編寫一個非常詳細的文件字串。

因為這就是代理將用來知道何時應該呼叫此工具的原因。

以及如何呼叫此工具,例如,這裡我們說輸入應該始終為空字串,因為我們不使用它,如果我們對輸入應該有更嚴格的要求。

例如,如果我們有一個函式應該始終接受搜尋查詢或SQL語句。

您將希望確保在這裡提及這一點,我們現在將建立另一個代理,這次我們將時間工具新增到現有工具列表中。

最後讓我們呼叫代理並詢問它今天的日期。

它認識到需要使用時間工具,在這裡指定,它有動作輸入為空字串,這很好,這是我們告訴它要做的,然後它返回一個觀察結果,然後最終語言模型取該觀察結果並響應使用者,今天日期是2023年,05月,21日。

在這裡暫停影片並嘗試輸入不同內容,代理課程結束,這是長鏈中較新、更令人興奮和更實驗性的一部分,希望你喜歡使用它,希望它展示瞭如何使用語言模型作為推理引擎。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P32:8——總結 - 吳恩達大模型 - BV1gLeueWE5N

在這門短課中,你看到了一系列應用。

包括處理客戶評論和構建回答文件問題的應用程式,嗯,甚至使用lm決定何時呼叫外部工具,如網路搜尋以回答複雜問題,如果一兩週前有人問你,構建所有這些應用程式需要多少工作,我想很多人會想,天啊。

這聽起來像幾周,你知道,甚至更長時間的工作,但在這門短課中,我們只用了一些合理的程式碼行,你可以使用lang chain高效構建所有這些應用程式,所以我希望你能接受這些想法。

也許你可以使用一些你在jupyter筆記本中看到的程式碼片段,並在你自己的應用程式中使用它們,這些想法只是開始,你可以使用語言模型進行許多其他應用,因為這些模型非常強大,因為它們適用於如此廣泛的任務。

無論是回答關於CSV的問題,查詢SQL資料庫,與API互動,有很多使用chains的不同示例,以及提示和輸出解析器的組合,然後更多的鏈在lang chain中做所有這些事情。

而這大部分歸功於langing社群,所以我也想向社群中的每個人表示衷心的感謝,無論是誰做出了貢獻,無論是改進文件,還是讓其他人更容易開始,或新的鏈型別開啟了一個全新的可能性世界。

所以就這樣,如果你還沒有這樣做,我希望你開啟你的膝上型電腦,你的桌上型電腦和執行pip,安裝lang chain。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P33:《LangChain:構建與資料對話的聊天機器人》1——介紹 - 吳恩達大模型 - BV1gLeueWE5N

你好,很高興與你分享,使用線鏈與資料聊天的全新課程,與Harrison Chase合作開發,他是Lang Chain的聯合創始人兼CEO,大型語言模型(如ChatGPT)可以回答許多主題的問題。

但一個孤立的大型語言模型只知道它被訓練的內容,不包括你的個人資料,比如你在公司,有專有文件,不在網際網路上,以及大型語言模型訓練後撰寫的資料或文章,若對你或他人有用,比如你的客戶。

能與你的文件對話並解答問題,利用那些文件的資訊和本課程中的LM,我們將涵蓋如何用Link Chain與資料聊天,Link Chain是一個開源開發者框架,用於構建LLM應用。

Link Chain由多個模組化元件和更多端到端模板組成,Link Chain中的模組化元件包括提示,模型,索引,鏈條和代理,深入瞭解這些元件,可檢視我與安德魯合上的第一門課,在這門課中。

我們將深入聚焦lang chain的一個流行用例,如何用lang chain與資料聊天,首先將介紹如何使用lang chain文件載入器,從各種激動人心的來源載入資料。

然後將觸及如何將這些文件分割為有意義的語義塊,這個預處理步驟看似簡單,但含義豐富,接下來,將概述語義搜尋,獲取相關資訊的基本方法,給定使用者問題,這是入門最簡單的方法,但有幾個情況會失敗,將討論這些情況。

然後討論如何修復,然後展示如何使用檢索文件,使LLM回答文件問題,但顯示你缺一關鍵,為完全重現聊天體驗,最後將涵蓋缺失部分記憶,展示如何構建完全功能的聊天機器人,透過它,你可以與資料聊天。

這將是一門激動人心的短期課程,我們感謝安哥拉,以及蘭斯·馬丁,來自Lang Chain團隊的,為哈里森稍後呈現的所有材料工作,以及深度學習,艾賽傑夫。

路德維希和迪亞拉·艾恩,如果你正在學習這門課程,並決定想複習一下語言鏈的基礎,我鼓勵你也要參加那個早期的語言鏈短課程,對於哈里森提到的LM應用開發,但就這些,我們現在繼續下一個影片,在那裡。

哈里森將向你展示如何使用。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P34:2——文件載入 - 吳恩達大模型 - BV1gLeueWE5N

為了建立一個你可以與你的資料進行交流的應用程式,首先,你需要將你的資料載入到一個可以工作的格式中,這就是長鏈文件載入器發揮作用的地方,我們擁有過八十種不同型別的文件載入器,在本課程中。

我們將覆蓋一些最重要的載入器和讓你熟悉這個概念,總的來說,讓我們開始,文件載入器處理訪問和轉換資料的具體細節,從各種不同格式和來源轉換為標準化格式,我們可以從像網站這樣的不同地方載入資料,不同的資料庫。

Youtube,而且這些文件可以以不同的資料型別出現,如pdfs。

Html json,而且,而且所以,文件載入器的整個目的是從這種資料來源的多樣性中提取,並將它們載入到一個標準的文件物件中,它由內容和相關的後設資料組成。

鏈式連結中有很多不同型別的文件載入器,我們沒有時間覆蓋它們全部。

但是,以下是對八十個的大致分類,再加上我們有很多處理非結構化資料的,如來自公共資料來源如YouTube的文字檔案。

Twitter,Hacker News,而且還有更多的處理非結構化資料的,來自你可能或你的公司擁有的專有資料來源如Figma Notion的,文件載入器也可以用於載入結構化資料,表格格式的資料。

其中可能只有一些文字資料存在於這些單元格或行中,你仍然想要問的問題,回答,或語義搜尋,因此,這裡的來源包括像airbyte這樣的東西,Stripe,Airtable。

好了現在,讓我們進入有趣的部分,實際上在使用文件載入器,首先,我們將載入一些我們需要的環境變數,如openai api金鑰,我們首先將處理的文件型別設定為pdfs。

所以讓我們從long chain中匯入相關的文件載入器,我們將使用pi pdf floater,我們已經將許多pdfs載入到工作空間的文件資料夾中。

因此,讓我們選擇一份並將其放入載入器中,現在,讓我們透過呼叫load方法載入文件,讓我們看看實際上我們載入了什麼,所以這,預設情況下,將載入一份文件列表,在這種情況下,這個pdf中有二十二個不同頁面。

每個都是一個獨特的文件,讓我們來看看第一個並看看它包含什麼,文件首先包含一些頁面內容,這是頁面的內容,這可能有點長,所以讓我們只列印出前幾百個字元。

另一個非常重要的資訊是與每個文件相關的後設資料,這可以透過後設資料元素訪問。

你可以在這裡看到有兩個不同的部分,一個是源資訊,這是pdf,我們從其他地方載入它的檔名是頁面欄位,這對應於pdf的頁面,它是我們從我們將要檢視的下一種文件載入器載入的,是一種從youtube載入的。

youtube上有很多有趣的內容,因此,很多人使用這種文件載入器來提問,對他們的最愛影片或講座,或類似的東西。

我們將在這裡匯入一些不同的東西,關鍵的部分是youtube音訊載入器,這從youtube影片中載入音訊檔案,另一個關鍵部分是openai whisper解析器,這將使用openai的whisper模型。

一種語音到文字模型,將youtube音訊轉換為我們可以工作的文字格式。

我們現在可以指定一個URL。

指定一個儲存音訊檔案的目錄,然後建立通用載入器作為這個youtube音訊載入器,與openai whisper解析器的組合,然後我們可以呼叫loader點load來載入與這個youtube相應的文件。

這可能需要幾分鐘,所以我們要加速併發布,現在載入完成後。

我們可以檢視載入的頁面內容,這是來自youtube影片的第一部分轉錄,這是一個好的時間暫停,去選擇你最喜歡的youtube影片,看看這個轉錄是否對你有用。

我們接下來要討論的一組文件。

如何載入來自網際網路的URL,網際網路上有很多真的很棒的教育內容,難道不酷,如果你能只是聊天,我們將透過匯入link chain中的web基載入器來使能這一點。

然後我們可以選擇任何URL,我們這裡的 favorite URL,我們將從這個github頁面上選擇一個markdown檔案,並建立一個載入器。

然後接下來我們可以呼叫loader點load,然後我們可以檢視頁面的內容。

在這裡你會注意到有很多空白。

緊隨其後是一些初始文字和一些更多的文字,這是一個很好的例子,說明你為什麼實際上需要處理資訊的後處理,以便將其轉換為可工作的格式。

最後我們將覆蓋如何從notion載入資料,Notion是一個非常流行的個人和公司資料的儲存庫。

並且很多人已經建立了與筆記本中的 notion 資料庫對話的聊天機器人,你將看到如何從 notion 資料庫中匯出資料的指示,透過這種方式,我們可以將其載入到連結鏈中,一旦我們以那種格式有了它。

我們可以使用 notion 目錄載入器來載入那個資料,並獲取我們可以工作的文件。

如果我們看看這個內容,我們可以看到它是在 markdown 格式中,並且這個 notion 文件來自 blend 的員工手冊,我相信正在聽的很多人已經使用了 notion。

並且他們有一些他們想要聊天的資料庫。

因此,這是一個將資料匯出的絕佳機會。

把它帶到這裡,開始在這種格式中工作,這就是文件載入的全部,我們已經覆蓋瞭如何從各種來源載入資料,並將它轉換為標準化的文件介面,然而,這些文件仍然相當大。

因此,在下一節中,我們將討論如何將它們分成較小的部分,這是有關和重要的,因為當你在進行這種增強的生成檢索時,你需要檢索出最相關的內容片段,所以你不想選擇我們這裡載入的所有文件,而是隻選擇段落。

或與你談論的主題最相關的幾句話,這也是一個更好地思考資料來源的機會,我們目前還沒有為這些資料來源載入器的,但你可能仍然想要探索誰知道。

也許你可以甚至做出一個pr來連結。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P35:3——文件分割 - 吳恩達大模型 - BV1gLeueWE5N

我們剛剛討論瞭如何將文件載入到標準格式中,現在,我們將討論如何將它們分成較小的片段,這可能聽起來非常容易,但是,這裡有許多微妙之處,它們對後來的影響很大,讓我們開始吧。

文件分割發生在您將資料載入到文件格式後,但在它進入向量儲存之前,這可能看起來非常簡單,您可以根據每個字元的長度或其他類似的方式分割片段。

但是,作為為什麼這既更復雜又非常重要在下游的原因的示例,讓我們看看這個例子在這裡,我們中有一個關於豐田卡羅拉的句子和一些規格。

如果我們進行簡單的分割,我們可能會得到一個句子的一部分在一個片段中,句子的另一部分在另一個片段中,然後,當我們在下游嘗試回答問題時。

關於卡羅拉的規格是什麼。

我們實際上在任一個片段中都沒有正確的資訊,所以它被分割開來,因此,我們無法正確地回答這個問題,因此,如何在分割片段時如何處理有許多微妙和重要性,以便將語義相關的片段組合在一起。

所有在lane chain中的文字分割器都基於分割片段,在某個片段大小和一些片段重疊下。

所以我們這裡有一個下面的圖表來顯示這看起來像什麼,片段大小對應於片段的大小,片段的大小可以以幾種不同的方式測量,我們在課程中會討論一些,因此,我們允許傳遞一個長度函式來測量片段的大小。

這通常是字元或標記,片段重疊通常被保持為一些重疊在兩個片段之間,就像我們在從一個到另一個移動時滑動的視窗,這允許同一部分上下文在片段的末尾,並在另一個片段的開始,並幫助建立一些一致性的概念。

文字分割器和lane chain都有建立文件和分割文件的方法,這涉及到相同的邏輯在內部,它只是暴露了一個稍微不同的使用者介面。

一個接受文字列表,另一個接受文件列表,lane chain中有許多不同型別的分割器,我們在這門課程中會覆蓋一些,但我鼓勵你在空閒時間檢查其餘的,這些文字分割器在許多維度上差異很大。

它們可以差異於如何分割片段,哪些字元進入那個,它們可以差異於,如何測量片段的長度,是按字元,是按標記,甚至有一些使用其他較小的模型來確定句子的結束可能何時,並且將其用作分塊方式。

分塊成片段的另一個重要部分也是後設資料。

在所有片段中保持相同的後設資料,但在相關時也新增新的後設資料,因此,有些文字分割器真的很專注於這一點。

片段的分割往往特定於,我們正在處理的文件型別。

這在您在程式碼上分割時尤為明顯,所以我們有一個語言文字分割器,有許多不同的分隔符。

用於各種不同的語言。

如Python,Ruby c,當分割這些文件時,它將考慮這些不同的語言和這些語言的相關分隔符。

在執行分割時,我們將首先按照之前設定環境,載入Open AI API金鑰。

接下來,我們將匯入兩種最常見的文字分割器和長鏈。

遞迴字元文字分割器和字元文字分割器,我們將首先嚐試一些玩具用例,只是為了瞭解這些做什麼,因此,我們將設定一個相對較小的片段大小為二十六。

和一個甚至更小的片段重疊為四,只是為了看到它們可以做什麼。

讓我們初始化這兩個不同的文字分割器為r_splitter和c_splitter,然後,讓我們看一些不同的使用案例。

讓我們載入第一個術語,從a到z的所有字母,讓我們看看當我們使用各種分割器時發生了什麼。

當我們使用遞迴字元文字分割器時。

它仍然只是一個字串,這是因為這有二十六個字元長,我們已指定片段大小為二十六,因此,實際上在這裡甚至不需要進行任何分割,讓我們在稍長的字串上進行分割,它比我們指定的二十六個字元的片段大小更長,在這裡。

我們可以看到建立了兩個不同的片段,第一個片段以z結束,所以這是二六字元,我們可以看到下一個片段從w開始,X,Y,Z,這些是四個片段重疊,然後,它繼續與字串的其餘部分,讓我們看一個稍微更復雜的字串。

其中字元之間有許多空格,我們現在可以看到它被分割成三個片段,因為有空格,所以它佔用更多的空間,因此,如果我們看重疊,我們可以看到在第一個中,有llm,然後在第二個中也有l和m,這似乎只有兩個字元。

但是因為在l和n之間有空格,然後在l前面和m後面,實際上這相當於構成塊重疊的四個字元,讓我們現在嘗試使用字元文字分割器。

我們可以看到當我們執行它時,它實際上並沒有嘗試在任何地方分割它,所以這裡發生了什麼,問題在於字元文字在一個字元上分裂。

並且預設那個字元是新行字元,但在這裡沒有新的,如果我們將分隔符設定為空白。

我們可以看到會發生什麼,然後。

在這裡它與以前相同分裂,這是一個暫停影片並嘗試一些新例子的好時機,無論是用你創造的不同字串,還是交換分隔符並看會發生什麼,此外,嘗試不同的塊大小和塊重疊也很有趣,所以,透過幾個玩具示例。

你可以大致瞭解正在發生的事情,這樣,當我們轉向更真實的世界示例時,你對場景下發生的事情會有良好的直覺。

現在,讓我們在更多的真實世界示例上嘗試一下。

這裡有一段很長的段落,我們可以看到,大約在這裡我們有一個雙行新符號。

這是段落之間的典型分隔符,讓我們檢查這段文字的長度。

"我們可以看到,它就大約是五百","現在讓我們定義我們的兩個文字分割器","我們將像以前那樣與字元文字分割器合作","以空間作為分隔符","然後,我們將初始化遞迴字元文字分割器","並且。

這裡是一個分隔符列表"。

"這些是預設的分隔符","但我們只是把它們放在這個筆記本里,以更好地展示正在發生的事情"。

因此,我們可以看到,我們擁有一份包含雙行空格的列表。"單行空格",然後什麼,一個空的字串,這些意味著當你在分割一段文字時,它會首先嚐試按雙行新符分割它,然後,如果它還需要進一步分割單個塊。

它會繼續按單行新符分割,然後,如果它還需要更多,它會繼續到空格。

最後,它會只是按字元分割,如果它真的需要這樣做,看這些在上述文字中的表現。

我們可以看到,字元文字分割器在空格上分裂。

因此,我們最終得到了句子中間奇怪的分隔。

遞迴文字分割器首先嚐試在雙行新線上分裂,因此,它將其分割成兩個段落,儘管第一個段落比指定的四百五十個字元要短,這可能是一個更好的分割,因為現在,每個自己的段落都在塊中,與在中間分割句子不同。

讓我們現在將其分割成更小的塊,只是為了更好地理解正在發生的事情,我們還將新增句號分隔符。

這是為了在句子之間分割,如果我們執行此文字分割器,我們可以看到按句子分割,但句號實際上在錯誤的位置,這是因為下面的正規表示式x在起作用,為了修復這個問題,我們可以實際上指定一個稍微更復雜的正規表示式x。

帶有一個後視鏡,現在如果我們執行這個,我們可以看到它被分割成句子,並且它以正確的方式分割,句號在正確的位置,讓我們現在將這個應用到一個更真實的世界例子中。

與在第一個文件載入部分我們工作的一個pdf中,讓我們載入它,然後讓我們在這裡定義我們的文字分割器這裡我們傳遞長度函式,這是用lone的,Python內建的,這是預設的,但我們只是明確指定它以增加清晰度。

在幕後發生了什麼,並且這正在計算字元的長度,因為我們現在要使用文件,我們使用split documents方法,並傳遞一個文件列表。

如果我們比較那些文件的長度與原始頁面的長度。

我們可以看到建立了許多更多的文件。

作為這個分割的結果,我們可以對在第一次講座中使用的概念db做類似的事情。

再次比較原始文件的連結與新的拆分文件。

我們可以看到有許多文件,現在,我們完成了所有分割,這是一個好暫停影片的點,嘗試一些新的示例。

我們已經基於字元進行了所有分割,但還有其他一種分割方式,這是基於標記的,為了此,我們將匯入標記文字分割器,這是因為經常LMS有上下文視窗,由標記數指定,因此,瞭解標記是什麼以及它們出現在哪裡很重要。

然後,我們可以基於它們進行分割,為了獲得一個稍微更代表性的想法,看看llm如何看待他們,真正理解標記和字元之間的差異,讓我們初始化標記文字分割器,以塊大小為一,塊重疊為零。

所以這將將任何文字分割為一個標記列表,讓我們建立一個有趣的虛構文字。

當我們分割它,我們可以看到它被分割成一堆不同的馬克標記,並且它們在長度上都有所不同,以及它們內部的字元數量,所以第一個就是foo,然後你有一個空格然後bar,然後只有b有一個空格,然後一個z。

然後z然後foo又出現了,這顯示了一下在字元分裂與標記分裂之間的一些差異,讓我們將這個應用到我們上面載入的文件中,以類似的方式,以類似的方式,我們可以在頁面上呼叫分割的文件。

如果我們看一下第一個文件,我們有我們的新分割文件,頁面內容大致是標題,然後,我們有源文件和它來自的頁面的後設資料,在這裡,你可以看到源文件的後設資料,以及頁面在塊中與原始文件相同,因此,如果我們看那個。

只是為了確保頁面零,後設資料,我們可以看到它對齊,這很好,它將後設資料適當地傳遞到每個塊中,但也可能存在您實際上想要向塊新增更多後設資料的情況,在你分割它們時,這可以包含文件中的位置資訊,塊來自哪裡。

它位於何處,相對於文件中的其他事物或概念,一般來說,這種資訊可以在回答問題時使用,以提供關於這個塊確切內容的更多上下文,以便看到,一個具體的例子,我們來看看另一種文字分割器,實際上。

它將資訊新增到每個片段的後設資料中,你現在可以暫停並嘗試一些你自己想出來的例子。

這個文字分割器是Markdown標題文字分割器,它會做什麼,它將根據標題或任何子標題分割Markdown檔案,然後,我將將這些標題作為內容新增到後設資料欄位中。

這將被傳遞給來自那些分割的片段的任何其他片段。

讓我們先做一個玩具示例,玩一玩文件,我們有一個標題,然後,第一章的子標題,然後我們在那裡有一些句子,然後,另一個甚至更小的子標題的部分。

然後,我們跳回到第二章,在一些句子中,讓我們定義一個我們要在文字上分割的標題列表,以及那些標題的名稱,所以首先我們有一個單獨的雜湊標籤,我們將其稱為標題一,然後我們有兩個雜湊標籤標題二。

三個雜湊標籤標題三。

我們可以然後使用這些標題初始化Markdown標題文字分割器,然後分割我們上面的玩具示例,如果我們看一些這些例子,我們可以看到第一個有一個內容hi,這是吉姆hi,這是喬,現在,在後設資料中我們有標題一。

然後,我們將其作為標題,標題二作為第一章。

這是從這裡來的。

在上述示例文件中,讓我們看看下一個,在這裡,我們可以看到我們已經跳入了一個甚至更小的子部分,所以我們有內容的hi,這是蘭斯,現在我們不僅有標題一,還有標題二和標題三,這又從內容和名稱中來。

在上述Markdown文件中。

讓我們試試在真實世界的例子中,在載入Notion目錄使用Notion目錄載入器之前,並載入了Markdown檔案。

這對於Markdown標題分割器是有關的,所以讓我們載入那些文件,然後定義Markdown分割器,標題一為一個單獨的雜湊標籤,標題二為兩個雜湊標籤。

我們分割文字,得到我們的分割,如果看它們。

我們可以看到第一個有內容的一些頁面,如果向下滾動到後設資料,我們可以看到我們已經載入標題一作為Blendel的員工手冊,我們已經覆蓋瞭如何以適當的後設資料獲取語義相關的片段。

下一步是將這些資料片段移動到一個向量儲存中。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P36:4——向量和嵌入 - 吳恩達大模型 - BV1gLeueWE5N

我們現在已經將文件分成了小的,語義上有意義的片段,現在是將這些片段放入索引的時候,這樣我們就可以輕鬆地檢索它們,當需要回答關於這個資料集的問題時,我們將利用嵌入和向量儲存。

讓我們看看那些是什麼我們之前在之前的課程中簡要覆蓋了,但我們將再次回顧它,有幾個原因。

首先,這些對於在你的資料上構建聊天機器人來說至關重要。

其次,我們將深入探討,並談論邊緣情況,以及這個通用方法實際上可以失敗的地方。

不要擔心,我們將在後來修復這些問題,但現在讓我們談談向量儲存和嵌入。

這發生在文字分割之後,當我們準備好以易於訪問的格式儲存文件時,什麼是嵌入。

它們將一段文字,並建立該文字的數值表示。

與內容相似的文字將在這個數值空間中有相似的向量。

這意味著,我們可以然後比較那些向量並找到相似的文字部分。

例如,在下面的例子中,我們可以看到關於寵物的兩句話非常相似。

而在關於汽車的句子中提到寵物的句子並不相似。

作為對完整工作流程的全面回顧,我們開始與文件。

然後建立這些文件的較小分割,然後建立這些文件的嵌入。

並將所有這些都儲存在向量儲存中,向量儲存是一種資料庫,您可以在其中後來輕鬆地查詢相似的向量。

這將在嘗試找到與手頭問題相關的文件時非常有用。

我們可以然後處理手頭的問題,建立一個嵌入,然後與向量儲存中的所有不同向量進行比較。

然後選擇最相似的一個,我們然後取這些和最相似的片段,並將它們與問題一起傳遞給llm,並得到答案。

我們將稍後覆蓋所有這些,現在,是我們深入探討嵌入和向量儲存本身的時候。

首先,我們將再次設定適當的環境變數。

從這裡開始,我們將與相同的一組文件工作,這些是cs two twenty九的講座,我們將載入,其中一些在這裡,注意,我們將實際上覆制,第一堂課,這是為了模擬一些髒資料。

文件載入後,我們可以然後使用遞迴字元文字分割器建立塊。

我們可以看到,我們已經建立了超過二百個不同的分塊,是時候轉向下一個部分併為它們建立嵌入式向量了。

我們將使用openai來建立這些嵌入式向量,然後在實際世界中跳入。

讓我們嘗試使用幾個玩具測試案例。

只是為了瞭解引擎內部的情況,我們有一些示例句子,其中前兩句非常相似。

而第三句與前兩句無關。

然後,我們可以使用嵌入類為每個句子建立嵌入式向量。

然後,我們可以使用numpy來比較它們並看到哪些最相似。

我們預期前兩句應該非常相似,然後,第一和第二與第三相比不應該那麼相似。

我們將使用點積來比較兩個嵌入式向量。

如果你不知道點積是什麼,沒關係,重要的是要知道,更高的分數越好。

在這裡,我們可以看到,第一個和第二個嵌入式向量有一個相當高的得分為9。6。

如果我們比較第一個嵌入式向量與第三個嵌入式向量。

我們可以看到,它顯著低於7。7,如果比較第二個與第三個。

我們可以看到,它大約相同於7。6。

現在是一個暫停並嘗試自己幾句的好時機,並看看點積是什麼。

現在讓我們回到實際世界的例子,是時候為pdf塊的所有部分建立嵌入式向量了。

然後儲存它們為向量,我們將用於本課程的向量儲存是chroma,所以讓我們匯入它lane chain與超過三十個向量儲存有整合。

我們選擇chroma因為它在記憶體中輕量級。

這使得它非常容易開始使用。

還有其他向量儲存提供託管解決方案,這可能在您試圖持久大量資料時非常有用,或持久在雲端儲存中。

我們將想在某個地方儲存這個向量儲存,以便我們在未來課程中使用它。

所以讓我們建立一個變數叫做持久目錄,我們將在後續的doc chroma中使用它。

讓我們也確保那裡什麼都沒有。

如果有東西在那裡,可能會引起問題,我們不想要那樣。

所以讓我們rm dash rf docs chroma,只是為了確保那裡什麼都沒有。

現在讓我們建立向量儲存,所以我們從文件中呼叫chroma,傳遞分裂,這些是我們 earlier 創造的分裂,傳遞嵌入。

這是開放AI嵌入模型,然後,我們將傳入持久目錄,這是一個chroma特定的關鍵字引數,允許我們將目錄儲存到磁碟。

如果我們看一下集合計數,做完這個之後,我們可以看到它是209,這與我們從前的分裂數相同。

現在讓我們開始使用它,讓我們思考一個問題,我們可以問這個資料,我們知道這是關於一堂課的。

所以讓我們問是否有我們可以尋求幫助的電子郵件,如果我們需要關於課程或材料的任何幫助。

我們將使用相似性搜尋方法,我們將傳遞問題,然後,我們還將傳遞k等於3,這指定我們要返回的文件數量。

如果我們執行那個,然後我們看文件的長度,我們可以看到它是3,因為我們指定的。

如果我們看第一個文件的內容。

我們可以看到它實際上關於電子郵件地址,cs2-299-dash-qa-cs,史丹佛,edu,這是我們可以傳送問題的電子郵件地址,並且由所有tas閱讀,做完之後,讓我們確保持久向量資料庫。

以便我們可以在未來的課程中使用它,透過執行向量db。dot。persist。

這覆蓋了語義搜尋的基本知識,並展示了我們可以僅基於嵌入物就得到很好的結果。

但它不是完美的,在這裡,我們將討論幾個邊緣情況並顯示在哪裡這可能會失敗。

讓我們嘗試一個新問題,他們對matlab說了什麼,讓我們執行這個,指定k等於5,並獲取一些結果。

如果我們看第一個兩個結果,我們可以看到它們實際上是相同的,這是因為當我們載入pdfs時,如果你記得我們特意指定,一個重複項,這是很糟糕的,因為我們在同一個部分中有相同的資訊。

我們將這兩個部分都傳遞給語言模型往下游,第二個部分的資訊並沒有真正的價值,而且如果存在一個不同,獨特的部分,語言模型可以從中學習,在下一節課中,我們將覆蓋如何同時獲取相關和獨特的部分。

這是另一種可能會發生的失敗模式,讓我們看看這個問題。

他們在第三堂課中說了什麼關於迴歸的內容。

當我們得到這些文件時,直覺上,我們預期它們應該都是第三堂課的一部分。

我們可以檢查這個,因為後設資料中包含了它們來自哪些講座的資訊。

所以讓我們遍歷所有文件並列印出後設資料。

我們可以看到實際上有一組結果。

一些來自第三堂課,一些來自第二堂課,還有一些來自第一堂課,關於為什麼這失敗直覺的原因是第三堂課。

以及我們想要只從第三堂課獲取文件的事實是一段結構化資訊。

但我們只是在基於嵌入的語義查詢上做。

它為整個句子建立了一個嵌入。

而且它可能更專注於迴歸,因此我們得到的結果可能對迴歸非常相關。

所以如果我們看第五個,檢視來自第一堂課的那個,我們可以看到它確實,實際上,提到了迴歸,所以它捕捉到了這個,但它沒有捕捉到事實,它只應該查詢來自第三堂課的文件,因為再次,這是一段結構化資訊。

並不是我們建立的語義嵌入完全捕捉的,現在是個好時機暫停並嘗試一些更多的查詢,你還能注意到哪些邊緣情況出現,你也可以嘗試改變k,你檢索的文件數量,正如你在這堂課中注意到的,我們使用了前三個,然後五個。

你可以嘗試調整它成為你想要的任何數字,你可能注意到當你使它更大時,你將檢索更多的文件,但是那個尾端的文件可能不如開始的那些相關,現在,我們覆蓋了語義搜尋的基本知識,以及一些失敗模式,讓我們繼續下一堂課。

我們將討論如何解決這些失敗模式並增強我們的檢索,讓我們轉到下一堂課。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P37:5——檢索 - 吳恩達大模型 - BV1gLeueWE5N

在上一節課中,我們覆蓋了語義搜尋的基本知識,並看到了它在許多使用場景中表現良好的情況,但我們也看到了一些邊緣情況,並看到了事情可能會如何出錯,在這節課中,我們將深入研究檢索。

並覆蓋一些更先進的方法來克服這些邊緣情況,我對此非常興奮,因為我認為檢索是新的,而且我們正在談論的技術在過去的幾個月裡出現了,這是一個前沿的主題,所以你們將處於前沿,讓我們有一些樂趣,在這節課中。

我們將談論檢索,這在查詢時間非常重要,當你有一個查詢進來時,並且你想要檢索最相關的片段。

我們在上一節課中討論了語義相似性搜尋。

但我們將討論一些不同和更先進的方法在這裡,我們將首先覆蓋的最大邊際相關性或mmr。

所以這背後的想法是。

如果你總是取與查詢在嵌入空間中最相似的文件。

你可能實際上會錯過多樣化的資訊,因為我們在邊緣情況中看到了,例如,我們有一個廚師在詢問所有種類的白蘑菇。

所以如果我們看最相似的結果。

那些將是前兩個文件,它們有許多與查詢相似的資訊,關於菌核,並且都是白色的,但我們確實想要確保我們也得到其他資訊。

如它真的很有毒,這就是mmr發揮作用的地方。

因為它將選擇一個多樣化的文件集,mmr的想法是我們傳送一個查詢,然後我們最初得到一組響應。

與fetch underscore k引數可以控制的響應數量有關。

以確定我們得到多少響應,這僅基於語義相似性,從那裡。

然後我們與那個較小的文件集一起工作,並最佳化為,不僅基於語義相似性的最相關的文件,但也是多樣化的。

從那個文件集中,我們選擇一個最終k來返回給使用者,另一種檢索我們可以做的是我們稱之為自我查詢,所以這對你來說很有用,當你得到的問題不僅僅是。

你想要查詢的語義內容,還包括一些你想要過濾的後設資料。

讓我們以問題為例,哪部在1980年製作的關於外星人的電影。

這實際上有兩個部分,它有一個語義部分,還有一個關於後設資料的部分,所以讓我們看問題,哪些關於外星人的電影在1980年製作,外星人咬了。

所以我們想要檢視我們在電影資料庫中的外星人,但它也有一個部分真正指的是關於每部電影的後設資料,那就是事實,年份應該是一九八零。

我們可以做,我們可以使用自然語言模型本身來將原始問題分成兩個分開的東西,一個過濾器和一個搜尋術語。

大多數向量儲存都支援後設資料過濾,所以你可以很容易地根據後設資料過濾記錄。

像年份是一九八零。

最後我們將談論壓縮,這可以有用於真正提取從檢索的段落中只有有關的部分,例如,當提問時,你會得到儲存的整個文件。

即使只有第一個或兩個句子是有關的部分,使用壓縮。

你可以然後執行所有這些文件透過自然語言模型並提取最相關的部分。

然後只將最相關的部分傳遞給最終的自然語言模型呼叫。

這以使更多的呼叫自然語言模型為代價。

但它也非常好用於將最終答案集中在最重要的事情上。

因此,它是一種權衡,讓我們看看這些不同的技術如何發揮作用。

我們將開始載入環境變數,像我們總是做的。

匯入chroma和open ai,因為我們之前使用過它們。

我們可以透過檢視集合看到,計數,它包含了我們之前載入的209個文件。

現在讓我們來看看最大邊際相關性的例子。

因此,我們將載入來自示例的文字,其中我們有關於蘑菇的資訊,對於這個例子,我們建立了一個小資料庫,我們可以簡單地使用它作為玩具,例如。

我們有我們的問題,現在我們可以執行相似性搜尋,我們將k設定為2,只返回最相關的兩個文件。

我們可以看到,沒有提到它是有毒的,現在讓我們執行它與mmr,除非將k設定為2,我們仍然想要返回兩個文件,讓我們將fetch k設定為3,我們獲取所有3個文件,最初。

我們可以看到,有毒的資訊在我們的檢索文件中被返回。

讓我們回到前一節課中的一個例子,當我們問關於matlab並返回包含重複資訊的文件以重新整理您的記憶。

我們可以檢視前兩個文件。

僅看前幾個字元,因為它們否則很長,我們可以看到它們相同,當我們在這些結果上執行mmr時。

我們可以看到第一個與以前相同。

因為那是最相似的,但當我們轉向第二個時,我們可以看到它不同。

響應中有一些多樣性。

現在讓我們轉向自我查詢示例,這是我們有問題的一個。

第三講座中他們說了什麼關於迴歸,它不僅返回來自第三講座的結果。

而且還來自第一和第二,如果我們手動修復這個。

我們會做的就是我們指定一個後設資料過濾器,所以我們傳遞這個資訊,我們想要源等於第三講座。

Pdf,然後如果我們看要檢索的文件,它們都將來自精確的那一課。

我們可以使用語言模型來做這個,所以我們不需要手動指定,要做這個。

我們將匯入一個語言模型open ai,我們將匯入一個檢索器叫做自我查詢檢索器。

然後我們將匯入屬性資訊,這是 where 我們可以指定後設資料中的不同欄位以及它們對應什麼。

我們在後設資料中只有兩個欄位。

來源和頁面,我們填寫每個屬性的名稱。

描述和型別,這資訊實際上將被傳遞給語言模型。

因此,使它盡可能描述性是非常重要的。

我們將指定一些關於這個文件儲存的資訊,我們將初始化語言模型,然後我們將初始化自我查詢檢索器使用 from lm 方法。

並傳遞給語言模型我們將要查詢的基礎向量資料庫,關於描述和後設資料的資訊,我們還將傳遞 verbose 等於 true 的設定。

verbose 等於 true 的話,讓我們看看底下的情況,當 llm 推斷出應該與任何後設資料過濾器一起傳送的查詢時。

當我們使用這個問題執行自我查詢檢索器時。

我們可以 thanks to ruo 等於 true,儘管我們在列印出底下的情況。

我們得到一個關於回歸的查詢,這是語義的部分,然後我們得到一個過濾器,我們有一個比較器等於,在來源屬性和一個值 docs 之間。

然後這是一個路徑,這是到第三機器學習講座的路徑,所以,這基本上在告訴我們在迴歸語義空間中進行查詢,然後進行過濾,只檢視源值為此值的文件。

因此,如果我們遍歷文件並列印出後設資料,我們應該看到它們全部來自第三堂課。

確實如此,這是一個例子,在這裡,自我查詢檢索器可以用於精確過濾後設資料。

我們可以討論的最後一種檢索技術是上下文壓縮,因此,讓我們在這裡載入一些相關的模組。

上下文壓縮檢索器,然後一個llm鏈提取器。

這將做什麼,這將從每個文件中提取只有有關的部分。

然後將這些作為最終返回響應,我們將定義一個漂亮的小函式來列印出文件。

因為它們往往很長且困惑,這將使事情更容易看到。

我們可以然後建立一個壓縮器與llm鏈提取器。

然後我們可以建立上下文壓縮檢索器,輸入壓縮器。

然後向量儲存的基礎檢索器,現在我們輸入問題,他們對matlab說了什麼。

我們檢視壓縮的文件,如果我們檢視返回的文件,我們可以看到兩件事,一,它們比正常文件短得多,但二我們還有一些重複的東西在進行,這是因為我們底層使用了語義搜尋演算法。

這就是我們透過本課程前面的mmr解決這個問題的方式,這是一個你可以結合各種技術以獲得最佳可能結果的好例子,為了做到這一點,當我們從向量資料庫建立檢索器時,我們可以將搜尋型別設定為mr。

然後我們可以重新執行這個,並看到我們返回,一個不含有任何重複資訊的過濾結果集,到目前為止,我們所提到的所有附加檢索技術都建立在向量資料庫之上。

值得注意的是,還有其他型別的檢索方法根本不使用向量資料庫。

而是使用其他,更傳統的nlp技術。

在這裡,我們將重新建立一個檢索管道,使用兩種不同型別的檢索器,和一個svm檢索器和一個tf-idf檢索器。

如果你從傳統的nlp或傳統的機器學習中認識這些術語,那太好了。

如果你不,這也沒關係,這只是一些其他技術在外面的例子。

除了這些,還有更多的,我鼓勵你去檢查一下,其中的一些。

我們可以很快地執行載入和分割的常規管道。

然後這兩個檢索器都暴露了一個從文字方法,一個接受嵌入模組的檢索器是svm檢索器,tf idf檢索器只是直接接受分割。

現在我們可以使用其他檢索器,讓我們傳遞,他們對matlab說了什麼,給svm檢索器,我們可以檢視最頂部的文件,我們回來可以看到它提到了很多關於matlab的東西,所以它在那裡取得了一些好的結果。

我們也可以嘗試在tf idf檢索器上這樣做,我們可以看到結果看起來稍微差一些,現在是個好時機,停下來嘗試所有這些不同的回收技術,我想你會注意到一些比其他的好在一些事情上。

所以我鼓勵你嘗試在各種問題上進行廣泛的測試,特別是自查詢檢索器,這是我最喜歡的,所以我建議你嘗試使用更多的複雜後設資料過濾,甚至可能建立一些沒有實際意義的後設資料,其中包含巢狀的後設資料結構。

你可以嘗試讓llm推斷,我認為這非常有趣,我認為這是一些更先進的東西,所以我非常興奮能夠與你分享它,現在我們已經談論了檢索,我們將談論這個過程的下一步。

LangChain_微調ChatGPT提示詞_RAG模型應用_agent_生成式AI - P38:6——問答聊天機器人 - 吳恩達大模型 - BV1gLeueWE5N

已講解如何檢索相關文件,下一步是處理這些文件,取原始問題,連同文件一起給語言模型,讓它回答問題,本課將講解及幾種方法,讓我們開始這節課。

將講解如何用已檢索文件,回答問題,在完成儲存和匯入後,獲取相關切分後,需傳入語言模型得答案。

流程大致如下,問題輸入。

查詢相關文件,然後傳入這些切分,連同系統提示和問題。

語言模型給出答案,預設情況下,所有塊放入同一上下文,進入語言模型的呼喚。

但有幾種不同方法,各有優缺點。

大部分優點來自有時會有很多文件,你無法將它們全部放入同一上下文中。

Mapreduce,精煉。

今天課程中我們將涵蓋其中一些,開始編碼。

首先,我們將載入環境變數。

然後載入之前持久化的向量資料庫,我將檢查其正確性。

可見與之前相同,有209個文件。

快速檢查相似性搜尋,確保為第一個問題工作:本課程的主要主題是什麼。

現在初始化將用於回答問題的語言模型。

我們將使用Chat Open AI模型gpt 3。5。

並將溫度設定為0,當我們需要事實答案時,這非常好。

因其變化性低,通常提供最高保真度,最可靠答案。

然後匯入檢索QA鏈,這是基於檢索的問題解答,由檢索步驟支援。

可透過傳入語言模型建立。

然後向量資料庫作為檢索器。

然後可呼叫它,查詢等於要問的問題。

檢視結果,我們得到一個答案,本課主要話題是機器學習,此外,討論部分可能會複習統計和代數。

本季度晚些時候,討論部分還將涵蓋主要講座材料的外延。

讓我們試著更好地理解,底層發生了什麼,並揭示一些主要部分的調整旋鈕,重要的是我們使用的提示,這是接受文件和問題並將其傳遞給語言模型的提示。

關於提示的複習。

可以檢視我與安德魯的第一堂課,這裡我們定義了一個提示模板。

有一些關於如何使用以下上下文片段的說明,然後它有一個上下文變數的佔位符,這是文件將放置的地方,還有一個問題變數的佔位符。

我們現在可以建立一個新的檢索,Qn,我們將使用與之前相同的語言模型,與之前相同的向量資料庫,但我們將傳遞一些新的引數,所以我們有返回源文件,所以我們將此設定為真,這將使我們能夠輕鬆檢查檢索到的文件。

然後我們還將傳遞一個提示。

等於qa鏈,上面定義的提示,讓我們嘗試一個新問題是機率,一個課程主題。

我們得到一個結果,如果我們檢查裡面的內容,我們可以看到是的,機率被認為是課程的前提。

講師假設對基本機率統計熟悉,我們將在討論部分複習一些先決條件,作為複習課程,謝謝提問回答我們也很高興,為了更好地理解它從哪裡獲取資料。

我們可以看一下返回的源文件。

如果你瀏覽它們,你應該看到所有被回答的資訊都在這些源文件之一中,現在是一個暫停並嘗試一些不同問題的好時機,或者你自己的不同提示模板,看看結果如何變化。

我們一直在使用stuff技術,我們預設使用的技術,基本上只是把所有文件都塞入最終提示中,這真的很好因為它只涉及一次對語言模型的呼叫,然而,這也有一個限制,如果有太多的文件。

它們可能無法全部放入上下文視窗,我們可以使用的不同技術,文件問答中的mapreduce技術,每個文件先單獨送至語言模型。

然後這些答案組合成最終答案。

這涉及更多語言模型的呼叫,但它可以處理任意多文件。

執行前一個問題,可看到此方法的另一個限制,實際上可以看到兩個,它要慢得多,二,結果實際上更糟,這個問題沒有明確答案,根據文件的部分內容,這可能是因為它基於每個文件單獨回答。

因此,如果資訊分散在兩個文件中,它沒有在同一上下文中擁有所有資訊。

這是一個使用車道鏈平臺獲得更好理解的機會,關於這些鏈條內部正在發生的事情。

我們將在此處演示,如果你想自己使用。

課程材料中有說明,如何獲取API金鑰,設定這些環境變數後,我們可以重新執行對映,減少鏈,然後我們可以切換到UI檢視。

內部,從這裡可以找到剛執行的執行。

我們可以點選檢視輸入和輸出,然後可看到孩子跑分析,內部,首先,有MapReduce文件鏈,實際涉及4次語言模型呼叫。

若點選其中一個呼叫,可看到每個文件的輸入和輸出。

若返回,然後可看到遍歷每個文件後,最終合併為鏈,將所有回覆填入最終呼叫的填充文件鏈,點選進入。

我們看到系統訊息,來自先前文件的4個摘要,然後使用你的問題,然後有答案在那裡,我們可以做類似的事情,將鏈型別設定為細化。

這是一種新的鏈型別,讓我們看看內部是什麼樣子,我們看到它在呼叫精煉文件鏈,涉及對llm鏈的四個連續呼叫,讓我們看看這個鏈中的第一個呼叫,看看這裡發生了什麼,在傳送給語言模型之前,我們有提示。

我們可以看到一個由幾部分組成的系統訊息,此上下文資訊在下面的部分,是系統訊息的一部分,它是我們提前定義的提示模板的一部分,接下來的這部分,所有這些文字,這是我們檢索到的其中一個文件,下面是使用者問題。

然後這裡是答案,如果我們回到前面,我們可以看看對語言模型的下一個呼叫,傳送給語言模型的最終提示,是一個將先前響應與新資料組合的序列,然後請求改進的響應,所以我們可以看到,我們有了原始使用者問題。

然後我們有了答案,這跟之前的一樣,然後我們說我們有機會僅用下面的更多上下文改進現有答案,如果需要的話,這是提示模板的一部分,一部分指令,其餘部分是我們在列表中檢索到的第二個文件,然後我們可以看到。

在新的上下文中,我們有一些額外的指令,改進原始答案以更好地回答問題,然後在下面我們得到了最終答案,但這是第二個最終答案,這個過程執行四次,在所有文件之前執行,然後到達最終答案,最終的答案就在這裡。

課程假設熟悉基本機率和統計,但我們將有複習部分來重新整理先決條件,你會發現這比MapReduce鏈更好,因為使用精煉鏈確實允許你組合資訊,儘管是順序的,它實際上比MapReduce鏈更鼓勵資訊的傳遞。

這是一個暫停的好機會,嘗試一些問題,嘗試不同的鏈,嘗試不同的提示模板,看看它在UI中看起來像什麼,這裡有很多可以玩的東西,聊天機器人的一大優點,也是它們越來越受歡迎的原因之一是你可以問後續問題。

你可以要求對之前的答案進行澄清,所以讓我們在這裡這樣做,建立問答鏈,使用預設內容。

問它,問題機率,課程主題。

然後問後續問題,提到機率是前提,然後問,為何需要前提,得到答案,課程前提是計算機基礎,和之前無關的計算機技能,我們問機率,怎麼回事,我們用的鏈無狀態概念,不記得先前問題或答案,需引入記憶。

相關文章