资讯详情

Resume-Matcher 简历增强(Enrichment)功能全解析:AI 定向提问与增量改写的工作流与源码实现

📅 2026/9/11 0:37:05 | 华诺云谱 👁 阅读
Resume-Matcher 简历增强(Enrichment)功能全解析:AI 定向提问与增量改写的工作流与源码实现
Resume-Matcher 简历增强Enrichment功能全解析AI 定向提问与增量改写的工作流与源码实现【免费下载链接】Resume-MatcherThe #1 AI Harness for Building Resumes, PDFs, Cover Letters more, locally with 100 LLMs support.项目地址: https://gitcode.com/GitHub_Trending/re/Resume-Matcher本篇技术指南围绕 Resume-Matcher 的 AI 简历增强功能展开讲解其分析弱点 → 定向提问 → 增量补充 bullet的三段式工作流、三个核心设计约束最多 6 个问题、只增不改、优先排序、后端五个 API 端点与前端的向导式状态机实现并结合源码与测试给出可直接落地的调用方式。读完本文你将掌握该功能从 Prompt 设计、LLM 调用、数据落库到 React 向导交互的完整实现链路并能在自己的简历数据处理管线中复用同样的设计模式。功能概览为什么需要增强而不是重写主简历Master Resume是用户所有求职材料的源头但它经常存在描述笼统、缺少量化指标、技术栈不明等问题。Resume-Matcher 的 enrichment 功能解决的不是重写一份新简历而是在保留原有内容的基础上帮助用户把薄弱条目补充得更具体、更有说服力。它的核心思路来自 enrichment.md 中的三步闭环分析简历找出 Experience工作经历与 Projects项目中描述薄弱或过于笼统的条目针对这些条目向用户提出定向澄清问题根据用户的回答生成额外的 bullet point追加到原有描述之后。整个过程由 LLM 驱动但关键决策——问什么、改哪里、怎么合并——通过精心设计的 Prompt 与代码逻辑进行约束避免 AI 自由发挥破坏简历事实。工作流从点击按钮到写入数据库的五个阶段根据 enrichment.md 与前端 use-enrichment-wizard.ts 中的状态机定义完整流程分为五个阶段用户在 简历详情页/resumes/[id]/page.tsx#L369) 点击 Enhance Resume 按钮打开 EnrichmentModalAI 分析简历analyzing识别薄弱条目并生成澄清问题用户逐题作答questions最多 6 个问题AI 根据回答生成新的 bulletgenerating进入预览页preview供用户确认确认后写入主简历applying→complete新 bullet 被追加到原有内容之后。前端状态机完整覆盖了idle / analyzing / questions / generating / preview / applying / complete / error / no-improvements九种状态其中no-improvements是重要的人性化分支当items_to_enrich或questions为空时向导直接提示简历已足够好并给出analysis_summary而不是强行让用户走完流程见 use-enrichment-wizard.ts。三大核心设计决策enrichment.md 明确列出了本功能的三个设计约束这些约束在源码中都有硬性落实设计决策说明源码落实最多 6 个问题避免让用户感到疲惫AI 在所有条目中合计最多生成 6 个问题而非每个条目 6 个Prompt 中写入 MAXIMUM 6 QUESTIONS TOTAL - this is a hard limit见 enrichment.py同时约束问题 ID 最多到q_5增量式增强原有 bullet 一律保留新生成的 bullet 追加在其后routers/enrichment.py 中existing_desc additional_bullets直接拼接问题优先排序AI 优先提出收益最高的问题Prompt 指令 Prioritize the most impactful questions that will yield the best improvements见 enrichment.py这里只增不改是刻意为之它既保护了用户简历中已经写好的事实也让 AI 生成的补充内容永远处于可审查状态——用户在预览步骤可以逐个确认新增内容而不是被迫接受一次大范围改写。弱点识别规则AI 如何判断这段写得不行分析阶段的 PromptANALYZE_RESUME_PROMPT内置了 6 条描述薄弱指标这是整个功能的判断基准泛化措辞出现 responsible for、worked on、helped with、assisted in、involved in 等模板化短语缺少量化指标没有数字、百分比、金额或可测量的结果范围不明团队规模、项目体量、用户数、职责边界含糊没有技术栈未提及具体技术、工具或方法论被动语态且无归属看不出候选人个人的实际贡献过于简短单条 bullet 无法说明工作内容。Prompt 同时给出了正面范例供模型参照例如- Led migration of 15 microservices to Kubernetes, reducing deployment time by 60% - Built real-time analytics dashboard using React and D3.js, serving 10K daily users - Architected payment processing system handling $2M monthly transactions可以看出这三条范例分别示范了量化影响、技术栈 用户规模、财务量级 架构职责正好与提问阶段想要抽取的信息维度metrics、technologies、scope、ownership一一对应。Prompt 还要求输出 JSON 中携带weakness_reason让用户在看问题时能理解为什么问我这些。API 端点三个核心接口与两个衍生接口enrichment.md 列出了三个核心端点。需要补充的是实际路由在 main.py 中以/api/v1前缀注册router 自身前缀为/enrichment因此完整路径为/api/v1/enrichment/...。此外同一模块还扩展实现了 AI Regenerate 功能的两个端点本文一并说明。POST /api/v1/enrichment/analyze/{resume_id}分析简历并生成问题。实现位于 routers/enrichment.py从数据库取出processed_data若为空返回 400提示重新上传简历将整个processed_data序列化为 JSON 填入 Prompt并按 get_language_name 注入output_language保证生成的问题、占位符、摘要全部使用用户当前内容语言项目支持中、英、日、西、法等多语言调用complete_json(prompt, max_tokens8192, schema_typeenrichment)并设置180 秒硬超时超时返回 504JSON 解析失败返回 422其余异常返回 500。响应结构由 schemas/enrichment.py 定义{ items_to_enrich: [ { item_id: exp_0, item_type: experience, title: Software Engineer, subtitle: Company Name, current_description: [bullet 1, bullet 2], weakness_reason: Missing quantifiable impact and specific technologies used } ], questions: [ { question_id: q_0, item_id: exp_0, question: What specific metrics improved as a result of your work?, placeholder: e.g., Reduced API response time by 40%, saved $50K annually } ], analysis_summary: Brief summary of overall resume strength and areas for improvement }注意item_id的命名规范工作经历用exp_0、exp_1按数组下标项目用proj_0、proj_1问题 ID 为q_0~q_5。这一约定是整个模块后续定位条目、按索引写回数据库的关键。POST /api/v1/enrichment/enhance根据用户回答生成增强描述。这是模块中实现最讲究性能的端点routers/enrichment.py包含双路径逻辑快速路径Fast path如果所有AnswerInput都携带了item_id则通过 _extract_item_from_resume 直接从processed_data按exp_0 / proj_0模式解析出条目详情完全跳过第二次 LLM 分析调用——这是避免问完问题还要再花 180 秒重新分析的关键优化兼容路径Legacy path若答案缺少item_id如旧版本前端或直接调 API 的客户端则重新调用ANALYZE_RESUME_PROMPT把question_id映射回item_id再按条目聚合答案。无论哪条路径最终都会对每个条目调用ENHANCE_DESCRIPTION_PROMPTenrichment.py要求模型生成 2-4 条新的bullet。该 Prompt 的核心约束是只 ADD不 REPLACE不重复已有 bullet只使用用户回答中提供的信息禁止虚构指标动作导向Led、Built、Architected、Optimized 等强动词开头量化优先包含技术栈明确个人贡献过去经历用过去时当前经历用现在时。响应的enhanced_description字段就是将要追加的新 bullet 列表代码还保留了旧 keyadditional_bullets的向后兼容读取。POST /api/v1/enrichment/apply/{resume_id}把增强结果写入主简历routers/enrichment.py深拷贝processed_data避免直接修改数据库中的原始对象按item_type分发到workExperience或personalProjects数组用item_id.split(_)[1]解析下标将新增 bullet 与原有 description 列表拼接existing_desc additional_bullets并处理了 description 可能是字符串的边缘情况同步更新content与processed_data两个字段后写回数据库返回{message: Enhancements applied successfully, updated_items: N}。衍生接口AI Regenerate按反馈重写同一模块同一 router、同样的enrichment前缀还实现了两个衍生端点POST /api/v1/enrichment/regenerate接收用户反馈指令instruction上限 2000 字符由 RegenerateRequest 校验对选中的 experience / project / skills 条目整体重写。与 enhance 的追加不同这里是替换且同样禁止编造事实Do NOT add any new facts, metrics...。所有条目通过asyncio.gather并行处理单个失败不会拖垮整体失败项以errors列表返回POST /api/v1/enrichment/apply-regenerated/{resume_id}落库前执行严格的一致性校验——通过标题、副标题、原文内容三层匹配定位条目若简历在重写期间被改动导致无法唯一匹配则整体拒绝409 Conflict防止覆盖用户数据。这一逻辑可以从 apply_regenerated_items 中的_find_unique_index_by_metadata与_lines_equal辅助函数推断属于安全落库的防御性设计。前端对应的 API 客户端封装在 lib/api/enrichment.ts五个函数analyzeResume、generateEnhancements、applyEnhancements、regenerateItems、applyRegeneratedItems与后端端点一一对应错误信息统一取data.detail展示。LLM 调用层JSON 模式、截断检测与重试所有端点都经由 complete_json 调用 LLM这是保证结构化输出可解析的公共底座强制 JSON-only 系统提示You must respond with valid JSON only模型支持时启用response_format{type: json_object}JSON mode失败后自动降级为纯提示约束截断感知重试按schema_typeenrichment检查返回结果是否缺少items_to_enrich / questions / analysis_summary等关键键若截断则附带提示语重试最多 2 次重试提示语见 llm.py通过_extract_json从响应中稳健抽取 JSON 对象支持前后缀文本包裹。分析阶段使用max_tokens8192为多语言输出留足空间生成阶段使用默认4096技能重写阶段为2048超时由 calculate_timeout 依据模型与 provider 动态计算。这意味着该功能天然兼容项目支持的 100 种 LLM本地模型、OpenAI 兼容聚合器等只要模型能输出 JSON 即可接入。前端实现向导式交互的工程细节前端通过useReducer实现严格的单向状态流use-enrichment-wizard.ts三个核心工程细节值得借鉴问题导航NEXT_QUESTION / PREV_QUESTION / GO_TO_QUESTION对currentQuestionIndex做边界钳制question-step.tsx 提供进度条、所属条目徽标工作经历用 Briefcase 图标、项目用 FolderKanban 图标、以及Ctrl/⌘ Enter 快捷提交空答案过滤生成阶段将answers中空白作答过滤掉answer.trim() ! 避免把空字符串塞给 LLM错误重试分级retry根据当前状态智能回退——已有预览则重试 apply已有答案则回到问题页否则从头分析见 use-enrichment-wizard.ts。弹窗组件 enrichment-modal.tsx 使用原生dialog实现并在analyzing / generating / applying三个加载态禁止关闭阻止 ESC 与背景点击避免用户在 LLM 调用中途误操作丢失进度。质量保障测试覆盖后端对该模块的约束在测试中有直接体现test_regenerate_endpoints.py 验证RegenerateRequest.instruction的 2000 字符上限2001 字符触发ValidationError并验证多条目并行处理路径schema_typeenrichment的截断检测逻辑在 test_llm.py 中覆盖。从测试结构可以推断见 conftest.py 对 enrichment 相关 mock 的引用团队将LLM 不可靠视为默认前提测试重点是校验模式、超时、错误码与落库安全性而非 LLM 的输出内容。关键文件索引文件作用prompts/enrichment.py4 组 Prompt分析、增强、条目重写、技能重写routers/enrichment.py5 个端点analyze / enhance / apply / regenerate / apply-regeneratedschemas/enrichment.py全部请求/响应 Pydantic 模型llm.pycomplete_jsonJSON 模式、截断检测、重试与超时use-enrichment-wizard.ts向导状态机useReducerlib/api/enrichment.ts前端 API 客户端components/enrichment/弹窗、提问页、预览页、加载步骤组件test_regenerate_endpoints.py端点与校验约束测试设计模式总结可复用的人机协作改写范式纵观整个功能它实际上示范了一个通用的人机协作内容改写范式AI 负责发现薄弱点并提出好问题分析阶段人负责提供事实增量提问阶段AI 再负责把事实组织成高质量表述生成阶段最后由代码以只追加、可预览、先校验再落库的方式保证数据安全。三个核心约束——问题数量上限、增量不改写、事实不虚构——分别从体验、数据完整性和可信度三个维度保护了用户这套设计同样适用于求职信、自我介绍等任何由用户资料驱动的 AI 生成场景。【免费下载链接】Resume-MatcherThe #1 AI Harness for Building Resumes, PDFs, Cover Letters more, locally with 100 LLMs support.项目地址: https://gitcode.com/GitHub_Trending/re/Resume-Matcher创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。