在实际业务场景中,我们经常需要从各种数据源加载数据。LangChain 提供了一套强大的文档加载器模块,帮助开发者轻松地将数据源中的内容加载为文档对象。本文将详细介绍 LangChain 的 Document Loaders 核心模块,并结合实际业务场景和代码示例,展示如何高效地加载和处理文档数据。
一、Document 类详解
Document 类是 LangChain 的核心组件之一,定义了一个文档对象的结构,包括文本内容和相关的元数据。该类允许用户与文档内容进行交互,如查看文档段落、摘要,以及使用查找功能来查询特定字符串。以下是 Document 类源码:
# 基于BaseModel定义的文档类。``class Document(BaseModel):` `"""接口,用于与文档进行交互。"""`` ` `# 文档的主要内容。` `page_content: str` `# 用于查找的字符串。` `lookup_str: str = ""` `# 查找的索引,初次默认为0。` `lookup_index = 0` `# 用于存储任何与文档相关的元数据。` `metadata: dict = Field(default_factory=dict)`` ` `@property` `def paragraphs(self) -> List[str]:` `"""页面的段落列表。"""` `# 使用"\n\n"将内容分割为多个段落。` `return self.page_content.split("\n\n")`` ` `@property` `def summary(self) -> str:` `"""页面的摘要(即第一段)。"""` `# 返回第一个段落作为摘要。` `return self.paragraphs[0]`` ` `# 这个方法模仿命令行中的查找功能。` `def lookup(self, string: str) -> str:` `"""在页面中查找一个词,模仿cmd-F功能。"""` `# 如果输入的字符串与当前的查找字符串不同,则重置查找字符串和索引。` `if string.lower() != self.lookup_str:` `self.lookup_str = string.lower()` `self.lookup_index = 0` `else:` `# 如果输入的字符串与当前的查找字符串相同,则查找索引加1。` `self.lookup_index += 1` `# 找出所有包含查找字符串的段落。` `lookups = [p for p in self.paragraphs if self.lookup_str in p.lower()]` `# 根据查找结果返回相应的信息。` `if len(lookups) == 0:` `return "No Results"` `elif self.lookup_index >= len(lookups):` `return "No More Results"` `else:` `result_prefix = f"(Result {self.lookup_index + 1}/{len(lookups)})"` `return f"{result_prefix} {lookups[self.lookup_index]}"
二、BaseLoader 类详解
BaseLoader 类定义了如何从不同的数据源加载文档,并提供了一个可选的方法来分割加载的文档。开发者可以基于该类为特定数据源创建自定义加载器。以下是 BaseLoader 类的定义:
# 基础加载器类。``class BaseLoader(ABC):` `"""基础加载器类定义。"""`` ` `# 抽象方法,所有子类必须实现此方法。` `@abstractmethod` `def load(self) -> List[Document]:` `"""加载数据并将其转换为文档对象。"""`` ` `# 该方法可以加载文档,并将其分割为更小的块。` `def load_and_split(` `self, text_splitter: Optional[TextSplitter] = None` `) -> List[Document]:` `"""加载文档并分割成块。"""` `# 如果没有提供特定的文本分割器,使用默认的字符文本分割器。` `if text_splitter is None:` `_text_splitter: TextSplitter = RecursiveCharacterTextSplitter()` `else:` `_text_splitter = text_splitter` `# 先加载文档。` `docs = self.load()` `# 然后使用_text_splitter来分割每一个文档。` `return _text_splitter.split_documents(docs)
三、使用 TextLoader 加载 Txt 文件
TextLoader 是用于加载简单 .txt 文件的加载器。以下是一个加载 .txt 文件的示例:
class TextLoader(BaseLoader):` `def __init__(self, filepath):` `self.filepath = filepath`` ` `def load(self):` `with open(self.filepath, 'r', encoding='utf-8') as file:` `text = file.read()` `return [Document(text)]`` ``# 示例使用``text_loader = TextLoader('example.txt')``documents = text_loader.load()``print(documents[0].summary()) # 输出文件的前100个字符...``
四、使用 ArxivLoader 加载 ArXiv 论文
ArxivLoader 类专门用于从 ArXiv 平台获取文档。用户提供一个搜索查询,加载器与 ArXiv API 交互,检索相关文档列表并返回 Document 对象。以下是一个示例:
class ArxivLoader(BaseLoader):` `def __init__(self, query):` `self.query = query`` ` `def load(self):` `# 模拟与 ArXiv API 的交互` `results = self.query_arxiv(self.query)` `return [Document(result['summary'], result) for result in results]`` ` `def query_arxiv(self, query):` `# 伪代码,实际需要调用 ArXiv API` `return [` `{'summary': '论文1摘要...', 'title': '论文1标题', 'authors': '作者1'},` `{'summary': '论文2摘要...', 'title': '论文2标题', 'authors': '作者2'}` `]`` ``# 示例使用``arxiv_loader = ArxivLoader('deep learning')``documents = arxiv_loader.load()``for doc in documents:` `print(doc.summary())``
五、使用 UnstructuredURLLoader 加载网页内容
UnstructuredURLLoader 使用非结构化分区函数(Unstructured)来检测 MIME 类型并将文件路由到适当的分区器。它支持两种模式:“single” 和 “elements”。以下是一个加载网页内容的示例:
from unstructured.partition.auto import partition`` ``class UnstructuredURLLoader(BaseLoader):` `def __init__(self, urls, mode='single', continue_on_failure=True, **kwargs):` `self.urls = urls` `self.mode = mode` `self.continue_on_failure = continue_on_failure` `self.kwargs = kwargs`` ` `def load(self):` `documents = []` `for url in self.urls:` `try:` `partitioned_text = partition(url, **self.kwargs)` `if self.mode == 'single':` `documents.append(Document(partitioned_text))` `elif self.mode == 'elements':` `for element in partitioned_text:` `documents.append(Document(element))` `except Exception as e:` `if not self.continue_on_failure:` `raise e` `print(f"Failed to load {url}: {e}")` `return documents`` ``# 示例使用``urls = ['https://react-lm.github.io/']``url_loader = UnstructuredURLLoader(urls, mode='elements')``documents = url_loader.load()``for doc in documents:` `print(doc.summary())``
六、实际业务场景应用
在实际业务中,Document Loaders 模块可以用于多种场景。例如:
-
财务报表处理:通过 TextLoader 加载公司财务报表的文本文件,进行数据分析和摘要生成。
-
科研论文检索:使用 ArxivLoader 从 ArXiv 平台加载与公司研究相关的最新论文,进行技术跟踪。
-
竞争对手分析:通过 UnstructuredURLLoader 加载竞争对手网站的内容,提取关键信息以进行市场分析。
七、结论
LangChain 的 Document Loaders 模块为从不同数据源加载文档提供了灵活且强大的解决方案。通过了解和使用 Document 类、BaseLoader 类以及各种具体加载器,开发者可以轻松地将各种数据源中的信息整合到自己的项目中,从而提升数据处理和分析的效率。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。