使用 JavaScript 将 LangChain 与 Ollama 结合使用¶
在本教程中,我们将使用 JavaScript 结合 LangChain 和 Ollama 来学习一些较新的内容。2023年8月,毛伊岛发生了一系列野火。在那之前训练的语言模型(LLM)无法了解这一事件,因为它们的训练数据不会包含那么近期的信息。因此,我们可以找到关于这些火灾的维基百科文章并就内容提问。
首先,让我们仅使用 LangChain 向模型提一个简单的问题。要用 JavaScript 做到这一点,我们需要安装 LangChain:
现在我们可以开始构建我们的JavaScript了:
import { Ollama } from "langchain/llms/ollama";
const ollama = new Ollama({
baseUrl: "http://localhost:11434",
model: "llama2",
});
const answer = await ollama.invoke(`why is the sky blue?`);
console.log(answer);
这将帮助我们获得与在终端运行 ollama run llama2 "为什么天空是蓝色的"
相同的结果。但我们想从网络加载一个文档来针对性地提问。Cheerio 是一个非常适合摄取网页的库,LangChain 在其 CheerioWebBaseLoader 中使用了它。所以,让我们安装 Cheerio
import { 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/tfjs-core@3.6.0 @tensorflow/tfjs-converter@3.6.0 @tensorflow-models/universal-sentence-encoder@1.3.3 @tensorflow/tfjs-node@4.10.0
如果你只安装这些组件而不指定版本号,它将安装最新版本,但 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 可以做的事情的简单介绍。