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_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
)
]
)
# 每次查询时都会应用所有节点后处理器
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
通过使用节点后处理器,你可以对检索到的节点进行精细的控制和优化,从而提升查询结果的质量和相关性。希望这些信息对你有所帮助!