Llama CPP
仅适用于 Node.js。
此模块基于node-llama-cpp(用于llama.cpp 的 Node.js 绑定),允许您与本地运行的 LLM 交互。这使您可以使用可以在笔记本电脑环境中运行的更小的量化模型,非常适合在不产生账单的情况下进行测试和草拟想法!
设置
您需要安装node-llama-cpp 模块才能与您的本地模型进行通信。
- npm
- Yarn
- pnpm
npm install -S node-llama-cpp
yarn add node-llama-cpp
pnpm add node-llama-cpp
- npm
- Yarn
- pnpm
npm install @langchain/community
yarn add @langchain/community
pnpm add @langchain/community
您还需要一个本地 Llama 2 模型(或node-llama-cpp 支持的模型)。您需要将此模型的路径作为参数的一部分传递给 LlamaCpp 模块(请参见示例)。
开箱即用的 node-llama-cpp
针对在具有 Apple M 系列处理器的 Metal GPU 的 MacOS 平台上运行进行了调整。如果您需要关闭它或需要对 CUDA 架构的支持,请参考node-llama-cpp 上的文档。
注意 LangChain.js 贡献者:如果您想运行与该模块相关的测试,您需要将您本地模型的路径放在环境变量 LLAMA_PATH
中。
安装 Llama2 的指南
在您的机器上运行本地 Llama2 模型是先决条件,因此这是一个快速指南,用于获取和构建 Llama 7B(最小的)并将其量化,以便它可以舒适地在笔记本电脑上运行。为此,您需要在您的机器上使用 python3
(建议使用 3.11),还有 gcc
和 make
,以便可以构建 llama.cpp
。
获取 Llama2 模型
要获取 Llama2 的副本,您需要访问Meta AI 并请求访问他们的模型。Meta AI 授予您访问权限后,您将收到一封包含访问文件的唯一 URL 的电子邮件,这在接下来的步骤中将需要。现在创建一个工作目录,例如
mkdir llama2
cd llama2
现在我们需要将 Meta AI 的 llama
仓库放在适当的位置,以便我们可以下载模型。
git clone https://github.com/facebookresearch/llama.git
一旦我们有了这个,我们就可以进入这个目录并运行下载器脚本以获取我们将使用的模型。注意:从这里开始,假设使用的模型是 llama-2–7b
,如果您选择其他模型,请不要忘记相应地更改对模型的引用。
cd llama
/bin/bash ./download.sh
此脚本将询问您 Meta AI 发送给您的 URL(请参见上文),您还需要选择要下载的模型,在这种情况下,我们使用了 llama-2–7b
。一旦此步骤成功完成(这可能需要一些时间,llama-2–7b
模型大约为 13.5Gb),应该有一个新的 llama-2–7b
目录,其中包含模型和其他文件。
转换和量化模型
在此步骤中,我们需要使用 llama.cpp
,因此我们需要下载该仓库。
cd ..
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
现在我们需要构建 llama.cpp
工具并设置我们的 python
环境。在这些步骤中,假设您的 python 安装可以使用 python3
运行,并且虚拟环境可以称为 llama2
,请根据您的情况进行调整。
make
python3 -m venv llama2
source llama2/bin/activate
激活您的 llama2 环境后,您应该看到 (llama2)
在您的命令提示符前缀,让您知道这是活动环境。注意:如果您需要返回来构建另一个模型或重新量化模型,请不要忘记再次激活环境。此外,如果您更新了 llama.cpp
,您将需要重新构建工具并可能安装新的或更新的依赖项!现在我们有一个活动的 python 环境,我们需要安装 python 依赖项。
python3 -m pip install -r requirements.txt
完成此操作后,我们可以开始转换和量化 Llama2 模型,以便通过 llama.cpp
在本地使用。首先,我们需要转换模型,在转换之前,让我们创建一个目录来存储它。
mkdir models/7B
python3 convert.py --outfile models/7B/gguf-llama2-f16.bin --outtype f16 ../../llama2/llama/llama-2-7b --vocab-dir ../../llama2/llama/llama-2-7b
这应该在刚刚创建的目录中创建一个名为 gguf-llama2-f16.bin
的转换后的模型。请注意,这只是一个转换后的模型,因此它的大小也约为 13.5Gb,在接下来的步骤中,我们将将其量化到大约 4Gb。
./quantize ./models/7B/gguf-llama2-f16.bin ./models/7B/gguf-llama2-q4_0.bin q4_0
运行此操作应导致在 models\7B
目录中创建一个新模型,该模型称为 gguf-llama2-q4_0.bin
,这是我们可以与 langchain 一起使用的模型。您可以通过使用 llama.cpp
工具测试它来验证此模型是否有效。
./main -m ./models/7B/gguf-llama2-q4_0.bin -n 1024 --repeat_penalty 1.0 --color -i -r "User:" -f ./prompts/chat-with-bob.txt
运行此命令将启动用于聊天会话的模型。 顺便说一句,如果您磁盘空间不足,则此小型模型是我们唯一需要的模型,因此您可以备份和/或删除原始的 13.5 Gb 模型。
用法
import { LlamaCpp } from "@langchain/community/llms/llama_cpp";
const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";
const question = "Where do Llamas come from?";
const model = new LlamaCpp({ modelPath: llamaPath });
console.log(`You: ${question}`);
const response = await model.invoke(question);
console.log(`AI : ${response}`);
API 参考
- LlamaCpp 来自
@langchain/community/llms/llama_cpp
流式传输
import { LlamaCpp } from "@langchain/community/llms/llama_cpp";
const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";
const model = new LlamaCpp({ modelPath: llamaPath, temperature: 0.7 });
const prompt = "Tell me a short story about a happy Llama.";
const stream = await model.stream(prompt);
for await (const chunk of stream) {
console.log(chunk);
}
/*
Once
upon
a
time
,
in
the
rolling
hills
of
Peru
...
*/
API 参考
- LlamaCpp 来自
@langchain/community/llms/llama_cpp