# AI-003 项目经历与自我评价 AI 优化实现方案 版本:v1.2(补充测试修复方案);日期:2026-10-27(Asia/Shanghai);状态:v1.1已批准并实施;v1.2待批准,尚未应用本节测试修复。 ## v1.2 本次待批准的精确变更 v1.1首轮实现已完成并验证:新模块19项测试,16通过、2错误、1因未提供专用Redis实例跳过;新完整JWT链与静态/运行时契约验证通过;OpenAPI脚本通过(217 paths/265 operations)。本版本仅修复测试设施,不改生产代码、接口、数据库、配置或依赖。 1. `D:/巴适/轻松聘-ai智能助手/mydreamjob-server/src/test/java/com/mydreamjob/resume/optimization/ResumeSectionOptimizationServiceTest.java`:将已有Answer桩上的后续 `when(...).thenThrow(...)` 换成 `doThrow(...).when(...)`。Mockito重设时先调用旧Answer且参数为null,导致测试自身NPE;用do语法避免执行旧桩。 2. `D:/巴适/轻松聘-ai智能助手/mydreamjob-server/src/test/java/com/mydreamjob/resume/optimization/ResumeSectionOptimizationControllerTest.java`:同理,后续重设已有异常桩统一使用 `doThrow/doReturn`,防止旧异常在测试准备阶段抛出;保留所有HTTP错误映射断言。 3. `D:/巴适/轻松聘-ai智能助手/mydreamjob-server/src/test/java/com/mydreamjob/resume/optimization/WorkExperienceOptimizationSecurityIntegrationTest.java`:仅将全仓硬编码数量213/261改为217/265,并将该测试方法名称更新为反映保留旧操作及新增AI操作。保留操作集合逐项对比、原工作经历鉴权和契约断言。该文件是v1.1预计文件范围之外的必要测试兼容调整,因此单列审批。 实施方式:只改以上三份测试;重跑新模块和工作经历定向测试(不启动Docker,旧Docker Redis测试排除;新Redis真库测试无显式实例时跳过),随后执行完整Maven构建验证并如实记录环境依赖失败;再次运行OpenAPI校验及差异检查,完成交付说明与工作记录后提交并推送个人分支。无新增接口或契约变化。回滚仅撤销这三份测试的本次差异,不重置分支、不强推。真实模型评测、前端联调和生产验收仍待单独开展。 以下v1.1正文继续适用,其生产实现范围未扩大。 ## 1. 目标、基线与范围 在负责人整合后的后端基础上,新增项目经历、自我评价两项 AI 文本优化能力。只提供建议,不自动保存;用户采用后回填原编辑字段,沿用既有在线简历保存、revision 冲突处理。不得编造事实,不修改评分、排名、推荐、隐私范围或前端代码。 实际 Git 仓库为 D:/巴适/轻松聘-ai智能助手,origin 为 https://gitea.baskbuddy.com/baskbuddy/zhangshun.git。D:/巴适/轻松聘/zhangshun 为历史非 Git 副本,不作为本次编码基线。2026-10-27 已执行 git fetch origin;当前本地/远端跟踪分支 qingsongpin-AIDevelop 位于 4784fd5,工作区干净;截图所示整合分支 origin/fix/mysql57-module-migrations-20261009 位于 c6ccab5。两分支从 8c94291 分叉:qingsongpin 独有1个提交,fix分支独有26个提交,不能用普通快进更新;c6ccab5 也不是 4784fd5 的后代。fetch 仅更新远端引用,没有改工作分支。 按用户指定,工作分支与最终上传目标为 qingsongpin-AIDevelop。获批后先把当前远端整合分支合并到 qingsongpin-AIDevelop,保留双方历史,不重写或强推。该同步会将整合分支已有的26个提交纳入个人分支,且两个分支的工作经历 AI 文件有重叠,可能产生冲突;先在本地处理并验证,不静默丢弃任一方行为。如果冲突涉及方案范围外的业务语义或无法安全判断,暂停实现并报告具体冲突,不扩大范围。成功同步后在该个人分支完成 AI-003,运行测试、核对差异并生成交付文档;用户明确要求完成后上传到自己的分支,因此实现及验证完成后提交并推送 origin/qingsongpin-AIDevelop,不推送其他分支、不合并 PR、不触发部署。实施前再次检查分支状态及适用 AGENTS.md;若远端出现新提交,先核对批准基线范围,不擅自扩项。 已核查远端 WorkExperienceOptimizationService/Controller/ModelRouter、ConsentNotice、CallLimiter、DeepSeek 客户端、OnlineResumeContent/Controller、phase1-scope-and-acceptance.md。c6ccab5 已有严格同意反序列化、告知版本、真实调用显式开关、Redis 原子限流与并发租约;旧本地文档中的“仅 dev 真实模式”已不适用。代码存在不等于本轮验收通过。 现有 OnlineResumeContent.Project 包含 name≤150、role≤120、description≤5000;selfEvaluation≤5000;目标职位≤120。已有 GET/PUT /api/v1/profile/me/online-resume 和项目条目接口。前端实际按钮、采用与保存调用尚未核验,由对接文档标明联调确认,不作为后端实现前置条件。项目名称可能包含商业秘密,须用公开名称或脱敏代称。 ## 2. 新增接口契约 全部接口使用 Authorization: Bearer ,仅当前 STUDENT 本人。服务端执行角色校验,不接收 userId,不读取其他人的资料。统一 ApiResponse 包装(code/message/data/requestId/timestamp),同步 JSON,无分页或 SSE。 | 方法 | 路径 | 功能 | | --- | --- | --- | | GET | /api/v1/profile/me/project-experience-optimization/notice | 项目经历处理告知;关闭模式亦可查看 | | POST | /api/v1/profile/me/project-experience-optimization | 优化一段项目描述 | | GET | /api/v1/profile/me/self-evaluation-optimization/notice | 自我评价处理告知;关闭模式亦可查看 | | POST | /api/v1/profile/me/self-evaluation-optimization | 优化已有自我评价 | 项目请求:projectName 可选≤150,role 可选≤120,description 必填非空≤5000,targetPosition 可选≤120;externalProcessingConsent 必填且必须为 JSON 布尔 true;consentNoticeVersion 必须等于告知当前版本 project-experience-external-processing-v1。 自我评价请求:description 必填非空≤5000,targetPosition 可选≤120;同意字段规则相同,版本 self-evaluation-external-processing-v1。本轮仅基于用户提交的原文润色,不自动扫描整份简历或生成无事实的自我评价;缺乏具体依据时返回补充问题。 项目请求示例(合成): ```json {"projectName":"练习商城","role":"后端开发","description":"参与课程商城项目,使用Java实现订单查询接口,编写接口测试并修复分页问题。","targetPosition":"Java后端开发","externalProcessingConsent":true,"consentNoticeVersion":"project-experience-external-processing-v1"} ``` 自我评价请求示例(合成): ```json {"description":"学习过Java和SQL,在课程商城项目中实现订单查询接口并编写测试,遇到问题会查阅文档并记录解决过程。","targetPosition":"Java后端开发","externalProcessingConsent":true,"consentNoticeVersion":"self-evaluation-external-processing-v1"} ``` 成功示例: ```json {"code":200,"message":"ok","data":{"status":"OPTIMIZED","optimizedDescription":"在课程商城项目中负责订单查询接口开发,使用 Java 实现查询逻辑,编写接口测试并修复分页问题。","suggestions":["如有可验证的测试结果,可补充说明。"],"followUpQuestions":[],"promptVersion":"project-experience-deepseek-v1","simulated":false},"requestId":"example-request","timestamp":"2026-10-27T02:00:00Z"} ``` 自我评价响应字段完全相同,promptVersion 为 self-evaluation-deepseek-v1。信息不足时 status=NEED_MORE_INFO,optimizedDescription=null 或按现有序列化规则省略,followUpQuestions 非空,不将空经历润色成虚假成果。stub 提示词版本分别为 project-experience-v1、self-evaluation-v1,simulated=true;simulated=false 仅表示真实模式,不证明每次已外呼。 notice 响应 data 沿用 version/title/provider/purpose/dataFields/message/mode/enabled/developmentOnly。分别列出项目的 projectName/role/description/targetPosition、自我评价的 description/targetPosition;说明本次同意、第三方传输、可拒绝且不影响手动保存、人工复核、不自动保存,以及供应商留存/训练规则尚待核实,不承诺零留存。 异常:400 参数/非法同意/告知过期/敏感输入;401 未登录;403 角色不符;404 用户不存在;429 配额或并发已满,Retry-After=60;502 模型输出无效;503 功能关闭、Redis不可用或上游不可用;504 超时;500 未预期错误。业务错误码沿用既有注册表,不新增业务枚举;安全错误不回显原文、供应商正文和异常堆栈。前端超时、失败时保留原文,429 不自动重试;其他模型失败由用户手动重试并再次确认本次调用。 ## 3. 实现方式与 AI 边界 在 com.mydreamjob.resume.optimization 内新增独立的 ResumeSection* 公共执行层服务于两项新能力,保留现有工作经历公开契约及实现。使用明确的 section 枚举选择字段、提示词、告知版本和配置,禁止客户端任意指定模型地址或提示词路径。独立项目和自评 DTO 映射为内部输入;不把项目角色伪装为工作职位来复用旧提示词。 复用 ConsentBooleanDeserializer、DeepSeekWorkExperienceSettings、WorkExperienceModelException 和现有 WorkExperienceCallLimiter。两项新接口与工作经历共享现有 Redis 配额池和并发门禁(现有名称保留),防止切换入口绕过全局预算;该变化意味着新调用会消耗工作经历相同配额,须在交付文档明确。沿用默认每用户3次/分钟、20次/日、全局200次/日、并发4、每用户同时1次、75秒租约。Redis失败关闭,额度不退还,不自动外呼重试。 新输入校验独立处理全部可传输字段,继承现有敏感数据/密钥拒绝与提示词注入防护模式;无事实原文先在本地返回 NEED_MORE_INFO,同意和安全检查仍先执行。新 DeepSeek 适配器复用设置,沿用固定官方地址、禁止重定向、连接5秒、请求超时1–60秒(默认20)、响应流式字节上限65536、严格 JSON 字段/类型/长度校验及诊断日志禁用策略。建议正文≤5000;建议和问题列表按现有客户端边界限制。 项目提示词围绕背景、本人职责、实际行动和有依据的结果组织;不补造团队规模、技术栈、指标或贡献归属。自评围绕原文中的技能、实践与工作方法改写,不推断人格、敏感属性或“精通”等无依据能力。输入作为不可信数据,与系统指令分离;模型无工具和业务写入权限。两类提示词分别版本管理,输出仅为建议;确定性校验不能证明所有语义事实,须保留人工复核并做合成样本评测。 不保存输入、输出或完整提示词,不输出到普通日志、DTO toString、错误信息。外呼仅传本节最小字段,不传姓名、联系方式、完整简历、账号标识或会话。Redis仅保存现有计数与租约,不保存文本。供应商留存及正式授权仍须负责人核实,默认关闭,测试只用合成资料。 ## 4. 精确预计文件范围 以下相对 D:/巴适/轻松聘-ai智能助手;无删除。 新增生产 Java(均在 mydreamjob-server/src/main/java/com/mydreamjob/resume/optimization/): - ResumeSection.java:两类能力及提示词/告知元数据。 - ResumeSectionInput.java:内部最小输入与内容脱敏 toString。 - ResumeSectionInputGuard.java:安全输入与空事实识别。 - ResumeSectionModelClient.java:内部建议契约。 - DeepSeekResumeSectionModelClient.java:真实 HTTP 与严格输出验证。 - StubResumeSectionModelClient.java:明确模拟的合成联调行为。 - ResumeSectionModelRouter.java:分别选择模式与真实开关。 - ResumeSectionOptimizationService.java:鉴权、同意、安全检查、限流及结果组装。 - ResumeSectionConsentNotice.java:各场景版本化告知。 - ResumeSectionOptimizationController.java:四个新增路由。 - ResumeSectionOptimizationExceptionHandler.java:仅新控制器的安全错误映射。 - ResumeSectionOptimizationOpenApiConfiguration.java:必要的运行时契约补充,保持静态契约一致。 - dto/ProjectExperienceOptimizationRequest.java、dto/SelfEvaluationOptimizationRequest.java、dto/ResumeSectionOptimizationResponse.java:独立请求与统一响应。 新增资源:mydreamjob-server/src/main/resources/ai/ 下 project-experience-v1.txt、project-experience-deepseek-v1.txt、self-evaluation-v1.txt、self-evaluation-deepseek-v1.txt。 新增测试:mydreamjob-server/src/test/java/com/mydreamjob/resume/optimization/ 下 ResumeSectionInputGuardTest.java、ResumeSectionModelRouterTest.java、DeepSeekResumeSectionModelClientTest.java、ResumeSectionOptimizationServiceTest.java、ResumeSectionOptimizationControllerTest.java、ResumeSectionOptimizationSecurityIntegrationTest.java、ResumeSectionPromptRegressionTest.java、ResumeSectionCallLimiterRedisIntegrationTest.java。 修改:docs/openapi-rc.json(四路由及 schema);docs/verify_openapi.py(本模块断言及实际数量);docs/resume-api.md(新能力及保存边界)。不修改旧工作经历代码、在线简历保存代码、认证或数据库迁移。若发现复用必须修改旧生产类或需增加文件/扩大范围,更新方案重新审批。 工作区文档:D:/巴适/轻松聘/docs/AI-003-项目经历与自我评价AI优化-实现方案.md;完成后新增同编号前端对接方案、后端整合说明;追加根工作记录.txt。新对外交付文档不放 mydreamjob-server/docs/。 ## 5. 数据库、依赖、配置及外部服务 无数据库迁移、无新增依赖、无新供应商或独立服务。沿用项目 Java/Spring/Jackson/Redis 及已有 DeepSeek 设置;具体模型名称只是当前代码配置事实,本轮未核验供应商能力或价格,非推荐结论。 新增 ai.project-experience.mode 与 ai.self-evaluation.mode,取 off/stub/deepseek,默认 off;各有 real-enabled,默认 false。deepseek 需对应 real-enabled=true 且原有 DEEPSEEK_API_KEY/DEEPSEEK_MODEL/DEEPSEEK_TIMEOUT_SECONDS 有效,不限制运行 profile。不修改现有 ai.work-experience.* 语义;共享配额由其现有 limits 配置管理并明确文档说明。本批不改环境文件或默认开启真实模型,不实际外呼第三方。 ## 6. 验证、验收与交付 先执行整合基线的适用工作经历定向测试,记录已有失败与新增失败。实现后执行 Maven 定向测试覆盖 *ResumeSection*Test、*WorkExperience*Test,真实模型测试保持关闭;再执行 mvn clean verify(外部环境不足如实记录)。运行 python ./docs/verify_openapi.py,核对静态与运行时新增 schema、必填项、鉴权与错误;不沿用历史 API 数量。执行 git diff --check 与精确文件差异检查。 必要测试:两场景正常/不足事实/空白/长度边界;true 与字符串/数字/null/false 的严格区别;缺失/过期/跨场景告知版本;未登录/其他角色;off 与显式真实开关;Redis故障关闭、配额/并发及租约;超时/非200/重定向/畸形JSON/超大响应/敏感输出;注入与密钥输入;DTO和错误无内容泄漏;工作经历契约回归。Redis真实集成使用团队可用测试实例,未经授权不启动或停止Docker;不可用标记未完成。无数据库变更,不声称开展真实 MySQL 验收。 合成评测集通过测试内样本版本管理,至少覆盖各场景的事实充分、仅空泛形容、无经历、恶意指令、敏感数据、诱导编造指标;验收要求受控失败路径不外呼、不写库、不泄漏,输出结构合法,回归样本不得新增无依据事实。真实模型质量/延迟/费用评测及前端联调本批未授权执行,交付中标记待验;不宣称达到生产验收。 兼容性:四路由增量新增、默认关闭;不改变现有保存和评分。采用后由前端保持原条目字段、id、revision;项目回填 description,自评回填 selfEvaluation,409 重新读取并由用户处理冲突,不自动覆盖。 回滚:先将两项 mode=off,必要时撤销本批精确文件与文档差异,保留用户后续修改;无数据库回滚。不执行 reset --hard、force push 或覆盖旧开发分支。测试后如需再改代码,按 AGENTS.md 另报修复方案审批。 ## 7. 当前状态与待办 已完成:远端fetch、分支拓扑与保存契约只读核对、用户批准v1.1方案;已在 qingsongpin-AIDevelop 创建备份分支并将 origin/fix/mysql57-module-migrations-20261009 合并提交至个人分支,未重置或强推。基线验证:工作经历相关Maven测试113项通过、2项跳过,排除1项需Docker的Redis集成测试;OpenAPI校验通过(213 paths/261 operations)。AI-003实现、扩展验证与交付文档进行中。模型评测、前端联调、供应商正式告知核实及生产验收仍未完成。