RAG技术原理
是一种结合检索与生成的自然语言处理技术,是为了提升生成式模型在特定领域的回答性能。通过引入知识库,使用检索模块从大量的文档中查询出相关信息,提供给大模型,生成更准确的回答。
标准流程
RAG技术分为三个阶段:
- 索引,将文档进行分块,通过向量嵌入技术将文档块向量化后存入向量数据库中。
- 检索,从向量数据库中检索出与问题语义相似的文档块。
- 生成,将检索出的文档块和prompt提供给大模型,生成回答。
一个demo代码
from langchain_community.document_loaders import PyPDFLoader # PDF文档提取
from langchain_text_splitters import RecursiveCharacterTextSplitter # 文档拆分chunk
from sentence_transformers import SentenceTransformer # 加载和使用Embedding模型
import faiss # Faiss向量库
import numpy as np # 处理嵌入向量数据,用于Faiss向量检索
import os # 引入操作系统库,后续配置环境变量与获得当前文件路径使用
os.environ["TOKENIZERS_PARALLELISM"] = "false" # 不使用分词并行化操作, 避免多线程或多进程环境中运行多个模型引发冲突或死锁
os.environ['OPENAI_API_KEY'] = 'sk-Ye9osqK6VfP8AhnONNtf3VIkzh2rAUnDeoPLWv6y3jO00vnb'
os.environ["OPENAI_API_BASE"] = "https://api.chatanywhere.tech/v1"
# 创建模型实例
from langchain_openai import ChatOpenAI
def load_embedding_model():
"""
加载bge-small-zh-v1.5模型
:return: 返回加载的bge-small-zh-v1.5模型
"""
print(f"加载Embedding模型中")
# SentenceTransformer读取绝对路径下的bge-small-zh-v1.5模型,非下载
embedding_model = SentenceTransformer(os.path.abspath('bge-small-zh-v1.5'))
print(f"bge-small-zh-v1.5模型最大输入长度: {embedding_model.max_seq_length}")
return embedding_model
def indexing_process(pdf_file, embedding_model):
"""
索引流程:加载PDF文件,并将其内容分割成小块,计算这些小块的嵌入向量并将其存储在FAISS向量数据库中。
:param pdf_file: PDF文件路径
:param embedding_model: 预加载的嵌入模型
:return: 返回Faiss嵌入向量索引和分割后的文本块原始内容列表
"""
# PyPDFLoader加载PDF文件,忽略图片提取
pdf_loader = PyPDFLoader(pdf_file, extract_images=False)
# 配置RecursiveCharacterTextSplitter分割文本块库参数,每个文本块的大小为512字符(非token),相邻文本块之间的重叠128字符(非token)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512, chunk_overlap=128
)
# 加载PDF文档,提取所有页的文本内容
pdf_content_list = pdf_loader.load()
# 将每页的文本内容用换行符连接,合并为PDF文档的完整文本
pdf_text = "\n".join([page.page_content for page in pdf_content_list])
print(f"PDF文档的总字符数: {len(pdf_text)}")
# 将PDF文档文本分割成文本块Chunk
chunks = text_splitter.split_text(pdf_text)
print(f"分割的文本Chunk数量: {len(chunks)}")
# 文本块转化为嵌入向量列表,normalize_embeddings表示对嵌入向量进行归一化,用于准确计算相似度
embeddings = []
for chunk in chunks:
embedding = embedding_model.encode(chunk, normalize_embeddings=True)
embeddings.append(embedding)
print("文本块Chunk转化为嵌入向量完成")
# 将嵌入向量列表转化为numpy数组,Faiss向量库操作需要numpy数组输入
embeddings_np = np.array(embeddings)
# 获取嵌入向量的维度(每个向量的长度)
dimension = embeddings_np.shape[1]
# 使用余弦相似度创建FAISS索引
index = faiss.IndexFlatIP(dimension)
# 将所有的嵌入向量添加到FAISS索引中,后续可以用来进行相似性检索
index.add(embeddings_np)
print("索引过程完成.")
return index, chunks
def retrieval_process(query, index, chunks, embedding_model, top_k=3):
"""
检索流程:将用户查询Query转化为嵌入向量,并在Faiss索引中检索最相似的前k个文本块。
:param query: 用户查询语句
:param index: 已建立的Faiss向量索引
:param chunks: 原始文本块内容列表
:param embedding_model: 预加载的嵌入模型
:param top_k: 返回最相似的前K个结果
:return: 返回最相似的文本块及其相似度得分
"""
# 将查询转化为嵌入向量,normalize_embeddings表示对嵌入向量进行归一化
query_embedding = embedding_model.encode(query, normalize_embeddings=True)
# 将嵌入向量转化为numpy数组,Faiss索引操作需要numpy数组输入
query_embedding = np.array([query_embedding])
# 在 Faiss 索引中使用 query_embedding 进行搜索,检索出最相似的前 top_k 个结果。
# 返回查询向量与每个返回结果之间的相似度得分(在使用余弦相似度时,值越大越相似)排名列表distances,最相似的 top_k 个文本块在原始 chunks 列表中的索引indices。
distances, indices = index.search(query_embedding, top_k)
print(f"查询语句: {query}")
print(f"最相似的前{top_k}个文本块:")
# 输出查询出的top_k个文本块及其相似度得分
results = []
for i in range(top_k):
# 获取相似文本块的原始内容
result_chunk = chunks[indices[0][i]]
print(f"文本块 {i}:\n{result_chunk}")
# 获取相似文本块的相似度得分
result_distance = distances[0][i]
print(f"相似度得分: {result_distance}\n")
# 将相似文本块存储在结果列表中
results.append(result_chunk)
print("检索过程完成.")
return results
def generate_process(query, chunks):
"""
生成流程:调用Qwen大模型云端API,根据查询和文本块生成最终回复。
:param query: 用户查询语句
:param chunks: 从检索过程中获得的相关文本块上下文chunks
:return: 返回生成的响应内容
"""
# 构建参考文档内容,格式为“参考文档1: \n 参考文档2: \n ...”等
context = ""
for i, chunk in enumerate(chunks):
context += f"参考文档{i + 1}: \n{chunk}\n\n"
# 构建生成模型所需的Prompt,包含用户查询和检索到的上下文
prompt = f"根据参考文档回答问题:{query}\n\n{context}"
print(f"生成模型的Prompt: {prompt}")
# 准备请求消息,将prompt作为输入
messages = [{'role': 'user', 'content': prompt}]
model = ChatOpenAI(model_name='gpt-3.5-turbo')
# 调用大模型API云服务生成响应
try:
# 2. 使用 DeepSeek 模型生成回答
response = model.invoke(messages)
# 初始化变量以存储生成的响应内容
generated_response = ""
print("生成过程开始:")
# 逐步获取和处理模型的增量输出
print(response.content)
except Exception as e:
print(f"大模型生成过程中发生错误: {e}")
return None
def main():
print("RAG过程开始.")
query = "下面报告中涉及了哪几个行业的案例以及总结各自面临的挑战?"
embedding_model = load_embedding_model()
# 索引流程:加载PDF文件,分割文本块,计算嵌入向量,存储在FAISS向量库中(内存)
index, chunks = indexing_process('test_lesson2.pdf', embedding_model)
# 检索流程:将用户查询转化为嵌入向量,检索最相似的文本块
retrieval_chunks = retrieval_process(query, index, chunks, embedding_model)
# 生成流程:调用Qwen大模型生成响应
generate_process(query, retrieval_chunks)
print("RAG过程结束.")
if __name__ == "__main__":
main()
输出:
/Users/mac/PycharmProjects/rag/.venv/bin/python /Users/mac/PycharmProjects/rag/lesson_2.py
RAG过程开始.
加载Embedding模型中
bge-small-zh-v1.5模型最大输入长度: 512
PDF文档的总字符数: 9163
分割的文本Chunk数量: 24
文本块Chunk转化为嵌入向量完成
索引过程完成.
查询语句: 下面报告中涉及了哪几个行业的案例以及总结各自面临的挑战?
最相似的前3个文本块:
文本块 0:
面的数字化转型。
2.3.2 面临的挑战
在数字化转型之前,金融业案例中银行面临以下主要挑战:客户服务模式过时,主要依赖实
体网点,导致服务效率低、客户体验差;金融科技企业带来巨大竞争压力,凭借创新技术和
便捷服务吸引大量客户,尤其是年轻一代;数据孤岛和风险管理滞后,各业务部门缺乏数据
共享机制,导致信息无法整合,风险管理效率低。
2.3.3 数字化转型解决方案
为应对金融业案例挑战,银行实施了多方面的数字化转型措施:首先,构建数字化银行平台,
推出移动银行应用、在线服务、虚拟客服和智能理财顾问,显著提升了服务便捷性和客户满
意度;其次,引入人工智能和大数据分析技术,通过个性化金融产品推荐和实时风险监控,
提升客户服务质量和风险管理能力。
相似度得分: 0.5915017127990723
文本块 1:
导致效率低且易出错;供应链复杂,涉及多个国家和地区,信息传递不及时,造成库存管理
困难,甚至存在供应链断裂的风险;客户需求变化快,传统大规模生产方式无法满足市场对
个性化定制产品的需求。
2.1.3 数字化转型解决方案
为了应对制造业上述挑战,公司通过以下步骤进行数字化转型:首先,引入工业 4.0 技术,
包括物联网(IoT)、人工智能(AI)、大数据分析和机器人自动化,以优化生产线;其次,
构建基于云计算的智能供应链管理系统,实现供应链的端到端可视化管理。
2.2 案例二:零售业的数字化转型
2.2.1 公司背景
零售业案例讲述了一家全球知名的快时尚服装零售企业,面对电子商务的崛起和消费者购物
行为的快速变化,传统零售模式受到巨大挑战。为保持市场竞争力并满足消费者日益增长的
数字化需求,公司决定实施全面的数字化转型战略。
2.2.2 面临的挑战
在数字化转型之前,零售业案例的公司面临以下挑战:线上线下渠道割裂,导致库存管理不
统一、客户体验不一致,难以提供无缝购物体验;数据利用率低,尽管拥有大量消费者和销
售数据,但缺乏先进的数据分析工具,未能转化为可操作的商业洞察。
2.2.3 数字化转型解决方案
相似度得分: 0.5728525519371033
文本块 2:
统一、客户体验不一致,难以提供无缝购物体验;数据利用率低,尽管拥有大量消费者和销
售数据,但缺乏先进的数据分析工具,未能转化为可操作的商业洞察。
2.2.3 数字化转型解决方案
为了解决零售业案例的线上线下渠道割裂、数据利用率低、供应链效率低下和客户体验滞后
等问题,公司实施了一系列数字化转型措施:首先,构建全渠道零售平台,实现线上与线下
购物渠道的无缝整合,提升顾客的便利性和满意度;其次,引入大数据和人工智能驱动的分
析平台,精准预测需求、优化库存,并提供个性化产品推荐和营销活动。
2.3 案例三:金融业的数字化转型
2.3.1 公司背景
金融业案例中的金融机构是一家全球知名的银行,成立已有百年历史。随着金融科技
(FinTech)的迅速发展以及消费者对在线金融服务需求的增加,传统银行业务模式面临前
所未有的挑战。为了保持市场竞争力并满足客户日益增长的数字化需求,该银行决定开展全
面的数字化转型。
2.3.2 面临的挑战
在数字化转型之前,金融业案例中银行面临以下主要挑战:客户服务模式过时,主要依赖实
体网点,导致服务效率低、客户体验差;金融科技企业带来巨大竞争压力,凭借创新技术和
相似度得分: 0.5637902021408081
检索过程完成.
生成模型的Prompt: 根据参考文档回答问题:下面报告中涉及了哪几个行业的案例以及总结各自面临的挑战?
参考文档1:
面的数字化转型。
2.3.2 面临的挑战
在数字化转型之前,金融业案例中银行面临以下主要挑战:客户服务模式过时,主要依赖实
体网点,导致服务效率低、客户体验差;金融科技企业带来巨大竞争压力,凭借创新技术和
便捷服务吸引大量客户,尤其是年轻一代;数据孤岛和风险管理滞后,各业务部门缺乏数据
共享机制,导致信息无法整合,风险管理效率低。
2.3.3 数字化转型解决方案
为应对金融业案例挑战,银行实施了多方面的数字化转型措施:首先,构建数字化银行平台,
推出移动银行应用、在线服务、虚拟客服和智能理财顾问,显著提升了服务便捷性和客户满
意度;其次,引入人工智能和大数据分析技术,通过个性化金融产品推荐和实时风险监控,
提升客户服务质量和风险管理能力。
参考文档2:
导致效率低且易出错;供应链复杂,涉及多个国家和地区,信息传递不及时,造成库存管理
困难,甚至存在供应链断裂的风险;客户需求变化快,传统大规模生产方式无法满足市场对
个性化定制产品的需求。
2.1.3 数字化转型解决方案
为了应对制造业上述挑战,公司通过以下步骤进行数字化转型:首先,引入工业 4.0 技术,
包括物联网(IoT)、人工智能(AI)、大数据分析和机器人自动化,以优化生产线;其次,
构建基于云计算的智能供应链管理系统,实现供应链的端到端可视化管理。
2.2 案例二:零售业的数字化转型
2.2.1 公司背景
零售业案例讲述了一家全球知名的快时尚服装零售企业,面对电子商务的崛起和消费者购物
行为的快速变化,传统零售模式受到巨大挑战。为保持市场竞争力并满足消费者日益增长的
数字化需求,公司决定实施全面的数字化转型战略。
2.2.2 面临的挑战
在数字化转型之前,零售业案例的公司面临以下挑战:线上线下渠道割裂,导致库存管理不
统一、客户体验不一致,难以提供无缝购物体验;数据利用率低,尽管拥有大量消费者和销
售数据,但缺乏先进的数据分析工具,未能转化为可操作的商业洞察。
2.2.3 数字化转型解决方案
参考文档3:
统一、客户体验不一致,难以提供无缝购物体验;数据利用率低,尽管拥有大量消费者和销
售数据,但缺乏先进的数据分析工具,未能转化为可操作的商业洞察。
2.2.3 数字化转型解决方案
为了解决零售业案例的线上线下渠道割裂、数据利用率低、供应链效率低下和客户体验滞后
等问题,公司实施了一系列数字化转型措施:首先,构建全渠道零售平台,实现线上与线下
购物渠道的无缝整合,提升顾客的便利性和满意度;其次,引入大数据和人工智能驱动的分
析平台,精准预测需求、优化库存,并提供个性化产品推荐和营销活动。
2.3 案例三:金融业的数字化转型
2.3.1 公司背景
金融业案例中的金融机构是一家全球知名的银行,成立已有百年历史。随着金融科技
(FinTech)的迅速发展以及消费者对在线金融服务需求的增加,传统银行业务模式面临前
所未有的挑战。为了保持市场竞争力并满足客户日益增长的数字化需求,该银行决定开展全
面的数字化转型。
2.3.2 面临的挑战
在数字化转型之前,金融业案例中银行面临以下主要挑战:客户服务模式过时,主要依赖实
体网点,导致服务效率低、客户体验差;金融科技企业带来巨大竞争压力,凭借创新技术和
生成过程开始:
content='数字化服务吸引大量客户,尤其是年轻一代;数据孤岛和风险管理滞后,各业务部门缺乏数据共享机制,导致信息无法整合,风险管理效率低。\n2.3.3 数字化转型解决方案\n为了解决金融业案例中的挑战,银行实施了多方面的数字化转型措施:首先,推出移动银行应用、在线服务、虚拟客服和智能理财顾问,以提升服务便捷性和客户满意度;其次,引入人工智能和大数据分析技术,通过个性化金融产品推荐和实时风险监控,提升客户服务质量和风险管理能力。\n\n综上所述,参考文档中涉及了金融业、制造业和零售业的案例,总结各自面临的挑战及采取的数字化转型解决方案。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 300, 'prompt_tokens': 1570, 'total_tokens': 1870, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'id': 'chatcmpl-Cjpx6IsvfzOsoLiusVnVYVJldPagN', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None} id='run--58b48c32-9c98-4594-8ebd-9d9e4dc7ee1b-0' usage_metadata={'input_tokens': 1570, 'output_tokens': 300, 'total_tokens': 1870, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
数字化服务吸引大量客户,尤其是年轻一代;数据孤岛和风险管理滞后,各业务部门缺乏数据共享机制,导致信息无法整合,风险管理效率低。
2.3.3 数字化转型解决方案
为了解决金融业案例中的挑战,银行实施了多方面的数字化转型措施:首先,推出移动银行应用、在线服务、虚拟客服和智能理财顾问,以提升服务便捷性和客户满意度;其次,引入人工智能和大数据分析技术,通过个性化金融产品推荐和实时风险监控,提升客户服务质量和风险管理能力。
综上所述,参考文档中涉及了金融业、制造业和零售业的案例,总结各自面临的挑战及采取的数字化转型解决方案。
RAG过程结束.
Process finished with exit code 0
好像存在文档块断裂的问题。
索引之文档解析
LangChain 提供了一套功能强大的文档加载器(Document Loaders),帮助开发者轻松地将数据源中的内容加载为文档对象。LangChain 定义了 BaseLoader 类和 Document 类,其中 BaseLoader 类负责定义如何从不同数据源加载文档,而 Document 类则统一描述了不同文档类型的元数据。
开发者可以基于 BaseLoader 类为特定数据源创建自定义加载器,并将其内容加载为 Document 对象。
langchain_community 是 LangChain 与常用第三方库相结合的拓展库。各类开源库和企业库基于 BaseLoader 类在 langchain_community 库中扩展了不同文档类型的加载器,这些加载器被归类于 langchain_community.document_loaders 模块中。每个加载器都可以输入对应的参数,如指定文档解析编码、解析特定元素等,以及对 Document 类进行提取或检索等操作。
Document Loader 模块是封装好的各种文档解析库集成 SDK,项目中使用还需要安装对应的文档解析库。
PDF文档解析
DF 文件在我们的业务场景中占有最高的比例,广泛应用于商业、学术和个人领域。尽管 PDF 文件的内容在表达图像、文字和表格信息,但其本质上是一系列显示和打印指令的集合。
PDF 文件的显示效果不受设备、软件或系统的影响,但对计算机而言,它是一种非数据结构化的格式,储存的信息无法直接被理解。此外,大模型的训练数据中不包含直接的 PDF 文件,无法直接理解。PDF 解析,对于纯文本格式可以转换为文本字符串,而对于包含多种元素的复杂格式,选择 MarkDown 文件作为统一的输出格式最为合适。这是因为 MarkDown 文件关注内容本身,而非打印格式,能够表示多种文档元素内容。MarkDown 格式被广泛接受于互联网世界,其信息能够被大模型理解。
分块策略与Embedding技术
分块的重要性在于它直接影响 RAG 系统的生成质量。合理的分块能够确保检索到的片段与用户查询信息高度匹配,避免信息冗余或丢失。
固定大小分块
将文档按固定大小进行分块,简单,但是无法考虑上下文问题。
重叠分块
使新文本块与前一个块的内容部分重叠,从而保留块边界处的重要上下文信息,增强系统的语义相关性。虽然这种方法增加了存储需求和冗余信息,但它有效避免了在块之间丢失关键语义或句法结构。
递归分块
通过预定义的文本分隔符(如换行符\n\n、\n ,句号、逗号、感叹号、空格等)迭代地将文本分解为更小的块,以实现段大小的均匀性和语义完整性。此过程中,文本首先按较大的逻辑单元分割(如段落 \n\n),然后逐步递归到较小单元(如句子 \n 和单词),确保在分块大小限制内保留最强的语义片段。
文档特定分块
根据文档的格式(如 Markdown、Latex、或编程语言如 Python 等)进行定制化分割的技术。此方法依据文档的特定格式和结构规则,例如 Markdown 的标题、列表项,或 Python 代码中的函数和类定义等,来确定分块边界。通过这种方式,确保分块能够准确反映文档的格式特点,优化保留这些语义完整的单元,提升后续的处理和分析效果。
语义分块
基于文本的自然语言边界(如句子、段落或主题中断)进行分段的技术,需要使用 NLP 技术根据语义分词分句,旨在确保每个分块都包含语义连贯的信息单元。语义分块保留了较高的上下文保留,并确保每个块都包含连贯的信息,但需要更多的计算资源。常用的分块策略有 spaCy 和 NLTK 的 NLP 库,spaCy 适用于需要高效、精准语义切分的大规模文本处理,NLTK 更适合教学、研究和需要灵活自定义的语义切分任务。
embedding嵌入
Embedding 嵌入是指将文本、图像、音频、视频等形式的信息映射为高维空间中的密集向量表示。这些向量在语义空间中起到坐标的作用,捕捉对象之间的语义关系和隐含的意义。通过在向量空间中进行计算(例如余弦相似度),可以量化和衡量这些对象之间的语义相似性。
向量是一组在高维空间中定义点的数值数组,而嵌入则是将信息(如文本)转化为这种向量表示的过程。这些向量能够捕捉数据的语义及其他重要特征,使得语义相近的对象在向量空间中彼此邻近,而语义相异的对象则相距较远。向量检索(Vector Retrieval)是一种基于向量表示的搜索技术,通过计算查询向量与已知文本向量的相似度来识别最相关的文本数据。向量检索的高效性在于,它能在大规模数据集中快速、准确地找到与查询最相关的内容,这得益于向量表示中蕴含的丰富语义信息。
向量数据库
向量数据库的核心在于其能够基于向量之间的相似性,快速、精确地定位和检索数据。
向量数据库的操作逻辑则是基于相似性搜索,即在查询时,应用特定的相似性度量(如余弦相似度、欧几里得距离等)来查找与查询向量最相似的向量。
向量数据库的核心在于其高效的索引和搜索机制。为了优化查询性能,它采用了如哈希、量化和基于图形的多种算法。这些算法通过构建如层次化可导航小世界(HNSW)图、产品量化(PQ)和位置敏感哈希(LSH)等索引结构,显著提升了查询速度。这种搜索过程并非追求绝对精确,而是通过近似最近邻(ANN)算法在速度与准确性之间进行权衡,从而实现快速响应。
向量数据库的索引结构可以理解为一种预处理步骤,类似于为图书馆中的书籍编制索引,方便快速找到所需内容。HNSW 图通过在多层结构中将相似向量连接在一起,快速缩小搜索范围。PQ 则通过压缩高维向量,减少内存占用并加速检索,而 LSH 则通过哈希函数将相似向量聚集在一起,便于快速定位。
向量数据库的搜索机制不是追求精确匹配,而是通过近似最近邻(ANN)算法在速度与准确性之间找到最佳平衡。ANN 算法通过允许一定程度的误差,在显著提高搜索速度的同时,依然能够找到与查询相似度较高的向量。这种策略对于需要实时、高精度响应的应用场景尤为重要。
向量搜索在接收到查询后,数据库通过已建立的索引结构执行相似性搜索,找出与查询向量最为接近的数据点。这一阶段的重点在于平衡搜索的速度与准确性,确保在大数据环境下提供快速且相关的查询结果。常见的向量搜索方法包括余弦相似度、欧几里得距离和曼哈顿距离。其中,余弦相似度主要用于文本处理和信息检索,关注向量之间的角度,以捕捉语义相似性;欧几里得距离则测量向量之间的实际距离,适用于密集特征集的聚类或分类;而曼哈顿距离则通过计算笛卡尔坐标中的绝对差值之和,适用于稀疏数据的处理。
混合检索与重排序技术
合检索,又称融合检索 / 多路召回,是指在检索过程中同时采用多种检索方式,并将各类检索结果进行融合,从而得到最终的检索结果。混合检索的优势在于能够充分利用不同检索方式的优点,弥补各自的不足,从而提升检索的准确性和效率。
尽管向量检索技术能够为每个文档块生成初步的相关性分数,但引入重排序模型仍然至关重要。向量检索主要依赖于全局语义相似性,通过将查询和文档映射到高维语义空间中进行匹配。然而,这种方法往往忽略了查询与文档具体内容之间的细粒度交互。重排序模型大多是基于双塔或交叉编码架构的模型,在此基础上进一步计算更精确的相关性分数,能够捕捉查询词与文档块之间更细致的相关性,从而在细节层面上提高检索精度。因此,尽管向量检索提供了有效的初步筛选,重排序模型则通过更深入的分析和排序,确保最终结果在语义和内容层面上更紧密地契合查询意图,实现了检索质量的提升。