6.2RAG--文档分割器
·
1.概念
1.1背景
前文我们利用构建知识库利用文档加载器将我们的本地文件等加载进来,文档加载器会对文档进行初步的拆分(PDF加载:按照PDF文档的分页进行拆分,MD加载:按照类型或者默认的方式进行拆分),但在初次拆分可能会出现同一个Q&A或者语义相近的资料被拆分为不同的子文档,这样不符合我们的期望。因此LangChain提出了文本切割器帮助我们进行文档的二次拆分。
1.2Def
TextSplitter⽂档拆分--通常是将⼤⽂本分解为更⼩的、易于管理的块。这对于索引数据并将其传递到模型中都很有⽤。因为,⼤块更难搜索并且不适合模型的有限上下⽂窗⼝。拆分可以提⾼搜索结果的粒度,从⽽可以更精确地将查询与相关⽂档部分进⾏匹配
2.分割策略学习
2.1根据文本长度或者语义进行拆分
2.1.1基于字符长度
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_text_splitters import CharacterTextSplitter
# 首先利用MD加载进一个大文件
markdown_path = "../Docs/Markdown/xxx.md"
# single 模式加载后,默认只有⼀个 Document 对象
loader = UnstructuredMarkdownLoader(markdown_path)
data = loader.load()
# 基于字符长度
# 1.定义分割器
text_split = CharacterTextSplitter(
separator="\n\n", # 选择分隔符:它有⼀个默认的分隔符优先级列表(基于长度时按照一个特定字符)
chunk_size=400, # 拆分块的大小(仅是参考值,为保证同一段落/语义可能会超过该值)
chunk_overlap=50, # 相邻两块可重复的字符长度
length_function=len, # 使⽤测量⻓度的函数
is_separator_regex=False, # 分隔符是正则表达式吗
)
# 2.拆分文档形成文档列表
documents = text_split.split_documents(data)
for document in documents:
print("*" * 30)
print(f"{document}\n")

2.1.2基于token长度
# 基于token长度
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", # 按某种编码格式进行拆分 "cl100k_base"--gpt采用的常用编码格式
chunk_size=400, # 拆分块的大小(仅是参考值,为保证同一段落/语义可能会超过该值)
chunk_overlap=50, # 相邻两块可重复的字符长度
)
cl100k_base编码:
import tiktoken
# 定于cl100k_base编码⽅式的分词器
enc = tiktoken.get_encoding("cl100k_base")
# 进⾏切分编码
enc_output = enc.encode("my name is LiHua!")
# 打印结果
print(f"编码后的token:{str(enc_output)}")
for token in enc_output:
print(f"将token: {str(token)} 变成⽂本:{str(enc.decode_single_token_bytes(token))}")
2.1.3基于长度硬约束
# 基于长度硬约束
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base",
chunk_size=100, # 拆分块的大小(不再是参考值,硬性条件)
chunk_overlap=0,
)
2.2特殊文档结构拆分
对于代码等特殊⽂本,可以尝试使⽤ Language 提供的不同的分割器(如PythonCodeTextSplitter 、 HTMLHeaderTextSplitter 等)效果会更好,它会理解代码的语法结构。
示例(Python文档)
from langchain_text_splitters import PythonCodeTextSplitter
# 字符串⽂档
PYTHON_CODE = """
def hello_world():
# # 2.拆分文档形成文档列表
print("Hello, World!")
def hello_python():
print("Hello, Python!")
"""
python_splitter = PythonCodeTextSplitter(chunk_size=50, chunk_overlap=0)
python_docs = python_splitter.create_documents([PYTHON_CODE])
for document in python_docs[:2]:
print("*" * 30)
print(f"{document}\n")
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)