专栏前言:如果说 Prompt 是大脑的思考方式,那么 RAG 就是大脑能随时翻阅的私人图书馆。本篇我们将深入探讨如何利用 Python、向量数据库和重排序技术,构建一套精准的知识库问答系统。

🚀 为什么“直接问”大模型不再有效?
幻觉问题:模型不知道答案时,会一本正经地胡说八道。

数据滞后:大模型无法感知实时信息或企业内部私有数据。

成本昂贵:将海量文档作为上下文(Context)输入,会迅速耗尽 Token 额度。

RAG 的核心逻辑:先检索,后生成。 即:根据问题去数据库里“捞”相关的片段,再把片段喂给模型做总结。

一、 RAG 的“流水线”架构:从文档到向量

一个标准的 RAG 系统由以下五个环节组成:加载 -> 切片 -> 向量化 -> 存储 -> 检索。

  1. 智能切片(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

  1. 初始化 Embedding 模型(将文字转为坐标的“翻译官”)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
  1. 创建并持久化向量库
vectorstore = Chroma.from_texts(
    texts=chunks, 
    embedding=embeddings,
    persist_directory="./chroma_db"
)
  1. 语义搜索:找出最相关的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}。如果信息不足,请直说不知道,不要编造。”

更多推荐