节点后处理器#
概念#
节点后处理器是一组模块,它们接收一组节点,并在返回这些节点之前应用某种转换或过滤。
在 LlamaIndex 中,节点后处理器最常应用于查询引擎内部,在节点检索步骤之后、响应合成步骤之前。
LlamaIndex 提供了几种可直接使用的节点后处理器,同时也提供了简单的 API 用于添加您自己的自定义后处理器。
提示
不确定节点后处理器在 RAG 工作流中的位置?请阅读高级概念。
使用模式#
以下是使用节点后处理器的一个示例
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),
]
# similarity postprocessor: filter nodes below 0.75 similarity score
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)
# cohere rerank: rerank nodes given query using trained model
reranker = CohereRerank(api_key="<COHERE_API_KEY>", top_n=2)
reranker.postprocess_nodes(nodes, query_str="<user_query>")
请注意,postprocess_nodes
可以接收 query_str
或 query_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
)
]
)
# all node post-processors will be applied during each query
response = query_engine.query("query string")
与检索到的节点结合使用#
或用作独立的模块来过滤检索到的节点
from llama_index.core.postprocessor import SimilarityPostprocessor
nodes = index.as_retriever().retrieve("test query str")
# filter nodes below 0.75 similarity score
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)
与您自己的节点结合使用#
如您可能已注意到,后处理器接收 NodeWithScore
对象作为输入,它只是一个包含 Node
和 score
值的封装类。
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),
]
# filter nodes below 0.75 similarity score
processor = SimilarityPostprocessor(similarity_cutoff=0.75)
filtered_nodes = processor.postprocess_nodes(nodes)
(custom-node-postprocessor)=
自定义节点后处理器#
基类是 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]:
# subtracts 1 from the score
for n in nodes:
n.score -= 1
return nodes
模块#
有关详细信息,请参阅完整的模块列表。