# 工作经历 AI:第三方处理告知与本次同意 > 2026-10-26 A7 新候选:真实模式改为 mode=deepseek + real-enabled=true 显式开启,不再要求 dev;新增 Redis 调用额度与并发门禁(429/Retry-After=60、Redis 故障503)。告知升级 work-experience-external-processing-v2,developmentOnly=false。下文旧版本/仅开发环境及旧验收记录属于历史,当前规则和上线边界以 [正式环境配置说明](ai-work-experience-production-config-20261026.md) 为准;本批尚未部署,不代表合规审核完成。 日期:2026-10-26。面向前后端联调人员;本批为后端候选,不是已部署接口,不改前端,不开放生产。 ## 1. 告知接口与版本规则 新增 `GET /api/v1/profile/me/work-experience-optimization/notice`,使用学生 Access Token。未登录/Refresh Token 401,企业和管理员 403;接口只读、不调用模型,功能关闭时也可读取。 `data` 返回: | 字段 | 含义 | | --- | --- | | `version` | 当前告知版本;本候选为 `work-experience-external-processing-v2` | | `title`、`message` | 应完整展示的标题和说明,不应由前端截断或删改关键内容 | | `provider`、`purpose`、`dataFields` | DeepSeek、生成优化建议、可能外发的 `position` / `description` / `targetPosition` | | `mode` | `off` / `stub` / `deepseek` | | `enabled` | 当前功能是否启用;false 时不能据此启用按钮 | | `developmentOnly` | 当前为 false,已取消开发 profile 限制;不等于完成生产合规审查 | 告知说明包含:真实模式会向第三方 DeepSeek 发送本次输入,模拟或本地规则直接处理不会外发;不得填写联系方式、证件、凭据、商业秘密或他人个人信息;结果可能不准确,须核对后手动采用;不自动保存或覆盖简历;拒绝不影响手动编辑和保存;同意仅针对本次优化。 第三方留存、训练用途等政策尚待核实并纳入正式告知。本候选不承诺第三方零留存、不用于训练,也不等于完成法律或运营合规审查。 优化仍为 `POST /api/v1/profile/me/work-experience-optimization`,示例: ```json { "position": "开发实习生", "description": "在导师指导下协助修改订单接口参数校验。", "targetPosition": "后端开发", "externalProcessingConsent": true, "consentNoticeVersion": "work-experience-external-processing-v2" } ``` 示例版本仅说明当前契约;实际请求必须使用本次已展示的 GET 返回版本,不要永久硬编码。版本不是 `promptVersion`,两者不可混用。`externalProcessingConsent` 只接受原生 JSON 布尔 true;false、null、缺失、字符串 `"true"`、数字或对象均拒绝。版本缺失、空白、旧版本或大小写不符也拒绝,HTTP 400,且不调用模型或走本地信息不足捷径。 **这是不兼容的请求变更**:旧客户端只有布尔同意而未带版本的请求不能继续调用。前后端须协调部署,未接入前不要开启功能。优化响应字段和 revision 保存流程不变,API 静态/运行时契约更新为 213 paths / 261 operations。 ## 2. 前端展示及同意/拒绝流程 1. 用户点击 AI 优化后读取告知接口,检查 enabled 和 developmentOnly;读取失败则保留原文,不外呼优化接口。 2. 完整展示 title/message、第三方名称、用途与发送字段。仅在 developmentOnly=true 时显示开发联调限制;false 不得当作合规审核通过标志。 3. 不默认勾选、不将注册或保存简历与同意绑定;提供“同意并优化”和“暂不使用”。关闭/拒绝不发送 POST,也不清空、修改原文。 4. 用户本次明确确认后,提交当前输入、原生 true 和本次已展示的 version。不要把本地缓存的“曾同意”自动用于后续优化,不自动提交或自动重试。 5. 收到 400 时检查输入和版本;版本已变化则重新获取、展示并让用户再次确认,不静默替换版本后重发。429 读取 Retry-After,不能自动重试或承诺倒计时后必定可用;503/504 等失败保留原文,展示错误后由用户决定是否重试。 6. OPTIMIZED 展示对比并由用户手动采用;NEED_MORE_INFO 展示补充问题,不显示“优化成功”,不启用采用/覆盖。原文已改变或用户已切账号时丢弃旧响应。 7. 采用只回填编辑框;真正保存继续使用已有带 revision 的简历接口。 ## 3. 日志保护与验证边界 后端 AI 链路不记录输入字段、Key、完整模型输出或上游正文。请求/响应/模型建议对象的 toString 已脱敏,正常 JSON 业务返回不受影响;模块异常只返回固定安全文案,不记录未知异常正文、cause 或堆栈。 AI 请求使用服务端生成的 requestId,不回显调用方提供的请求 ID 文本;日志路径归一化,非常规 HTTP 方法归为 OTHER。保留的请求元数据包括规范化路径、方法、状态、耗时、服务端 requestId 及既有网络地址信息,不包含请求/响应正文或查询参数。前端排障使用后端返回的 requestId,不要将正文或 Key 放进 URL、跟踪头、埋点或 console。 在 AI 请求范围内抑制 Spring Web/HTTP/Security、Hibernate 及 AI 模块的正文/异常诊断日志;其他接口仍沿用现有日志行为。JDK HTTP 诊断开关可能打印 Authorization/正文,创建 DeepSeek 客户端时发现非空且非 none 的 `jdk.httpclient.HttpClient.log` 将失败关闭;不得在启动后动态开启该诊断。 该保护针对本工程应用日志,不能替代对反向代理、网关、APM、系统转储或第三方平台的独立审计;不声称任意日志组件或未来新增 logger 都已被全面验证。合成验收资料另存测试证据,不是允许生产记录真实正文。`simulated=false` 仍只是模式标记,不能当成外呼/计费凭证。 后端只校验客户端提交的同意声明与版本,不能证明前端真的展示、用户阅读或点击;本批不新增永久同意记录或数据库迁移,也不把技术门禁当作完整知情同意审计证据。正式政策、供应商处理约定、前端交互及生产部署仍待独立确认。 ## 4. 联调清单 - 告知可在关闭模式下读取;匿名、企业、管理员、Refresh Token 和禁用账号不能绕过权限。 - 明确 true+当前版本可继续;其他类型、拒绝、遗漏或旧版本必须 400 且零模型调用;对“暂无相关经历”同样校验同意,不能走捷径绕过。 - 拒绝/关闭/超时/切账号/输入变化不丢原文,不自动重试,不自动保存。 - 用合成原文、Key 标记和完整响应标记覆盖成功、校验、畸形 JSON、未知异常,检查应用日志中均不存在;TRACE 测试也必须保留安全元数据而不是关闭所有日志取巧。 - A5 定向173项及A6独立全量3848项均是历史基线结果,不能替代本次A7配置、门禁与告知v2的验证。A7结果以对应新基线验收报告为准。 - 本批未调用真实模型,未提交、推送或发布;前端真机、服务器实际配置与真实连通不能由后端离线测试代替。