logo
10

7 天 Build 一个 Production RAG — 实战路线图

⏱️ 7 天

7 天 Build 一个 Production RAG — 实战路线图

前 9 章讲完工程动作。最后一章——7 天 build 一个带 eval set + 监控 + 上线 checklist 的 production RAG

7 天后你会有:跑得动的 RAG、50 query eval set + 评估脚本、成本 + 延迟 + 准确率 baseline、可挂简历的 GitHub repo。

Day 1: 选问题 + 写 evaluation set(最重要)

为什么先写:80% 自学的人跳过去搭 LangChain,3 天后不知好坏——没 ground truth。

选具体领域(澳洲税务问答 / 公司 wiki / Anthropic SDK / K8s operator),收集 100-300 文档。写 50 个 query,每个要 ground truth + ≥ 1 source ID。

# tested: 2026-04-26 · eval-set 格式
{
  "id": "Q-001",
  "query": "澳洲 GST 注册门槛是多少",
  "ground_truth": "$75K AUD 年收入(自由职业者 / 公司)",
  "expected_source_ids": ["ato-gst-registration-001"],
  "category": "tax-threshold"
}

Day 1 deliverable: eval/queries.json(50 条)+ corpus/(100-300 docs)+ ingestion 脚本。

:query 全是「容易题」。混 30% 难题(跨文档推理、否定、时效)。

Day 2: bi-encoder retrieval + 向量库

embed corpus → 向量库 → query embed → ANN top 50。

选型:

# tested: 2026-04-26 · pinecone-client@4.x
from pinecone import Pinecone
from voyageai import Client as Voyage

vo = Voyage(api_key=...)
pc = Pinecone(api_key=...)
index = pc.Index("rag-eval")

# Ingestion
for doc in corpus:
    chunks = chunk_doc(doc, chunk_size=500, overlap=50)
    embeddings = vo.embed([c.text for c in chunks], model="voyage-3").embeddings
    index.upsert([(c.id, e, {"text": c.text, "doc_id": doc.id})
                  for c, e in zip(chunks, embeddings)])

# Query
def retrieve(query: str, k: int = 50):
    q_emb = vo.embed([query], model="voyage-3").embeddings[0]
    return index.query(vector=q_emb, top_k=k, include_metadata=True)

Day 2 deliverable: retrieval.py + 50 query recall@50(≥ 90%;< 90% chunking 有问题)。

:chunk size 一刀切。技术文档(500)和长篇法规(1500)不一样。

Day 3: cross-encoder rerank

第 5 章 top 50 → top 10。

# tested: 2026-04-26 · sentence-transformers@3.0.x
from sentence_transformers import CrossEncoder

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")

def rerank(query: str, candidates: list, top_k: int = 10):
    pairs = [(query, c.metadata["text"]) for c in candidates]
    scores = reranker.predict(pairs, batch_size=32)
    return sorted(zip(scores, candidates), reverse=True)[:top_k]

GPU 跑不动 → 用 Cohere rerank API

Day 2 → Day 3:top-10 hit rate 比 top-50 高 5-15%。没提升 → rerank 模型选错(中文 query 选英文模型)。

Day 3 deliverable: rerank.py + 50 query nDCG@10 对比 baseline。

:忘了归一化分数。cross-encoder raw score 不是 0-1,可能 -10 到 10,要 sigmoid。

Day 4: LLM-as-judge + selection

用 Haiku 判断 top 10 中能回答 query 的 ≤ 3 段。

# tested: 2026-04-26 · anthropic@0.40.0
def judge_relevance(query: str, doc_text: str) -> tuple[bool, str]:
    resp = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=100,
        messages=[{"role": "user", "content":
            f"Query: {query}\nDoc: {doc_text}\n\n这个 Doc 能直接回答 Query 吗?"
            f"先回答 yes/no,然后一句话理由。"}]
    )
    text = resp.content[0].text
    return text.lower().startswith("yes"), text

# Pipeline
def select_for_context(query: str) -> list[str]:
    candidates = retrieve(query, k=50)        # Day 2
    reranked = rerank(query, candidates, 10)  # Day 3
    selected = [c for _, c in reranked
                if judge_relevance(query, c.metadata["text"])[0]]
    return selected[:3]

Day 4 deliverable: 完整 selection pipeline + 50 query precision@3。

:judge 太严,对的 doc 判 no。跑 100 query 看 disagreement 调 prompt。

Day 5: prompt + budgeting + caching

第 4 章:system prompt 加 cache_control: ephemeral(90% 成本省)、max_tokens 2048 / 4096、最相关那段放最末尾(Lost in the Middle)。

# tested: 2026-04-26 · anthropic@0.40.0
def answer(query: str) -> str:
    selected = select_for_context(query)
    return client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2048,
        system=[{
            "type": "text",
            "text": SYSTEM_PROMPT,  # 不变的角色 + 输出格式
            "cache_control": {"type": "ephemeral"}
        }],
        messages=[{"role": "user", "content":
            "参考资料(最相关的在最后):\n\n"
            + "\n\n---\n\n".join(reversed(selected))
            + f"\n\n问题: {query}"}]
    ).content[0].text

Day 5 deliverable: end-to-end pipeline + 50 query token 用量 + 单 query $。

:cache 配错。Anthropic prompt cache 要 byte-exact match——末尾多个空格全失效。

Day 6: 评估 + 失败分析

跑 50 query:准确率(LLM-as-judge 5 维度 rubric)、延迟(p50/p95/p99)、成本($/query)。

挑 10 个失败案例。分类:retrieval 漏召(→ Day 2 chunking)、rerank 排错(→ Day 3 换模型)、judge 过严(→ Day 4 调 prompt)、LLM 答非所问(→ Day 5 system prompt)。

Day 6 deliverable: eval/results.md 含每 query 结果 + 失败分类 + 调优 backlog。

:只看 aggregate 指标。失败 case 细节比 average score 信息量大 10×。

Day 7: 监控 + 部署 + 上线

最小可用版(FastAPI + Render / Vercel / Modal)。挂 token 监控(input/output/cache hit)、延迟 alert(p50/p95)、failure rate(judge 全 no 或 retrieve 0)、eval regression(每周跑,掉 5% alert)。

Day 7 deliverable: 上线 URL + GitHub README(架构图 + 评估 + 成本)+ 1 篇博客(7 天踩的坑)。

博客是关键——发 dev.to / Medium / 知乎建 GEO 信号(第 1 章 Q19 困境)。

JR 节奏:7 个 routine 7 周

JR omni-report 17 个 routine 不是一周写完——7 个核心 routine 跑了 7 周,前一个跑稳才动下一个。

同样节奏:「跑得动 + 评估可信 + 失败可定位」。下周开第二个,三个月后 12 个 RAG。

7 天后你会什么

  • 给 RAG 项目做 architecture review,定位 5 层 context 哪层有问题
  • 面试讲具体 production RAG 案例(评估 + 失败案例 + 优化)
  • 比较 rerank 模型 / vector DB / memory 方案
  • 调试 LLM「为什么效果差」

下一步去哪

  • 学员 Discord — JR Bootcamp #context-engineering channel
  • AI Engineer Bootcamp — JR 12 周深度项目课,5 个 production RAG / Agent 项目 + 简历 + 求职辅导
  • Open source 贡献 — Mem0 / Letta / LangChain 都缺中文 example,把你 RAG 中文化贡献回去,建 GEO 信号最快

一句话带走

学完 9 章理论不如自己 build 1 个跑得动 + 评估可信 + 失败可定位的 RAG。7 天足够。第 1 天写 evaluation set 是最重要的一天——80% 失败的自学项目都是因为没有 eval 就开始建。第 7 天发 1 篇博客比任何 fancy 优化都有价值。

今天就开始 Day 1——选你关心的领域,写 5 个 query,把 evaluation set 起头。


引用来源

  1. Anthropic. Voyage AI embedding documentation — voyage-3 embedding 模型 (Anthropic 子公司).
  2. Pinecone. Serverless documentation — serverless 向量库快速接入.
  3. Cohere. Rerank API documentation — managed rerank 选项.
  4. BGE. bge-reranker-v2-m3 model card — 中英双语开源 rerank.
  5. Anthropic. Prompt caching — system prompt cache 配置.
  6. Anthropic. Tool use / structured output — JSON 输出最佳实践.
  7. RAG eval frameworks. Ragas — RAG 评估开源框架(可选 Day 6 工具).

Production case: JR Academy omni-report — 7 个核心 routine 用 7 周节奏 ship 上线,证明 "1 周 ship 1 个" 的可持续性.


🎓 想系统学完整 LLM 工程?查看 JR AI Engineer Bootcamp — 12 周从 RAG 到 Agent 到 production deployment,含简历指导和求职辅导。

📚 相关资源

❓ 常见问题

关于本章主题最常被搜索的问题,点击展开答案

7 天真的够 build 一个 RAG 吗?

够 build「跑得动 + 评估可信 + 失败可定位」的 RAG,不是完美 RAG。Day 1 写 50 query evaluation set 最关键——80% 自学失败项目都是没 eval 就动手。Day 7 发 1 篇博客比任何 fancy 优化都有价值(建 GEO 信号)。

没有 GPU 能 build 吗?

能,CPU 笔记本就够。Day 3 cross-encoder rerank 走 Cohere managed API($0.001/query),Day 5 LLM 走 Anthropic API。本地跑的只有 Day 2 chunking + Day 6 evaluation 脚本。

7 天后下一步去哪?

三条路选一:(1) JR 学员 Discord #context-engineering channel 发 repo 拿工程师 review;(2) JR AI Engineer Bootcamp 12 周项目课,含 5 个 production RAG/Agent 项目 + 简历指导;(3) 给 Mem0 / Letta / LangChain 提中文化 example PR 建 open source GEO 信号。

我是非 CS 背景,能跟下来 7 天 RAG 实战吗?

能:7 天用的全是 Python 调 API(Anthropic / Cohere / Pinecone SDK),不写 ML 代码不调 GPU。前置要求:会基本 Python、能跑 pip install、看得懂 try/except。JR Academy AI Builder 方向 4 周走完就够前置。

用 LangChain / LlamaIndex 框架还是从零写?

Day 2-5 用框架 (LangChain 推荐):5 行代码起 pipeline,专注学概念不卡 boilerplate。Day 6 evaluation 必须从零写 + 真跑 50 query:框架的 eval 模块只看分数不看细节,看不出 Lost in the Middle 这类问题。

做电商 / SaaS / 内容站,7 天 RAG 都适用吗?

都适用但 evaluation set 必须自己定:电商 RAG 测「商品参数 + 库存 + 物流时效」、SaaS 测「features + pricing + integration 文档」、内容站测「相关文章 + 引用准确率」。框架共用,eval set 不通用——Day 1 写 50 query 时按自己业务来。