Day25:RAG检索+重排序保姆级入门!
引言:
前面我们已经搞定了文档解析、文本分块、Embedding向量化、向量库 ,相当于把所有资料整理好、存进了智能图书馆。但很多人踩坑:明明资料存了,大模型还是答非所问,检索出来的内容驴唇不对马嘴!
今天咱们就搞定RAG最核心的环节------检索.重排序,全程大白话.保姆级代码,通义千问在线版.本地Qwen:7b双版本,看完直接上手,彻底告别大模型"睁眼说瞎话"!
今日学习目标 ✅ 吃透RAG完整检索流程,搞懂每一步逻辑 ✅ 实现基础RAG问答,告别模型幻觉 ✅ 入门重排序(Rerank),优化检索准确率 ✅ 拿到可直接运行的双版本代码,今日输出直接达标
🧠 一、先搞懂:RAG检索到底是啥?
❌ 劝退式定义
RAG检索是通过用户问题向量化,在向量库中匹配相似文档,将上下文传入大模型生成回答的过程,重排序是对检索结果二次排序提升相关性
✅ 大白话讲解
RAG检索 = 图书馆找书 你问一个问题,先把问题变成向量(相当于把你的问题翻译成图书馆能懂的语言),然后去向量库里找最相关的文档片段 ,把找到的资料递给大模型,让模型只看着资料回答,不准自己瞎编!
重排序(Rerank)= 二次筛选好书 第一次检索可能找出5篇内容,有的相关、有的不相关,重排序就是把最相关的排前面,不相关的踢走,让模型只看最精准的资料,答案自然靠谱!
📊 基础RAG完整流程(一步都不落下)
-
用户提问:比如"2026年3月1年期LPR是多少?"
-
问题向量化:用Embedding把问题转成向量
-
向量库检索:匹配最相似的文档片段
-
(可选)重排序优化:二次筛选精准内容
-
传入大模型:把资料.问题一起给模型
-
生成回答:模型只看资料作答,无幻觉
🛠️ 环境一键安装(复制即跑,无报错)
bash
# 基础依赖,往期没装全的直接复制
pip install langchain langchain-community chromadb dashscope sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 重排序基础工具
pip install rank_bm25 -i https://pypi.tuna.tsinghua.edu.cn/simple/
💻 实战一:基础RAG问答代码(通义千问版,首选)
零难度,填个API Key就能跑,适配新手,直接实现精准问答!
python
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import TextLoader
# ===================== 核心配置(必填) =====================
os.environ["DASHSCOPE_API_KEY"] = "你的通义千问API Key"
# 向量库路径(沿用往期,没有就新建)
PERSIST_DIR = "./chroma_lpr_db"
# 测试文档(自己准备LPR相关txt)
TEST_FILE = "lpr_2026.txt"
# ===================== 1. 文档加载+分块 =====================
loader = TextLoader(TEST_FILE, encoding="utf-8")
docs = loader.load()
# 中文友好分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?"]
)
split_docs = text_splitter.split_documents(docs)
# ===================== 2. 向量库构建 =====================
embedding = DashScopeEmbeddings(model="text-embedding-v3")
vector_db = Chroma.from_documents(
documents=split_docs,
embedding=embedding,
persist_directory=PERSIST_DIR
)
vector_db.persist()
# 转为检索器
retriever = vector_db.as_retriever(search_kwargs={"k": 3})
# ===================== 3. 初始化大模型 =====================
llm = Tongyi(
model="qwen-plus",
temperature=0.1, # 低温防幻觉
max_tokens=512
)
# ===================== 4. 防幻觉Prompt模板 =====================
prompt_template = """
你是严谨的金融助手,只根据参考资料回答,绝对不编造,不知道就说"暂无相关内容"。
参考资料:{context}
用户问题:{question}
"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
# ===================== 5. 构建RAG问答链 =====================
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": PROMPT},
return_source_documents=True
)
# ===================== 测试运行 =====================
if __name__ == "__main__":
question = "2026年3月的1年期LPR是多少?"
print(f"🤖 正在提问:{question}")
result = qa_chain.invoke({"query": question})
print("\n" + "="*50)
print("✅ 最终回答:", result["result"])
print("="*50)
💻 实战二:基础重排序优化代码(新手入门版)
在基础检索后加一层简单重排序,准确率直接提升,代码改动极小!
python
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain.prompts import PromptTemplate
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_community.document_loaders import TextLoader
# 配置和基础版一致,直接复用
os.environ["DASHSCOPE_API_KEY"] = "你的通义千问API Key"
PERSIST_DIR = "./chroma_lpr_db"
TEST_FILE = "lpr_2026.txt"
# 复用基础版的文档加载、向量库、模型初始化
loader = TextLoader(TEST_FILE, encoding="utf-8")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
split_docs = text_splitter.split_documents(docs)
embedding = DashScopeEmbeddings(model="text-embedding-v3")
vector_db = Chroma.from_documents(split_docs, embedding, PERSIST_DIR)
base_retriever = vector_db.as_retriever(search_kwargs={"k": 5})
llm = Tongyi(model="qwen-plus", temperature=0.1)
# ===================== 核心:重排序优化 =====================
# 基础重排序器,过滤不相关内容
compressor = LLMChainExtractor.from_llm(llm)
# 构建带重排序的检索器
rerank_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=base_retriever
)
# 构建问答链
prompt_template = """
你是严谨的金融助手,只根据参考资料回答,绝对不编造,不知道就说"暂无相关内容"。
参考资料:{context}
用户问题:{question}
"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=rerank_retriever,
chain_type_kwargs={"prompt": PROMPT},
return_source_documents=True
)
# 测试
if __name__ == "__main__":
question = "2026年3月的1年期LPR是多少?"
result = qa_chain.invoke({"query": question})
print("\n" + "="*50)
print("✅ 重排序优化后回答:", result["result"])
print("="*50)
💡 本地Qwen:7b简易替换(无需API Key)
把模型部分替换成以下代码,即可用本地大模型运行:
python
from langchain_community.llms import Ollama
# 替换Tongyi,本地模型
llm = Ollama(model="qwen:7b", temperature=0.1)
# Embedding也换成本地版
from langchain_community.embeddings import HuggingFaceEmbeddings
embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
⚠️ 新手避坑指南
-
检索不准:把k值调大(比如3改5),多检索几条再重排序
-
模型还瞎编:temperature调0.1及以下,Prompt严格约束
-
向量库不生效:必须用和建库一致的Embedding模型
🎯 今日基础版总结
今天咱们彻底打通RAG核心流程,从基础检索 到入门重排序,双版本代码直接运行,再也不用怕大模型幻觉。基础版主打一个"听懂、会用、能跑通",新手完全无压力,今天的输出任务直接搞定!