内容参考于:图灵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)


