【AI大模型学习路线】第三阶段之RAG与LangChain——第十七章(Advanced RAG[2])Sentence windows retrieval?
【AI大模型学习路线】第三阶段之RAG与LangChain——第十七章(Advanced RAG[2])Sentence windows retrieval?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/148709313
📌 一、背景介绍:为什么需要 Sentence Windows Retrieval?
在标准的 RAG 流程中,向量检索(如通过 FAISS)通常是基于完整的 chunk(文档块)进行的。但实际场景中,一个段落的某一句话可能才是用户问题的核心答案,而这句话所在 chunk 太大、或者语义分散,可能导致:
- 检索到相关性低的 chunk;
- 或者检索到包含答案但生成模型无法聚焦其位置,导致 hallucination(幻觉)。
👉 为解决这个问题,Sentence Windows Retrieval 提出了基于“句子粒度”的检索方式,同时在每个相关句子周围添加窗口上下文,提升信息的精确度和完整性。
📘 二、什么是 Sentence Windows Retrieval?
定义:
- Sentence Windows Retrieval 是将文档切分为句子级单位,然后检索最相关的句子,并在其上下添加固定数量的上下文句子,组成一个“窗口”,作为最终返回的内容给 RAG 模型使用。
优点:
- 提高检索粒度:避免冗余信息;
- 保留上下文语义:不因句子独立而丢失上下文;
- 提升生成模型理解力:答案精度更高。
🧠 三、LangChain 中的 Advanced RAG(2): Sentence Windows Retrieval
LangChain 在第十七章“Advanced RAG(2)”中内置支持此方式,主要流程如下:
✅ 步骤简述:
- 文本按句子切分
- 每句做 Embedding 向量化
- 用户提问 → 检索最相关句子
- 在该句子周围向前向后扩展 N 个句子
- 拼接窗口,作为最终检索文档
- 传入 LLM(大模型)用于生成回答
🧪 四、Python 实战:LangChain 中实现 Sentence Windows Retrieval
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import SentenceTransformersTokenTextSplitter
from langchain.document_loaders import TextLoader
from langchain.retrievers import SentenceWindowRetriever
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
# 加载文档
loader = TextLoader("your_document.txt")
docs = loader.load()
# 步骤 1:句子切分(使用句子级切割器)
splitter = SentenceTransformersTokenTextSplitter()
split_docs = splitter.split_documents(docs)
# 步骤 2:Embedding 向量化 + 建立 FAISS 向量库
embedding_model = OpenAIEmbeddings()
vectordb = FAISS.from_documents(split_docs, embedding_model)
# 步骤 3:构造 Sentence Windows 检索器
retriever = SentenceWindowRetriever.from_vectorstore(
vectordb,
window_size=2, # 向前/向后各扩展2句
search_type="similarity", # 使用相似度检索
)
# 步骤 4:构建 RAG QA 链
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(temperature=0),
retriever=retriever,
return_source_documents=True
)
# 步骤 5:提问
query = "人工智能大模型是如何实现多模态理解的?"
result = qa_chain(query)
print(result["result"])
⚙️ 参数说明
参数 | 含义 |
---|---|
window_size | 向左右各扩展几句 |
SentenceWindowRetriever | LangChain 提供的句子级检索封装 |
splitter | 可替换为自定义句子切分器 |
retriever | 可与任意 FAISS/HNSW 向量库配合使用 |
search_type | 支持 "similarity" 或 "mmr" |
🎯 五、与大模型结合的意义
RAG + Sentence Window Retrieval 是当前大模型应用的重要发展方向,解决了大模型:
- 知识有限(非实时)
- 长文档无法精读
- 生成偏离源事实
等问题。结合 LangChain,你可以构建自己的问答系统,具备高精度检索 + 上下文理解能力。
✅ 总结一句话:
- Sentence Windows Retrieval 是将文档拆分为句子,通过检索关键句并附加上下文窗口,提升 RAG 系统的检索精度与生成效果,是当前 LangChain 和大模型融合应用中的关键技术。