1. 案例目标本案例展示了如何使用TopicNodeParser实现基于主题的文档分块技术。TopicNodeParser实现了MedGraphRAG论文中描述的分块方法特别适用于处理包含多个主题或多样化内容的医疗文档。该技术通过命题转换和主题相似度分析将文档分割成语义相关的块确保每个分块保持主题一致性同时不超过LLM的上下文长度限制。2. 技术栈与核心依赖llama-index-node-parser-topic: TopicNodeParser的核心实现包llama-index.core: LlamaIndex核心框架提供文档和节点处理功能llama-index.embeddings.openai: OpenAI嵌入模型支持llama-index.llms.openai: OpenAI大语言模型接口3. 环境配置必要安装步骤%pip install llama-index llama-index-node-parser-topicAPI密钥配置import os os.environ[OPENAI_API_KEY] sk-... # 替换为您的OpenAI API密钥4. 案例实现4.1 数据准备案例使用了一段关于Medical Graph RAG (MedRAG)的技术文本作为示例数据该文本详细介绍了MedRAG方法的原理、三层级图结构、U-retrieve策略以及评估结果。4.2 模型初始化from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.llms.openai import OpenAI embed_model OpenAIEmbedding() llm OpenAI(modelgpt-4o-mini)4.3 TopicNodeParser配置基于LLM的相似度方法from llama_index.node_parser.topic import TopicNodeParser node_parser TopicNodeParser.from_defaults( llmllm, max_chunk_size1000, similarity_methodllm, # 可以是llm或embedding window_size2, # 论文建议window_size5 )基于嵌入的相似度方法node_parser TopicNodeParser.from_defaults( embed_modelembed_model, llmllm, max_chunk_size1000, similarity_methodembedding, # 可以是llm或embedding similarity_threshold0.8, window_size2, # 论文建议window_size5 )参数说明max_chunk_size: 分块的最大大小以token计similarity_method: 相似度计算方法可以是llm基于LLM或embedding基于嵌入向量similarity_threshold: 仅在使用嵌入方法时有效相似度阈值window_size: 滑动窗口大小用于减少顺序处理产生的噪声4.4 文档处理nodes node_parser.get_nodes_from_documents(documents, show_progressTrue)注意由于命题是由LLM创建的创建节点时可能会导致较长的处理时间。实验时请谨慎操作。4.5 结果检查处理完成后代码展示了如何检查分块结果for i, node in enumerate(nodes): print(f--- Chunk {i1} ---) print(node.get_content())5. 案例效果5.1 分块结果示例使用TopicNodeParser处理后文档被分割成多个主题相关的分块每个分块包含一系列命题propositions分块1示例包含关于Medical Graph RAG方法介绍的一系列命题This paper introduces a novel graph RAG method for applying LLMs to the medical domain. The novel graph RAG method is referred to as Medical Graph RAG (MedRAG). The Medical Graph RAG technique improves LLM performance in the medical domain. The Medical Graph RAG technique responds to queries with grounded source citations. ...分块2示例包含关于三层级图结构的命题Documents provided by users are used as the top-level source to extract entities. The extracted entities are linked to a second level consisting of more basic entities. The more basic entities are previously abstracted from credible medical books and papers. The extracted entities are connected to a third level, which is the fundamental medical dictionary graph. ...5.2 两种相似度方法的对比方法原理优势局限性LLM相似度使用LLM判断命题之间的主题相似性更准确的主题判断能理解复杂语义处理速度较慢API调用成本高嵌入相似度计算命题嵌入向量的余弦相似度处理速度快成本较低可能无法捕捉复杂语义关系6. 案例实现思路6.1 MedGraphRAG分块算法原理TopicNodeParser实现了MedGraphRAG论文中描述的分块方法核心步骤如下段落分割: 使用静态字符如换行符将文档分割成段落命题转换: 将每个段落转换为自包含的命题propositions顺序分析: 顺序分析文档中的每个命题决定是否应与现有分块合并或启动新分块滑动窗口: 实现滑动窗口技术论文建议窗口大小为5减少顺序处理产生的噪声大小限制: 设置硬性阈值确保最长分块不超过LLM的上下文长度限制6.2 命题转换技术命题转换是TopicNodeParser的核心技术之一它将原始文本转换为独立的、自包含的陈述句。这种转换有以下优势语义完整性: 每个命题表达一个完整的语义单元独立性: 命题之间相对独立便于灵活组合可比较性: 独立的命题更容易进行相似度比较6.3 主题相似度判断TopicNodeParser提供两种主题相似度判断方法基于LLM的相似度判断使用LLM的zero-shot能力判断两个命题是否属于同一主题优势能够理解复杂语义关系和上下文劣势处理速度慢API调用成本高基于嵌入的相似度判断计算命题嵌入向量的余弦相似度并与预设阈值比较优势处理速度快计算成本低劣势可能无法捕捉复杂的语义关系6.4 滑动窗口技术为了减少顺序处理产生的噪声TopicNodeParser实现了滑动窗口技术同时处理多个段落默认为5个通过移除第一个段落并添加下一个段落来持续调整窗口保持对主题一致性的关注减少局部决策的偏差7. 扩展建议7.1 参数优化max_chunk_size调整: 根据LLM的上下文窗口大小和文档类型调整最大分块大小window_size优化: 根据文档复杂度和主题分布调整滑动窗口大小similarity_threshold调优: 针对特定领域调整相似度阈值平衡分块粒度和主题一致性7.2 算法改进混合相似度方法: 结合LLM和嵌入两种方法先使用嵌入快速筛选再使用LLM精确判断自适应窗口大小: 根据文档内容密度动态调整滑动窗口大小层次化分块: 实现多级分块策略先进行粗粒度主题分割再进行细粒度命题组合7.3 应用扩展多领域支持: 扩展到医疗以外的其他专业领域如法律、金融等多语言支持: 增强对非英语文档的处理能力特别是低资源语言多模态支持: 扩展对图像、表格等多模态内容的处理能力7.4 性能优化并行处理: 实现命题转换和相似度计算的并行处理缓存机制: 对相似命题的转换结果和相似度判断进行缓存增量更新: 支持文档部分更新时的增量分块处理8. 总结TopicNodeParser实现了MedGraphRAG论文中描述的先进分块技术通过命题转换和主题相似度分析将文档分割成语义相关的块。该方法特别适用于处理包含多个主题或多样化内容的专业文档如医疗文献。通过本案例我们学习了如何配置和使用TopicNodeParser包括基于LLM和基于嵌入的两种相似度计算方法以及如何检查和评估分块结果。该技术为处理复杂专业文档提供了强有力的工具能够保持主题一致性同时不超过LLM的上下文限制特别适用于构建专业领域的知识图谱和RAG系统。最佳实践建议根据文档类型和领域选择合适的相似度计算方法对于大规模文档处理优先使用基于嵌入的方法以提高效率定期评估分块质量根据结果调整参数结合领域知识优化命题转换策略提高分块质量
【RAG】【Data-Processor】【node_parsers05】TopicNodeParser主题解析示例
1. 案例目标本案例展示了如何使用TopicNodeParser实现基于主题的文档分块技术。TopicNodeParser实现了MedGraphRAG论文中描述的分块方法特别适用于处理包含多个主题或多样化内容的医疗文档。该技术通过命题转换和主题相似度分析将文档分割成语义相关的块确保每个分块保持主题一致性同时不超过LLM的上下文长度限制。2. 技术栈与核心依赖llama-index-node-parser-topic: TopicNodeParser的核心实现包llama-index.core: LlamaIndex核心框架提供文档和节点处理功能llama-index.embeddings.openai: OpenAI嵌入模型支持llama-index.llms.openai: OpenAI大语言模型接口3. 环境配置必要安装步骤%pip install llama-index llama-index-node-parser-topicAPI密钥配置import os os.environ[OPENAI_API_KEY] sk-... # 替换为您的OpenAI API密钥4. 案例实现4.1 数据准备案例使用了一段关于Medical Graph RAG (MedRAG)的技术文本作为示例数据该文本详细介绍了MedRAG方法的原理、三层级图结构、U-retrieve策略以及评估结果。4.2 模型初始化from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.llms.openai import OpenAI embed_model OpenAIEmbedding() llm OpenAI(modelgpt-4o-mini)4.3 TopicNodeParser配置基于LLM的相似度方法from llama_index.node_parser.topic import TopicNodeParser node_parser TopicNodeParser.from_defaults( llmllm, max_chunk_size1000, similarity_methodllm, # 可以是llm或embedding window_size2, # 论文建议window_size5 )基于嵌入的相似度方法node_parser TopicNodeParser.from_defaults( embed_modelembed_model, llmllm, max_chunk_size1000, similarity_methodembedding, # 可以是llm或embedding similarity_threshold0.8, window_size2, # 论文建议window_size5 )参数说明max_chunk_size: 分块的最大大小以token计similarity_method: 相似度计算方法可以是llm基于LLM或embedding基于嵌入向量similarity_threshold: 仅在使用嵌入方法时有效相似度阈值window_size: 滑动窗口大小用于减少顺序处理产生的噪声4.4 文档处理nodes node_parser.get_nodes_from_documents(documents, show_progressTrue)注意由于命题是由LLM创建的创建节点时可能会导致较长的处理时间。实验时请谨慎操作。4.5 结果检查处理完成后代码展示了如何检查分块结果for i, node in enumerate(nodes): print(f--- Chunk {i1} ---) print(node.get_content())5. 案例效果5.1 分块结果示例使用TopicNodeParser处理后文档被分割成多个主题相关的分块每个分块包含一系列命题propositions分块1示例包含关于Medical Graph RAG方法介绍的一系列命题This paper introduces a novel graph RAG method for applying LLMs to the medical domain. The novel graph RAG method is referred to as Medical Graph RAG (MedRAG). The Medical Graph RAG technique improves LLM performance in the medical domain. The Medical Graph RAG technique responds to queries with grounded source citations. ...分块2示例包含关于三层级图结构的命题Documents provided by users are used as the top-level source to extract entities. The extracted entities are linked to a second level consisting of more basic entities. The more basic entities are previously abstracted from credible medical books and papers. The extracted entities are connected to a third level, which is the fundamental medical dictionary graph. ...5.2 两种相似度方法的对比方法原理优势局限性LLM相似度使用LLM判断命题之间的主题相似性更准确的主题判断能理解复杂语义处理速度较慢API调用成本高嵌入相似度计算命题嵌入向量的余弦相似度处理速度快成本较低可能无法捕捉复杂语义关系6. 案例实现思路6.1 MedGraphRAG分块算法原理TopicNodeParser实现了MedGraphRAG论文中描述的分块方法核心步骤如下段落分割: 使用静态字符如换行符将文档分割成段落命题转换: 将每个段落转换为自包含的命题propositions顺序分析: 顺序分析文档中的每个命题决定是否应与现有分块合并或启动新分块滑动窗口: 实现滑动窗口技术论文建议窗口大小为5减少顺序处理产生的噪声大小限制: 设置硬性阈值确保最长分块不超过LLM的上下文长度限制6.2 命题转换技术命题转换是TopicNodeParser的核心技术之一它将原始文本转换为独立的、自包含的陈述句。这种转换有以下优势语义完整性: 每个命题表达一个完整的语义单元独立性: 命题之间相对独立便于灵活组合可比较性: 独立的命题更容易进行相似度比较6.3 主题相似度判断TopicNodeParser提供两种主题相似度判断方法基于LLM的相似度判断使用LLM的zero-shot能力判断两个命题是否属于同一主题优势能够理解复杂语义关系和上下文劣势处理速度慢API调用成本高基于嵌入的相似度判断计算命题嵌入向量的余弦相似度并与预设阈值比较优势处理速度快计算成本低劣势可能无法捕捉复杂的语义关系6.4 滑动窗口技术为了减少顺序处理产生的噪声TopicNodeParser实现了滑动窗口技术同时处理多个段落默认为5个通过移除第一个段落并添加下一个段落来持续调整窗口保持对主题一致性的关注减少局部决策的偏差7. 扩展建议7.1 参数优化max_chunk_size调整: 根据LLM的上下文窗口大小和文档类型调整最大分块大小window_size优化: 根据文档复杂度和主题分布调整滑动窗口大小similarity_threshold调优: 针对特定领域调整相似度阈值平衡分块粒度和主题一致性7.2 算法改进混合相似度方法: 结合LLM和嵌入两种方法先使用嵌入快速筛选再使用LLM精确判断自适应窗口大小: 根据文档内容密度动态调整滑动窗口大小层次化分块: 实现多级分块策略先进行粗粒度主题分割再进行细粒度命题组合7.3 应用扩展多领域支持: 扩展到医疗以外的其他专业领域如法律、金融等多语言支持: 增强对非英语文档的处理能力特别是低资源语言多模态支持: 扩展对图像、表格等多模态内容的处理能力7.4 性能优化并行处理: 实现命题转换和相似度计算的并行处理缓存机制: 对相似命题的转换结果和相似度判断进行缓存增量更新: 支持文档部分更新时的增量分块处理8. 总结TopicNodeParser实现了MedGraphRAG论文中描述的先进分块技术通过命题转换和主题相似度分析将文档分割成语义相关的块。该方法特别适用于处理包含多个主题或多样化内容的专业文档如医疗文献。通过本案例我们学习了如何配置和使用TopicNodeParser包括基于LLM和基于嵌入的两种相似度计算方法以及如何检查和评估分块结果。该技术为处理复杂专业文档提供了强有力的工具能够保持主题一致性同时不超过LLM的上下文限制特别适用于构建专业领域的知识图谱和RAG系统。最佳实践建议根据文档类型和领域选择合适的相似度计算方法对于大规模文档处理优先使用基于嵌入的方法以提高效率定期评估分块质量根据结果调整参数结合领域知识优化命题转换策略提高分块质量