工欲善其事,必先利其器。我们会从学习环境的搭建开始这个系列。
Jupyter 是一种交互式笔记本,可以支持多种语言。就我们现在的学习而言,我们所需的是 Python 的执行能力。我们可以把它理解成可以运行 Python 代码的 Web 笔记本应用。它可以直接运行穿插在 Markdown 文件中的 Python 代码,得到代码执行的结果。这对于我们的学习非常有帮助。
现在,我们首先来搭建 Jupyter 环境。
安装 Miniconda
在开始 Jupyter 环境搭建之前,首先,我们需要准备一个 Python 的运行环境。这里,我们选择使用 Miniconda。Conda 是一个用于管理 Python 虚拟环境的工具,可以方便地安装、运行、更新 Python 以及 Python 的软件包。Miniconda 是 Conda 的一个简化版本。比起完整的 Anaconda,Miniconda 功能一致,但是预安装的包更少,因此占用空间更小。这些特点使 Miniconda 成为只需要基本的 Python 环境和工具的用户的一个很好的选择。
Miniconda 的安装包可以在这个页面找到。按照操作系统选择对应的安装包之后,双击运行开始安装。
点击下一步 Next。
这里需要同意协议,点击“I Agree”,来到下一步。
Miniconda 可以安装给自己或者所有用户。如果给所有用户安装,则需要管理员权限。根据自己的需要进行选择,之后点击下一步。
这里需要选择 Miniconda 安装目录。我们可以考虑安装到 C 盘以外的磁盘。选择完毕之后,点击下一步。
下面需要选择一些安装选项,其中,
- Create shortcuts:创建快捷方式;
- Add Miniconda3 to my PATH environment variable:将 Miniconda 添加到环境变量,官方给出的建议是不推荐(NOT recommended);
- Register Miniconda3 as my default Python 3.12:将 Miniconda3 注册为默认 Python 环境;
- Clear the package cache upon completion:安装完毕后清理安装包缓存。
根据自己的需要选择,然后点击安装 Install。
下面开始安装,可能需要一段时间,但不会太长。
安装完毕,点击下一步。
取消勾选 Welcome to Anaconda,结束安装。安装完毕之后,开始菜单中会出现 Miniconda 的菜单项。
其中,第一个 Anaconda Powershell Prompt 是在 PowerShell 中打开;第二个则是在 CMD 中打开。这里个人比较喜欢 PowerShell ,所以点击第一个。
这里我们看到,最前面有个(base)
,表示当前处于 base 环境。前面说过,Conda 用于管理 Python 虚拟环境。base 环境作为 Conda 自己所在环境,一般不会在 base 环境中安装其它包。所以,现在我们创建一个新的环境。创建环境的命令如下:
conda create -n llm
即创建一个新的虚拟环境,该环境名为llm
。创建完之后,使用
conda env list
获取已有环境列表,执行结果如下:
这里一共有两行:第一列是环境名字,第二列是该环境所在的目录。可以看到,现在我们有两个虚拟环境:base 和 llm;其中,base 位于 Miniconda 安装目录,llm 位于 Miniconda 安装目录下的 envs 文件夹。除了 base 环境,我们新建的所有环境,都会在这个目录中。目录列前面的*
表示当前所在环境。现在,我们当前所在环境是 base。接下来,我们要切换到新建的 llm 环境,使用命令
conda activate llm
即激活 llm 环境。再使用conda env list
查看一下:
可以看到,*
已经到了 llm 环境,而命令行的前面也变成了(llm)
,说明我们的环境已经成功切换到了 llm。
Conda 就是使用这种机制:为每个虚拟环境创建一个独立的文件夹,获得彼此独立的多个环境。由于每个环境位于不同目录,所以这些环境之间是没有任何影响的。这意味着,当在环境 A 中安装了某些包之后,环境 B 是没有的。由此通过冗余的磁盘空间换取独立的虚拟环境。
Conda 默认的服务器可能比较慢,我们可以修改为国内镜像服务器,以便加快下载速度。使用下面的命令创建配置文件:
conda config --add channels conda-forge
没有出错的话,会在用户目录下生成一个 .condarc 文件。Windows 平台是 C:\Users\<用户名> 目录,Linux/Unix/Mac 平台则是 ~ 目录。用文本编辑器打开 .condarc 文件,修改如下:
channels: - conda-forge - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
然后运行
conda clean -i
清空索引缓存即可。
值得注意的是,配置 conda 服务器镜像地址是全局的,并不与虚拟环境相关,即不需要为每一个环境单独设置。
安装 Jupyter
接下来,我们开始安装 Jupyter 笔记本应用。
conda install python jupyter notebook
等待 Conda 处理过依赖之后,需要直接按下回车或 y 键确认安装。
等待安装完毕之后,输入python
,进入 Python 交互环境,然后输入下面的命令。
python from jupyter_server.auth import passwd; passwd() # 该命令输入两遍密码后,会生成散列后的字符串,该字符串需要复制保存下来 quit() # 退出 python 环境
接着使用下面的命令
jupyter notebook --generate-config
用于生成 Jupyter 配置文件,位置会在命令返回中显示。
使用文本编辑器打开生成的配置文件,按照下面的说明进行修改。
# 允许任何来源的请求 # 如果在服务器运行,则需要配置,否则不需要 # c.ServerApp.allow_origin = '*' # 允许远程访问 # 如果在服务器运行,则需要配置,否则不需要 # c.ServerApp.allow_remote_access = True # jupyter notebook所在主机IP地址 # 如果在服务器运行,则需要配置,否则不需要 # c.ServerApp.ip = 'localhost' # 生成项目文件的保存路径,注意 Windows 平台下需要使用 / 作为路径分隔符 c.ServerApp.root_dir = 'E:/jupyter' # 本地浏览器打开(关闭) # 如果在服务器运行,则需要配置,否则不需要 # c.ServerApp.open_browser = False # 配置密码时生成的字符串写入进去 # 文件中 c.ServerApp.password 已经被废弃了,按照下面配置 # 配置过后,在打开 Jupyter 后需要输入密码,如果不需要配置密码,则不要修改该配置 c.PasswordIdentityProvider.hashed_password = 'hashed_password' # 服务器端本地IP访问端口设置(不是公网地址端口) # 如果在服务器运行,则需要配置,否则不需要 # c.ServerApp.port = 8888
该文件是一个 Python 文件,所以应该符合 Python 的语法,否则会报错。注意上面代码中的说明,有些配置是在服务器运行 Jupyter 时所需要的,本地运行并不需要。修改完毕保存之后,使用命令
jupyter notebook
启动 Jupyter。如果上面没有配置c.ServerApp.open_browser
为False
,则应该自动打开浏览器。当显示如下页面,表示安装成功。
Jupyter 的基本使用
现在,Jupyter 的页面是英文的,让我们修改为中文显示。回到之前的 Conda 环境,输入下面的命令
pip install jupyterlab-language-pack-zh-CN
重新运行 Jupyter,可以看到已经有中文选项了。
点击菜单项,会询问是否切换语言,确定之后,浏览器会自动刷新。此时,Jupyter 的界面就变成中文的了。
下面我们试着创建一篇笔记。点击“新建”按钮,可以看到,我们可以创建几种类型的笔记。首先我们选择使用 Python 3 (ipyternel) 内核,看看 Jyputer 能干什么。
点击选择内核之后,浏览器弹出新的 tab 页面。
整篇文档以块的形式组织。每个块都有自己的类型,这些类型可以在上面的下拉菜单中修改。右侧是使用的内核,可以看到我们选择的是 Python 3。内核意味着,这篇文档中的代码块都可以使用这个内核运行。这里就是 Python。下面我们试一下。
首先在第一个代码块输入
print("hello, world")
然后点击工具栏的“运行”按钮,或者使用快捷键 Shift + Enter,代码块下面会出现运行结果。这就是 Jupyter 的强大之处,它可以直接在笔记中运行 Python 代码,并且输出结果。可以把它理解为一个简单的 Python 代码编辑器,但它更适合学习。接下来,在新出现的第二个代码块中输入一段 Markdown:
# hello
别忘了把代码块类型改为 Markdown,然后运行这个代码块。
这段 Markdown 经过运行之后,渲染成 HTML 显示出来。双击生成结果,或者选中之后点击回车,即可继续编辑。
下面我们看另外的两个命令。
%dir
!dir
dir
是 Windows PowerShell 的命令,类似于 Linux 平台的 ls
,用于输出当前目录中的所有文件。第一个命令%dir
报错:%dir
没有找到。这是因为,所有以%
开头的命令,都是 Jupyter 的魔法命令(magic commands)。魔法命令就是 Jupyter 能够执行的一系列特殊命令,并不一定是 shell 命令。Jupyter 提供了大量魔法命令,可以使用%lsmagic
查看全部魔法命令。第二个命令!dir
,则是将!
后面的命令,直接发送给 Jupyter 所在 shell 去执行。了解了这一区别,才能理解,有时候在网上看到别人分享的 Jupyter 学习笔记,有的会使用%pip
,有的会使用!pip
,看起来是一样的,其实是因为 Jupyter 自己实现了%pip
命令。而且也能够理解为什么下面的输出会有不同:
这是因为 Jupyter 实现了%ls
魔法命令,而 Windows 下并没有ls
命令。
可以在这里查看 Jupyter 提供的所有魔法命令。
能够在 Jupyter 中使用 shell 命令是很重要的,这意味着我们有了安装 Python 依赖包的能力。下面将演示这一点。
matplotlib 是一个 Python 库,它可以进行 2D 绘图,功能强大。比如在代码块中使用下面的代码:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2 * np.pi, 200) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, y) plt.show()
但这段代码执行会报错:因为 Jupyter 运行环境中并没有安装 matplotlib,正如报错信息最后一行所示。我们知道,Python 包可以使用 pip
命令安装,那么,如果能够在环境中事先安装好 matplotlib,不就可以了?所以,我们在这段代码的上面添加上安装的命令,再来试一下。
这里需要注意的是,在执行耗时的任务时,Jupyter 的界面不会有明显的反馈,不能很好的分辨任务是否完成。这时我们可以通过右上角的圆点查看内核的状态:当圆点是黑色时,说明内核忙碌。安装完毕之后,再次运行上面的代码,即可看到运行结果。
注意到,Jupyter 的 Python 内核为 ipykernel。当我们有多个 Conda 虚拟环境时,有时会希望,Jupyter 直接使用 Conda 虚拟环境中的 Python。这样就能直接使用 Conda 中安装的包了。要达到这一目的,我们可以在 Conda 中安装 ipynernel:
conda install -c ipynernel
然后使用下面的命令:
python -m ipykernel install --user --name=llm --display-name="Python 3 (llm)"
其中,--name
是 Conda 虚拟环境的名字,--display-name
是 Jupyter 内核下拉菜单中显示的名字。
现在,我们已经使用 Conda 创建好 Python 虚拟环境,安装了交互式笔记应用 Jupyter,介绍了 Jupyter 的基本使用。下面,我们将真正开始 LangChain 的开发学习。