Ch13 RAG修订于 二〇二六年七月二日

13.16 动手搭一个 RAG

前面讲了这么多理论,这一节用最少的代码,让你真正跑起来一个 RAG 系统。

13.16.1 30 行代码搭一个最小 RAG

# 安装依赖:pip install chromadb openai

import chromadb
from openai import OpenAI

client = OpenAI()
# 1. 准备文档
docs = [
    "RAG 是 Retrieval-Augmented Generation 的缩写,由 Meta AI 在 2020 年提出。",
    "RAG 的核心思想是先检索相关文档,再让 LLM 根据文档生成答案。",
    "RAG 能有效减少 LLM 的幻觉问题,并提供可追溯的引用来源。",
    "向量数据库是 RAG 系统的核心组件,用于存储和检索文档的 Embedding 向量。",
    "2024 年微软开源了 Graph RAG,将知识图谱与 RAG 结合。"
]

# 2. 创建向量数据库并存入文档
collection = chromadb.Client().create_collection("my_rag")
for i, doc in enumerate(docs):
    emb = client.embeddings.create(model="text-embedding-3-small", input=doc).data[0].embedding
    collection.add(ids=[str(i)], embeddings=[emb], documents=[doc])

# 3. RAG 查询
def ask(question):
    q_emb = client.embeddings.create(model="text-embedding-3-small", input=question).data[0].embedding
    results = collection.query(query_embeddings=[q_emb], n_results=3)
    context = "\n".join(results["documents"][0])
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": f"参考资料:\n{context}\n\n问题:{question}\n\n请基于参考资料回答。"}]
    )
    return response.choices[0].message.content

# 测试
print(ask("什么是 RAG?"))
print(ask("RAG 能解决什么问题?"))

13.16.2 逐步解释

第 1-3 行:导入库。chromadb 是向量数据库,openai 提供 Embedding 和 LLM 能力。

第 6-12 行:准备文档。这 5 句话就是你的”知识库”。生产环境中,你会从 PDF、网页、数据库中读取成千上万篇文档。

第 15-18 行:创建向量数据库并存入文档。对每篇文档做 Embedding(变成向量),然后把向量和原始文本一起存入 Chroma。ids 是唯一标识符。

第 21-30 行:RAG 查询函数。输入问题 → Embedding 问题 → 在向量数据库中搜索最相似的 3 个文档 → 把文档和问题拼接成 Prompt → 让 LLM 生成答案。

第 33-34 行:测试。问两个问题,看 RAG 系统能否正确回答。

13.16.3 从最小 RAG 到生产 RAG 的改进路径

这个 30 行的 RAG 系统能跑,但离生产可用还有距离。改进路径如下:

第 1 步:更好的分块。把 docs 从固定列表改成从文件读取,用 RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50) 分块。

第 2 步:混合检索。在向量检索基础上,加入 BM25 关键词检索。Elasticsearch 或 rank-bm25 库。

第 3 步:重排序。用 bge-reranker-v2-m3 对检索结果重排序,只取 Top-3 给 LLM。

第 4 步:Prompt 优化。加入系统角色、引用标注指令、检索失败处理。

第 5 步:缓存。对相同问题缓存答案,用 Embedding 做语义去重。

第 6 步:监控。接入 Langfuse,监控检索延迟、答案质量、用户反馈。

第 7 步:Agentic RAG。如果问题需要多步检索,引入 Agent 循环。

每一步改进都能带来可感知的质量提升,但每一步也都会增加系统复杂度。不要一次性做所有改进——从第一步开始,评估效果,再决定下一步是否需要。


← 上一节:13.15 RAG 生产部署 | 下一节:章首 →

关联4

知识图谱

局部图谱 · 点节点跳转