Deno 和 Jupyter Notebook:如何優(yōu)雅地學(xué)習(xí) LLM?
工欲善其事,必先利其器。 LLM 的開(kāi)發(fā)跟傳統(tǒng)的項(xiàng)目開(kāi)發(fā)區(qū)別在于,LLM 很多請(qǐng)求是耗時(shí)甚至是耗錢(qián)的,基礎(chǔ)的如調(diào)用 OpenAI API,每次都會(huì)消費(fèi)一定的 token。
另外,我們可能會(huì)反復(fù)調(diào)試一段代碼來(lái)測(cè)試最合適的參數(shù)和 prompt,如果我們像傳統(tǒng) Nodejs 程序一樣每次都從頭重新跑一次,既耗時(shí)也花費(fèi)比較多。所以我們需要使用適合機(jī)器學(xué)習(xí)和大模型領(lǐng)域的專(zhuān)用開(kāi)發(fā)工具。
Deno 和 Jupyter Notebook
在正式介紹 Jupyter Nodebook 之前,我們先介紹一下 Deno,我相信大家或多或少聽(tīng)說(shuō)過(guò) Deno,他是 Node.js 之父 Ryan Dahl 創(chuàng)建的新項(xiàng)目。更多的介紹可以看 Deno 的官網(wǎng),一句話(huà)介紹,Deno 是把 nodejs 中分散的生態(tài)整合在一起,并提供更現(xiàn)代的框架支持。 例如 Deno 開(kāi)箱支持 TypeScript、自帶格式化工具、自帶測(cè)試框架、高質(zhì)量的標(biāo)準(zhǔn)庫(kù),并且有比較好的安全性,默認(rèn)腳本不能訪問(wèn)文件、環(huán)境或者網(wǎng)絡(luò)等等好用的功能。
可以理解成一個(gè)更強(qiáng)的 Nodejs,當(dāng)然 Deno 不是我們小冊(cè)的重點(diǎn),你會(huì) nodejs 就會(huì) deno,并且獲得了很多 nodejs 需要配置才能使用的功能。
在了解完了 Deno 后,我們將學(xué)習(xí)在 AI 領(lǐng)域比較常用的工具 — Jupyter Notebook,我們少?gòu)U話(huà),先看演示。
const text = await Deno.readTextFile("./people.json");
CleanShot 2024-03-18 at 21.46.36@2x.png
Jupyter Notebook 的核心是代碼塊,每個(gè)代碼塊作為一個(gè)整體去執(zhí)行,并且可以多次反復(fù)執(zhí)行。在代碼快的左側(cè),是執(zhí)行順序的標(biāo)記,指這個(gè)代碼塊被執(zhí)行的順序。
例如,如果你先執(zhí)行第一個(gè)代碼塊,它會(huì)顯示數(shù)字 1;接著執(zhí)行第二個(gè)代碼塊,它會(huì)顯示數(shù)字 2;然后你再執(zhí)行代碼塊 1,它的左側(cè)就會(huì)顯示數(shù)字 3。
也就是這個(gè)數(shù)字顯示的是當(dāng)前塊被執(zhí)行的順序,這個(gè)數(shù)字存在的目的是幫助你跟蹤代碼塊的執(zhí)行順序,并且在執(zhí)行過(guò)程中保持清晰的狀態(tài)。
這個(gè)理解起來(lái)有點(diǎn)怪,我們用 code demo 測(cè)試一下,我們?cè)诘诙K中顯示變量 text。
CleanShot 2024-03-18 at 21.57.45@2x.png
在 Jupyter NoteBook 中,如果一個(gè)代碼快只有一個(gè)變量,那就會(huì)自動(dòng)把該變量顯示出來(lái),類(lèi)似于 console.log(單個(gè)變量) 但又不一樣,其中有些微妙的區(qū)別在使用中你會(huì)感受出來(lái)。
所以,當(dāng)運(yùn)行完兩個(gè)代碼塊之后,在 js 的環(huán)境中有了 text 這個(gè)變量。我們可以把這里的從 txt 文件讀內(nèi)容理解成一個(gè)耗時(shí)又耗錢(qián)的任務(wù)(就像 OpenAI API 一樣),在運(yùn)行完這個(gè)任務(wù)后,就會(huì)把結(jié)果儲(chǔ)存在 text 中,后續(xù)就可以對(duì) text 做任何測(cè)試,而不需要重復(fù)的從文件中讀取。
例如,我們可以對(duì) text 進(jìn)行切割。
CleanShot 2024-03-18 at 22.17.58@2x.png
如果我們對(duì)切割的結(jié)果不滿(mǎn)意,可以調(diào)整切割的方式。
CleanShot 2024-03-18 at 22.18.36@2x.png
可以看到,再次運(yùn)行第三個(gè)單元格兩次后,左側(cè)的數(shù)字就變成了 4。
注意,如果上游數(shù)據(jù)發(fā)生了改變,下游并不會(huì)自動(dòng)的更新或者重新運(yùn)行,例如我們這里手動(dòng)修改 text 的值改成一個(gè)字符串。
CleanShot 2024-03-18 at 22.21.05@2x.png
可以看到,后面依賴(lài)于 text 的代碼格并沒(méi)有自動(dòng)更新,需要自己手動(dòng)重新運(yùn)行:
CleanShot 2024-03-18 at 22.20.26@2x.png
之所以叫 Notebook 是因?yàn)樘烊恢С?markdown,我們新建一個(gè)塊,然后設(shè)置為 markdown 塊:
CleanShot 2024-03-19 at 11.37.55@2x.png
CleanShot 2024-03-19 at 11.39.34@2x.png
在運(yùn)行之后,就會(huì)渲染出來(lái):
轉(zhuǎn)存失敗,建議直接上傳圖片文件
轉(zhuǎn)存失敗,建議直接上傳圖片文件。
有了 Jupyter NoteBook,我們就可以節(jié)約 費(fèi)事/費(fèi)錢(qián) 的請(qǐng)求,并且基于某個(gè)運(yùn)行結(jié)果的輸出,在后面的代碼塊中,不斷嘗試各種解析或者處理方式。同時(shí),也非常方便結(jié)合 markdown 來(lái)做一些筆記,獲得比在注釋里記錄更方便的學(xué)習(xí)體驗(yàn)。
配置
Jupyter Notebook 項(xiàng)目開(kāi)始以 python 為主,后續(xù) deno 提供了 js/ts Kernel 的支持,所以我們需要分別安裝這兩個(gè)。這里以 Mac 環(huán)境演示,如果是 win/linux 可以參考后附的鏈接進(jìn)行安裝。
首先我們需要本地有 python 環(huán)境,最好是 3.9 及以上的 python 環(huán)境。在配置好 python 環(huán)境后,然后安裝 Jupyter Notebook:
pip install notebook如果你本地 python3 的 pip 別名是 pip3,那就需要:
pip3 install notebook然后在本地安裝 Deno 環(huán)境:
curl -fsSL https://deno.land/install.sh | sh安裝完畢 Deno 環(huán)境后,使用 deno 為 Jupyter Notebook 配置 kernel:
deno jupyter --unstable --install然后通過(guò)運(yùn)行以下命令,驗(yàn)證 kernel 是否配置完成:
deno jupyter --unstable顯示以下即為配置成功:
CleanShot 2024-03-19 at 11.27.05@2x.png
然后我們運(yùn)行以下命令啟動(dòng) notebook:
jupyter notebook然后就會(huì)自動(dòng)打開(kāi)一個(gè)網(wǎng)頁(yè),然后我們就可以正常使用 notebook 了。
目前 deno kernel 的 Jupyter Notebook 不支持代碼提示,所以寫(xiě)代碼會(huì)難受一點(diǎn),大家可以安裝 vscode 插件,使用 vscode 去編輯和運(yùn)行 notebook。
CleanShot 2024-03-19 at 11.43.55@2x.png
https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter
CleanShot 2024-03-19 at 11.45.39@2x.png
記得在右上角切換 Kernel 為 Deno, 如果切換 Kernel 遇到問(wèn)題,可以參考文檔: https://code.visualstudio.com/docs/datascience/jupyter-kernel-management 。
目前在 VSCode 里的體驗(yàn)也有問(wèn)題,會(huì)因?yàn)樽R(shí)別不了 Deno 的引用在代碼上顯示出錯(cuò)的樣式(這個(gè)在之后的代碼中也會(huì)遇到),但不影響正常運(yùn)行,可以忽略代碼里的飄紅即可。
具體用什么編輯方式書(shū)寫(xiě) notebook 可以根據(jù)自己的喜好。
安裝參考鏈接:
- https://www.python.org/downloads/
- https://docs.deno.com/runtime/manual/
- https://docs.deno.com/runtime/manual/tools/jupyter
- https://jupyter.org/install
- https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter
Deno 依賴(lài)管理
Deno 直接從遠(yuǎn)程拉取依賴(lài),自帶緩存機(jī)制,而不需要本地安裝,例如我們?nèi)绻枰?lodash 庫(kù),我們不需要像 nodejs 一樣使用 npm/yarn 等來(lái)安裝依賴(lài),而是可以直接從遠(yuǎn)程引入:
import _ from "npm:/lodash如果我們需要鎖定版本,則可以:
import _ from "npm:/lodash@4.17.21"這個(gè)命令,就會(huì)讓 deno 從 npm 找到對(duì)應(yīng)的 lodash 包,然后引入,我們就可以在另一個(gè)代碼塊中使用引入后的_,比如:
const a = _.random(0, 5);
a
CleanShot 2024-03-19 at 21.58.38@2x.png
當(dāng)然,我們每次都這樣使用完整的鏈接引入就會(huì)比較麻煩,所以我們可以在頂層創(chuàng)建一個(gè)文件 deno.json 來(lái)給設(shè)置別名。
在跟 notebook 文件同級(jí)創(chuàng)建一個(gè) deno.json 文件:
- 1-test-notebook.ipynb
- deno.json然后填寫(xiě)其中的內(nèi)容為:
{
"imports": {
"lodash": "npm:/lodash@4.17.21"
},
"deno.enable": true
}這里內(nèi)容比較好理解,就是將 "npm:/lodash@4.17.21" 的別名設(shè)置為 lodash,其中"deno.enable": true 是如果你用了 deno 的 vscode 插件,可以讓它識(shí)別到,并對(duì) deno 在 vscode 體驗(yàn)的一些優(yōu)化。
設(shè)置完畢后,我們就可以使用別名在 deno 中引入 lodash 了:
import _ from "lodash"
const a = _.random(0, 5);
a注意,如果你更新了 deno.json 需要重啟 notebook 的內(nèi)核才能讓 deno 拿到最新的別名:
CleanShot 2024-03-19 at 22.05.50@2x.png
這里,我們只介紹了足夠本教程使用 Deno 依賴(lài)管理,更多信息可以參考。
小結(jié)
這一節(jié),我們學(xué)習(xí)了 在機(jī)器學(xué)習(xí)領(lǐng)域中常用的工具 Jupyter Notebook,這也是我們邁向?qū)I(yè) AI 的一步。你可以看到在 github 中,很多知名的 AI 論文開(kāi)源的 demo 入口都是一個(gè) Jupyter Notebook,其在 AI 這場(chǎng)景中有不可替代的優(yōu)勢(shì)。
當(dāng)然,Deno + Jupyter Notebook 這一套工具只是可選的,即使不配置也可以正常學(xué)習(xí)后續(xù)的課程,只需要將后續(xù)教程中部分 Deno 專(zhuān)有的 API 替換成 Node.js 對(duì)應(yīng)的 API 即可。
我個(gè)人建議是嘗試一下 Deno,這可能是未來(lái) js 在后端的風(fēng)向,目前后端的各種 js 運(yùn)行時(shí)在打架,可以都把玩看看,跟 nodejs 對(duì)比一下。而且,使用 Jupyter Notebook 在學(xué)習(xí) AI 相關(guān)技術(shù)時(shí)確實(shí)十分方便,也是專(zhuān)業(yè) AI 開(kāi)發(fā)時(shí)會(huì)使用的工具。






























