使用 JavaScript 与 Ollama 配合使用 LangChain
在这个教程中,我们将使用 JavaScript 与 LangChain 和 Ollama 一起学习一些稍新的内容。在 2023 年 8 月,毛伊岛发生了一系列野火。在此之前训练的 LLM(大型语言模型)无法了解这件事,因为它们的训练数据不会包含如此近期的信息。因此,我们可以找到关于这场火灾的维基百科文章 (https://en.wikipedia.org//wiki/2023_Hawaii_wildfires),并就其内容提问。
首先,我们使用 LangChain 向模型提问一个简单的问题。在 JavaScript 中实现这个功能,我们需要先安装 LangChain:
npm install @langchain/community现在我们可以开始构建我们的 JavaScript 了:
import {Ollama} from "@langchain/community/llms/ollama";
const ollama = new Ollama({
baseUrl: "http://localhost:11434",
model: "llama3",
});
const answer = await ollama.invoke(`why is the sky blue?`);
console.log(answer);这将得到与在终端中运行 ollama run llama3 "why is the sky blue" 相同的结果。但是我们想要从网页中加载文档来提问。 Cheerio 是一个很棒的库,用于摄入网页,而 LangChain 在其 CheerioWebBaseLoader 中使用了它。所以让我们安装 Cheerio 并构建应用程序的这一部分。
npm install cheerioimport {CheerioWebBaseLoader} from "langchain/document_loaders/web/cheerio";
const loader = new CheerioWebBaseLoader("https://en.wikipedia.org/wiki/2023_Hawaii_wildfires");
const data = await loader.load();这将加载文档。尽管此页面比《奥德赛》小,但它肯定比大多数 LLM 的上下文大小要大。因此,我们将需要将其拆分为更小的部分,然后仅选择与我们的问题相关的内容。这是使用向量数据存储的一个很好的示例。在此示例中,我们将使用属于 LangChain 的一部分的 MemoryVectorStore。但是,我们还需要采取一步将内容放入数据存储中。我们必须运行一个嵌入过程,该过程将文本中的标记转换为一系列向量。为此,我们将使用 TensorFlow。这有很多事情在进行。首先,安装我们需要的 Tensorflow 组件。
npm install @tensorflow/[email protected] @tensorflow/[email protected] @tensorflow-models/[email protected] @tensorflow/[email protected]如果你只是安装那些组件而不带版本号,它会安装最新版本,但是 Tensorflow 内部存在冲突,所以你需要安装兼容的版本。
import {RecursiveCharacterTextSplitter} from "langchain/text_splitter"
import {MemoryVectorStore} from "langchain/vectorstores/memory";
import "@tensorflow/tfjs-node";
import {TensorFlowEmbeddings} from "langchain/embeddings/tensorflow";
// Split the text into 500 character chunks. And overlap each chunk by 20 characters
const textSplitter = new RecursiveCharacterTextSplitter({
chunkSize: 500,
chunkOverlap: 20
});
const splitDocs = await textSplitter.splitDocuments(data);
// Then use the TensorFlow Embedding to store these chunks in the datastore
const vectorStore = await MemoryVectorStore.fromDocuments(splitDocs, new TensorFlowEmbeddings());要将数据存储与对 LLM(大型语言模型)提出的问题相连接,我们需要使用 LangChain 的核心概念:链。链是一种将多个活动连接在一起以完成特定任务的方式。有许多类型的链可供选择,但在这个教程中,我们将使用 RetrievalQAChain。
import {RetrievalQAChain} from "langchain/chains";
const retriever = vectorStore.asRetriever();
const chain = RetrievalQAChain.fromLLM(ollama, retriever);
const result = await chain.call({query: "When was Hawaii's request for a major disaster declaration approved?"});
console.log(result.text)所以我们创建了一个检索器,它是一种从数据存储中返回与查询匹配的块的方法。然后通过一个链将检索器和模型连接起来。最后,我们向该链发送查询,结果使用我们的文档作为来源得出答案。它返回的答案是正确的,2023 年 8 月 10 日。
这是一个关于你可以使用 LangChain 和 Ollama 进行操作的简单介绍。
