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

相关推荐
魏祖潇8 分钟前
别问哪个 AI 工具最好——我换了一圈才想明白的几件事
人工智能
doiito21 分钟前
【Agent Harness】Gliding Horse 给 Agent OS 装上双曲空间引擎与默克尔树边云同步
ai·rust·架构设计·系统设计·ai agent
齐翊1 小时前
怎么确认 AI 看懂了你的提示词?
人工智能·github·ai编程
饼干哥哥1 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
以和为贵1 小时前
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
前端·人工智能·面试
武子康2 小时前
调查研究-192 AI Agent 之间也需要“信任“:把多 Agent 信任变成可测指标
人工智能·openai·agent
Smoothcloud_润云3 小时前
Hermes Agent 的上下文记忆机制:一个开源 Agent 是怎么"记住"你的
人工智能·agent·gpu
早点睡啊3 小时前
精读 LangChain 官方文档(一)总览、安装与快速开始:从 create_agent 跑通第一个智能体
人工智能
knqiufan3 小时前
从 Python 到 TypeScript,用 GLM-5.2 跑通 PowerMem SDK 的长程任务工程
ai·memory·agentic·powermem