RAG(Retrieval-Augmented Generation,检索增强生成)就是其中一种被广泛研究和应用的优化架构。

①RAG的优点:

相比提示词工程,RAG 有更丰富的上下文和数据样本,可以不需要用户提供过多的背景描述,就能生成比较符合用户预期的答案。
相比于模型微调,RAG 可以提升问答内容的时效性和可靠性。
在一定程度上保护了业务数据的隐私性。
②RAG的缺点:

由于每次问答都涉及外部系统数据检索,因此 RAG 的响应时延相对较高。
引用的外部知识数据会消耗大量的模型 Token 资源。

典型的RAG有两个主要流程:

索引:从数据源提取数据,构建索引。

检索生成:接受用户查询并从索引中检索相关数据,然后将其传递给模型。

①索引阶段:

从各种数据源加载数据➡️将文档切分为小块➡️对文本块进行嵌入➡️存储嵌入向量。

②检索生成阶段:

根据用户输入,使用检索器从存储中检索相关文本块➡️大模型使用包含问题和检索结果的提示生成回答。

文档加载

加载txt

# pip install langchain_community
from langchain_community.document_loaders import TextLoader

docs = TextLoader(
    file_path="assets/sample.txt",  # 文件路径
    encoding="utf-8",  # 文件编码方式
).load()  # 返回List[Document]

print(docs)
# [Document(metadata={'source': 'asset/sample.txt'}, page_content='...')]

加载csv

# pip install langchain_community
from langchain_community.document_loaders.csv_loader import CSVLoader

# 加载所有列
docs = CSVLoader(
    file_path="assets/sample.csv",  # 文件路径
).load()  # 返回List[Document]

print(docs)

# 加载部分列
docs = CSVLoader(
    file_path="assets/sample.csv",  # 文件路径
    metadata_columns=["title", "author"],  # 将指定列作为元数据
    content_columns=["content"],  # 将指定列作为内容
).load()  # 返回List[Document]

print(docs)

加载json

LangChain 实现了 JSONLoader,用来将 JSON 和 JSONL 数据转换为 LangChain 文档对象。它使用指定的 jq 模式来解析 JSON 文件,从而将特定字段提取到 LangChain 文档的内容和元数据中。
如果要从 JSON Lines 文件加载文档,需传递 json_lines=True。

# pip install langchain_community jq
from langchain_community.document_loaders import JSONLoader

# 提取所有字段
docs = JSONLoader(
    file_path="assets/sample.json",  # 文件路径
    jq_schema=".",  # 提取所有字段
    text_content=False,  # 提取内容是否为字符串格式
).load()

print(docs)




# 提取指定字段中的内容
docs = JSONLoader(
    file_path="assets/sample.json",  # 文件路径
    jq_schema=".data.items[]",  # 提取data.items中的数据
    text_content=False,  # 提取内容是否为字符串格式
).load()

print(docs)

docs = JSONLoader(
    file_path="assets/sample.json",  # 文件路径
    jq_schema=".data.items[].content",  # 提取data.items[].content中的数据
).load()

print(docs)

加载HTML网页

# pip install langchain_community beautifulsoup4
import bs4 #解析前端HTML页面
from langchain_community.document_loaders import WebBaseLoader

docs = WebBaseLoader(
    # 网址序列
    web_paths=("https://baike.baidu.com/item/%E5%BE%AE%E6%B3%A2%E7%82%89/84186",),
    # 传给 BeautifulSoup 的解析参数,parse_only 表示只提取指定标签的元素
    bs_kwargs={"parse_only": bs4.SoupStrainer(class_="J-lemma-content")},
).load()

print(docs)

加载Markdown

# pip install langchain_community unstructured[md]
from langchain_community.document_loaders import UnstructuredMarkdownLoader

docs = UnstructuredMarkdownLoader(
    # 文件路径
    file_path="assets/sample.md",
    # 加载模式:
    #   single 返回单个Document对象
    #   elements 按标题等元素切分文档
    mode="elements",
).load()

print(docs)

加载 Doc/Docx

# pip install langchain_community unstructured[docx]
from langchain_community.document_loaders import UnstructuredWordDocumentLoader

docs = UnstructuredWordDocumentLoader(
    # 文件路径
    file_path="assets/sample.docx",
    # 加载模式:
    #   single 返回单个Document对象
    #   elements 按标题等元素切分文档
    mode="single",
).load()

print(docs)

加载 PDF

对于复杂 PDF,需要进行文本提取、布局检测、表格解析、公式识别等处理。

1)PyPDFLoader

# pip install langchain_community
from langchain_community.document_loaders import PyPDFLoader

docs = PyPDFLoader(
    # 文件路径,支持本地文件和在线文件链接,如"https://arxiv.org/pdf/alg-geom/9202012"
    file_path="assets/sample.pdf",
    # 提取模式:
    #   plain 提取文本
    #   layout 按布局提取
    extraction_mode="plain",
).load()

print(docs)

2)UnstructuredPDFLoader

支持布局识别与 OCR 提取文字。
使用UnstructuredPDFLoader,需要先下载 Poppler 和 Tesseract OCR。

# pip install unstructured[local-inference]
from langchain_community.document_loaders import UnstructuredPDFLoader

docs = UnstructuredPDFLoader(
    file_path="assets/sample.pdf",  # 文件路径
    # 加载模式:
    #   single: 返回单个Document对象
    #   elements: 按标题等元素切分文档
    mode="elements",
    # 加载策略:
    #   fast: pdfminer 提取并处理文本
    #   ocr_only: 转换为图片并进行 OCR
    #   hi_res: 识别文档布局,将OCR 输出与 pdfminer 输出融合
    strategy="hi_res",
    # 推断表格结构:仅 hi_res 下起效,如果为 True 则会在表格元素的元数据中添加 text_as_html
    infer_table_structure=True,
    # OCR 使用的语言: eng 英文,chi_sim 中文简体。语言列表参考 https://github.com/tesseract-ocr/langdata
    languages=["eng", "chi_sim"],
    # 更多参数详见 https://github.com/Unstructured-IO/unstructured/blob/main/unstructured/partition/pdf.py
).load()

print(docs)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐