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

相关推荐
mys55182 分钟前
杨建允:AI搜索时代文旅品牌的GEO优化营销策略
人工智能·ai搜索优化·geo优化·文旅geo·文旅品牌geo
hsg776 分钟前
简述:torchgeo
人工智能·深度学习
ForDreamMusk9 分钟前
PyTorch编程基础
人工智能·pytorch
喵喵侠w9 分钟前
Rokid 智能眼镜开发实战:制作一款花草树木识别智能体
人工智能
小程故事多_809 分钟前
从推理到智能体,大模型强化学习中信用分配机制的演进与突破
人工智能·prompt·aigc·ai编程
人工智能研究所13 分钟前
Claude + HyperFrames:用 HTML 方式制作视频,AI 时代一切皆可 HTML?
人工智能·html·音视频·ai 视频·hyperframes·claude-
是娇娇公主~21 分钟前
AI Agent详解
人工智能·ai agent
CV-杨帆24 分钟前
RAG 与记忆机制本质辨析及研究路径评估
人工智能
AI医影跨模态组学30 分钟前
如何通过MRI识别的系膜筋膜侵犯类型关联局部晚期直肠癌的免疫微环境及肿瘤增殖活性,并进一步解释其与预后不良的机制联系
人工智能·论文·医学·医学影像
人机与认知实验室33 分钟前
如何用四维矩阵建模计算性的态势感知与算计性的势态知感?
人工智能·线性代数·矩阵