当前位置: 首页 > news >正文

RAG 从零搭建:8 步搞定知识库问答

后端转AI第一课:RAG是面试重中之重,也是第一个简历项目的核心。

RAG是什么

RAG = 给模型查资料再答。模型不记得你的文档,那就先检索相关片段,拼进提示词,再让模型回答——答案有依据、能溯源、不胡说。

8步全链路

① 文档解析 → ② 切片分块 → ③ Embedding → ④ 向量库存储

→ ⑤ 语义检索 → ⑥ 召回重排 → ⑦ Prompt拼接 → ⑧ 大模型生成

① 文档解析(PDF/Word→文本)

from langchain_community.document_loaders import PyPDFLoader

documents.extend(PyPDFLoader(path).load())

documents.extend(Docx2txtLoader(path).load())

documents.extend(TextLoader(path, encoding="utf-8").load())

# 坑:表格/图片里的字读不出,需要OCR或多模态

② 切片分块(200-500字+重叠)

from langchain_huggingface import HuggingFaceEmbeddings

splitter = RecursiveCharacterTextSplitter(

chunk_size=300, # 块大小

chunk_overlap=50, # 重叠防切断语义

separators=["\n\n", "\n", "。", "!", "?", " ", ""]

)

chunks = splitter.split_documents(documents)

# 坑:块太大召回糙,太小丢上下文

③ Embedding(中文用bge)

from langchain_community.embeddings import HuggingFaceBgeEmbeddings

embeddings = HuggingFaceEmbeddings(
model_name=embed_model_name,
model_kwargs={"device": "cpu"}, # 无显卡固定cpu
encode_kwargs={"normalize_embeddings": True} # BGE模型强制归一化向量
)

# 中文场景用bge/m3e,比通用英文模型准

④ 向量库存储(Chroma最轻)

from langchain_chroma import Chroma

vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)

⑤⑥ 语义检索 + 重排

retriever = vectorstore.as_retriever(

search_kwargs={"k": 5} # 初召回K块

)

# 重排(Rerank):用交叉编码器挑最相关Top-N

from langchain_community.cross_encoders import HuggingFaceCrossEncoder

from langchain.retrievers import ContextualCompressionRetriever

from langchain.retrievers.document_compressors import CrossEncoderReranker

reranker = CrossEncoderReranker(

model=HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-base"),

top_n=3

)

compression_retriever = ContextualCompressionRetriever(

base_compressor=reranker, base_retriever=retriever

)

⑦⑧ Prompt拼接 + 生成

from langchain_community.document_loaders import (
PyPDFLoader,
TextLoader,
Docx2txtLoader,
)

prompt = ChatPromptTemplate.from_messages([

("system", """你是一个知识库问答助手。

只根据提供的资料回答,资料里没有的,明确说"不知道"。

回答末尾标注引用来源。"""),

("user", "资料:\n{context}\n\n问题:{question}")

])

llm = ChatOpenAI(model="qwen-max", temperature=0.2)

def ask(question: str):

docs = compression_retriever.invoke(question)

context = "\n".join(f"[{i+1}] {d.page_content}" for i, d in enumerate(docs))

chain = prompt | llm

return chain.invoke({"context": context, "question": question})

完整示例

question = "什么是RAG?"

answer = ask(question)

print(answer.content)

关键认知:RAG的"稳"靠检索质量,不是模型多强。召回差,模型再强也胡说。

过关清单

☐ 上传PDF能解析出文本

☐ 分块有重叠,参数可配置

☐ 中文Embedding(bge)检索语义相关

☐ 回答带引用来源

☐ 知识库无答案时明确说"不知道"

📌 配套Demo代码:(Star支持🔥backend-to-ai-guide/rag-demo/README.md at main · cxy-ai-gongfang/backend-to-ai-guide · GitHub

下一篇:RAG优化实战——去幻觉/提召回/成本控制。

欢迎关注专栏,持续更新。

http://www.jsqmd.com/news/1332308/

相关文章:

  • 国产替代:MEMS红外测温传感器在激光头过热保护中的毫秒级响应
  • 从游戏兼容性到专业控制:DS4Windows如何重新定义你的PS4手柄体验
  • 3步掌握AMD Ryzen调试工具:解决你的处理器性能优化难题
  • LAN9252/3 替代方案|FCE1353 EtherCAT从站芯片复位指南教程
  • “RK3588 边缘 AI 盒子 AIBOX-3588 硬件解析:接口布局、功耗与部署参考“
  • 【人工智能】深入浅出 Transformer 架构:从 Self-Attention 到 PyTorch 完整代码实现
  • 3000元猛鱼盲盒开箱指南:从设备准备到入缸检疫的完整流程
  • Claude Code 对接本地大模型:打造私有化AI编程助手
  • 计算机毕业设计之大熊猫新闻网站系统的设计与实现
  • 三个推理引擎我全跑了一遍,结论和官网 benchmark 不一样
  • Windows上从零开始搭建openclaw并接入飞书
  • 中山全屋除甲醛5星级推荐:从勘测到CMA验收的一站式靠谱品牌 - 环保除醛知识库
  • Windows多网卡UDP发送实战:路由控制与Socket编程详解
  • ICM20602六轴传感器实战指南:从硬件设计到姿态解算
  • RDP Wrapper终极指南:免费解锁Windows远程桌面完整功能
  • 程序流程控制
  • 2026企业AI发稿如何实现权威收录?传播易GEO优化助力AI优先推荐
  • Unity Motion Matching实战:三步构建流畅角色动画系统
  • NoSleep防休眠工具:轻松解决Windows自动锁屏困扰的终极方案
  • 3分钟掌握iFakeLocation:免费跨平台iOS虚拟定位终极指南
  • 把首 token 延迟从 820ms 压到 210ms,我只拆了这两层
  • 本地AI角色扮演工具部署指南:豆包锐评AI内容实践
  • 从字符画到3D动画:程序员用Python代码实现浪漫玫瑰花绘制
  • 魔兽争霸III终极优化指南:5个简单步骤让你的经典游戏焕发新生
  • 工业和信息化部电子信息司副司长史惠康一行考察远图东莞智能制造基地
  • 领导最讨厌这种项目经理,再努力也难提拔
  • 显卡驱动彻底清理终极指南:如何用Display Driver Uninstaller解决驱动残留问题
  • 百斤饮料盲盒实测:拆解电商盲盒营销的风险与价值评估方法
  • 3种实用技术方案:高效突破城通网盘下载限制的完整指南
  • 【人工智能】网络越深效果越差?解析 PyTorch ResNet 残差连接机制与图像分类项目落地实战