73.高级RAG-后检索器(文档过滤)

内容参考于:图灵AI大模型全栈

过滤

它的作用是处理检索出来的数据,比如说之前通过BM25词频率检索出来的文档由于我们非要让它返回多个文档数据,导致有些都是0分,那么这些0分的就没必要拼接到提示词中给大模型了,或者说低于多少分,比如低于0.7、0.5这个分数很低的相关性可能就不会很大,所以就不要给大模型了,所以过滤的功能是把检索出来的一些相关性不高的文档删掉

一般0.7分以上的就是属于很相似的

llamaindex文档地址:https://developers.llamaindex.ai/python/framework-api-reference/postprocessor/

效果图:

下图中是检索出来的所以文档和文档的相关性分数

下图红框是通过,下图蓝框过滤器来过滤0.7分以下的数据得到的最终相关性的文档

代码:注意如果给RetrieverQueryEngine传递了node_postprocessors参数就不需要自己手动调用后处理器的代码了,所以说下方 retriever.retrieve和similarity_processor.postprocess_nodes代码可以删了

python 复制代码
from llama_index.core import (
    SimpleDirectoryReader,
    VectorStoreIndex
)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.postprocessor import SimilarityPostprocessor
from llama_index.core.query_engine import RetrieverQueryEngine
from base_llm import embed_model, llm

# 读取文档
documents = SimpleDirectoryReader(
    input_files=["./data_file/公司规章制度.txt"]
).load_data()

# 文档分割器
parser = SentenceSplitter(
    chunk_size=300,
    chunk_overlap=50
)

# 创建索引
index = VectorStoreIndex(
    parser.get_nodes_from_documents(documents),
    embed_model=embed_model
)

# 创建检索器,返回15个相关文档,但是不可能把15个都给大模型,所以需要后续使用后处理来处理检索出来的文档
# 广撒网,捞大鱼,丢小鱼
retriever = index.as_retriever(similarity_top_k=15)  # 先多召回15条

# 创建相似度的后处理器,小于0.7分就直接不要了
similarity_processor = SimilarityPostprocessor(similarity_cutoff=0.7)

# 创建问题查询引擎
query_engine = RetrieverQueryEngine.from_args(
    # 设置检索器
    retriever=retriever,
    # 设置大模型
    llm=llm,
    # 设置后处理器,后处理器可以传递多个
    # 所以说可以对文档进行不同的过滤处理,比如过滤和重排,重排是后面的内容,这里只写过滤
    # 执行顺序从上往下依次执行
    node_postprocessors=[
        similarity_processor,
    ],
)

# 问题
query = "公司上下班时间"

#
response = query_engine.query(query)
print("==== LLM回答 ====")
print(response)



# 下方的代码retriever.retrieve和similarity_processor.postprocess_nodes,是在不给 RetrieverQueryEngine.from_args 传递node_postprocessors参数的情况下写的
# 如果传递了node_postprocessors参数直接使用RetrieverQueryEngine.from_args(xx).query(query)就可以了
nodes = retriever.retrieve(query)
print("\n==== 检索节点分数 ====")
for node in nodes:
    print(f"Score: {node.score:.3f} | Text: {node.text[:100]}...")
# 把检索出来的文档节点给到后处理器(这里是过滤小于0.7分的)
# nodes就是通过检索器查出来的跟问题相关的文档节点
res = similarity_processor.postprocess_nodes(nodes)
print(res)

相关推荐
云烟成雨TD11 小时前
LlamaIndex 系列【29】检索增强策略:路由(Routing)机制
ai·agent·rag·llamaindex
一只小bit8 天前
LlamaIndex框架:简单RAG框架的全过程实现手册
llm·milvus·rag·llamaindex·deepseek
云烟成雨TD8 天前
LlamaIndex 系列【24】检索增强策略:交叉编码器(Cross‑Encoder)
ai·agent·rag·llamaindex
uncle_ll12 天前
智能客服实践:微调+RAG双引擎架构落地
llm·agent·智能客服·rag·llamaindex
云烟成雨TD13 天前
LlamaIndex 系列【21】语义检索(Semantic Search)
ai·agent·rag·llamaindex
云烟成雨TD13 天前
LlamaIndex 系列【20】关键词检索(Keyword Search):BM 25 算法
ai·agent·rag·llamaindex
云烟成雨TD15 天前
LlamaIndex 系列【14】数据接入流水线(IngestionPipeline)
ai·agent·rag·llamaindex
云烟成雨TD15 天前
LlamaIndex 系列【18】关键词检索(Keyword Search):TF-IDF 算法
ai·agent·llamaindex
2601_9623815820 天前
VSCode如何配置LlamaIndex RAG(检索增强生成)应用开发环境
vscode·开发环境·rag·llamaindex·检索增强生成
练习两年半的攻城狮21 天前
【RAG实战】知识库 BGE-M3 稀疏向量混合检索方案
python·fastapi·llamaindex