资讯动态

RAG 入门-LangChain 读取文本

发布时间:2026/8/4 13:41:21 来源:尧图企业网站定制
前言前面学习了 RAG 的概念和 LCEL 的语法现在来继续学习 LangChain 读取文本数据的使用方法。在构建 RAG 系统时数据加载是第一步也是非常关键的一步。LangChain 提供了丰富的 Document Loaders可以轻松处理各种格式的数据源。本文将介绍如何使用 LangChain 读取TXT 文本文件读取目录批量文件JSON 结构化数据网页数据Markdown 文档带层级结构的复杂文档环境准备1. 安装依赖包# 基础依赖 pip install langchain langchain-community # JSON 解析依赖 pip install jq # Markdown 和复杂文档解析 pip install unstructured[md] # 网页加载依赖 pip install beautifulsoup4 lxml # 一键安装所有依赖 pip install langchain langchain-community jq unstructured[md] beautifulsoup4 lxml读取 TXT 文本最基础的文本加载方式适用于纯文本文件。文件名01读取txt文本.pyfrom langchain_community.document_loaders import TextLoader # 加载单个 TXT 文件 loader TextLoader(./设定.txt, encodingutf-8) docs loader.load() print(docs) # 打印结果 [Document( metadata{source: ./设定.txt}, page_content《黑神话悟空》的故事可分为六个章节... )] # 也可以加载 JSON 文件作为纯文本 json_loader TextLoader(../99-doc-data/灭神纪/人物角色.json, encodingutf-8) json_docs json_loader.load() print(json_docs)需要注意的是在处理中文的时候加上encodingutf-8。返回的是Document对象列表包含page_content内容和metadata元数据TextLoader会将整个文件作为一个 Document 返回读取目录文件批量加载目录下的多个文件支持文件过滤和多线程加载。文件名02读取目录.pyfrom langchain_community.document_loaders import DirectoryLoader, TextLoader # 加载目录下的所有文件 directory_loader DirectoryLoader( , # 当前目录 # glob**/*.txt, # 只加载 .txt 文件可选 # loader_clsTextLoader, # 指定加载器类型可选 loader_kwargs{encoding: utf-8}, # 传递给加载器的参数 use_multithreadingTrue, # 多线程加载提升速度 show_progressTrue, # 显示进度条 silent_errorsTrue, # 跳过无法加载的文件 ) documents directory_loader.load() print(f加载了 {len(documents)} 个文档) print(documents)参数说明参数说明示例glob文件匹配模式**/*.txt只加载 txt 文件loader_cls指定加载器类TextLoader用于文本文件loader_kwargs加载器参数{encoding: utf-8}use_multithreading是否多线程True提升加载速度show_progress显示进度条True方便查看进度silent_errors忽略错误True跳过无法加载的文件注意事项没有指定glob时会尝试加载所有文件类型没有指定loader_cls时会使用UnstructuredFileLoader自动识别文件类型对于 Markdown 文件需要安装unstructured[md]依赖读取 JSON 数据使用jq语法提取和转换 JSON 数据非常灵活。文件名03读取json.pyfrom langchain_community.document_loaders import JSONLoader # 需要先安装pip install jq loader JSONLoader( file_path../99-doc-data/灭神纪/人物角色.json, jq_schema.mainCharacter, # 提取 mainCharacter 字段 # jq_schema.mainCharacter | 姓名 .name 背景 .backstory, # 格式化输出 text_contentFalse # False 返回 JSON 对象True 返回纯文本 ) docs loader.load() print(docs)参数详解1.jq_schema使用 jq 语法提取和转换数据假设 JSON 文件内容{ mainCharacter: { name: 孙悟空, backstory: 花果山美猴王 } }不同的jq_schema效果# 提取整个对象 jq_schema.mainCharacter # 结果{name: 孙悟空, backstory: 花果山美猴王} # 格式化输出 jq_schema.mainCharacter | 姓名 .name 背景 .backstory # 结果姓名孙悟空背景花果山美猴王2.text_content控制输出格式# text_contentTrue纯文本 Document(page_content姓名孙悟空背景花果山美猴王) # text_contentFalseJSON 字符串 Document(page_content{name: 孙悟空, backstory: 花果山美猴王})读取网页数据直接从 URL 加载网页内容适合爬取在线文档。文件名04读取网页数据.pyfrom langchain_community.document_loaders import WebBaseLoader loader WebBaseLoader(web_pathhttps://www.baidu.com) docs loader.load() print(docs)使用场景加载在线文档和教程爬取新闻和博客文章获取实时更新的内容注意事项需要网络连接某些网站可能需要设置 User-Agent建议添加错误处理和重试机制读取 Markdown 文件Markdown 是技术文档的常用格式LangChain 提供了专门的加载器。文件名05读取markdown.pyfrom langchain_community.document_loaders import UnstructuredMarkdownLoader loader UnstructuredMarkdownLoader( 002LangChain读取文本.md, modeelements # 拆分成多个元素 ) docs loader.load() print(f加载了 {len(docs)} 个元素) for doc in docs: print(f类型: {doc.metadata.get(category, Unknown)}) print(f内容: {doc.page_content[:100]}...) print(- * 50)mode参数说明# modesingle默认整个文件作为一个 Document [Document(page_content# 标题\n\n内容...)] # modeelements按元素拆分标题、段落、列表等 [ Document(page_content标题, metadata{category: Title}), Document(page_content段落内容, metadata{category: NarrativeText}), Document(page_content列表项, metadata{category: ListItem}) ]整理父子元素结构处理复杂文档时保持元素的层级关系非常重要。有些时候上下文练习比较紧密缺失上下文就无法回答问题。文件名06-Unstrutured-整理父子元素.pyfrom langchain_unstructured import UnstructuredLoader from typing import List from langchain_core.documents import Document # 维基百科页面需要魔法 page_url https://zh.wikipedia.org/wiki/%E9%BB%91%E7%A5%9E%E8%AF%9D%EF%BC%9A%E6%82%9F%E7%A9%BA def _get_setup_docs_from_url(url: str) - List[Document]: loader UnstructuredLoader( web_urlurl, headers{ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 } ) setup_docs [] parent_id None current_parent None for doc in loader.load(): # 标题和表格作为父元素 if doc.metadata[category] in [Title, Table]: parent_id doc.metadata[element_id] current_parent doc setup_docs.append(doc) # 子元素关联到父元素 elif doc.metadata.get(parent_id) parent_id: setup_docs.append((current_parent, doc)) return setup_docs # 加载并打印结构 docs _get_setup_docs_from_url(page_url) for item in docs: if isinstance(item, tuple): parent, child item print(f父元素 - {parent.metadata[category]}: {parent.page_content}) print(f子元素 - {child.metadata[category]}: {child.page_content}) else: print(f{item.metadata[category]}: {item.page_content}) print(- * 80)核心思路识别父元素Title、Table 等通过parent_id关联子元素保持文档的层级结构便于后续处理应用场景

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价