【Python × AI】RAG 全链路实战:让大模型拥有“私人图书馆”的深度检索艺术
专栏前言:如果说 Prompt 是大脑的思考方式,那么 RAG 就是大脑能随时翻阅的私人图书馆。本篇我们将深入探讨如何利用 Python、向量数据库和重排序技术,构建一套精准的知识库问答系统。
🚀 为什么“直接问”大模型不再有效?
幻觉问题:模型不知道答案时,会一本正经地胡说八道。
数据滞后:大模型无法感知实时信息或企业内部私有数据。
成本昂贵:将海量文档作为上下文(Context)输入,会迅速耗尽 Token 额度。
RAG 的核心逻辑:先检索,后生成。 即:根据问题去数据库里“捞”相关的片段,再把片段喂给模型做总结。
一、 RAG 的“流水线”架构:从文档到向量
一个标准的 RAG 系统由以下五个环节组成:加载 -> 切片 -> 向量化 -> 存储 -> 检索。
- 智能切片(Chunking):不是简单的字符串分割
高质量 RAG 的第一步是切片。如果切得太碎,会丢失上下文;切得太粗,检索噪音太大。
建议:使用 RecursiveCharacterTextSplitter,并设置合理的 overlap(重叠度),保证语义的连续性。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个切片500字
chunk_overlap=50, # 前后重叠50字,防止语义断层
length_function=len,
is_separator_regex=False,
)
chunks = text_splitter.split_text(long_document_text)
二、 核心组件:向量数据库(Vector DB)
在 Python 生态中,Milvus 和 Chroma 是目前的主流选择。向量化的本质是将文本转化为高维空间中的坐标(Embedding)。
实战:使用 Chroma 快速构建本地索引
Python
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
- 初始化 Embedding 模型(将文字转为坐标的“翻译官”)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
- 创建并持久化向量库
vectorstore = Chroma.from_texts(
texts=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
- 语义搜索:找出最相关的3个片段
query = "公司关于年假的规定是什么?"
docs = vectorstore.similarity_search(query, k=3)
三、 进阶黑科技:重排序(Rerank)提升精度
基础的向量检索是基于“数学上的余弦相似度”,它往往能找到关键词相似的,但未必能找到逻辑相关的。
工业界标准做法:二阶段检索(Re-ranking)。
粗排:用向量库快速捞出 Top 20 个片段。
精排:用专门的 Rerank 模型(如 BGE-Reranker)对这 20 个片段重新打分,选出最准确的前 3 个。
四、 避坑指南:RAG 开发中的“深水区”
在技术落地中,这些细节决定了你的 RAG 是“玩具”还是“产品”:
多模态挑战:PDF 里的表格怎么处理?(建议使用 Unstructured 库进行解析)。
检索质量评估:引入 RAGAS 框架。通过“忠实度”、“相关度”等指标给你的系统打分,而不是靠感觉。
Prompt 模板设计:
“已知信息:{context}。请根据已知信息回答问题:{question}。如果信息不足,请直说不知道,不要编造。”
更多推荐
所有评论(0)