Week 4 Day 30:最终检查与30天回顾 - 苏格拉底教学

30天前你用 go mod init 开始了一个空项目。今天你要让它变成一个值得放在简历上的作品,并且清楚地知道你学到了什么。


第一部分:问题驱动

🤔 问题1:如果面试官现在打开你的 GitHub repo,第一眼会看到什么?

引导问题:

  1. README 有没有截图或 demo GIF?(没有 → 面试官 30 秒后关掉)
  2. 代码有没有 TODO: 和 panic("not implemented")?(有 → 说明你没跑通)
  3. 有没有 .env 文件被提交上去了?(有 → 简历直接扣分)
  4. 测试覆盖了关键路径吗?(没有 → "这是个玩具项目")

答案揭示: GitHub repo 是你在面试官面前的无声简历。在面试官打开链接的前 60 秒,他会决定这个项目值不值得细看。


🤔 问题2:30天之后,你真正能讲清楚的是什么?

引导问题:

  1. 如果被问"你们 RAG 的 chunk size 怎么选的",你能解释选择背后的权衡吗?
  2. 如果被问"ReAct 和普通 function calling 有什么区别",你能回答吗?
  3. 如果被问"你的系统怎么保证 create_ticket 不重复",你能从数据结构讲到代码吗?

答案揭示: 面试考的不是你知道多少概念,而是你能把"做过的事"讲清楚多深。一个讲透的模块比十个走马观花的更有价值。


第二部分:GitHub Repo 整理 Checklist

仓库结构检查

agent-runtime/ ├── cmd/ │ └── api/ │ └── main.go ✅ 启动点清晰 ├── internal/ │ ├── agent/ ✅ ReAct 主循环 │ ├── llm/ ✅ LLM Client 封装 │ ├── rag/ ✅ Chunker + Embedder + Retriever │ ├── tools/ ✅ Tool 实现(search_kb, create_ticket 等) │ ├── server/ ✅ HTTP handlers + SSE streaming │ ├── middleware/ ✅ 日志、认证、Cost tracking │ ├── cache/ ✅ Prompt cache + Response cache │ ├── metrics/ ✅ CostTracker + LatencyTracker │ └── security/ ✅ PII 检测 + Injection 检测 ├── evals/ ✅ 评测脚本 + golden set │ ├── golden_set.jsonl │ └── run_eval.go ├── data/ │ └── docs/ ✅ 知识库文档(markdown) ├── Dockerfile ✅ 两阶段构建 ├── docker-compose.yml ✅ 含 Qdrant + Redis + Postgres ├── .env.example ✅ 有示例,无真实 key ├── .gitignore ✅ 忽略 .env 和 binary └── README.md ✅ 完整文档

12 点代码自查

在把仓库链接发给面试官之前,逐条检查:

正确性

  • go build ./... 零错误(本地和 CI 都能 build)
  • go test ./... 能跑通,且覆盖关键路径(agent loop、RAG retrieval、tool 幂等性)
  • 所有 TODO 要么删掉,要么改成 issue(// TODO: xxx 不该出现在 main branch)
  • 没有 panic("not implemented") 或空的 return nil, nil

安全

  • .env 不在 git history 里(用 git log --all -- .env 检查)
  • .env.example 存在,所有 key 有注释说明用途
  • 没有硬编码的 API key、密码、连接字符串

可读性

  • 每个 package 有 package-level comment(一句话说明这个包做什么)
  • 复杂函数有注释,解释"为什么"而不只是"做什么"
  • 变量命名清晰(tk 不如 ticketc 不如 client

可操作性

  • docker compose up 能在 5 分钟内启动完整服务
  • curl / httpie 示例可以直接 copy-paste 运行

第三部分:README 要素清单

完整 README 结构

# Agent Runtime — Customer Support Copilot

> 一句话描述:用 Go 构建的 AI Agent 系统,通过 RAG + ReAct 架构,
> 自动处理客服工单并支持人工审核工作流。

## 架构图

[在这里放一张架构图,可以用 ASCII art 或 Mermaid]

┌─────────────────────────────────────────────┐
│                   用户 / API                  │
└────────────────────┬────────────────────────┘
          ┌──────────▼──────────┐
          │   Agent Service      │
          │  (ReAct Loop)        │
          └──┬───────┬───────┬──┘
             │       │       │
         RAG Service  LLM   Tool Hub
             │              │
         Qdrant      Jira / Slack / Postgres

## 功能特性

- RAG 知识库检索(Qdrant Vector DB,Top-K cosine similarity)
- ReAct Agent 循环(最多 5 轮推理,支持并发 tool 调用)
- 人工审核工作流(高危操作走 Kafka → 人工确认)
- 成本追踪(每次 LLM 调用记录 token 用量和费用)
- 流式响应(SSE streaming,首字延迟 < 200ms)
- 防御性安全(PII 检测、Prompt Injection 过滤、幂等性)

## 快速启动

### 前置要求
- Go 1.22+
- Docker & Docker Compose

### 步骤

git clone https://github.com/yourname/agent-runtime
cd agent-runtime
cp .env.example .env
# 编辑 .env,填入 OPENAI_API_KEY 等

docker compose up -d  # 启动 Qdrant + Redis + Postgres
go run ./cmd/api      # 启动 Agent 服务

### 验证

# 健康检查
curl http://localhost:8080/health

# 发送一条客服消息(流式响应)
curl -N -X POST http://localhost:8080/chat/stream \
  -H "Content-Type: application/json" \
  -d '{"message": "如何重置我的 SSO 密码?", "user_id": "user_123"}'

## API 文档

### POST /chat
发送消息,获取 Agent 回答(非流式)

请求:
{
  "message": "string",
  "user_id": "string",
  "session_id": "string(可选)"
}

响应:
{
  "answer": "string",
  "sources": ["string"],
  "from_cache": false,
  "latency_ms": 1234,
  "model_used": "gpt-4o-mini"
}

### POST /chat/stream
流式响应版本,返回 SSE 事件流

SSE 事件格式:
data: {"type": "token", "content": "根据"}
data: {"type": "token", "content": "知识库..."}
data: {"type": "done", "done": true}

### GET /admin/metrics
返回成本和延迟摘要

## 评测结果

在 100 个 golden query 上的评测结果:

| 指标 ||
|------|----|
| 自动解决率 | 78% |
| Recall@5 | 0.91 |
| 平均响应时间 | 1.2s |
| P99 响应时间 | 3.1s |
| 月成本估算(1K DAU) | ~$38 |

## 技术选型说明

| 组件 | 选型 | 理由 |
|------|------|------|
| Vector DB | Qdrant | 开源、Go SDK 成熟、支持 filtering |
| LLM | OpenAI GPT-4o / mini | 成本/效果权衡,支持 function calling |
| 缓存 | Redis | TTL 支持、SetNX 幂等键 |
| 消息队列 | Kafka | 审核工作流的持久化和回放 |
| ORM | 标准 database/sql | 避免 ORM 抽象层复杂性 |

第四部分:30天回顾

Week 1 核心学到什么

主题:Go 基础 + LLM Client 封装

  • Go module 和项目结构(cmd/ + internal/ 的设计哲学)
  • HTTP middleware 链(http.Handler 接口的函数式组合)
  • context.Context 的传播机制(超时、取消、跨函数传递 request_id)
  • 封装 LLM Client 的必要性:不能让 SDK 细节泄漏到业务逻辑层
  • interface 设计:LLMClient 接口让测试可以 mock,让实现可以替换

一句话核心洞察:

Go 的 context 不是可选的——它是整个请求链路的"总开关",Agent 系统的每一层都必须正确传递和响应它。


Week 2 核心学到什么

主题:RAG 系统构建

  • Chunking 策略:段落优先 + 大段再分割 + overlap 保留上下文
  • Embedding 的本质:把文本映射到高维语义空间,使得相似语义有相似向量
  • Vector DB 工作原理:HNSW 索引(近似最近邻,用图结构加速搜索)
  • Metadata filtering:在向量相似度基础上加 WHERE 条件(部门、权限等)
  • RAG 评测:Recall@K、MRR、Precision@K,以及如何建立 golden set

一句话核心洞察:

RAG 的精度瓶颈通常不在 embedding 模型,而在 chunking 策略和 metadata 设计。好的 chunk 让 LLM 有精准的上下文,差的 chunk 让它只能瞎猜。


Week 3 核心学到什么

主题:Agent 核心链路 + 可观测性

  • ReAct 循环(Reasoning + Acting):LLM 生成思考和行动,工具执行,结果反馈,循环
  • Function Calling 协议:tool_calls 结构,如何解析和执行,如何回传结果
  • 人工审核工作流:并非所有 Agent 决策都该自动执行,高危操作走审批
  • 结构化日志(slog)+ Trace ID:让每次请求的完整链路可以被回溯
  • Metrics 设计:LLM 调用次数/延迟/token、tool 调用成功率、business metrics(自动解决率)

一句话核心洞察:

没有可观测性的 Agent 是黑盒,出了问题只能猜。结构化日志 + Trace ID 是 Agent 系统的基础设施,而不是事后补充。


Week 4 核心学到什么

主题:生产化 + 面试准备

  • 成本建模:token × 单价 × 调用量 = 月账单。不知道成本就无法做优化决策
  • 模型路由:简单 query 不需要最强模型,节省 40-80% 成本
  • Failure Mode 思维:幻觉、超时、注入、PII 泄漏、重复创建——每一类都需要专门的防御
  • Post-mortem 文化:事故不是坏事,没有 post-mortem 才是坏事
  • Defense in Depth:任何单点防御都会失效,系统应在多层都有防护

一句话核心洞察:

"能跑通"和"生产可用"之间隔着:成本追踪、Failure Mode 防御、可观测性、测试覆盖、文档完整。这 30 天让你补上了这个差距。


第五部分:面试前最后准备

面试前一天 Checklist

技术确认:

  • GitHub repo 链接有效,且在隐身模式下可以访问
  • docker compose up 能跑通(在新机器或 CI 验证过)
  • README 的 curl 示例全部能跑通
  • 本地能运行 go test ./... 全部通过

内容准备:

  • 自我介绍 5 分钟版本练习过至少 3 遍
  • 3 个 STAR 故事脑子里熟了,不需要背稿
  • 系统设计能口头完整讲完(25分钟内)
  • LRU Cache 和 TopK 算法能手写

心理准备:

  • 面试当天提前 10 分钟进入 Zoom/Google Meet
  • 有纸和笔(或白板应用)准备好
  • 如果被问到不会的,想好怎么应对(不是沉默)

面试中的实时策略

听到题目 → 先重复理解(不要立刻开始) ↓ 澄清边界(规模、约束、特殊情况) ↓ 口头说思路(先说方向,等面试官点头再写) ↓ 写代码(从框架开始,再填细节) ↓ 自己测试(举一个例子手动跑一遍) ↓ 讨论 trade-off(主动说你的方案有什么限制)

第六部分:下一步学习建议

30天后的路径

如果面试还需要 2-4 周:

  • 做 2 道 LeetCode Hard(优先:hard DP + 图)
  • 深入研究一个你系统里你觉得最薄弱的模块
  • 做一次完整的 chaos engineering 演练并记录结果

拿到 Offer 之后:

方向 推荐路径
深入 Go 并发 读 《Concurrency in Go》(Katherine Cox-Buday)
分布式系统 读 《Designing Data-Intensive Applications》(Kleppmann)
LLM 系统 关注 LangChain Blog、Anthropic Research、OpenAI Cookbook
可观测性 学习 OpenTelemetry,在项目里加 Jaeger tracing

长期能力建设:

  1. 写 Post-mortem:每次遇到自己犯的 bug,认真写一份 5 Whys。这是 SRE 思维的基本训练
  2. 做 Benchmark:每引入一个新组件,先测它在你规模下的 P99 latency
  3. 读源码:你用了 Qdrant、chi、slog,选一个读它的 Go 实现

第七部分:自测清单

  • GitHub repo 12 点 checklist 全部通过
  • README 在隐身模式下可以让一个陌生人跑起来
  • 能说出 Week 1-4 每周的核心洞察
  • 能解释你的系统比一个简单 ChatGPT wrapper 复杂在哪里(至少 5 点)
  • 面试前一天 Checklist 全部打勾

第八部分:作业

任务1:做 repo 最终扫描

# 检查是否有敏感内容
git log --all --oneline -- .env
git log --all --oneline -- "*.key"

# 检查所有 TODO
grep -rn "TODO\|FIXME\|HACK\|panic(" --include="*.go" .

# 检查 build
go build ./...
go test ./...

任务2:补全 README

  • 架构图(ASCII art 或 Mermaid)
  • 快速启动步骤(验证过能跑通)
  • 评测结果表格
  • 技术选型说明

任务3:写一份"30天心得"

不是给别人看的,是给自己的:

  • 你在哪一天/哪个模块有了真正的理解突破?
  • 哪个问题你现在还没有完全想清楚?
  • 如果重来,你会改变哪一天的学习顺序?

任务4:发给一个朋友看 repo

让没有做过这个项目的朋友,跟着 README 启动服务。

  • 他卡在哪里了?
  • 哪里的文档不够清晰?
  • 修复,然后再次发给他验证。

第九部分:常见面试问题(最终版)

Q: 你的项目和直接用 LangChain 有什么区别?

A: 三个核心区别: (1)可控性:LangChain 隐藏了很多细节,出问题难以调试。我的实现每一层都是显式的,生产排查更直接; (2)成本感知:LangChain 不内置成本追踪,我实现了 token × 单价的全链路计量; (3)Go 生态:LangChain 主要是 Python,我的服务用 Go,并发性能更好,部署镜像更小(Go binary vs Python 镜像)。


Q: 30天能做出一个"生产级"系统吗?

A: 我不会说它是生产级,但它包含了生产环境需要考虑的核心问题:幂等性、可观测性、成本追踪、Failure Mode 防御、人工审核工作流。这些在大多数 demo 项目里是缺失的。

如果要真正上线,还需要:完整的 E2E 测试、压力测试、安全审计、以及更多领域知识(比如针对具体客服场景的数据)。这些我知道,也知道怎么做,只是 30 天内做了权衡。


Q: 你觉得 AI Agent 基础设施和传统微服务基础设施最大的不同是什么?

A: 核心不同在于不确定性的位置

传统微服务:输入确定 → 逻辑确定 → 输出确定,问题通常是性能和可用性。

AI Agent:LLM 的输出本质上是概率性的,同样的输入可能给出不同输出。这带来了新的基础设施问题:

  • 如何检测 LLM 给出了错误答案(而不只是崩溃)
  • 如何在不确定输出中保证工具调用的安全边界
  • 如何衡量系统"质量"(不只是 availability 和 latency,还有 accuracy)

这是我在这 30 天里最大的认知转变。


结语

30 天前,你开始了一个空项目。

今天你有:

  • 一个完整的 Go Agent Runtime(RAG + ReAct + 人工审核)
  • 对 LLM 成本、延迟、Failure Mode 的系统性认知
  • 可以在面试中讲清楚的技术决策和权衡
  • 一个可以展示给面试官的 GitHub repo

这不是终点,这是你真正开始理解 AI Infrastructure 的起点。

下一步,你会构建什么?