LLAMAINDEX 分租户 部门:Filter过滤+节点后处理

检索器作用:

  • 1向量模型的语义过滤(更具问题的向量和向量存储数据进行向量匹配)
  • 2 使用元数据过滤

初步作用

1 创建是加入metadata属性

2创建 过滤器

3 使用检索器(index.as_retriever())过滤器(检索器内使用 或者如下简单使用)

  • 基础元数据过滤器(MetadataFilter)
  • 精确匹配过滤器(ExactMatchFilter)
  • 嵌套的MetadataFilters实例
from llama_index.core.vector_store.types import MetadataFilter,ExactMatchFilter
documents = SimpleDirectoryReader("data").load_data()
for document in documents:
    document.metadata['department']="ABC"
#添加元数据 department为ABC 单文件也是同样返回list类型
#之后就是节点化
#过滤模块 ExactMatchFilter 和MetadataFilters
#filters过滤,下面创建了ABC部门的过滤器
filtersABC=MetadataFilters(
    filters=[ExactMatchFilter(key="department",value="ABC")]
)
实际使用最简单的查询 index对象
xxx=index.as_query_engine(filters=filtersABC)

正式查询 RetrieverQueryEngine

from llama_index.core.query_engine import RetrieverQueryEngine

下面正式简写的逻辑代码

from llama_index.core import VectorStoreIndex, get_response_synthesizer
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.postprocessor import SimilarityPostprocessor
# 1. 新增过滤器相关导入
from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
# 2. 建立过滤器
filtersABC = MetadataFilters(
    filters=[ExactMatchFilter(key="department", value="ABC")]
)
# 3. 建索引(保持不变)
index = VectorStoreIndex.from_documents(documents)
# 4. 把过滤器挂到检索器,similarity_top_k相似度最高的10个结果,使用过滤器filtersABC过滤此处还用向量模型更具问题向量与向量库进行匹配并将score值附上,以此给下面的节点后处理的相似度过滤器使用
retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=10,
    filters=filtersABC          # <── 关键一句
)
# 5. 响应器的创建,下面使用默认配置
response_synthesizer = get_response_synthesizer()
# 6.创建查询器 检索器来的数据,响应器,节点后处理(相似度大于0.7)
query_engine = RetrieverQueryEngine(
    retriever=retriever,
    response_synthesizer=response_synthesizer,
    node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.7)],
)
response = query_engine.query("What did the author do growing up?")
print(response)

再加上节点关键词后处理KeywordNodePostprocessor

from llama_index.core.postprocessor import KeywordNodePostprocessor
#和相似度一个地方导入
keyword_filter = KeywordNodePostprocessor(
    required_keywords=["author", "childhood"],   # 必须同时出现
    exclude_keywords=["fiction", "novel"]        # 一旦出现就整段扔掉
)
#在其中查询加入:
node_postprocessors=[
        SimilarityPostprocessor(similarity_cutoff=0.7),  # 1. 先卡相似度
        keyword_filter,                                  # 2. 再卡关键词
    ]

前后节点PrevNextNodePostprocessor一起拉回来,实现更好的上下文

from llama_index.core.postprocessor import PrevNextNodePostprocessor
#和相似度一个地方导入
prev_next = PrevNextNodePostprocessor(
    num_prev=1,      # 往前多拿 1 个
    num_next=1,      # 往后多拿 1 个
    include_original=True,   # 把原始节点也保留
)
#在其中查询加入:
node_postprocessors=[
        SimilarityPostprocessor(similarity_cutoff=0.7),  # ① 相似度
        keyword_filter,                                  # ② 关键词
        prev_next,                                       # ③ 扩上下文
    ],

加上时间顺序

from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
for doc in documents:
    doc.metadata["date"] = "2025-12-12"   # 统一日期
from llama_index.core.postprocessor import FixedRecencyPostprocessor
#和相似度一个地方导入
# 1. 按 metadata 里的 "date" 字段排序,只留最新的 5 个节点
recency = FixedRecencyPostprocessor(
    top_k=5,               # 保留最新 5 个
    date_key="date"        # 对应 metadata 中的时间字段名
)
#在其中查询加入:
 node_postprocessors=[
        SimilarityPostprocessor(similarity_cutoff=0.7),  # ① 相似度
        keyword_filter,                                  # ② 关键词
        prev_next,                                       # ③ 扩上下文
        recency,                                         # ④ 只留最新 5 个
    ],

EmbeddingRecencyPostprocessor TimeWeightedPostprocessor

参数EmbeddingRecencyPostprocessorTimeWeightedPostprocessor说明
alpha✅ 0→1 可调❌ 无时间权重;0=只看向量,1=只看新鲜度
time_decay (λ)✅ 可调✅ 可调衰减系数;越大,旧文档得分掉得越快
top_k最终按综合分排序后保留多少节点
date_key✅ 默认 “date”✅ 默认 “date”节点 metadata 里的日期字段名
  • 想“稍微”让新文档靠前,但又不想误杀经典老文档
    → EmbeddingRecencyPostprocessor(alpha 设 0.3–0.5)
  • 业务只关心“最近一年”的内容,老文档基本无用
    → TimeWeightedPostprocessor(lambda 0.99–0.995)
  • 希望平滑调节“向量 vs 时间”天平
    → 只有 EmbeddingRecencyPostprocessor 能给 alpha 旋钮。

# 方案 A:线性插值
recency = EmbeddingRecencyPostprocessor(
    alpha=0.5,          # 时间占 50 %
    time_decay=0.995,   # 旧文档衰减斜率
    top_k=5,
    date_key="date"
)
# 方案 B:乘法衰减
time_weight = TimeWeightedPostprocessor(
    time_decay=0.995,
    top_k=5,
    date_key="date"
)

重排 LLMRerank 默认,需要在前后节点召回之前PrevNextNodePostprocessor省tokens

from llama_index.core.postprocessor import (
    SimilarityPostprocessor,
    KeywordNodePostprocessor,
    PrevNextNodePostprocessor,
    FixedRecencyPostprocessor,
    LLMRerank,  # ① 新增
)
llm_rerank = LLMRerank(top_n=4, choice_batch_size=3)  
# 一次让 LLM 评 3 条 一共回4条
query_engine = RetrieverQueryEngine(
    retriever=retriever,
    response_synthesizer=get_response_synthesizer(),
    node_postprocessors=[sim, key, date, llm_rerank, prev_next], 
)
###
向量召回 10 节点
→ similarity≥0.7
→ 含关键词
→ 取最新 7 个
→ LLM 重排选 3 个
→ 前后各补 1 个相邻节点
→ 送 LLM 生成答案

去重(MD5)DeduplicatePostProcessor(show_progress=True)

在重排LLMRerank之后,扩充上下文之前PrevNextNodePostprocessor

dedup=DeduplicatePostProcessor(show_progress=True)

时间硬截断 时间不在最新的几个节点,相当于最近时间的几个节点top_k。主要针对metadata中的时间元数据 date_key。reverse=False(默认False是升序,True则为最先的,自己看着办吧)

fixedt=FixedRecencyPostprocessor(top_k=8,date_key=’create_time’,reverse=False)

此条目发表在None分类目录。将固定链接加入收藏夹。

发表回复