节点后处理器模块#
SimilarityPostprocessor#
用于移除相似度得分低于阈值的节点。
from llama_index.core.postprocessor import SimilarityPostprocessor
postprocessor = SimilarityPostprocessor(similarity_cutoff=0.7)
postprocessor.postprocess_nodes(nodes)
KeywordNodePostprocessor#
用于确保某些关键词被排除或包含。
from llama_index.core.postprocessor import KeywordNodePostprocessor
postprocessor = KeywordNodePostprocessor(
required_keywords=["word1", "word2"], exclude_keywords=["word3", "word4"]
)
postprocessor.postprocess_nodes(nodes)
MetadataReplacementPostProcessor#
用于将节点内容替换为节点元数据中的字段。如果元数据中不存在该字段,则节点文本保持不变。与 SentenceWindowNodeParser 结合使用时最有用。
from llama_index.core.postprocessor import MetadataReplacementPostProcessor
postprocessor = MetadataReplacementPostProcessor(
target_metadata_key="window",
)
postprocessor.postprocess_nodes(nodes)
LongContextReorder#
模型难以访问扩展上下文中心的重要细节。一项研究发现,当关键数据位于输入上下文的开头或结尾时,通常会产生最佳性能。此外,随着输入上下文的长度增加,性能会显著下降,即使是为长上下文设计的模型也是如此。
此模块将重新排序检索到的节点,这在需要较大的 top-k 值时会很有用。
from llama_index.core.postprocessor import LongContextReorder
postprocessor = LongContextReorder()
postprocessor.postprocess_nodes(nodes)
SentenceEmbeddingOptimizer#
此后处理器通过移除与查询不相关的句子来优化 token 使用量(这通过使用嵌入来实现)。
百分位截止值是使用相关句子顶部百分比的一种衡量标准。
也可以指定阈值截止值,该值使用原始相似度截止值来选择保留哪些句子。
from llama_index.core.postprocessor import SentenceEmbeddingOptimizer
postprocessor = SentenceEmbeddingOptimizer(
embed_model=service_context.embed_model,
percentile_cutoff=0.5,
# threshold_cutoff=0.7
)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可以在这里找到。
CohereRerank#
使用“Cohere ReRank”功能重新排序节点,并返回前 N 个节点。
from llama_index.postprocessor.cohere_rerank import CohereRerank
postprocessor = CohereRerank(
top_n=2, model="rerank-english-v2.0", api_key="YOUR COHERE API KEY"
)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可以在这里找到。
SentenceTransformerRerank#
使用来自 sentence-transformer 包的交叉编码器重新排序节点,并返回前 N 个节点。
from llama_index.core.postprocessor import SentenceTransformerRerank
# We choose a model with relatively high speed and decent accuracy.
postprocessor = SentenceTransformerRerank(
model="cross-encoder/ms-marco-MiniLM-L-2-v2", top_n=3
)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可以在这里找到。
请也参考sentence-transformer 文档,以获取更完整的模型列表(并显示速度/准确性的权衡)。默认模型是 cross-encoder/ms-marco-TinyBERT-L-2-v2,它提供最快的速度。
LLM Rerank#
使用 LLM 通过让 LLM 返回相关文档及其相关性得分来重新排序节点。返回排名前 N 的节点。
from llama_index.core.postprocessor import LLMRerank
postprocessor = LLMRerank(top_n=2, service_context=service_context)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可在这里(Gatsby)和这里(Lyft 10K 文档)找到。
JinaRerank#
使用“Jina ReRank”功能重新排序节点,并返回前 N 个节点。
from llama_index.postprocessor.jinaai_rerank import JinaRerank
postprocessor = JinaRerank(
top_n=2, model="jina-reranker-v1-base-en", api_key="YOUR JINA API KEY"
)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可在这里找到。
FixedRecencyPostprocessor#
此后处理器按日期排序并返回前 K 个节点。这假设每个节点的元数据中有一个可解析的 date 字段。
from llama_index.core.postprocessor import FixedRecencyPostprocessor
postprocessor = FixedRecencyPostprocessor(
tok_k=1, date_key="date" # the key in the metadata to find the date
)
postprocessor.postprocess_nodes(nodes)

完整的 notebook 指南可在这里找到。
EmbeddingRecencyPostprocessor#
此后处理器按日期排序后返回前 K 个节点,并在衡量嵌入相似度后移除过于相似的较旧节点。
from llama_index.core.postprocessor import EmbeddingRecencyPostprocessor
postprocessor = EmbeddingRecencyPostprocessor(
service_context=service_context, date_key="date", similarity_cutoff=0.7
)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可在这里找到。
TimeWeightedPostprocessor#
此后处理器返回对每个节点应用时间加权重排序后的前 K 个节点。每次检索节点时,都会记录检索时间。这使得搜索偏向于尚未在查询中返回过的信息。
from llama_index.core.postprocessor import TimeWeightedPostprocessor
postprocessor = TimeWeightedPostprocessor(time_decay=0.99, top_k=1)
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可在这里找到。
(Beta) PIINodePostprocessor#
PII(个人身份信息)后处理器会移除可能存在安全风险的信息。它通过使用 NER(可以使用专用的 NER 模型,也可以使用本地 LLM 模型)来实现。
LLM 版本#
from llama_index.core.postprocessor import PIINodePostprocessor
postprocessor = PIINodePostprocessor(
service_context=service_context # this should be setup with an LLM you trust
)
postprocessor.postprocess_nodes(nodes)
NER 版本#
此版本使用运行 pipeline("ner") 时加载的 Hugging Face 的默认本地模型。
from llama_index.core.postprocessor import NERPIINodePostprocessor
postprocessor = NERPIINodePostprocessor()
postprocessor.postprocess_nodes(nodes)
两者的完整 notebook 指南都可以在这里找到。
(Beta) PrevNextNodePostprocessor#
使用预定义设置读取 Node 关系,并获取所有前置节点、后置节点或两者。
当您知道这些关系指向重要数据(前置、后置或两者)时,这非常有用,这些数据在检索到该节点时应发送给 LLM。
from llama_index.core.postprocessor import PrevNextNodePostprocessor
postprocessor = PrevNextNodePostprocessor(
docstore=index.docstore,
num_nodes=1, # number of nodes to fetch when looking forawrds or backwards
mode="next", # can be either 'next', 'previous', or 'both'
)
postprocessor.postprocess_nodes(nodes)

(Beta) AutoPrevNextNodePostprocessor#
与 PrevNextNodePostprocessor 相同,但允许 LLM 决定模式(后置、前置或两者)。
from llama_index.core.postprocessor import AutoPrevNextNodePostprocessor
postprocessor = AutoPrevNextNodePostprocessor(
docstore=index.docstore,
service_context=service_context,
num_nodes=1, # number of nodes to fetch when looking forawrds or backwards)
)
postprocessor.postprocess_nodes(nodes)
完整的示例 notebook 可在这里找到。
(Beta) RankGPT#
使用 RankGPT Agent 根据相关性对文档进行重排序。返回排名前 N 的节点。
from llama_index.postprocessor.rankgpt_rerank import RankGPTRerank
postprocessor = RankGPTRerank(top_n=3, llm=OpenAI(model="gpt-3.5-turbo-16k"))
postprocessor.postprocess_nodes(nodes)
完整的 notebook 指南可在这里找到。
Colbert Reranker#
使用 Colbert V2 模型作为重排序器,根据查询 token 和段落 token 之间的细粒度相似度对文档进行重排序。返回排名前 N 的节点。
from llama_index.postprocessor.colbert_rerank import ColbertRerank
colbert_reranker = ColbertRerank(
top_n=5,
model="colbert-ir/colbertv2.0",
tokenizer="colbert-ir/colbertv2.0",
keep_retrieval_score=True,
)
query_engine = index.as_query_engine(
similarity_top_k=10,
node_postprocessors=[colbert_reranker],
)
response = query_engine.query(
query_str,
)
完整的 notebook 指南可在这里找到。
rankLLM#
使用来自 rankLLM 的模型对文档进行重排序。返回排名前 N 的节点。
from llama_index.postprocessor.rankllm_rerank import RankLLMRerank
# RankZephyr reranker, return top 5 candidates
reranker = RankLLMRerank(model="rank_zephyr", top_n=5)
reranker.postprocess_nodes(nodes)
完整的 notebook 示例可用。