第 L4 层
应用工程:从调一次 API 到带 evals 的生产系统
这一层
这一层解决的问题只有一个:把模型变成一个能上线、能量、能改的功能。知识点按一条线排,每一个都是前一个在生产里撞到的墙。
这条线怎么走
- 调用模型 API:token、流式、工具、成本:一切从消息列表进、token 流出开始。要会的是 context window、计费、流式、工具调用的请求响应形状、一次调用的毫秒和美元。
- Prompting:能度量的指令 / 结构化输出:让模型的回答能被程序消费:prompt 是接口规范,不是咒语——改一处要能说出指标动了多少;输出要能被程序消费,所以 schema 约束和降级链紧跟着来。
- Embedding:把意思变成向量:模型不知道你的数据。把意思变成向量,「按意思搜」成了算距离;要懂它和关键词检索什么时候混用、召回怎么量。
- RAG:先查再答:先查再答。难的不是接向量库,是切分、召回、重排、上下文预算,和一组带标准答案的问题。
- Agent:循环里带工具的模型:模型 + 工具 + 循环。工程全在边界上:步数上限、工具报错、上下文裁剪、什么时候该用固定流程。
- MCP:给每个系统一个统一的插口:给每个系统一个统一插口。写 server 的核心是把操作描述得让模型选得对,好不好由 agent 的选工具评测说了算。
- Evals:知道它有没有变好:没有评测,改 prompt、换模型都是猜。评测集从生产错误里一条条攒出来,裁判要和人对过。
- 可观测性:知道线上发生了什么,并能回到评测:线上每次调用一条 trace,加上质量信号,再抽样回到 error analysis——评测集靠这个环才不会停在上线那天。
- 成本:每一次调用都有价签:缓存、批量、路由、降级、上限;量每个成功结果的成本,不量平均。
- 安全:模型会照着不可信的文本行动:模型会照着不可信文本行动。拆开「私有数据、不可信内容、对外发送」三要素,削能力而不是只靠检测。
TypeScript:前端与 SDK 所在的语言 是旁支:生态的 SDK、框架、MCP 参考实现都在里面,目标是读得懂改得动,不是学语言。
线上的位置:model-apis、structured-output、cost、safety 贴着每一次调用;embeddings 与 rag 在调用之前;agents 与 mcp 把调用串成循环;evals 在发布之前,observability 在发布之后,两者首尾相接。
快变层怎么学
这一层以月计半衰期,教程写出来就旧了。只收三种东西:官方文档(供应商保证了什么)、开源项目与评测工具(别人怎么把它做成系统)、一线从业者的工程文章(踩过的坑)。学法是「一页官方文档 + 一个自己做过的项目」:每个节点的 project 字段就是那个项目,做完才算过。每季度重看精选,工具类超过新鲜度上限就换。
推荐前十
按阅读顺序;每条链到下面的节点。
- 1
Claude Cookbooks — Anthropic free
可以跑的 notebook,工具调用、JSON、缓存、批量各一个 → 调用模型 API:token、流式、工具、成本
- 2
Prompting best practices — Anthropic free
模型厂随版本重写的提示参考,先读适用于所有模型的部分 → Prompting:能度量的指令
- 3
Structured outputs — Anthropic free
schema 约束与 strict 工具参数的官方边界,决定你在哪层兜底 → 结构化输出:让模型的回答能被程序消费
- 4
What are embeddings? — Vicki Boykis free
从 one-hot 到 transformer embedding 的短书,带工程 → Embedding:把意思变成向量
- 5
Introducing Contextual Retrieval — Anthropic free
hybrid、rerank、chunk 上下文各有测过的数字 → RAG:先查再答
- 6
Building effective agents — Anthropic free
工作流与 agent 的区别,和什么时候两者都不需要 → Agent:循环里带工具的模型
- 7
Model Context Protocol — introduction and spec free
读协议本身,不读框架的包装 → MCP:给每个系统一个统一的插口
- 8
AI Evals: Everything You Need to Know — Hamel Husain and Shreya Shankar free
从真实 trace 的 error analysis 开始,再做和人对过的裁判 → Evals:知道它有没有变好
- 9
Prompt caching — Anthropic free
最大的一项原生省钱手段,权威数字只在这页 → 成本:每一次调用都有价签
- 10
My Lethal Trifecta talk at the Bay Area AI Security Meetup — Simon Willison free
一条规则记住数据怎么被偷,设计权限边界时先拿掉一个要素 → 安全:模型会照着不可信的文本行动
节点
调用模型 API:token、流式、工具、成本
半衰期: 快变
模型从来看不见字母和单词。tokenizer 把你的文本切成 token(常见词整个一个,生僻词切成几段),每个给一个编号——所以模型拼写会出错:它根本没见过字母。一切都按 token 计数:context window 是它一次能读多少(你的提示和它的回答加在一起),一次调用的价钱和耗时都随它增长。从代码里调模型,做的主要就是管这件事:token 一到就流式读出来、让它调你的工具、要一份你能校验的 JSON。这些决定了后面 RAG、agent、evals 的每一个工程取舍。
- 先修
- LLM:模型怎么工作
- 之后
- Agent:循环里带工具的模型 · 成本:每一次调用都有价签 · 可观测性:知道线上发生了什么,并能回到评测 · Prompting:能度量的指令 · 结构化输出:让模型的回答能被程序消费 · TypeScript:前端与 SDK 所在的语言
repo — Runnable notebooks for the calls you will actually make — tool use, JSON output, prompt caching, batches — each a working example rather than a description.
video · 15 min · only 0:00–14:56 — What a token is, in a live tokenizer: why the same text costs different amounts on different models, and why models stumble on spelling and arithmetic.
复现项目: A client that knows what it costs — Call one model API with streaming, one tool and a JSON schema; log tokens and latency per call, and work out the cost of a thousand requests.
落选 (2)
- OpenAI API reference — 另一家的同类文档;主力栈是 Anthropic 与 OpenRouter,Cookbooks 已覆盖同样的调用形态。
- Anthropic SDK 的 README — 安装与调用示例,Cookbooks 是它的超集。
Prompting:能度量的指令
半衰期: 快变谁在招
对一次调用来说,提示就是模型的整个世界:你的指令、几个例子、它该用的文档,还有问题。措辞的小改动会以你预料不到的方式改变结果,所以好的提示是对着一组你自己保存的测试用例改出来的,从来不是凭一个回答的感觉。会写提示的标志不是写得花,而是改一处能说出指标动了多少——它是 evals 的入口,也是 RAG 和 agent 里最便宜的那根杠杆。
docs — The model maker's reference, rewritten with each release so it fits the models you will call: instructions, examples, structure, output format, tools. Start with the techniques for all models.
复现项目: Improve one prompt with a test set, not by feel — Fifty cases with expected outputs, a baseline score, then each prompt change measured as a diff — keep the ones that move the number.
落选 (3)
- Prompt engineering guide(OpenAI) — 同类官方页,留一家。
- DSPy — 把 prompt 当可优化参数的框架,先有评测集再谈,归 Evals:知道它有没有变好 之后。
- 各种 prompt 技巧合集站 — 教程类,快变层不收。
结构化输出:让模型的回答能被程序消费
半衰期: 快变
模型吐出的是文本,程序要的是字段。约束从强到弱有四级:供应商在解码时按 schema 约束(grammar)、工具参数的 strict 模式、prompt 里给格式加本地校验、只做解析加重试。工程量全在降级链上:每一级失败时下一级是什么、失败怎么计数、哪些字段允许缺。另外两件事常被忽略:schema 的字段名和描述是模型会读的文档,写法直接影响正确率;「JSON 合法」不等于「内容正确」,后者归 Evals:知道它有没有变好。
docs — 模型侧 JSON schema 约束和 strict 工具参数的官方说明:支持哪些 schema 特性、编译后的 grammar 怎么缓存、和工具调用怎么配合——先弄清供应商保证了什么,再决定自己在哪一层兜底。
- Instructor free
repo — 把 schema 校验、失败重试、多供应商统一成一个薄层的开源实现;读它的校验与重试环,等于拿到自己写降级链时的参考答案。
复现项目: 一个带校验与降级链的抽取器 — 对一批真实输入用 JSON schema 约束抽取字段;schema 特性不支持时退到 prompt 约束加本地校验,再退到重试。记每一级的命中率、失败率和每条成本。
落选 (3)
- Structured Outputs guide(OpenAI) — 同一件事的另一家官方页;主力栈是 Anthropic 与 OpenRouter,留一家够用。
- Pydantic AI — 整个 agent 框架,本节点只要校验与降级这一层,Instructor 更薄。
- JSON Schema 规范 — 原理类,不是本层的快变内容,用到时查。
Embedding:把意思变成向量
半衰期: 快变
在模型内部,每个 token 都变成一个向量——一长串数字,摆放得让意思相近的东西落在附近。对整段文字做同样的事,就能按意思搜:一个问「怎么退钱」的问题能找到退款政策,哪怕两者没有一个词相同。关键词检索在精确的名字、编码和报错信息上仍然更强,所以好的系统两种都用(hybrid)。要懂的是:各自擅长什么、什么时候混用、向量索引在数据量多大时才值得、怎么量召回。它是 RAG 的地基。
book — A short free book that goes from one-hot vectors to transformer embeddings with the engineering around them — the one explanation practitioners keep linking.
复现项目: Semantic search over your own documents — Embed a few thousand of your own documents into a vector index, then compare its top ten against keyword search on twenty queries you label.
落选 (2)
- MTEB leaderboard — 选模型时现查的流,不收藏。
- Sentence — Transformers 文档 — 自托管 embedding 的工具文档,用户走托管 API,用到再看。
RAG:先查再答
半衰期: 快变谁在招
检索增强生成:模型回答之前,你的代码先在你自己的文档里搜索,把最相关的几段贴进提示。模型据此作答而不是凭记忆,还能说出是在哪里找到的。RAG 系统答错时,多半是对的那一段根本没被取回来,所以最先要量的是检索本身:回答问题的那一段,有多大比例出现在你取回的内容里。难的不是接上向量库,而是切分、召回、重排、上下文预算,以及用一组带标准答案的问题证明它比不检索更好。
article — Hybrid search (embeddings plus BM25), reranking and chunk context, each with a measured drop in retrieval failures — design with numbers.
复现项目: Hybrid retrieval with a labelled query set — BM25 plus vectors fused with reciprocal rank fusion, a reranker, and 50 hand-labelled queries; report recall@k and nDCG against keyword search alone.
落选 (3)
- RAGAS — 回答质量的指标库,等有了生成这一半再收。
- LlamaIndex / LangChain 的 RAG 教程 — 框架教程,快变层不收。
- 各家 reranker 文档(Cohere 等) — 工具文档,做 rerank 那一步时现查。
Agent:循环里带工具的模型
半衰期: 快变谁在招
给模型一张工具清单(搜索、跑代码、调 API),再把它放进循环:它提出要用哪个工具,你的代码去执行,结果送回去,模型决定下一步,直到任务完成。一个自己写的朴素循环胜过花哨的框架;难的是循环外面那些东西:步数上限、工具报错怎么办、上下文怎么裁剪、什么时候该用固定流程而不是 agent,以及找出它到底在哪一步出错。评测要看它选没选对工具、参数对不对、走了几步。
article — Workflows versus agents, and when you need neither: the handful of patterns these systems are built from, named by a lab that ships them.
course — Hands-on: tool calling, a ReAct-style loop and multi-agent setups in code you run — the gap between reading about agents and writing one.
article — Context is the agent loop's most expensive variable: when to trim, compress, take notes or hand off to a sub-agent, sorted by problem — the checklist for your own loop's context budget.
复现项目: Write the agent loop yourself, then evaluate it — Messages API tool use with a step cap, tool-error retries and context trimming; score it on 30 real tasks for tool choice, argument correctness and steps taken.
落选 (2)
- OpenAI Agents SDK / LangGraph — 框架;项目字段要求自己写循环,框架放到写过之后。
- Writing effective tools for agents(Anthropic,2025 — 09)— 内容贴 #557,但 HN 最高 3 分、没过背书线;在 MCP:给每个系统一个统一的插口 的落选里同记一笔。
MCP:给每个系统一个统一的插口
半衰期: 快变谁在招
Model Context Protocol 是把一个系统(数据库、工单系统、内部 API)作为工具提供给任何 agent 的标准方式:服务端写一次,所有会说 MCP 的助手和 agent 都能接上。功夫在工具的名字和描述上——agent 只有从描述里看得出什么时候该选它,才用得好;工具名、参数 schema、错误信息都是写给模型读的文档。好不好不由你说,由 agent 的选工具评测说。
docs — The protocol itself — tools, resources, transports — straight from the spec rather than from a framework's wrapper around it.
复现项目: An MCP server for an API you know, measured by an agent — Expose five real operations as tools, then run an agent on 30 tasks and count how often it picks the right tool with the right arguments; rewrite descriptions until that number moves.
落选 (2)
- MCP TypeScript SDK — 13,533 star 的官方实现,但它是写 server 的工具不是知识点,规范一条已够。
- Writing effective tools for agents(Anthropic,2025 — 09)— 讲用 agent 迭代工具描述,正是 #557 的方法;HN 最高 3 分没过背书线,正文点名即可。
Evals:知道它有没有变好
半衰期: 快变谁在招
同一个问题每次都可能得到不同的回答,所以一次测试说明不了什么。一个 eval 是一组真实用例加一种给每个回答打分的办法:能写精确检查的地方写精确检查,不能的地方用评分表或另一个模型当裁判;每次改动都跑一遍。先从读真实输出、给失败方式起名字开始——评测集就从那张清单里长出来,它才能告诉你一次改动是真的变好了,还是只把失败挪到了别处。它是这一层里最稀缺、最能区分候选人的技能。
article — Start from error analysis on real traces, not from a metric; then judges you check against people — the practice behind 'evaluation frameworks' in these postings.
- promptfoo free
repo — Runs an eval set as CI — cases in YAML, assertions by rule or by judge, red when the score drops — turning one-off eval studies into a regression suite. Open source; part of OpenAI since March 2026.
- Inspect free
repo — An evaluation institute's open-source framework: a clean task / dataset / solver / scorer split, with agent tasks and tool use first-class — the shape to grow a reusable harness in.
复现项目: An eval harness that gates a change — Label 100 real outputs by hand, build an LLM judge and measure its agreement with you, and make CI fail when a prompt or model change drops the score.
落选 (4)
- Hamel Husain 与 Shreya Shankar 的 evals 课程 — 付费课程,形态是教程,快变层只收文档、项目、工具与文章;FAQ 一条已经是课程的提纯。
- Braintrust — 托管平台,本节点要的是能进 CI 的开源工具。
- Who Validates the Validators(Shankar 等,2024) — 裁判要和人对齐的原始论文,原理类,归 L5。
- OpenAI Evals — 仓库偏基准测试,不是应用评测的形状。
可观测性:知道线上发生了什么,并能回到评测
半衰期: 快变
LLM 功能的可观测性是三件事:每次调用一条 trace(prompt 版本、模型、token、延迟、成本、工具调用序列);线上质量信号(用户改没改结果、重试、降级触发、投诉);以及回环——从 trace 里抽样、人工标注、做 error analysis、把失败模式变成 Evals:知道它有没有变好 的新用例。只记状态码的日志不够,要能重建「模型看到了什么、答了什么」,又不能存超出隐私许可的内容。没有这个回环,评测集只会停在上线那天的样子。
- Langfuse free
repo — 开源、可自托管进 k3s 的 trace / 会话 / 评分平台。价值不在看板,而在把生产 trace 变成能抽样、能打分、能回灌进评测集的数据——error analysis 的入口就在这里。
复现项目: 给一个在线 LLM 功能接 trace,再从 trace 回到评测集 — 给一个生产里的 LLM 功能每次调用记一条 trace(输入摘要、prompt 版本、模型、token、延迟、成本、用户有没有改译文);一个月后抽 100 条做 error analysis,把失败模式写成新的评测用例。
落选 (3)
- OpenTelemetry GenAI semantic conventions — 方向对(厂商中立的 span 属性),但仓库 664 star 没过背书线;接 Langfuse 时顺手对照字段名。
- LangSmith — 闭源托管,自托管只给企业版;本层偏可自托管的开源。
- Phoenix(Arize) — 和 Langfuse 同类,二选一即可。
成本:每一次调用都有价签
半衰期: 快变
成本 = 单价 × token × 次数,杠杆按便宜程度排:缩短 prompt 和输出;prompt caching(共用前缀只付一次全价);Batch API(异步换半价);模型路由(便宜模型先上,不确定时升级);供应商故障时的降级;最后是硬上限——每用户配额、每日预算、先报价再执行。量的时候看每次请求的 p50 / p95 而不是平均,更要看「每个成功结果」的成本:一个失败重试三次的便宜模型不便宜。缓存和路由会改变模型看到的内容,改完要回 Evals:知道它有没有变好 跑一遍。
docs — 供应商原生省钱手段里最大的一项:哪些前缀能缓存、各模型的最小可缓存长度、写入与命中的价格倍率,权威数字只在这页。读完就能算出共用一段长系统提示的调用该省多少。
复现项目: 给一个共用系统提示的生产调用加 prompt caching,拿账单验证 — 把共用的系统提示和术语表放进缓存前缀,跑一周,对比缓存命中 token 占比、每千次调用成本和 p50 延迟;批量回填类任务改走 Batch API,再比一次。
落选 (3)
- Message Batches API docs(Anthropic) — 本想收,HN 最高 3 分、没过背书线;和 prompt caching 同一个文档站,读完那页顺手读,正文与项目里已点名。
- OpenRouter docs — 主力路由层,但它是产品文档不是知识点;路由与降级在 `OpenRouterRouting.java` 里已是自己的实现。
- 各家价格表 — 流,不收藏,算账时现查。
安全:模型会照着不可信的文本行动
半衰期: 快变
这里的安全是 LLM 应用的应用安全,不是对齐。三个问题:不可信内容从哪进来(用户输入、检索到的文档、工具返回、网页);模型能做什么(工具权限最小化、不可逆操作要人确认、按任务分级);数据能从哪出去(外链、markdown 图片、带参数的工具调用)。Prompt injection 没有完整解法,所以靠削能力而不是只靠检测:把三要素拆开、输出先校验再执行、每次调用有记录和上限。MCP server 的作者同时是攻击面的作者——工具描述和返回值都是模型会照做的文本。
docs — 十类风险一张清单——prompt injection、输出处理不当、过度代理、向量库弱点、无上限消耗。给自己的 agent 或 MCP server 做威胁建模时逐条过一遍,不会漏掉整类。
article — 一条判定规则就够记:私有数据、不可信内容、对外发送三者同在,数据就能被偷走。设计工具权限边界时先问「拿掉哪一个」,比堆检测器可靠。
复现项目: 给 ImageStep MCP 做一轮 prompt injection 红队 — 用 promptfoo 的 red team 对 MCP server 的 7 个工具跑注入用例(藏在文件名、URL 页面、工具返回里的指令),数 agent 越过权限边界或把数据发到外部的次数;修完再跑一轮。
落选 (3)
- 各家 prompt injection 防护指南(Anthropic / OpenAI 文档) — 以 prompt 层手段为主,不如上面两条从能力边界讲。
- Greshake 等《Not what you've signed up for》(2023) — 间接注入的原始论文,原理类,归 L5 前沿而非本层。
- Lakera 等 guardrail 产品 — 检测类产品,迭代快,是流不是收藏。
TypeScript:前端与 SDK 所在的语言
半衰期: 快变谁在招
客户集成会碰到 web 前端和 SDK,它们大多是 TypeScript 写的;模型厂的 SDK、agent 框架、MCP 的参考实现也在里面。已经在写它的人直接跳过。它在这一层的意义是「读得懂、改得动生态里的代码」,不是语言本身。
docs — The language's own reference, short enough to read in an evening — enough to read and change the web and SDK code these roles ship to customers.
复现项目: Type an SDK for an API you use — Write a small typed client for a real API — request and response types, errors as values, one streaming endpoint — and publish it with its tests.
落选 (2)
- Effective TypeScript — 付费书,深度超出「读得懂改得动」的要求。
- Total TypeScript — 课程,快变层不收教程。
完成标准自测
- 有一个在线的 RAG 或 agent 功能,带常驻的评测集(≥ 50 条人工核过的金标),CI 里分数掉线就红。
- 能对任一次线上调用说出 prompt 版本、模型、token、延迟、成本,并从生产 trace 抽样做过一轮 error analysis。
- 改一个 prompt 或换一个模型,能给出指标变化的数字和成本变化的数字。
- 写过一个 MCP server 或工具集,用 agent 的选工具评测量过描述改动的效果。
- 对自己的系统画过一次「不可信内容从哪进、模型能做什么、数据从哪出」的图,并拆掉过一个要素。
作者的笔记原稿。