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)

相关推荐
染指11103 天前
72.高级RAG-sql检索器
python·sql·mysql·llama·llamaindex·高级rag
染指11105 天前
70.高级RAG-混合检索器(BM25和向量检索,RRF、归一化分数、DBSF公式详解,融合排序)
rag·llama_index·llamaindex
染指111012 天前
64.高级RAG-摄取管道
人工智能·llama_index·llamaindex·摄取管道
染指111016 天前
61.RAG-RAG存在的问题
人工智能·llama·rag·llama_index·llamaindex
染指111017 天前
60.llama_index-记忆(记忆存储到Redis)
llamaindex
染指111021 天前
56.llama_index-查询引擎
人工智能·llama·rag·llama_index·llamaindex
染指111024 天前
53.llama_index-向量存储、索引存储
数据库·redis·llama_index·llamaindex
染指11101 个月前
50.llama_index-文档分割器(文本)
llama·rag·llamaindex
染指11101 个月前
46.llama_index-提示词模板(富提示词模板、jinja2静态和动态模板)
llama·rag·llamaindex