【手摸手学RAG】03数据准备——从加载到分块,构建高效知识库

举报
胡琦 发表于 2025/09/19 23:26:33 2025/09/19
【摘要】 在RAG中外部知识库是关键要素之一,本文将从最基础的数据加载和文本分块开始,和大家学习交流如何构建一个高效的知识库。

最近,检索增强生成(RAG)技术的热度相信大家都有目共睹,几乎每周会有新的相关论文。RAG 通过结合外部知识库,让大模型能够回答更加精准、实时的问题。正所谓“万丈高楼平地起”,一个高质量的知识库是RAG应用成功的基石。那么,如何为我们的RAG应用准备好“弹药”呢?

在RAG中外部知识库是关键要素之一,本文将从最基础的数据加载和文本分块开始,和大家学习交流如何构建一个高效的知识库。

image.png


第一步:数据加载(Data Loading)——万事开头难,但我们可以很简单

在RAG的世界里,数据加载是我们将外部知识“喂”给模型的第一步。这些知识可以来自各种地方,比如PDF文档、网页、数据库,甚至是Notion笔记。幸运的是,现在已经有很多强大的工具可以帮助我们轻松搞定这一步。

  1. 认识数据加载器(Data Loaders)

    我们可以把数据加载器想象成一个“搬运工”,它的任务就是从指定的数据源(比如一个文件夹、一个URL)中读取数据,并将其转换成RAG流程可以理解的格式。

    在LlamaIndex和LangChain这两个主流的RAG框架中,都内置了丰富的数据加载器。以LlamaIndex为例,我们可以使用SimpleDirectoryReader来加载一个本地文件夹中的所有文档。

  2. 实战演练:加载本地Markdown文件

    假设我们有一个存放着项目文档的文件夹data,里面都是.md格式的文件。现在,我们想把这些文档加载进来,作为我们RAG应用的知识库。

    from llama_index.core import SimpleDirectoryReader
    
    # 指定要加载的文件夹路径
    reader = SimpleDirectoryReader(input_dir="./data")
    
    # 加载数据
    documents = reader.load_data()
    
    # 打印加载的第一个文档
    print(documents[0].text)
    

    image.png

    看,是不是很简单?只需要短短几行代码,我们就完成了本地文件的加载。SimpleDirectoryReader会自动遍历文件夹下的所有文件,并把它们读取成Document对象。

    除了本地文件,LlamaIndex还支持加载PDF、网页、数据库等多种数据源,大家可以根据自己的需求选择合适的加载器。


第二步:文本分块(Text Chunking)——庖丁解牛,让文本更易“消化”

加载完数据后,我们通常不会直接把整个文档都扔给模型。因为文档可能很长,不仅会超出模型的上下文窗口限制,还会影响检索的精度。所以,我们需要对加载进来的长文本进行“分块”,也就是把它们切分成一个个更小的、更易于处理的“知识块”(Chunks)。

  1. 为什么需要文本分块?

    • 提升检索精度: 更小的文本块意味着更聚焦的语义。当用户提问时,我们更容易找到与问题最相关的那个“知识块”。

    • 适应模型上下文: 每个大模型都有自己的上下文长度限制。通过分块,我们可以确保喂给模型的“知识”不会超出这个限制。

    • 优化处理效率: 处理短文本比处理长文本要快得多,这对于提升RAG应用的响应速度至关重要。

  2. 实战演练:使用SentenceSplitter进行分块

    LlamaIndex提供了多种文本分块器,其中最常用的是SentenceSplitter。它可以根据句子、段落等语义边界来切分文本,比简单的按固定长度切分要更加智能。

    from llama_index.core.node_parser import SentenceSplitter
    
    # 初始化分块器,设置块大小和重叠大小
    parser = SentenceSplitter(chunk_size=1024, chunk_overlap=20)
    
    # 对加载的文档进行分块
    nodes = parser.get_nodes_from_documents(documents)
    
    # 打印第一个分块的内容
    print(nodes[0].get_content())
    

    image.png

    在这里,chunk_size定义了每个分块的目标大小,而chunk_overlap则指定了相邻分块之间的重叠部分。设置一定的重叠可以帮助我们保留块与块之间的语义连续性,避免信息在切分处丢失。


尾声

今天,我们一起学习了RAG数据准备流程中的两个关键步骤:数据加载和文本分块。通过SimpleDirectoryReaderSentenceSplitter这两个简单而强大的工具,我们已经可以搭建起一个基本的数据处理流水线了。

当然,RAG的世界远不止于此。在接下来的学习中,我们还会接触到更高级的分块策略、元数据提取、索引构建等更有趣的内容。希望大家能继续保持学习的热情,和我一起探索RAG的奥秘!

如果你在学习过程中遇到了任何问题,欢迎在评论区留言交流。我们下次再见!

本文基于[datawhalechina/all-in-rag]项目整理,仅代表个人学习心得,不代表任何官方观点。小伙伴们有疑问欢迎交流讨论,一起学习一起进步!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。