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)

相关推荐
uncle_ll2 天前
LlamaIndex 全栈实战指南:架构解构、RAG 核心原理与私有知识库工程化落地方案
架构·llm·agent·rag·llamaindex
练习两年半的攻城狮3 天前
RAG 系统中 Excel/表格数据的正确处理方式
python·llamaindex
练习两年半的攻城狮4 天前
FastAPI + LlamaIndex Agent 流式对话踩坑实录
fastapi·llamaindex
云烟成雨TD5 天前
LlamaIndex 系列【5】智能体开发:大语言模型接入与基础调用
ai·agent·rag·llamaindex
云烟成雨TD6 天前
LlamaIndex 系列【3】上下文增强驱动的 LLM 应用开发框架
ai·agent·rag·llamaindex
云烟成雨TD6 天前
LlamaIndex 系列【4】入门案例(阿里云百炼适配)
ai·agent·rag·llamaindex
gis分享者7 天前
LangChain 和 LlamaIndex 有什么区别?各自适合什么场景?
人工智能·ai·langchain·场景·区别·llamaindex
练习两年半的攻城狮16 天前
LlamaIndex ResponseMode 深度解析
python·llamaindex
染指111018 天前
79.高级RAG-md文档元素分割器
markdown·rag·llama_index·llamaindex
染指111018 天前
80.高级RAG-LLamaIndex实际应用-金融助手
人工智能·rag·llama_index·llamaindex