7 天 Build 一个 Production RAG — 实战路线图
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。
选型:
- 最快:Anthropic Voyage embedding + Pinecone serverless — 30 分钟
- 中:OpenAI text-embedding-3-small + Qdrant Cloud — 1 小时
- 自托管:BGE-m3 + Qdrant local — 半天
# 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 起头。
引用来源
- Anthropic. Voyage AI embedding documentation — voyage-3 embedding 模型 (Anthropic 子公司).
- Pinecone. Serverless documentation — serverless 向量库快速接入.
- Cohere. Rerank API documentation — managed rerank 选项.
- BGE. bge-reranker-v2-m3 model card — 中英双语开源 rerank.
- Anthropic. Prompt caching — system prompt cache 配置.
- Anthropic. Tool use / structured output — JSON 输出最佳实践.
- 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 时按自己业务来。