前言
工欲善其事必先利其器。LLM 的开发与传统的项目开发有一些区别,LLM 很多请求是耗时甚至是烧钱的,比如说 Open AI 的 API,每次都会消费一定的 Token。
其次,我们可能会反复调试一段代码来测试最合适的参数与prompt
,如果我们像传统 Nodejs 程序一样每次都从头跑一次,耗时也花钱。所以我们需要使用适合机器学习与大模型领域的专用开发工具。
Deno 和 Jupyter NoteBook
在正式介绍 Jupyter NoteBook 之前,我们先介绍一下 Deno 吧,做前端的大家肯定是或多或少听说过 Deno 的,它是 Nodejs 之父创立的新项目。这里不会赘述它的使用方法,可以自行查询官方网站的文档,简单概括一下就是,把 Nodejs 的分散的生态全部整合到了一起,提供了更多的现代框架支持。比方说:
- Deno 开箱支持 Typescript
- 自带格式化工具
- 自带测试框架
- 高质量的标准库
- 有比较好的安全性
- 默认脚本不能访问文件,网络,环境
可以把它理解成一个更为强劲的 Nodejs,当然了,Deno 不是我们这个主题的重点,你只需要知道,你会 Nodejs 就会 Deno,并且还可以直接获得很多需要 Nodejs 配置了才可以使用的功能。
好了,接下来我们来看看 AI 领域经常用到的工具——Jupyter NoteBook 吧:
先看看演示:
这个工具的核心就是代码块,每个代码块作为一个独立的整体去执行,并且可以反复多次进行执行。在代码块的左侧,可以看看我贴的这张图,就是执行的顺序标记,指代的就是这个代码块被执行的顺序
比如说,我先执行图里的第一个代码块,它会显示数字 1;然后执行第二个代码里,它会显示数字 2,紧接着我再去执行代码块 1,它的左侧就变成了 3:
这样就很直观了吧,也就是说这个数字显示的是当前被执行的顺序,这个数字存在的目的是帮助你跟踪代码块的执行顺序,并且在执行过程中保持一种清晰的状态。
顺带一提,在 Jupyter NoteBook 中,如果一个代码块只有一个变量的话,就会像我图里那样,自动的把该变量显示出来,类似于console.log
,但是又有点不一样,后面实际使用中会有更多的体验。
所以说,在我执行完这两个代码块之后,在 JS 环境中,就有了一个text
变量,我们可以把这里从 txt 文件中读内容理解成一个耗时耗钱的任务(比方说 OpenAI API),在执行完这个任务之后,我们就可以把内容存储到变量里,后续可以对这个任务做任何测试,而不需要反复从文件中读取(亦或是反复发送 chatgpt 来烧钱)
接下来我们可以对 text 随便操作了,比方说我们来做一下切割:
可以看到,我们做了复数次操作之后,旁边的数字也在增加。
值得注意的是:
如果上游数据发生了变化,下游并不会自动更新或者重新运行
比如说我们这边手动修改 text 的值变成一个自定义的字符串:
需要手动去运行一下才更新。
这个工具之所以有叫做 NoteBook,是因为他也支持 Markdown:
所以说,我们有了 Jupyter NoteBook,就可以节约费钱(也有费事)的请求,基于某个运行结果的输出,我们可以不断尝试解析和处理方式。与此同时,也非常方便结合 Markdown 来做笔记。
配置
Jupyter NoteBook 主要是以 Python 为主的,后续的 Deno 提供了 JS/TS Kernel 的支持,所以我们就需要分别安装 Deno 与 Jupyter NoteBook。
因为我的电脑是 Mac,以 Mac 为例:
1.Mac 电脑基本默认有 Python3 的环境,如果你是 windows,可以自行安装 Python3。
2.我们管理包都是用的 pipx,会把工具安装到 pipx 管理的虚拟环境中:
python3 -m pip install --user pipx
python3 -m pipx ensurepath
3.使用 pipx 安装 Jupyter Notebook
pipx install notebook
4.检查是否安装成功
pipx list
这样就算安装好了
5.然后在本地安装 Deno 环境
curl -fsSL https://deno.land/install.sh | sh
6.安装完 Deno 环境之后,使用 Deno 为 Jupyter NoteBook 配置 Kernel(内核)
deno jupyter --install
正常来说会显示:
这就是配置成功的内容啦
7.启动,运行以下命令启动 NoteBook
jupyter-notebook
这样以来就可以自动打开一个网页,我们就可以正常使用 NoteBook 了。
目前 Deno Kernel 的 Jupyter NoteBook 不支持代码提示,所以我们可以安装 VScode 插件,使用 VScode 去编辑运行
记得在右上角切换 Kernel 为 Deno,如果切换遭遇了问题,可以阅读参考文档
不过目前在 VScode 上的体验也有点问题就是了,会因为识别不了 Deno 的引用在代码上显示出错误的样式,但是不影响正常的运行,无视飘红即可。
Deno 依赖管理
Deno 是直接从远程拉取依赖的,自带缓存机制,而不需要本地安装。
比方说我们需要lodash
库,不需要像 Nodejs 一样使用 npm/yarn 之类的来安装依赖,而是可以直接从远程导入:
import _ from "npm:/lodash"
如果需要锁定版本:
import _ from "npm:/lodash@4.17.21"
这个命令就会让 deno 从 npm 找到对应的 lodash 包,然后引入,咱们就可以在另一个代码块里使用引入的_
:
const a = _.random(0,5);
a
当然啦,我们每次都这样使用完整的链接引入就会比较麻烦,所以我们可以在顶层创建一个文件deno.json
来给设置别名
在跟 NoteBook 文件同级创建一个deno.json
文件
- 1-test-notebook.ipynb
- deno.json
然后在 json 中填写:
{
"imports": {
"lodash": "npm:/lodash@4.17.21"
},
"deno.enable": true
}
这里比较容易 get 到,就是将"npm:/lodash@4.17.21"的别名设置为lodash
,其中"deno.enable": true
是如果你用了 deno 的 vscode 插件,可以让它识别到,并且对 deno 在 vscode 的体验进行一些优化。
deno install
使用上述指令进行依赖安装,以及之后更新了json的内容都要跑一下这个指令,确保依赖在缓存里存在,就可以运行项目了
设置完毕之后,我们就可以使用别名在 deno 中引入lodash
:
要额外注意,如果更新了deno.json
,需要重启一下 NoteBook 的内核才可以生效,就是我图里标出来的位置。