Skip to content

转换器#

转换器是一种接收节点列表作为输入,并返回节点列表的组件。每个实现 Transformation 基类的组件都同时包含同步的 __call__() 定义和异步的 acall() 定义。

当前,以下组件属于 Transformation 对象:

使用模式#

虽然转换器最适合与数据摄取管道配合使用,但也可以直接使用。

from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.extractors import TitleExtractor

node_parser = SentenceSplitter(chunk_size=512)
extractor = TitleExtractor()

# 直接使用转换器
nodes = node_parser(documents)

# 或异步使用转换器
nodes = await extractor.acall(nodes)

与索引结合使用#

转换器可以传入索引或全局设置中,在调用索引的 from_documents()insert() 方法时使用。

from llama_index.core import VectorStoreIndex
from llama_index.core.extractors import (
    TitleExtractor,
    QuestionsAnsweredExtractor,
)
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.node_parser import TokenTextSplitter

transformations = [
    TokenTextSplitter(chunk_size=512, chunk_overlap=128),
    TitleExtractor(nodes=5),
    QuestionsAnsweredExtractor(questions=3),
]

# 全局设置
from llama_index.core import Settings

Settings.transformations = [text_splitter, title_extractor, qa_extractor]

# 单索引设置
index = VectorStoreIndex.from_documents(
    documents, transformations=transformations
)

自定义转换器#

您可以通过实现基类来自定义任何转换器。

以下自定义转换器将移除文本中的所有特殊字符和标点符号。

import re
from llama_index.core import Document
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.schema import TransformComponent


class TextCleaner(TransformComponent):
    def __call__(self, nodes, **kwargs):
        for node in nodes:
            node.text = re.sub(r"[^0-9A-Za-z ]", "", node.text)
        return nodes

这些自定义转换器可以直接使用,也可以在任何 IngestionPipeline 中使用。

# 在管道中使用
pipeline = IngestionPipeline(
    transformations=[
        SentenceSplitter(chunk_size=25, chunk_overlap=0),
        TextCleaner(),
        OpenAIEmbedding(),
    ],
)

nodes = pipeline.run(documents=[Document.example()])