62 LlamaIndex中的节点后处理器:提升检索结果的利器

LlamaIndex中的节点后处理器:提升检索结果的利器

在LlamaIndex中,节点后处理器(Node Postprocessor)是一组模块,它们在返回节点之前对其进行某种形式的转换或过滤。这些后处理器在查询引擎中应用最为广泛,通常在节点检索步骤之后和响应合成步骤之前发挥作用。LlamaIndex不仅提供了几种即用型的节点后处理器,还提供了一个简单的API,允许用户添加自定义的后处理器。

概念

节点后处理器的主要功能是对一组节点进行处理,然后返回经过某种转换或过滤的节点。在LlamaIndex的查询引擎中,节点后处理器通常在节点检索步骤之后和响应合成步骤之前应用。

使用模式

以下是使用节点后处理器的一个示例:

from llama_index.core.postprocessor import SimilarityPostprocessor
from llama_index.postprocessor.cohere_rerank import CohereRerank
from llama_index.core.data_structs import Node
from llama_index.core.schema import NodeWithScore

nodes = [
    NodeWithScore(node=Node(text="text1"), score=0.7),
    NodeWithScore(node=Node(text="text2"), score=0.8),
]

# 相似度后处理器:过滤相似度低于0.75的节点
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)

# Cohere重排序:使用训练模型对节点进行重排序
reranker = CohereRerank(api_key="<COHERE_API_KEY>", top_n=2)
reranker.postprocess_nodes(nodes, query_str="<user_query>")

需要注意的是,postprocess_nodes 可以接受 query_strquery_bundle(QueryBundle),但不能同时接受两者。

在查询引擎中使用

节点后处理器最常见的使用场景是在查询引擎中,它们应用于从检索器返回的节点,并在响应合成步骤之前进行处理。

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.postprocessor import TimeWeightedPostprocessor

documents = SimpleDirectoryReader("./data").load_data()

index = VectorStoreIndex.from_documents(documents)

query_engine = index.as_query_engine(
    node_postprocessors=[
        TimeWeightedPostprocessor(
            time_decay=0.5, time_access_refresh=False, top_k=1
        )
    ]
)

# 每次查询时都会应用所有节点后处理器
response = query_engine.query("query string")

独立使用

节点后处理器也可以作为独立对象用于过滤检索到的节点:

from llama_index.core.postprocessor import SimilarityPostprocessor

nodes = index.as_retriever().retrieve("test query str")

# 过滤相似度低于0.75的节点
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)

使用自定义节点

如你所见,后处理器接受 NodeWithScore 对象作为输入,这只是一个包含节点和分数值的包装类。

from llama_index.core.postprocessor import SimilarityPostprocessor
from llama_index.core.data_structs import Node
from llama_index.core.schema import NodeWithScore

nodes = [
    NodeWithScore(node=Node(text="text"), score=0.7),
    NodeWithScore(node=Node(text="text"), score=0.8),
]

# 过滤相似度低于0.75的节点
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)

自定义节点后处理器

基类是 BaseNodePostprocessor,API接口非常简单:

class BaseNodePostprocessor:
    """Node postprocessor."""

    @abstractmethod
    def _postprocess_nodes(
        self, nodes: List[NodeWithScore], query_bundle: Optional[QueryBundle]
    ) -> List[NodeWithScore]:
        """Postprocess nodes."""

一个简单的自定义节点后处理器只需几行代码即可实现:

from llama_index.core import QueryBundle
from llama_index.core.postprocessor.types import BaseNodePostprocessor
from llama_index.core.schema import NodeWithScore


class DummyNodePostprocessor(BaseNodePostprocessor):
    def _postprocess_nodes(
        self, nodes: List[NodeWithScore], query_bundle: Optional[QueryBundle]
    ) -> List[NodeWithScore]:
        # 从分数中减去1
        for n in nodes:
            n.score -= 1

        return nodes

通过使用节点后处理器,你可以对检索到的节点进行精细的控制和优化,从而提升查询结果的质量和相关性。希望这些信息对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值