RAG 入门:让 AI 读懂你的数据

RAG入门到精通:向量检索、Embedding、知识图谱等核心技术原理与实战部署指南。

A
AGISeed Team
AGISeed 作者

RAG 入门:让 AI 读懂你的数据

编者按:AI 什么都知道,但不知道你公司内部的最新数据。RAG(检索增强生成)就是解决这个问题的”瑞士军刀”。这篇文章基于 LangChain 官方文档、腾讯云 2026 RAG 全景分析、AWS 技术白皮书,带你从原理到代码,30 分钟搭建第一个 RAG 系统。


一、为什么需要 RAG?

LLM 有三大硬伤:

问题例子RAG 如何解决
知识截止GPT 不知道你公司上周的财报把最新数据放进外部知识库
幻觉AI 编了一个不存在的研究强制 AI 先查资料再回答
私有数据不能把内部文档发给 OpenAI数据存在你的向量数据库里

二、RAG 的核心原理

%%{init: {'theme': 'dark', 'themeVariables': {'primaryColor': '#4a9eff', 'lineColor': '#888'}}}%%
flowchart TB
    subgraph Offline["📥 离线阶段(建索引,一次性的)"]
        A["📄 文档/PDF/数据库"] --> B["✂️ 文本分块<br/>Chunking"]
        B --> C["🔢 Embedding<br/>文字→向量"]
        C --> D["💾 存入向量数据库<br/>ChromaDB/Qdrant/Pinecone"]
    end
    subgraph Online["📤 在线阶段(每次查询)"]
        E["❓ 用户提问"] --> F["🔢 问题 → 向量"]
        F --> G["🔍 相似度搜索<br/>找最相关的 N 段"]
        G --> H["📎 组装上下文<br/>问题 + 检索结果"]
        H --> I["🤖 LLM 生成回答<br/>基于上下文回答"]
    end
    
    style G fill:#e74c3c,color:#fff
    style I fill:#2ecc71,color:#fff

三、动手实践:30 分钟搭建第一个 RAG

环境准备

# pip install langchain chromadb openai python-dotenv

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 1. 加载文档
loader = TextLoader("./my_document.txt")
documents = loader.load()

# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,      # 每块 500 字符
    chunk_overlap=50,    # 块之间重叠 50 字符
    separators=["\n\n", "\n", "。", ".", " ", ""]
)
chunks = text_splitter.split_documents(documents)

# 3. 创建向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 4. 创建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0),      # temperature=0 让回答更确定
    chain_type="stuff",             # 把检索结果"塞"进 Prompt
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})  # 每次检索 3 段
)

# 5. 提问
response = qa_chain.run("你的问题")
print(response)

四、RAG 的 5 个关键参数

参数建议值影响
chunk_size200-1000太小→语义不完整;太大→检索不精准
chunk_overlapchunk_size 的 10%-20%防止关键信息正好在两块之间被切断
top_k3-10检索太少→信息不足;太多→噪音干扰 LLM
temperature0-0.3RAG 场景建议 0(确定性回答,减少幻觉)
embedding 模型text-embedding-3-small便宜、效果好、1536 维

五、进阶:RAG 的三个优化阶段

阶段 1:Naive RAG(基础版)

文档 → 分块 → 向量检索 → LLM 生成

问题:检索不准、分块策略简陋

阶段 2:Advanced RAG(进阶版)

文档 → 智能分块 → 混合检索(向量 + 关键词) → 重排序 → LLM 生成

新增能力

%%{init: {'theme': 'dark', 'themeVariables': {'primaryColor': '#4a9eff', 'lineColor': '#888'}}}%%
flowchart LR
    Q["❓ 用户提问"] --> QR["🔄 查询改写<br/>Query Rewriting"]
    QR --> HR["🔍 混合检索<br/>向量 + BM25"]
    HR --> RR["📊 重排序<br/>Reranking"]
    RR --> G["🤖 LLM 生成"]
    
    style HR fill:#e74c3c,color:#fff
    style RR fill:#f39c12,color:#fff
  • 查询改写:把用户口语化的提问改成更精确的检索语句
  • 混合检索:向量语义搜索 + BM25 关键词搜索 → 互补
  • 重排序(Reranking):二次筛选,提高精准度

阶段 3:Agentic RAG(智能版)

用户提问 → Agent 自动拆步骤 → 多轮检索 → 多源融合 → LLM 生成

Agent 能自己判断”需要查几次”、“去哪个数据库查”、“要不要联网搜索”。


六、向量数据库选型

数据库优势劣势推荐场景
ChromaDB轻量、免费、Python原生不支持分布式个人项目、Demo
FAISSMeta 开源,速度快无持久化(需手动存)研究、离线计算
QdrantRust 实现,性能好社区版功能受限生产环境
Pinecone全托管,零运维贵,数据在美国不想运维
Milvus国产,企业级部署复杂大规模企业

建议:入门用 ChromaDB,上生产用 Qdrant。


七、避坑指南

常见错误正确做法
整篇文档塞一个 chunk根据文档结构分块(按段落/章节)
只用向量检索加 BM25 关键词检索作为补充
不设温度(默认 1.0)RAG 场景 temperature=0,避免 AI 自由发挥
top_k 设为 1至少设 3-5,给 AI 足够上下文
不校验检索结果打印检索到的文本,检查是否相关

八、延伸阅读


参考来源