跳至主要内容

Llama CPP

兼容性

仅在 Node.js 上可用。

此模块基于 node-llama-cpp 的 Node.js 绑定,用于 llama.cpp,允许您使用本地运行的 LLM。这使您可以使用能够在笔记本电脑环境中运行的更小的量化模型,非常适合在不产生账单的情况下测试和快速构建想法!

设置

您需要安装 node-llama-cpp 模块才能与您的本地模型进行通信。

npm install -S node-llama-cpp @langchain/community @langchain/core

您还需要一个本地 Llama 2 模型(或 node-llama-cpp 支持的模型)。您需要将此模型的路径作为参数传递给 LlamaCpp 模块(请参阅示例)。

默认情况下,node-llama-cpp 针对在具有 Apple M 系列处理器的 Metal GPU 的 MacOS 平台上运行进行了优化。如果您需要关闭此功能或需要 CUDA 架构支持,请参阅 node-llama-cpp 的文档。

有关获取和准备 llama2 的建议,请参阅此模块的 LLM 版本的文档。

LangChain.js 贡献者注意:如果您想运行与该模块关联的测试,您需要将本地模型的路径放在环境变量 LLAMA_PATH 中。

用法

基本用法

在本例中,我们传入一个作为消息包装的提示,并期望一个响应。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";
import { HumanMessage } from "@langchain/core/messages";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const model = new ChatLlamaCpp({ modelPath: llamaPath });

const response = await model.invoke([
new HumanMessage({ content: "My name is John." }),
]);
console.log({ response });

/*
AIMessage {
lc_serializable: true,
lc_kwargs: {
content: 'Hello John.',
additional_kwargs: {}
},
lc_namespace: [ 'langchain', 'schema' ],
content: 'Hello John.',
name: undefined,
additional_kwargs: {}
}
*/

API 参考

系统消息

我们也可以提供系统消息,请注意,使用 llama_cpp 模块,系统消息会导致创建新会话。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";
import { SystemMessage, HumanMessage } from "@langchain/core/messages";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const model = new ChatLlamaCpp({ modelPath: llamaPath });

const response = await model.invoke([
new SystemMessage(
"You are a pirate, responses must be very verbose and in pirate dialect, add 'Arr, m'hearty!' to each sentence."
),
new HumanMessage("Tell me where Llamas come from?"),
]);
console.log({ response });

/*
AIMessage {
lc_serializable: true,
lc_kwargs: {
content: "Arr, m'hearty! Llamas come from the land of Peru.",
additional_kwargs: {}
},
lc_namespace: [ 'langchain', 'schema' ],
content: "Arr, m'hearty! Llamas come from the land of Peru.",
name: undefined,
additional_kwargs: {}
}
*/

API 参考

此模块也可以与链一起使用,请注意,使用更复杂的链将需要适合的 llama2 版本,例如 70B 版本。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";
import { LLMChain } from "langchain/chains";
import { PromptTemplate } from "@langchain/core/prompts";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const model = new ChatLlamaCpp({ modelPath: llamaPath, temperature: 0.5 });

const prompt = PromptTemplate.fromTemplate(
"What is a good name for a company that makes {product}?"
);
const chain = new LLMChain({ llm: model, prompt });

const response = await chain.invoke({ product: "colorful socks" });

console.log({ response });

/*
{
text: `I'm not sure what you mean by "colorful socks" but here are some ideas:\n` +
'\n' +
'- Sock-it to me!\n' +
'- Socks Away\n' +
'- Fancy Footwear'
}
*/

API 参考

流式传输

我们也可以使用 Llama CPP 进行流式传输,这可以使用原始的“单个提示”字符串。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const model = new ChatLlamaCpp({ modelPath: llamaPath, temperature: 0.7 });

const stream = await model.stream("Tell me a short story about a happy Llama.");

for await (const chunk of stream) {
console.log(chunk.content);
}

/*

Once
upon
a
time
,
in
a
green
and
sunny
field
...
*/

API 参考

  • ChatLlamaCpp 来自 @langchain/community/chat_models/llama_cpp

或者,您可以提供多条消息,请注意,这会获取输入,然后将 Llama2 格式的提示提交给模型。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";
import { SystemMessage, HumanMessage } from "@langchain/core/messages";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const llamaCpp = new ChatLlamaCpp({ modelPath: llamaPath, temperature: 0.7 });

const stream = await llamaCpp.stream([
new SystemMessage(
"You are a pirate, responses must be very verbose and in pirate dialect."
),
new HumanMessage("Tell me about Llamas?"),
]);

for await (const chunk of stream) {
console.log(chunk.content);
}

/*

Ar
rr
r
,
me
heart
y
!

Ye
be
ask
in
'
about
llam
as
,
e
h
?
...
*/

API 参考

使用 invoke 方法,我们也可以实现流生成,并使用 signal 中止生成。

import { ChatLlamaCpp } from "@langchain/community/chat_models/llama_cpp";
import { SystemMessage, HumanMessage } from "@langchain/core/messages";

const llamaPath = "/Replace/with/path/to/your/model/gguf-llama2-q4_0.bin";

const model = new ChatLlamaCpp({ modelPath: llamaPath, temperature: 0.7 });

const controller = new AbortController();

setTimeout(() => {
controller.abort();
console.log("Aborted");
}, 5000);

await model.invoke(
[
new SystemMessage(
"You are a pirate, responses must be very verbose and in pirate dialect."
),
new HumanMessage("Tell me about Llamas?"),
],
{
signal: controller.signal,
callbacks: [
{
handleLLMNewToken(token) {
console.log(token);
},
},
],
}
);
/*

Once
upon
a
time
,
in
a
green
and
sunny
field
...
Aborted

AbortError

*/

API 参考


此页面是否有帮助?


您也可以在 GitHub 上留下详细的反馈 在 GitHub 上.