一架梯子,一头程序猿,仰望星空!
LangChain教程(JS版本) > 内容正文

加载本地数据


文档加载器

提示:LangChain设计了一个Document Loader组件用于加载各种类型的本地数据

使用文档加载器从源中加载数据作为DocumentDocument是一段文本和相关的元数据。例如,有用于加载简单的.txt文件的文档加载器,用于加载任何网页的文本内容,甚至用于加载YouTube视频的转录稿。

文档加载器公开了一个”load”方法,用于从配置的源加载数据作为文档。它们还可以选择实现”lazy load”,以便将数据懒加载到内存中。

文本加载器

最简单的加载器将文件读入文本,并将其全部放入一个文档中。

import { TextLoader } from "langchain/document_loaders/fs/text";

const loader = new TextLoader("src/document_loaders/example_data/example.txt");
const docs = await loader.load();

创建文档

文档本质上很简单。它由一个文本片段和可选的元数据组成。文本片段是我们与语言模型交互的内容,而可选的元数据对于跟踪文档的元数据(如源信息)很有用。

interface Document {
  pageContent: string;
  metadata: Record;
}

在LangChain中很容易创建一个文档对象:

import { Document } from "langchain/document";

const doc = new Document({ pageContent: "foo" });

您还可以创建带有元数据的文档:

import { Document } from "langchain/document";

const doc = new Document({ pageContent: "foo", metadata: { source: "1" } });

CSV

每个文档一行的方式来加载CSV数据。

设置

npm install d3-dsv@2

使用,提取所有列

示例CSV文件:

id,text
1,This is a sentence.
2,This is another sentence.

示例代码:

import { CSVLoader } from "langchain/document_loaders/fs/csv";

const loader = new CSVLoader("src/document_loaders/example_data/example.csv");

const docs = await loader.load();
/*
[
  Document {
    "metadata": {
      "line": 1,
      "source": "src/document_loaders/example_data/example.csv",
    },
    "pageContent": "id: 1\n
text: This is a sentence.",
  },
  Document {
    "metadata": {
      "line": 2,
      "source": "src/document_loaders/example_data/example.csv",
    },
    "pageContent": "id: 2\n
text: This is another sentence.",
  },
]
*/

使用,提取单个列

示例CSV文件:

id,text
1,This is a sentence.
2,This is another sentence.

示例代码:

import { CSVLoader } from "langchain/document_loaders/fs/csv";

const loader = new CSVLoader(
  "src/document_loaders/example_data/example.csv",
  "text"
);

const docs = await loader.load();
/*
[
  Document {
    "metadata": {
      "line": 1,
      "source": "src/document_loaders/example_data/example.csv",
    },
    "pageContent": "This is a sentence.",
  },
  Document {
    "metadata": {
      "line": 2,
      "source": "src/document_loaders/example_data/example.csv",
    },
    "pageContent": "This is another sentence.",
  },
]
*/

文件目录

这部分介绍了如何加载目录中的所有文件。

第二个参数是一个文件扩展名到加载器工厂的映射。每个文件都会传递给匹配的加载器,然后将生成的文档连接在一起。

示例文件夹:

src/document_loaders/example_data/example/
├── example.json
├── example.jsonl
├── example.txt
└── example.csv

示例代码:

import { DirectoryLoader } from "langchain/document_loaders/fs/directory";
import {
  JSONLoader,
  JSONLinesLoader,
} from "langchain/document_loaders/fs/json";
import { TextLoader } from "langchain/document_loaders/fs/text";
import { CSVLoader } from "langchain/document_loaders/fs/csv";

const loader = new DirectoryLoader(
  "src/document_loaders/example_data/example",
  {
    ".json": (path) => new JSONLoader(path, "/texts"),
    ".jsonl": (path) => new JSONLinesLoader(path, "/html"),
    ".txt": (path) => new TextLoader(path),
    ".csv": (path) => new CSVLoader(path, "text"),
  }
);
const docs = await loader.load();
console.log({ docs });

JSON

JSON加载器使用JSON pointer来指定您要提取的JSON文件中的键。

无JSON pointer示例​

最简单的使用方法是不指定JSON pointer。加载器将加载JSON对象中找到的所有字符串。

示例JSON文件:

{
  "texts": ["This is a sentence.", "This is another sentence."]
}

示例代码:

import { JSONLoader } from "langchain/document_loaders/fs/json";

const loader = new JSONLoader("src/document_loaders/example_data/example.json");

const docs = await loader.load();
/*
[
  Document {
    "metadata": {
      "blobType": "application/json",
      "line": 1,
      "source": "blob",
    },
    "pageContent": "This is a sentence.",
  },
  Document {
    "metadata": {
      "blobType": "application/json",
      "line": 2,
      "source": "blob",
    },
    "pageContent": "This is another sentence.",
  },
]
*/

使用JSON pointer示例​

您可以通过选择JSON对象中要提取字符串的键来进行更高级的使用。

在这个示例中,我们只想提取“from”和“surname”条目的信息。

{
  "1": {
    "body": "BD 2023 SUMMER",
    "from": "LinkedIn Job",
    "labels": ["IMPORTANT", "CATEGORY_UPDATES", "INBOX"]
  },
  "2": {
    "body": "Intern, Treasury and other roles are available",
    "from": "LinkedIn Job2",
    "labels": ["IMPORTANT"],
    "other": {
      "name": "plop",
      "surname": "bob"
    }
  }
}

示例代码:

import { JSONLoader } from "langchain/document_loaders/fs/json";

const loader = new JSONLoader(
  "src/document_loaders/example_data/example.json",
  ["/from", "/surname"]
);

const docs = await loader.load();
/*
[
  Document {
    "metadata": {
      "blobType": "application/json",
      "line": 1,
      "source": "blob",
    },
    "pageContent": "BD 2023 SUMMER",
  },
  Document {
    "metadata": {
      "blobType": "application/json",
      "line": 2,
      "source": "blob",
    },
    "pageContent": "LinkedIn Job",
  },
  ...
]

自定义文档加载器

如果您想实现自己的文档加载器,有几种选择。

继承 BaseDocumentLoader

您可以直接扩展BaseDocumentLoader类。BaseDocumentLoader类为从各种来源加载文档提供了一些方便的方法。

abstract class BaseDocumentLoader implements DocumentLoader {
  abstract load(): Promise;
}

子类化 TextLoader

如果您想从文本文件中加载文档,您可以扩展TextLoader类。TextLoader类负责读取文件,所以您只需实现一个解析方法。

abstract class TextLoader extends BaseDocumentLoader {
  abstract parse(raw: string): Promise;
}

子类化 BufferLoader

如果您想从二进制文件中加载文档,您可以扩展BufferLoader类。BufferLoader类负责读取文件,所以您只需实现一个解析方法。

abstract class BufferLoader extends BaseDocumentLoader {
  abstract parse(
    raw: Buffer,
    metadata: Document["metadata"]
  ): Promise;
}


关联主题