跳到内容

节点后处理器模块#

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 示例可用。

所有 Notebook#