检索器作用:
- 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
| 参数 | EmbeddingRecencyPostprocessor | TimeWeightedPostprocessor | 说明 |
|---|---|---|---|
| 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)