想实现 RAG⾸先就需要从源中获取数据即加载数据或⽂档。这是通过 LangChain 的⽂档加载器完成的1.Document类LangChain ⽂档加载器可以将各种数据源加载成⼀系列的⽂档对象Document定义了⼀个documents⽂档列表其内包含了两个Document⽂档对象。通常单个Document对象表⽰较⼤⽂档的⼀个块/⻚。每个Document对象包含了以下参数•id可选的⽂档标识符。理想情况下这应该在整个⽂档集合中是唯⼀的并格式化为UUID但不会强制执⾏。•page_content字符串⽂本•metadata与内容关联的任意元数据。类型为dict [Optional]from langchain_core.documents import Document documents [ # 单个Document对象通常表⽰较⼤⽂档的⼀个块 Document( # 内容字符串 page_content狗是很好的伴侣以忠诚和友好⽽闻名。, # 元数据字典 # 元数据属性可以捕获有关⽂档源、与其他⽂档的关系以及其他信息的信息。 metadata{source: mammal-pets-doc}, ), Document( page_content猫是独⽴的宠物经常享受⾃⼰的空间。, metadata{source: mammal-pets-doc}, ), ]2.PDF文档将本地的 PDF ⽂档加载到 LangChain 中其实就是将 PDF ⽂档转换为⼀个个Document对象。这时就需要我们使⽤ PyPDFLoader⽂档加载器完成这⼀功能class langchain_community.document_loaders.pdf.PyPDFLoader类有以下关键函数•init()初始化函数⼊参file_path表⽰要加载的 PDF ⽂件的路径。•load()→list[Document]将数据加载到⽂档对象中。返回⽂档对象列表。from langchain_community.document_loaders import PyPDFLoader file_path ../Docs/PDF/脚⼿架级微服务租房平台QA.pdf loader PyPDFLoader(file_path) # 将 PDF ⽂件的每⼀⻚转换为⼀个独⽴的 Document 对象并存储在列表 docs 中。 docs loader.load() print(f问PDF ⽂件的总⻚数为\n{len(docs)}\n) print(f问第⼀⻚⽂本内容的前200个字符是\n{docs[0].page_content[:200]}\n) print(f问第⼀⻚元数据\n{docs[0].metadata})现在许多 LLM ⽀持对多模态输⼊例如图像进⾏推理。在某些应⽤程序中例如对具有复杂布局、图表或扫描的 PDF 进⾏问答可以跳过 PDF 解析直接将 PDF ⻚⾯转换为图像并将其直接传递给模型可能是更准确的3.MarkDown将本地的Markdown⽂档加载到 LangChain 中需要我们使⽤UnstructuredMarkdownLoader⽂档加载器完成这⼀功能classlangchain_community.document_loaders.markdown.UnstructuredMarkdownLoader类有以下关键函数•init()初始化函数所需参数◦file_path表⽰要加载的Markdown⽂件的路径。◦mode加载⽂件时要使⽤的模式。可以是 single 或 elements。默认为 single。▪single⽂档将作为单个 Document 对象返回▪elements会将⽂档拆分为 Title 和 NarrativeText 等不同类型的元素。•load()→list[Document]将数据加载到⽂档对象中。返回⽂档对象列表。LangChain 实现的UnstructuredMarkdownLoader需要依赖 Unstructured 包。因此在使⽤前我们需要先安装它pip installunstructured[md]nltk我们使⽤single模式加载⼀个本地Markdownfrom langchain_community.document_loaders import UnstructuredMarkdownLoader from langchain_core.documents import Document markdown_path ../Docs/Markdown/脚⼿架级微服务租房平台QA.md # single 模式加载后默认只有⼀个 Document 对象 loader UnstructuredMarkdownLoader(markdown_path) data loader.load() assert len(data) 1 assert isinstance(data[0], Document) print(data[0].page_content[:200]) print(data[0].metadata)elements模式下加载本地Markdown⽂档的效果from langchain_community.document_loaders import UnstructuredMarkdownLoader from langchain_core.documents import Document markdown_path ../Docs/Markdown/脚⼿架级微服务租房平台QA.md # single 模式加载后默认只有⼀个 Document 对象 loader UnstructuredMarkdownLoader(markdown_path, modeelements) data loader.load() print(f问⽂档个数为\n{len(data)}\n) print(问前三个⽂档数据) for document in data[:3]: print(f{document}\n)Markdown文档类型print(set(document.metadata[category] for document in data))