当前位置: 首页 > news >正文

使用 LlamaIndex 自定义 Transformation 组件实现节点元数据提取

使用 LlamaIndex 自定义 Transformation 组件实现节点元数据提取

文章目录

  • 使用 LlamaIndex 自定义 Transformation 组件实现节点元数据提取
    • 引言:什么是 Transformations?
    • 一、Transformation 的基本概念
    • 二、实战:自定义 PrefixExtractor 组件
    • 三、代码解析与运行说明

引言:什么是 Transformations?

在构建基于文档的 RAG(Retrieval-Augmented Generation)系统时,数据处理流程中最终要的一步就是文档的摄取与转换。LlamaIndex 提供了一个强大的工具——IngestionPipeline,它允许我们将原始文档一步步转换为可用于检索和生成的结构化节点(Node)。
其中,Transformation 是整个管道最核心的概念之一。它是指一组节点作为输入,并返回节点列表的操作。每个实现 Transformation 基类的组件都包含同步 call() 定义或异步 acall() 定义的两种实现方式。

一、Transformation 的基本概念

  1. 接口定义
from llama_index.core.schema import TransformComponentclass MyCustomTransform(TransformComponent):def __call__(self, nodes, **kwargs):# 同步处理逻辑return nodesasync def acall(self, nodes, **kwargs):# 异步处理逻辑(可选)return nodes
  • __call__:这是每个 Transformation 必须实现的方法,用于同步地对输入的节点列表进行变换。
  • acall():如果你希望支持异步操作(例如调用远程API),可以实现该方法。
  1. 标准内置组件
    LlamaIndex 提供了一些常用的 TransformComponent 实现,包括:
  • SentenceSplitter: 文本分块;
  • TitleExtractor: 自动提取标题;
  • Embedding 模型: 生成向量嵌入;
  • KeywordExtractor: 关键词抽取;

二、实战:自定义 PrefixExtractor 组件

接下来我们通过一个具体示例,展示如何继承 TransformComponenet 并实现一个自定义的节点处理器:PrefixExtractor, 它的作用是提取每个节点文本的前两个字符,并将其作为metadata 字段保存。

from llama_index.core import Document
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.dashscope import DashScopeEmbedding
from llama_index.core.storage.docstore import SimpleDocumentStore
from llama_index.core.schema import TransformComponentclass PrefixExtractor(TransformComponent):def __call__(self, nodes, **kwargs):for node in nodes:if len(node.text) >= 2:prefix = node.text[:2]node.metadata["prefix"] = prefixelse:node.metadata["prefix"] = node.textreturn nodesdocstore = SimpleDocumentStore()pipeline = IngestionPipeline(transformations=[SentenceSplitter(chunk_size=50,chunk_overlap=5,),PrefixExtractor(),DashScopeEmbedding(model="text-embedding-v3",api_key=os.getenv("ALI_API_KEY"),api_base=os.getenv("ALI_API_BASE"),),],docstore=docstore,
)nodes = pipeline.run(documents=[Document.example()]
)pipeline.persist("./pipeline_storage")for node in nodes:print("Text: ", node.text)print("Metadata: ", node.metadata)

三、代码解析与运行说明

  1. PrefixExtractor 类详解
  • 我们定义了一个类 PrefixExtractor,继承自 TransformComponent
  • __call__ 方法中遍历所有传入的节点;
  • 在每个节点提取其 .text 属性的前两个字符,并存入 .metadata 中;
  • 最后返回更新后的节点列表。
  1. 构建 IngestionPipeline
  • 首先使用 SentenceSplitter 将文档分割成小块;
  • 然后通过我们自定义的 PrefixExtractor 添加前缀字段;
  • 在使用 DashScopeEmbedding 为每个节点生成向量;
  • 最后奖结果持久化到本地文件夹中。
  1. 输出结果实例
  • 假设节点的内容为:
这是一个测试文档。

则输出部分内容如下:

{"text": "这是一个测试文档。","metadata": {"prefix": "这是"}
}
http://www.lqws.cn/news/75007.html

相关文章:

  • 【笔记】部署 AgenticSeek 项目问题:端口 8000 被占用
  • STM32CubeDAC及DMA配置
  • win主机如何结束正在执行的任务进程并重启
  • Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)
  • rabbitmq Fanout交换机简介
  • 通过《哪吒》看人生百态
  • 数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • android binder(三)binder.c函数分析
  • DeepSeek模型高级应用:提示工程与Few-shot学习实战指南
  • [HTML5]快速掌握canvas
  • EXSI通过笔记本wifi上外网配置
  • Elasticsearch 读写流程深度解析
  • Python应用range函数初解pro
  • JSP、HTML和Tomcat
  • 从0开始学vue:vue3和vue2的关系
  • 通信革新与网络安全探索与创新:开启未来之门
  • 设计模式——迭代器设计模式(行为型)
  • 38、响应处理-【源码分析】-HTTPMessageConverter原理
  • JAVA学习-练习试用Java实现“使用JavaFX绘制散点图 :可视化数据集”
  • JAVA核心知识点--元注解详解
  • 网络攻防技术四:网络侦察技术
  • 制作个人Github学术主页
  • 智慧零工平台前端开发实战:从uni-app到跨平台应用
  • uniapp路由跳转toolbar页面
  • React 18新特性介绍
  • 【保姆级教程】PDF批量转图文笔记
  • springboot 集成webFilter登录认证信息过滤 DEMO原型介绍
  • TomatoSCI数据分析实战:探索社交媒体成瘾
  • CppCon 2014 学习:(Costless)Software Abstractions for Parallel Architectures
  • MCP协议学习