Resume Matcher 深度指南:AI 驱动的简历定制引擎,架构、安装与多 LLM 实战配置
【免费下载链接】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 是一个以"Master Resume(母版简历)"为核心的 AI 简历定制开源项目:先维护一份完整母版简历,再针对每个具体职位描述(Job Description, JD)自动生成定制化简历、求职信(Cover Letter)与面试准备内容,支持本地与云端 100+ 种 LLM。本文将以仓库 README.md 与 SETUP.md 为主线,结合后端源码(config.py、llm.py、main.py)与部署配置(docker-compose.yml、start.sh),完整讲解其工作原理、六大核心功能、本地安装、多 AI Provider 配置、Docker 部署与故障排查,读完即可从零跑通并深度定制自己的简历工作流。
一、项目定位与核心工作流
Resume Matcher 的设计哲学是一次母版、处处定制:你不必为每次投递手工重写简历,而是维护一份内容完整、覆盖你全部经历能力的 Master Resume,之后每一次投递都只针对目标 JD 做"定向裁剪"。
官方给出的标准工作流(见 README.md 的 Getting Started 一节)共六步:
- Upload:上传你的 Master Resume(支持 PDF 或 DOCX)
- Paste:粘贴你正在投递的目标职位描述(JD)
- Review:审阅 AI 生成的改进建议与定制化内容
- Cover Letter:为本次投递生成求职信,并可生成可选的面试准备材料
- Customize:调整版式与章节,使其符合你的个人风格
- Export:用你偏好的模板导出专业 PDF
这套流程在代码层的落点是前端页面路由(app/(default)) 下的dashboard、builder、tailor、resume-wizard、tracker、settings等页面)与后端 API 路由(routers 下的resumes、jobs、enrichment、applications、resume_wizard等,均在 main.py 中以/api/v1前缀统一挂载)。
二、六大核心功能全景
2.1 Master Resume:母版简历
项目的起点是一份"主简历"。README 用一张上传输入示意图说明了这一入口——你既可以直接上传现有简历文件,也可以把过往经历结构化录入,作为后续所有定制动作的内容底座。
从后端数据层看,主简历由 database.py 中的Resume模型承载,并维护"单主简历"(single-master)不变量:数据库层通过_master_resume_lock串行化主简历提升操作,同时用部分唯一索引作为存储级兜底。这意味着系统中始终只有一份简历会被标记为 Master。
2.2 Resume Builder:职位定制化构建器
粘贴一份 JD,AI 即为你生成针对该职位的定制简历。README 明确指出你可以在 Builder 中:
- 修改 AI 建议的内容
- 添加/删除章节
- 通过拖拽(drag-and-drop)重排章节顺序
- 从多种简历模板中选择版式
前端实现上,拖拽重排依赖@dnd-kit(见 package.json),章节级拖拽组件位于 components/builder/draggable-section-wrapper.tsx;Builder 主界面位于 components/builder/resume-builder.tsx。后端对应"定制/改进"(tailoring / improve)流程,由 services/improver.py 实现,并受REQUEST_TIMEOUT_SECONDS(默认 240 秒,可配置范围 [30, 1800] 秒)超时保护——该超时必须在后端asyncio.wait_for、Next.jsproxyTimeout与前端AbortController三层保持一致,否则任一层先超时都会导致请求被静默切断(config.py 中的注释明确记录了这一问题)。
2.3 Cover Letter 生成器
基于 JD 与简历内容生成定制化求职信。后端服务位于 services/cover_letter.py,前端有 components/builder/cover-letter-editor.tsx 与对应预览组件,并提供独立的打印路由(app/print/cover-letter/[id])用于 PDF 化输出。
2.4 Interview Prep:面试准备
README 说明:可为已保存的定制简历生成结构化、以简历内容为依据的面试准备材料。使用方式有两种:在 Builder 的 "Interview Prep" 标签页按需生成,或在 Settings 中开启自动生成。后端服务位于 services/interview_prep.py,其输出结构由 llm.py 中的截断检测定义,包含role_fit_analysis(岗位匹配度分析)、resume_questions(基于简历的提问)、project_follow_ups(项目追问)、skill_gaps(技能差距)、talking_points(谈话要点)五个必填键。
2.5 简历评分与关键词高亮
针对 JD 分析你的简历,输出匹配分数、关键词高亮与改进建议。README 提供了真实运行界面截图:
前端展示组件为 components/builder/jd-comparison-view.tsx、components/builder/highlighted-resume-view.tsx 以及 components/tailor/ats-score-card.tsx;关键词匹配的纯前端逻辑在 lib/utils/keyword-matcher.ts,并有对应单元测试 tests/keyword-matcher.test.ts。
2.6 PDF 导出与模板系统
定制后的简历与求职信均可导出为 PDF,底层由 Playwright 驱动的 Headless Chromium 渲染(技术栈表明确标注,前端打印路由位于 app/print)。Docker 启动脚本 start.sh 会在容器内检查并自动安装 Playwright Chromium,若安装失败会明确告警"PDF export may not work"。
仓库内置 4 套 PDF 模板,README 的模板表完整如下:
| 模板名称 | 预览 | 描述 |
|---|---|---|
| Classic Single Column | 传统简洁版式,适合大多数行业。 查看 PDF | |
| Modern Single Column | 当代设计,注重可读性与美观。 查看 PDF | |
| Classic Two Column | 结构化双栏版式,章节区分清晰。 查看 PDF | |
| Modern Two Column | 双栏流线型设计,组织更有序。 查看 PDF |
前端模板注册机制见 components/resume(resume-single-column.tsx、resume-two-column.tsx、resume-modern.tsx、resume-modern-two-column.tsx等),CSS 样式体系位于 components/resume/styles,并有 tests/template-registration.test.ts 与 tests/resume-clean.test.tsx 等测试保障。想扩展新模板可参考 docs/agent/features/adding-resume-templates.md。
2.7 国际化(i18n)
README 明确了两层国际化能力:
- 多语言 UI:界面支持英语、西班牙语、简体中文、日语、巴西葡萄牙语
- 多语言内容:简历与求职信内容可按你的偏好语言生成
前端语言包位于 messages(en.json、es.json、fr.json、ja.json、pt-BR.json、zh.json),本地化上下文与工具在 lib/i18n 与 lib/context/language-context.tsx,仓库还提供 scripts/check_locale_parity.py 与测试 tests/i18n-locale-parity.test.ts 来保证各语言包键值对齐。
2.8 Roadmap:规划中的功能
README 列出的未来方向包括:
- AI Canvas:面向"数据驱动简历内容"的撰写画布
- Email template generator:求职邮件模板生成器
- Multi-job description optimization:多职位描述联合优化
三、本地安装与快速启动
3.1 前置条件
README 与 SETUP.md 给出的环境要求如下:
| 工具 | 版本要求 | 说明 |
|---|---|---|
| Python | 3.13+ | 后端运行环境 |
| Node.js | 22+ | 前端运行环境 |
| npm | 10+ | 随 Node.js 附带 |
| uv | Latest | Python 依赖管理(uv sync) |
| Git | 任意 | 克隆仓库 |
uv 的安装方式(macOS/Linux 与 Windows):
# macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows (PowerShell) powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # 或通过 pip pip install uv3.2 快速启动(双终端)
README 与 SETUP 给出的最快启动路径:
# 克隆仓库 git clone https://gitcode.com/GitHub_Trending/re/Resume-Matcher.git cd Resume-Matcher # 终端 1:后端 cd apps/backend cp .env.example .env # 配置你的 AI Provider uv sync # 安装依赖 uv run app # 终端 2:前端 cd apps/frontend npm install npm run dev后端默认监听http://0.0.0.0:8000,前端开发服务器(Next.js 16 + Turbopack)默认监听http://localhost:3000。启动后打开http://localhost:3000,在 Settings 页配置 AI Provider 即可使用。
3.3 后端.env配置详解
.env模板位于 apps/backend/.env.example。以 OpenAI 为例的最小配置(来自 SETUP.md):
LLM_PROVIDER=openai LLM_MODEL=gpt-5-nano-2025-08-07 LLM_API_KEY=sk-your-api-key-here # 本地开发保持默认即可 HOST=0.0.0.0 PORT=8000 FRONTEND_BASE_URL=http://localhost:3000 CORS_ORIGINS=["http://localhost:3000", "http://127.0.0.1:3000"]后端配置由 config.py 中的Settings类(基于pydantic-settings)从环境变量加载,全部可配置项与默认值如下:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
LLM_PROVIDER | openai | 可选openai/openai_compatible/anthropic/openrouter/gemini/deepseek/groq/ollama(空值回退为 openai) |
LLM_MODEL | gpt-5-nano-2025-08-07 | 默认模型名 |
LLM_API_KEY | 空 | API 密钥,可留空由 UI 配置或使用本地无鉴权服务 |
LLM_API_BASE | None | 自定义 API 端点(Ollama、代理、OpenAI 兼容服务) |
REASONING_EFFORT | None | 推理强度:minimal/low/medium/high;None表示不发送该参数(最大兼容性,LiteLLM 会为不支持的模型自动丢弃) |
HOST | 0.0.0.0 | 后端监听地址 |
PORT | 8000 | 后端监听端口 |
RELOAD | false | 开发热重载开关(RELOAD=true uv run app) |
LOG_LEVEL | INFO | 应用日志级别:CRITICAL/ERROR/WARNING/INFO/DEBUG |
LOG_LLM | WARNING | LiteLLM 日志级别(同上取值) |
FRONTEND_BASE_URL | http://localhost:3000 | 前端地址,PDF 生成时后端回调前端使用 |
CORS_ORIGINS | ["http://localhost:3000", "http://127.0.0.1:3000"] | CORS 白名单(JSON 数组),FRONTEND_BASE_URL会被自动追加 |
REQUEST_TIMEOUT_SECONDS | 240 | 单次定制/改进请求硬超时,被钳制在 [30, 1800] 秒 |
值得注意的源码细节:LLM_PROVIDER为空时会自动回退为openai(config.py);LOG_LEVEL/LOG_LLM若传非法值会在启动时抛出ValueError而非静默接受(同文件 L230-L237、L284-L291);REQUEST_TIMEOUT_SECONDS则对非法输入回退 240 并钳制范围(L256-L268)。
3.4 前端配置
前端通常无需环境文件;仅当后端运行在不同端口时才需要(SETUP.md):
cd apps/frontend cp .env.sample .env.local四、AI Provider 配置深度解析
4.1 支持的 Provider 一览
源码层面,llm_provider是严格枚举(config.py):openai、openai_compatible、anthropic、openrouter、gemini、deepseek、groq、ollama共 8 种。README 的对照表与 SETUP.md 的配置模板合并如下:
| Provider | 位置 | LLM_PROVIDER/LLM_MODEL配置示例 | 备注 |
|---|---|---|---|
| Ollama | 本地 | ollama/gemma3:4b(LLM_API_BASE=http://localhost:11434) | 免费,运行在你的机器上 |
| OpenAI | 云端 | openai/gpt-5-nano-2025-08-07 | GPT-5 Nano、GPT-4o 等 |
| Anthropic | 云端 | anthropic/claude-haiku-4-5-20251001 | Claude Haiku 4.5 |
| Google Gemini | 云端 | gemini/gemini/gemini-3-flash-preview | Gemini 3 Flash |
| OpenRouter | 云端 | openrouter/deepseek/deepseek-chat | 聚合多模型 |
| DeepSeek | 云端 | deepseek/deepseek-chat | DeepSeek Chat |
| OpenAI-Compatible | 本地 | openai_compatible/llama-3.1-8b(LLM_API_BASE=http://localhost:8080/v1) | llama.cpp、vLLM、LM Studio 等暴露 OpenAI Chat Completions API 的服务,API Key 可选 |
Anthropic 的完整.env示例:
LLM_PROVIDER=anthropic LLM_MODEL=claude-haiku-4-5-20251001 LLM_API_KEY=sk-ant-your-key-here4.2 本地免费方案:Ollama
不想产生 API 费用时,用 Ollama 本地跑模型:
# 1. 安装 Ollama(官方站点下载) # 2. 拉取模型 ollama pull gemma3:4b # 其他选择:llama3.2、mistral、codellama、neural-chat # 3. 配置 .envLLM_PROVIDER=ollama LLM_MODEL=gemma3:4b LLM_API_BASE=http://localhost:11434 # Ollama 不需要 LLM_API_KEY# 4. 确保 Ollama 正在运行 ollama serve4.3 底层实现:LiteLLM 多 Provider 路由
所有 Provider 的请求都经由 llm.py 封装到 LiteLLM,几处关键实现值得了解:
- 模型名前缀:
get_model_name会为各 Provider 自动添加 LiteLLM 前缀,例如openai_compatible→openai/、anthropic/、gemini/、deepseek/、groq/、ollama_chat/(Ollama 走/api/chat以支持 messages 数组),OpenRouter 始终强制openrouter/前缀以支持嵌套模型名(如openrouter/anthropic/claude-3.5-sonnet)。若模型名已带已知前缀则原样透传(llm.py)。 api_base规范化:_normalize_api_base会按 Provider 剥离重复的/v1后缀,防止出现/v1/v1/...404(如 Anthropic、Gemini、OpenRouter 各自内部会追加/v1/messages、/v1/models/...、/v1);OpenAI / OpenAI 兼容端点则原样保留用户粘贴的 URL(llm.py)。- 重试与熔断:使用 LiteLLM
Router,num_retries=3,按错误类型区分重试策略:RateLimitError重试 3 次、超时与 5xx 重试 2 次、鉴权/坏请求/内容策略违规不重试;单部署下禁用冷却(cooldown),避免瞬时故障导致后端整体黑屏(llm.py)。Router 按配置指纹缓存,Provider/模型/Key/Base 变化时自动重建(L507-L526)。 - 能力探测:
_supports_temperature、_supports_json_mode查询 LiteLLM 模型注册表判断参数是否受支持,未注册的本地模型(Ollama 自定义模型)保守跳过温度参数;JSON 模式对 Ollama 始终放行(原生format="json")。已知特例:claude-opus-4*不发送 temperature、Moonshotkimi-k2.6仅允许 temperature=1(L871-L920)。 - 思考模型兼容:
_extract_message_text按content→reasoning_content(DeepSeek R1、OpenAI o1/o3)→thinking(Anthropic extended thinking)的顺序提取文本,推理型模型也可直接使用;complete还会剥离...思考标签(L971-L982)。 - JSON 安全:
_extract_json带递归深度(10 层)与内容大小(1MB)双重上限;get_safe_max_tokens会把请求的max_tokens钳制到模型实际输出上限,未注册模型回退保守的 4096(L760-L804)。
4.4 API Key 解析优先级与安全设计
resolve_api_key(llm.py)是密钥解析的唯一真源,优先级为:顶层api_key>api_keys[provider]> 环境变量/设置默认值。关键安全例外:openai_compatible与ollama属于"本地无鉴权"Provider,会跳过环境变量回退——这是为了防止你在LLM_API_KEY里存了付费 OpenAI Key,结果被误发给本地服务。
- API Key 在磁盘上不落明文:
config.json只存非密钥配置,密钥以加密密文存入 SQLite 的api_keys表(config.py 保存时剥离、L58-L73 解密注入);启动时migrate_legacy_keys会把历史明文密钥一次性折叠进加密存储并清除明文(L112-L149)。 - 健康检查失败时返回给前端的错误信息会经
_scrub_secrets打码sk-...、AIza...、Bearer ...等密钥特征串,防止通过 Settings 页面反向读取密钥(llm.py)。 - OpenAI 兼容服务留空 Key 时自动替换为哨兵值
sk-no-key,以满足 OpenAI 客户端非空校验(L117-L131)。
4.5 在 UI 中配置与验证
官方推荐通过 Settings 界面配置(数据持久化于数据卷/存储,重启不丢失)。首次使用清单:
- 打开
http://localhost:3000/settings - 选择 AI Provider
- 输入 API Key(或配置 Ollama)
- 点击 "Save Configuration"
- 点击 "Test Connection" 验证连通性
- 返回 Dashboard 上传第一份简历
"Test Connection" 调用的正是后端check_llm_health(llm.py):它会发起一次最小对话(max_tokens=64、超时 30 秒),并区分api_key_missing、empty_content、duplicate_v1_path、not_found_404、html_response等错误码,方便快速定位(例如duplicate_v1_path即提示你LLM_API_BASE里多写了/v1)。
五、Docker 部署
5.1 官方镜像与单端口架构
官方 Docker 镜像发布在ghcr.io/srbhr/resume-matcher与srbhr/resume-matcher,支持linux/amd64与linux/arm64。容器架构为"单公共端口":前端监听 3000,后端内部监听 8000,Next.js 将/api反向代理到后端,因此你只需暴露一个 3000 端口(docker-compose.yml 与 start.sh 中的FRONTEND_PORT=3000、BACKEND_PORT=8000体现这一设计)。
5.2 快速启动
# 从发布镜像启动容器 docker compose up -d # 查看日志 docker compose logs -f # 停止容器 docker compose down直接运行镜像(README 方式,数据持久化到命名卷):
docker run --name resume-matcher \ -p 3000:3000 \ -v resume-data:/app/backend/data \ ghcr.io/srbhr/resume-matcher:latest生产环境建议固定版本标签,例如ghcr.io/srbhr/resume-matcher:1.2.0或ghcr.io/srbhr/resume-matcher:1.2。
5.3 环境变量与端口定制
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT | 3000 | 宿主机端口(映射到容器内 3000) |
LOG_LEVEL | INFO | 应用/Uvicorn 日志级别(ERROR/WARNING/INFO/DEBUG) |
LOG_LLM | WARNING | LiteLLM 日志级别 |
LLM_PROVIDER | openai | AI Provider |
LLM_MODEL | — | 使用的模型(推荐在 Settings UI 配置) |
LLM_API_KEY | — | API Key(推荐在 Settings UI 配置) |
LLM_API_BASE | — | 自定义 API 端点(Ollama 或代理) |
# 只改宿主机端口(容器内保持 3000) PORT=4000 docker compose up -d注意:
LOG_LEVEL与LOG_LLM的修改需要重启容器才生效。
5.4 Docker Secrets(*_FILE变量)
容器支持 Postgres 风格的*_FILEDocker Secrets 机制(实现在 start.sh 的file_env函数中):敏感值可挂载为文件后通过路径传入。
LLM_API_KEY_FILE=/run/secrets/llm_api_key docker compose up -d支持的*_FILE变体:
| 普通变量 | *_FILE变体 |
|---|---|
LOG_LEVEL | LOG_LEVEL_FILE |
LOG_LLM | LOG_LLM_FILE |
LLM_PROVIDER | LLM_PROVIDER_FILE |
LLM_MODEL | LLM_MODEL_FILE |
LLM_API_KEY | LLM_API_KEY_FILE |
LLM_API_BASE | LLM_API_BASE_FILE |
规则:普通变量与其*_FILE变体二者只能用其一;若同时设置,容器会以明确错误退出(start.sh)。
5.5 日志级别配置与安全警告
LOG_LEVEL=INFO LOG_LLM=DEBUG docker compose up -d安全警告:
LOG_LLM=DEBUG会让 LiteLLM 以明文记录 API Key,严禁在生产或共享环境使用 DEBUG 级别,默认的WARNING是安全的。此外 LiteLLM 内部还会读取LITELLM_LOG控制 handler 级过滤;LOG_LLM设置的是 logger 级别,两者必须同时放行日志才会出现,若你按 LiteLLM 文档设置了LITELLM_LOG,请确保LOG_LLM处于相等或更低级别。
5.6 Ollama 与 Docker 协同
Ollama 跑在宿主机上时,容器内无法通过localhost访问宿主机服务,需使用 Docker 的宿主机别名:
# 方式一:环境变量 LLM_API_BASE=http://host.docker.internal:11434 docker compose up -d # 方式二:README 的 docker run 方式,同样把 URL 换成 host.docker.internal然后在 Settings UI 中将 Ollama 配置为 Provider。README 明确提示:"Using Ollama with Docker? Usehttp://host.docker.internal:11434as the Ollama URL instead oflocalhost."
5.7 访问端点
容器启动后可访问:
| URL | 说明 |
|---|---|
http://localhost:3000 | 主应用(Dashboard) |
http://localhost:3000/settings | 配置 AI Provider |
http://localhost:3000/api/v1/health | 后端健康检查(liveness,不调用 LLM) |
http://localhost:3000/docs | 交互式 API 文档(FastAPI Swagger UI) |
源码层面的健康检查有两个层级(routers/health.py):GET /api/v1/health仅返回{"status": "healthy"}作为 Docker HEALTHCHECK 探针;GET /api/v1/status则综合 LLM 连通性、数据库统计(简历数、JD 数、改进次数、是否有 Master Resume)给出ready或setup_required状态,且各子系统检查互相隔离——LLM 探测或数据库统计失败只降级对应字段,不会让整个端点 500。
六、常用命令速查
后端命令
cd apps/backend # 开发服务器(自动重载) RELOAD=true uv run app # 生产服务器 uv run uvicorn app.main:app --host 0.0.0.0 --port 8000 # 安装依赖 uv sync # 安装含开发依赖(用于测试) uv sync --group dev # 运行测试 uv run pytest # 查看数据文件(SQLite 数据库等) ls -la data/前端命令
cd apps/frontend # 开发服务器(Turbopack 快速刷新) npm run dev # 生产构建 npm run build # 生产启动 npm run start # 代码检查 npm run lint # Prettier 格式化 npm run format # 换端口启动 npm run dev -- -p 3001 # 单元测试(Vitest) npm run test数据管理
README 技术栈表标注数据库为 TinyDB(JSON 文件存储),但当前源码已演进为 SQLite:数据层 database.py 是"行为保持的 TinyDB 替换",Database门面保留了原方法名与签名、返回纯 dict,SQLite 文件位于apps/backend/data/resume_matcher.db;同时保留双引擎设计——异步引擎(aiosqlite)服务文档表与应用表,同步引擎服务加密的api_keys表(因为在 LLM 热路径get_llm_config → resolve_api_key上是同步读取)。启动时 main.py 会幂等执行 scripts/migrate_tinydb_to_sqlite.py,将遗留 TinyDB 数据自动迁入 SQLite(迁移失败会快速失败而非以空库启动,避免被误认为数据丢失)。
# 查看数据文件 ls apps/backend/data/ # 备份数据 cp -r apps/backend/data apps/backend/data-backup # 重置(从零开始;危险操作,请先备份) rm -rf apps/backend/data七、故障排查速查表
| 现象 | 错误线索 | 解决方案 |
|---|---|---|
| 后端无法启动 | ModuleNotFoundError | 用uv run uvicorn app.main:app --reload启动,确保依赖经uv sync安装 |
| 后端无法启动 | LLM_API_KEY not configured | 检查.env中是否填写了所选 Provider 的有效 Key |
| 前端页面加载失败 | ECONNREFUSED | 后端未启动,先启动后端:cd apps/backend && uv run uvicorn app.main:app --reload |
| 前端构建/TS 报错 | 编译错误 | 清空 Next.js 缓存后重启:rm -rf apps/frontend/.next && npm run dev |
| PDF 下载失败 | Cannot connect to frontend for PDF generation | ① 前端必须运行;②.env中FRONTEND_BASE_URL与前端地址一致;③CORS_ORIGINS包含前端地址。前端跑在 3001 端口时:FRONTEND_BASE_URL=http://localhost:3001、CORS_ORIGINS=["http://localhost:3001","http://127.0.0.1:3001"] |
| Ollama 连接失败 | Connection refused to localhost:11434 | ①ollama list确认服务在跑;② 必要时ollama serve启动;③ollama pull gemma3:4b确认模型已下载 |
八、项目结构与技术栈
8.1 技术栈
| 组件 | 技术 | 源码证据 |
|---|---|---|
| 后端 | FastAPI、Python 3.13+、LiteLLM | apps/backend/pyproject.toml、llm.py |
| 前端 | Next.js 16、React 19、TypeScript | package.json |
| 数据库 | SQLite(SQLAlchemy,自 TinyDB 迁移) | database.py、scripts/migrate_tinydb_to_sqlite.py |
| 样式 | Tailwind CSS 4、Swiss International Style | package.json、docs/portable/swiss-design-system/README.md |
| Playwright 驱动的 Headless Chromium | pdf.py、start.sh |
8.2 目录结构
Resume-Matcher/ ├── apps/ │ ├── backend/ # Python FastAPI 后端 │ │ ├── app/ │ │ │ ├── main.py # 应用入口(路由挂载、生命周期、数据迁移) │ │ │ ├── config.py # pydantic-settings 环境配置 │ │ │ ├── database.py # SQLite (SQLAlchemy) 数据层 │ │ │ ├── llm.py # LiteLLM 多 Provider 集成 │ │ │ ├── pdf.py # Playwright PDF 渲染 │ │ │ ├── crypto.py # API Key 加解密 │ │ │ ├── routers/ # API 端点(resumes/jobs/enrichment/applications/...) │ │ │ ├── services/ # 业务逻辑(improver/cover_letter/ats/parser/refiner/...) │ │ │ ├── schemas/ # Pydantic 数据模型 │ │ │ └── prompts/ # LLM Prompt 模板 │ │ ├── data/ # SQLite 数据库与 config.json(自动创建) │ │ ├── .env.example # 环境变量模板 │ │ └── pyproject.toml # Python 依赖 │ │ │ └── frontend/ # Next.js React 前端 │ ├── app/ # 页面(dashboard/builder/tailor/tracker/settings/...) │ ├── components/ # 可复用组件(builder/preview/resume/ui/...) │ ├── hooks/ # 自定义 Hooks(use-enrichment-wizard 等) │ ├── lib/ # 工具与 API 客户端 │ ├── messages/ # 多语言语言包 │ ├── .env.sample # 环境变量模板 │ └── package.json # Node.js 依赖 │ ├── docs/ # 额外文档(agent 架构指南、portable 设计系统等) ├── docker-compose.yml # Docker Compose 配置 ├── Dockerfile # 容器构建 └── README.md # 项目总览8.3 进一步阅读
- SETUP.md:完整安装指南(本文章节三至七的原始出处)
- docs/agent/architecture/backend-guide.md:后端架构与 API 细节
- docs/agent/architecture/frontend-workflow.md:用户流程与组件架构
- docs/agent/features/enrichment.md:简历内容增强(Enrichment)功能设计
- docs/agent/features/jd-match.md:JD 匹配与关键词高亮机制
- docs/agent/features/application-tracker.md:职位申请追踪器(Kanban 看板)
- docs/portable/swiss-design-system/README.md:Swiss International Style UI 设计系统
- apps/backend/tests 与 apps/frontend/tests:覆盖 LLM 契约、健康检查、PDF 渲染、i18n 等环节的测试用例,可作为理解各功能预期行为的权威参考
九、结语
Resume Matcher 把"简历投递"这件事工程化为一条可重复的流水线:Master Resume 作为单一事实来源,LLM 负责针对 JD 的定向改写、求职信生成、面试准备与评分建议,模板与 PDF 导出解决最终交付格式,而 LiteLLM 抽象层让本地 Ollama 到云端 Claude/GPT/Gemini/DeepSeek 等 100+ 模型的切换只需改一个环境变量。无论你是想本地免费跑通整套流程的求职者,还是希望理解"多 Provider LLM 应用 + 前后端分离 + 容器化"工程架构的开发者,都可以以本仓库的 README.md、SETUP.md 与上述源码路径为索引,逐步深入。
【免费下载链接】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),仅供参考