Day25:RAG检索+重排序保姆级入门!

Day25:RAG检索+重排序保姆级入门!

引言:

前面我们已经搞定了文档解析、文本分块、Embedding向量化、向量库 ,相当于把所有资料整理好、存进了智能图书馆。但很多人踩坑:明明资料存了,大模型还是答非所问,检索出来的内容驴唇不对马嘴

今天咱们就搞定RAG最核心的环节------检索.重排序,全程大白话.保姆级代码,通义千问在线版.本地Qwen:7b双版本,看完直接上手,彻底告别大模型"睁眼说瞎话"!

今日学习目标 ✅ 吃透RAG完整检索流程,搞懂每一步逻辑 ✅ 实现基础RAG问答,告别模型幻觉 ✅ 入门重排序(Rerank),优化检索准确率 ✅ 拿到可直接运行的双版本代码,今日输出直接达标

🧠 一、先搞懂:RAG检索到底是啥?

❌ 劝退式定义

RAG检索是通过用户问题向量化,在向量库中匹配相似文档,将上下文传入大模型生成回答的过程,重排序是对检索结果二次排序提升相关性

✅ 大白话讲解

RAG检索 = 图书馆找书 你问一个问题,先把问题变成向量(相当于把你的问题翻译成图书馆能懂的语言),然后去向量库里找最相关的文档片段 ,把找到的资料递给大模型,让模型只看着资料回答,不准自己瞎编!

重排序(Rerank)= 二次筛选好书 第一次检索可能找出5篇内容,有的相关、有的不相关,重排序就是把最相关的排前面,不相关的踢走,让模型只看最精准的资料,答案自然靠谱!

📊 基础RAG完整流程(一步都不落下)

  1. 用户提问:比如"2026年3月1年期LPR是多少?"

  2. 问题向量化:用Embedding把问题转成向量

  3. 向量库检索:匹配最相似的文档片段

  4. (可选)重排序优化:二次筛选精准内容

  5. 传入大模型:把资料.问题一起给模型

  6. 生成回答:模型只看资料作答,无幻觉

🛠️ 环境一键安装(复制即跑,无报错)

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")

⚠️ 新手避坑指南

  1. 检索不准:把k值调大(比如3改5),多检索几条再重排序

  2. 模型还瞎编:temperature调0.1及以下,Prompt严格约束

  3. 向量库不生效:必须用和建库一致的Embedding模型

🎯 今日基础版总结

今天咱们彻底打通RAG核心流程,从基础检索入门重排序,双版本代码直接运行,再也不用怕大模型幻觉。基础版主打一个"听懂、会用、能跑通",新手完全无压力,今天的输出任务直接搞定!

相关推荐
拿泥more3 小时前
用 AI Agent 监控南理工通知公告
agent·skills·监控通知
人工智能培训3 小时前
具身智能中:人机交互与协作挑战
人工智能·深度学习·神经网络·机器学习·大模型·具身智能
你们补药再卷啦3 小时前
Agent建设(3/4)笔记
人工智能
TMT星球3 小时前
梦饷科技联手澳洲高端护肤品牌澳诗茉开展超级品牌日 销售额突破400万
大数据·人工智能
黎阳之光3 小时前
黎阳之光:数智硬核技术赋能应急管理装备创新,筑牢安全防线
大数据·人工智能·科技·算法·安全
*JOKER3 小时前
[LLM量化] 深入理解大模型量化:GPTQ 原理解析
人工智能·深度学习·机器学习·gptq·大模型量化
研究点啥好呢3 小时前
3月26日Github热榜推荐 | AI代理工具链专栏
人工智能·驱动开发·python·ai
剑穗挂着新流苏3123 小时前
200_深度学习的地基:PyTorch 数据操作与 Pandas 预处理实战
人工智能·pytorch·python·深度学习
灵机一物3 小时前
灵机一物AI智能电商小程序(已上线)-告别“人肉电商“:我们如何用 AI 数字员工,实现智能电商小程序自动化运营
人工智能·自动化·数字员工·养龙虾·自动化运营