从概念到可交付:简历技术深水区
用一个可追踪的 Agent 任务串起状态、可靠性、检索、评测、前端与交付;案例中的架构和数字是教学假设。
假设用户在阅读器中请求“总结文档,并保存一条笔记”。一次可恢复的执行依次经过:请求认证 → 创建任务 → 模型决定检索 → 检索工具返回带来源的片段 → 模型生成草稿 → 用户确认写笔记 → 服务端写入 → 前端收到最终事件。每一步都可能失败,模型输出只是建议;服务端执行结果才是写入是否成功的依据。
| 对象 | 示例字段 | 设计原因 |
|---|---|---|
| 任务 | task_id、user_id、status、version、created_at | 隔离用户,乐观锁防止并发覆盖 |
| 步骤 / 工具调用 | step_id、call_id、name、arguments、attempt、result_ref | 关联调用和观测,区分重试与新操作 |
| 事件 | task_id、seq、type、payload、timestamp | 按任务单调序号去重、断线续传与审计 |
| 证据 | source_id、版本、片段、位置、检索时间 | 检查回答是否真正被来源支持,追踪过期信息 |
状态示例:queued → running → waiting_approval → running → succeeded / failed / cancelled。取消是请求而非魔法:必须传播到可取消的请求;已经提交的外部副作用需要查询结果或补偿。不要把 UI 上的“已取消”当作下游一定未执行。
执行边界依次做:JSON 解析 → schema 校验(类型、必填、长度、范围)→ 认证和对象级授权 → 目标资源约束 → 高风险确认 → 执行与审计。Schema 正确不代表有权访问;提示词中的“请勿越权”也不是权限系统。网页、RAG 片段和工具输出都视为不可信数据,不让其直接授予工具权限或覆盖系统规则。
超时不等于失败:调用写笔记工具时服务端可能已提交,但响应丢失。盲目重试可能重复写入。客户端生成同一业务操作的幂等键;服务端在同一租户范围内持久保存键、请求摘要、状态和结果,并用唯一约束及事务保护。相同键、相同参数返回原结果;相同键、不同参数拒绝。跨外部系统仍需对方支持幂等或通过查询和补偿对账,不能凭本地键声称“恰好一次”。
可重试:限流、临时网络错误可按上限指数退避加随机抖动;不可盲重试:权限拒绝、参数错误、未知结果的非幂等写入。为任务设置总时限、token 和工具次数预算。日志记录 task_id、call_id、耗时和错误类别,避免记录密钥及不必要的敏感内容。参见 OWASP 提示注入防护。
练习:保存笔记超时后,下一步是什么?
先凭操作 ID 查询服务端状态;若明确未提交且使用同一幂等键可重试。状态未知且下游不支持查询或幂等时,停止自动重试并交由对账或人工处理。
预算:可用输入 = 模型上下文上限 − 预留输出 − 安全余量。依次预算系统规则、工具 schema、当前任务、近期历史与检索片段。压缩历史时保留目标、约束、未完成步骤、已确认事实及其来源;避免把摘要当原始证据。
记忆生命周期:提取候选 → 取得适当授权 → 去重和冲突检查 → 写入带来源、时间、置信度及范围的记录 → 检索时按权限过滤 → 更新、过期或删除。用户偏好和敏感事实不是同一种数据;每次读取仍须鉴权。画像错误可能持续影响后续回答,因此需要可查看、可更正、可删除。
RAG 分阶段:解析文档并保留页码/版本 → 按语义切块(保留适当重叠)→ 稀疏与稠密召回 → 融合并重排 → 权限和时效过滤 → 带引用生成 → 逐条检查主张是否被引用支持。BM25 分数与向量相似度量纲未必相同,线性加权前需归一化或使用排名融合,并在数据集上调参。无证据时应拒答或标记不确定,不能把检索到的文字等同于真相。
练习:如何定位答错?
先判断正确文档是否入库、权限是否允许;再看召回 Recall@k 和重排;最后检查生成结论是否被正确片段支持。将检索错误和生成错误分别统计。
先定义任务成功:例如需要引用正确版本、禁止越权、写操作仅执行一次。为每个样本固定输入、工具快照、预期结果与可接受变体;划分开发集和未参与调参的测试集,覆盖正常、歧义、长上下文、注入、超时、重复事件、跨租户等情况。按任务类型分层报告,避免平均分掩盖高风险失败。
| 层次 | 指标 / 方法 | 局限 |
|---|---|---|
| 检索 | Recall@k = 前 k 条含相关证据的查询数 / 有标注查询数;MRR 衡量首个相关结果排名 | 需要可信标注与固定语料版本 |
| 结果 | 任务成功率 = 成功任务数 / 总任务数;引用支持率 = 有证据支持的主张数 / 需证据主张数 | 先定义分母、失败和部分成功 |
| 过程 | 无授权调用次数、重复副作用、耗时 P50/P95、每任务成本 | 平均延迟不能代表尾延迟 |
| 人工 / Judge | 明确评分细则、盲评、人工抽样核对一致性 | 模型裁判可能偏好文风、受注入影响或与生成器犯相同错误 |
同一批样本对照新旧版本,记录模型、提示词、工具和数据版本;多次运行观察随机波动和置信区间。示例门禁:高风险越权和重复写入均为 0,成功率不得低于基线的预先约定阈值;小样本零失败不证明真实失败率为零。上线先小流量观察,回滚条件与负责人事先约定。
SSE 是服务器到客户端的单向事件流。事件以空行结束,id 可供 EventSource 重连时携带 Last-Event-ID;服务端仍需保留事件并实现重放,浏览器不会自动替应用补齐历史。心跳注释可防部分空闲超时,具体链路仍需实测。原生 EventSource 使用 GET,不能任意设置请求头;需要 POST 或自定义头时可使用 fetch 流并正确解析 SSE。参见 MDN SSE。
id: 42
event: tool.completed
data: {"taskId":"t1","seq":42,"stepId":"s1","result":"ok"}
前端 reducer 按 task_id 和 seq 合并事件,重复事件跳过;序号缺口时暂停增量并拉取快照或重放。区分服务端任务状态与本地连接状态(断线不等于任务失败);重新打开页面先加载快照再接续事件。长列表虚拟化,错误、空态、等待确认、取消和无障碍键盘操作都要有明确交互。
React:用不可变更新避免原状态被修改;Effect 订阅要清理,切换任务时中止旧请求或忽略过期响应。Next.js:App Router 中按需将交互组件设为 Client Component,敏感凭据和数据库操作留在服务端;SSR 是服务端生成初始 HTML,hydration 使客户端交互生效,两者初始输出不一致会导致问题。参见 React Effects 和 Next.js 服务端与客户端组件。
| 技术 | 要会解释、实现和验证的内容 |
|---|---|
| TypeScript | 用联合类型建模状态与事件,用穷尽检查发现漏分支;类型在运行时被擦除,外部 JSON 仍要验证。 |
| Python | 使用类型标注和数据校验处理 API;理解 async I/O、超时、取消与并发上限;CPU 密集任务不应阻塞事件循环。 |
| React / Tailwind CSS | 组件拆分、派生状态与 Effect 清理;用工具类构建响应式布局,检查键盘焦点、对比度和窄屏溢出。 |
| Next.js / SSR | 区分服务器和客户端边界、缓存与动态数据,避免泄漏密钥;测首屏与 hydration,检查鉴权和租户隔离。 |
| Tauri / 插件内核 | Web 前端与原生进程通过受控命令通信;插件声明能力、版本和权限,限制文件/网络访问,对失败和卸载做隔离。性能数据以具体应用实测为准。 |
| Chrome Extension | 理解 content script、side panel、service worker 权限与通信;最小化 host 权限,持久化状态并测试后台终止与恢复。 |
| Linux / Nginx | 观察日志、进程、内存与文件描述符;Nginx 关闭相应路径缓冲并核对链路空闲超时,配合 curl -N 测试;超时参数是两次读操作之间的等待上限,并非整个任务总时长。 |
简历只提供部分技术与成果,没有源码、完整配置和评测报告。以下是进一步学习和向项目负责人求证的问题,不是项目实际实现的断言。
- B2B 多模态工作流:节点状态和执行事件如何映射?视频任务如何异步查询、取消和重试?断点恢复时如何避免重复生成?以中途断线、乱序、节点失败测试。
- AI 咨询产品:长对话记忆如何取得授权、纠错和删除?质量与任务完成怎样标注,怎样隔离测试集?自进化变更如何经离线评测和回滚?
- Agent-first 阅读系统:Tauri 如何约束插件权限和版本兼容?长文检索怎样保留页码?插件失败是否影响主进程?用恶意输入、权限拒绝和崩溃测试。
- 词典数据管线:如何对齐词条语言、词性和释义?Wiktionary 的来源、版本、许可与署名如何记录?校验器如何处理来源缺失及争议?抽样盲评错误率并标注原因。
以阅读器笔记 Agent 为题,按顺序交付:① 画出状态与事件表;② 写出检索工具的输入验证和只读权限;③ 实现带幂等键的笔记写入;④ 设计 20 条覆盖正常与失败的评测样本;⑤ 实现事件去重与断线恢复;⑥ 注入超时、重复消息和错误引用,记录失败原因及修复前后结果。至少用两个用户测试资源隔离。
写操作超时后,最合适的第一步是?
复盘检查清单
能否说明证据来源和失效条件?是否分开模型建议与实际副作用?断线后能否恢复、去重?是否有未见过的测试集?每项结论是否能用数据或来源支持?实际生产还需结合负载、安全需求、法规和平台版本验证。
- MCP 2026-07-28 规范:2026-07-28 的请求携带能力信息,不再使用旧式 initialize 握手;传输和安全应按使用版本核查。MCP 与 Skills 是不同概念。
- Chrome Service Worker 生命周期 与 Nginx proxy 模块:核对行为和配置。
- Wikimedia API 和 Wikimedia 使用条款:使用词典数据时核对版本、具体内容的许可及署名要求。