智能体开发|文档分段策略之Token级固定大小分段

分档策略概述
良好的文档分段策略不仅可以更好地实现文档检索,还可以更高效地获取相关文档。目前RAG技术的发展日新月异,各类文档分段策略层出不穷,但是从整体上来说,它们均各有优劣。文档分段主要存在以下4个方面的问题。
(1)段落过大:可能导致检索到的文档包含过多无关信息,增加了大模型理解语义的难度,降低了答案的准确性,甚至超出了大模型上下文大小的限制。
(2)段落过小:可能导致检索到的文档只包含部分信息,无法全面回答用户所提的问题。
(3)分段不当:可能会破坏语义的连贯性,导致原本一个完整的知识被拆分到多个段落中。
(4)忽略文档结构:通常很多文档是有章节划分的,一章或者一节通常就是一个完整的话题,如果分段不当,则该结构就会被破坏,进而导致分段不当。
在LlamaIndex中,主要包含5种类型的分段策略:固定大小分段、语义分段、递归分段、文档结构分段和混合策略分段

Token级固定大小分段
使用TokenTextSplitter()按照Token数量来进行固定大小的分段。该方案仅供演示,实际使用过程中不建议使用,因为它只关注Token,而不会关注句子,常常将一个句子从中间截断,导致AI完全无法正确、完整地表达语句
from llama_index.core import SimpleDirectoryReaderfrom llama_index.core.node_parser import TokenTextSplitterfrom llama_index.core import VectorStoreIndexfrom llama_index.core import Settingsfrom llama_index.embeddings.openai import OpenAIEmbeddingimport osfrom dotenv import load_dotenvload_dotenv()QWEN_AGENT_SERVER = os.getenv('QWEN_AGENT_SERVER')QWEN_AGENT_API_KEY =os.getenv('QWEN_API_KEY')Settings.embed_model = OpenAIEmbedding(model_name="qwen3-embedding:4b",api_base=QWEN_AGENT_SERVER,api_key=QWEN_AGENT_API_KEY,)# 从docs目录加载所有文档,如果文档较多,则词嵌入和索引过程耗时较长documents = SimpleDirectoryReader(input_dir="./static/docs").load_data()# 定义分隔器,并设置每个段落的长度为200,有20个Token可以重叠splitter = TokenTextSplitter(chunk_size=200,chunk_overlap=20)# 读取分段后的结果,这是验证分段策略的重点所在nodes = splitter.get_nodes_from_documents(documents)for node in nodes:print(node.get_content() + "\n============\n")# 创建索引时,通过参数transformations指定分隔器,该步骤非当前话题必需,后续不再演示# transformations 参数可以指定多个分隔器进行混合分隔index = VectorStoreIndex.from_documents(documents,transformations=[splitter])# 对文档进行索引# 将向量持久化保存到dbstore目录中,并设置索引ID为'uncle_tuu'# 后续可以通过索引编号来对索引进行过滤,以指定更小范围的内容进行检索index.set_index_id("TokenTextSplitte")# 将索引持久化保持到 /dbstore/TokenTextSplitte 目录中index.storage_context.persist(persist_dir="./dbstore/TokenTextSplitte")

END
夜雨聆风