RAG 教程(二):RAG文本加载

RAG 技术教程:RAG文本加载

在 RAG(检索增强生成)系统中,文本加载是构建知识库的 “第一步”,也是整个流程的基础。它的核心作用是将分散在各种格式(如 TXT、PDF、CSV、HTML 等)中的原始文本数据 “接入” RAG 系统,为后续的检索和生成提供可处理的 “原材料”。没有文本加载,RAG 系统就无法获取外部知识,“检索增强” 也就无从谈起。

RAG的文本加载器

langchain提供了一些文本加载器,使用文档加载器可以从源加载数据转换为Document。

Document包含两个属性page_content(文本)和metadata=(元数据,即来源、标题等等)

导入依赖:

pip install pypdf==5.1.0
pip install unstructured==0.16.6 markdown==3.7
pip install jq==1.8.0 python-magic-bin==0.4.14

加载 TXT 文件

该代码用于加载 TXT 格式的文本文件。初始化加载器时指定目标 TXT 文件路径(如 “test.txt”)和编码格式(UTF-8),调用load()方法后可将文件内容加载为文档对象。

from langchain_community.document_loaders import TextLoader
txt_loader = TextLoader("test.txt", encoding="UTF-8")
txt_data = txt_loader.load()
print(txt_data)

加载 CSV 文件

此代码针对 CSV 格式文件进行加载处理。导入CSVLoader类后,通过file_path参数指定 CSV 文件路径(如 “test.csv”)并设置编码为 UTF-8 创建加载器实例。调用load()方法加载数据后,csv_data会包含 CSV 文件中的结构化数据,以文档对象形式呈现。打印结果可查看加载的表格数据内容,便于后续从结构化数据中提取知识片段。

from langchain_community.document_loaders import CSVLoader
csv_loader = CSVLoader(file_path="test.csv", encoding="UTF-8")
csv_data = csv_loader.load()
print(csv_data)

加载 PDF 文件

该代码实现 PDF 文件的加载与分割功能。使用PyPDFLoader类初始化加载器并指定 PDF 文件路径(如 “test.pdf”),调用load_and_split()方法可将 PDF 按页面分割为多个文档对象。pages变量存储分割后的每页内容,打印后能看到每页的文本内容及页码等元数据。这种按页分割的方式适合处理多页 PDF,为后续文档分片提供基础。

from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("test.pdf")
pages = loader.load_and_split()  # 按页面分割 PDF
print(pages)

加载 Markdown 文件

此代码用于加载 Markdown 格式文档。通过UnstructuredMarkdownLoader类创建加载器,指定 MD 文件路径(如 “test.md”)并设置mode="elements"模式,该模式会保留 Markdown 中的元素结构(如标题、列表等)。load()方法加载后的数据包含结构化的文档内容,打印结果可查看提取的文本及元素类型信息,便于保留原始文档的格式逻辑。

from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader(file_path="test.md", mode="elements")
data = loader.load()
print(data)

加载 JSON 文件

该代码针对 JSON 文件实现特定字段的加载。使用JSONLoader类时,需通过file_path指定 JSON 文件路径(如 “test.json”),并通过jq_schema=".skills"参数定义 JSON 数据的提取规则(此处提取 “skills” 字段下的内容)。加载后的数据聚焦于指定字段的内容,打印结果可查看提取的目标信息,适用于从 JSON 结构中精准获取所需知识。

from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(file_path="test.json", jq_schema=".skills")
data = loader.load()
print(data)

加载 HTML 文件

方法一:使用 UnstructuredHTMLLoader

通过UnstructuredHTMLLoader类加载 HTML 文件(如 “test.html”),该加载器会对 HTML 内容进行非结构化处理,提取其中的文本信息。load()方法返回处理后的文档对象,打印结果可查看 HTML 中的纯文本内容,适合快速获取网页文本信息。

# 使用UnstructuredHTMLLoader加载HTML文件
from langchain_community.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader("test.html")
data = loader.load()
print(data)
方法二:使用 BSHTMLLoader

BSHTMLLoader类加载 HTML 文件时会利用 BeautifulSoup 解析器,除提取文本外还能保留页面结构信息(如标题等)。加载后的数据data1包含解析后的结构化内容,打印结果可看到页面标题及正文文本,适合需要保留 HTML 文档结构特征的场景。

# 使用BSHTMLLoader加载HTML,提取页面标题
from langchain_community.document_loaders import BSHTMLLoader
loader1 = BSHTMLLoader("test.html")
data1 = loader1.load()
print(data1)

此时我们就拿到了我们想要的文本数据,下一节我将讲解一下如何去进行文本的分割。

### 构建本地环境中的RAG系统 #### 准备工作 为了在本地环境中成功部署检索增强生成(RAG)系统,需先安装必要的软件包和工具。这包括但不限于Python及其开发环境、Docker用于容器化服务、Milvus作为向量数据库以及Elasticsearch来提高文本检索能力[^2]。 #### 安装依赖项 建议创建一个新的虚拟环境以隔离项目所需的特定版本库文件。接着可以使用pip命令安装`rag`, `elasticsearch`, `pymilvus`等Python包: ```bash python3 -m venv rag_env source rag_env/bin/activate pip install elasticsearch pymilvus rag ``` 对于非Python组件如Milvus或Elasticsearch,则推荐采用Docker镜像快速启动实例: ```dockerfile version: '3' services: milvus: image: milvusdb/milvus:v2.0-cpu-d070521-8c1fbb ports: - "19530:19530" - "9091:9091" elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1 environment: discovery.type: single-node ports: - "9200:9200" - "9300:9300" ``` 保存上述配置到名为`docker-compose.yml`的文件中,并执行`docker-compose up -d`指令一键搭建所需的服务集群[^1]。 #### 数据准备与导入 完成基础设施建设之后,下一步就是准备好要被索引的数据集并将其加载至相应的存储引擎内。针对结构化表格类资料可以直接通过API接口写入Milvus;而对于非结构化的文档则可能需要预先转换成适合的形式再提交给Elasticsearch进行全文搜索优化处理。 #### 集成应用逻辑 最后一步是在应用程序层面实现对这两个后台系统的调用。通常情况下会涉及到编写一段中间件代码负责接收前端请求后分别查询两个不同的搜索引擎并将结果汇总返回给客户端展示。这里给出一个简单的Flask Web API例子说明这一过程: ```python from flask import Flask, request, jsonify import requests app = Flask(__name__) @app.route('/query', methods=['POST']) def query(): data = request.json['text'] # Query Elasticsearch for text-based search results. es_response = requests.post('http://localhost:9200/_search?q=' + data).json() # Query Milvus for vector similarity matching. mv_response = requests.get(f'http://localhost:9091/vectors/search?data={data}').json() combined_results = { "es": es_response, "milvus": mv_response } return jsonify(combined_results) if __name__ == '__main__': app.run(debug=True) ``` 此段脚本展示了如何同时访问Elasticsearch和Milvus来进行综合性的信息检索操作,并将两者的结果合并起来提供给最终用户查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员miki

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值