Spaces:
Sleeping
Sleeping
| # 📑 技术规格说明(SPR) — AI-powered Resume & Cover Letter Generator | |
| ## 1. 项目结构 | |
| ``` | |
| apply-helper/ | |
| ├── pyproject.toml # 项目依赖与配置 | |
| ├── uv.lock # UV 依赖锁定文件 | |
| ├── .env.example # 环境变量配置模板 | |
| ├── src/ # 源代码根目录 | |
| │ ├── streamlit_app.py # Streamlit 前端主入口 | |
| │ ├── mock_data.py # 测试用模拟数据 | |
| │ ├── services/ # 业务逻辑层 | |
| │ │ ├── __init__.py | |
| │ │ ├── analyse_service.py # JD/用户信息分析与总结 | |
| │ │ ├── generation_service.py # 简历与求职信生成 | |
| │ │ └── llm_service.py # LLM/LiteLLM 统一封装与调用 | |
| │ └── llm/ # LLM集成层 | |
| │ ├── __init__.py | |
| │ ├── litellm_client.py # LiteLLM API 封装 | |
| │ └── prompt_templates.py # LLM Prompt 模板管理 | |
| ├── docs/ # 文档目录 | |
| │ ├── prd.md # 产品需求文档 | |
| │ ├── spec.md # 技术规格说明(本文件) | |
| │ ├── services.spec.md # 服务层规格说明 | |
| │ └── llm.spec.md # LLM集成规格说明 | |
| └── tests/ # 单元测试(待实现) | |
| ``` | |
| ## 2. 主要 Python 文件与函数 | |
| ### 2.1 `src/streamlit_app.py` — Streamlit 前端主入口 | |
| - **页面布局**: 侧边栏输入控制,主区域双列预览(简历 + 求职信) | |
| - **会话状态管理**: 使用 `st.session_state` 持久化分析结果、生成文档和错误状态 | |
| - **主要函数**: | |
| - `main()`:应用入口,负责页面配置、UI渲染与交互逻辑 | |
| - `initialize_session_state()`:初始化会话状态变量 | |
| - `handle_analyse(jd: str, user_info: str)`:分析按钮回调,包含输入验证、调用服务、异常处理 | |
| - `handle_refine(feedback: str)`:优化按钮回调,基于反馈更新分析 | |
| - `handle_mock_analyse()`:模拟分析按钮回调,加载预设测试数据 | |
| - **模拟数据功能**: 三个按钮支持加载模拟JD、简历和完整分析结果 | |
| - **错误处理**: 集中化错误显示,用户友好提示信息 | |
| ### 2.2 LLM 集成层 | |
| #### `src/services/llm_service.py` — LLM服务包装层 | |
| - **核心功能**: 提供LLM调用的统一接口,负责提示词模板格式化和LiteLLM调用 | |
| - **主要函数**: | |
| - `analyse_llm(jd: str, user_info: str) -> str`: 工作分析,返回原始LLM响应字符串 | |
| - `refine_llm(summary_json: str, feedback: str) -> str`: 基于反馈优化分析,返回原始LLM响应 | |
| - `generate_resume_llm(summary_json: str, user_info: str) -> str`: 生成Markdown格式简历 | |
| - `generate_cover_letter_llm(job_description: str, user_info: str) -> str`: 生成德语求职信 | |
| #### `src/llm/litellm_client.py` — LiteLLM客户端集成 | |
| - **多Provider支持**: 优先支持Azure OpenAI,备用支持标准OpenAI | |
| - **自动配置**: 基于环境变量自动检测和配置最优客户端 | |
| - **主要函数**: | |
| - `call_llm(prompt: str, model: str = None, max_tokens: int = 800, temperature: float = 1.0) -> str` | |
| - `get_azure_client() -> dict`: 配置Azure OpenAI客户端 | |
| - `get_openai_client() -> dict`: 配置标准OpenAI客户端 | |
| - 包含连接测试和调试模式,支持litellm debug | |
| #### `src/llm/prompt_templates.py` — 提示词模板管理 | |
| - **模板类型**: analyse, refine, generate_resume, generate_cover_letter | |
| - **函数**: `get_template(name: str) -> str` | |
| - **特点**: | |
| - 字典存储,包含详细的JSON输出格式要求 | |
| - ANALYSE_PROMPT: 德国科技市场专家角色,8-12个技能提取,4-6个匹配点分析 | |
| - GENERATE_COVER_LETTER_PROMPT: 德语商务求职信生成,符合德国商务信函规范 | |
| - 所有模板包含明确的输出格式要求和角色设定 | |
| #### 核心处理逻辑 | |
| - **提示词管理**: 从模板获取提示词,使用Python字符串format动态替换参数 | |
| - **LLM调用**: 通过LiteLLM统一接口调用不同provider的模型 | |
| - **错误处理**: LiteLLM层处理API调用异常,服务层处理业务逻辑异常 | |
| - **响应处理**: 返回原始字符串响应,由上层服务负责结构化解析 | |
| ### 2.3 业务服务层 | |
| #### `src/services/analyse_service.py` — 分析服务 | |
| - **功能**: 职位描述与用户背景的匹配分析,使用Pydantic数据模型 | |
| - **数据模型**: `AnalysisResult(BaseModel)` - 结构化分析结果 | |
| - key_skills: List[str] - 关键技能列表 | |
| - match_points: List[str] - 匹配优势点 | |
| - gap_points: List[str] - 技能差距点 | |
| - suggestions: List[str] - 改进建议 | |
| - pitch: str - 价值主张 | |
| - **主要逻辑**: | |
| - 验证输入参数非空 | |
| - 委托LLM服务进行分析 | |
| - `_parse_analysis_response()` - 复杂JSON解析逻辑,处理代码块包装 | |
| - `analyse()` - 初始分析,返回AnalysisResult对象 | |
| - `refine()` - 基于反馈优化分析,使用model_dump_json()序列化 | |
| #### `src/services/generation_service.py` — 文档生成服务 | |
| - **功能**: 编排简历和求职信的生成 | |
| - **主要接口**: | |
| - `generate_resume(summary: AnalysisResult, user_info: str) -> str` - 生成简历 | |
| - `generate_cover_letter(job_description: str, user_info: str) -> str` - 生成求职信 | |
| - `generate_both(summary: AnalysisResult, user_info: str, job_description: str) -> Tuple[str, str]` - 生成完整文档对 | |
| - **主要逻辑**: | |
| - 使用AnalysisResult对象和原始文本作为输入 | |
| - 调用LLM服务生成简历(Markdown)和求职信(德语文本) | |
| - 支持动态导入处理,兼容模块和独立运行 | |
| - 返回生成的文档元组 | |
| ### 2.4 模拟数据系统 | |
| #### `src/mock_data.py` — 测试数据管理 | |
| - **MOCK_JD**: 完整的高级软件工程师职位描述 | |
| - **MOCK_RESUME**: John Smith 的详细简历信息 | |
| - **Analysis_Summary**: 结构化分析结果(Dict格式) | |
| - key_skills, match_points, gap_points, suggestions, pitch | |
| - **Resume**: 生成的Markdown格式简历 | |
| - **Cover_Letter**: 生成的纯文本求职信 | |
| - **用途**: 支持无需LLM调用的完整工作流测试 | |
| ## 3. Streamlit UI 实现 | |
| ### 3.1 页面布局 | |
| - **侧边栏(Sidebar)**: | |
| - **模拟数据按钮**: 三列布局 - "Load Mock JD", "Load Mock Resume", "Mock Analyse" | |
| - **输入区域**: | |
| - Job Description 文本区域(高度150px) | |
| - User Resume/Info 文本区域(高度200px) | |
| - **控制按钮**: "Analyse" 按钮(全宽) | |
| - **优化区域**: | |
| - Feedback 文本区域(高度100px) | |
| - "Refine" 按钮(全宽) | |
| - **主区域(Main Area)**: | |
| - **错误显示**: 使用 `st.error()` 显示异常信息 | |
| - **分析摘要**: 使用 `st.json()` 展示结构化分析结果 | |
| - **双列预览**: | |
| - 左列: Resume 预览(Markdown 渲染) | |
| - 右列: Cover Letter 预览(纯文本显示) | |
| ### 3.2 会话状态管理 | |
| **状态变量**: | |
| - `summary` - 分析摘要结果 | |
| - `resume_md` - 生成的简历Markdown | |
| - `cover_letter_txt` - 生成的求职信文本 | |
| - `error` - 错误信息显示 | |
| - `user_info_input` - 用户输入缓存 | |
| ### 3.3 交互流程 | |
| 1. **标准工作流**: | |
| - 输入JD和用户信息 → 点击"Analyse" → 显示分析和生成结果 | |
| - 输入反馈 → 点击"Refine" → 更新分析和重新生成 | |
| 2. **模拟数据工作流**: | |
| - 点击"Load Mock JD" → 自动填充职位描述 | |
| - 点击"Load Mock Resume" → 自动填充简历信息 | |
| - 点击"Mock Analyse" → 直接加载完整分析结果 | |
| 3. **错误处理**: | |
| - 输入验证: 检查空值,显示友好错误信息 | |
| - 异常捕获: 包装在try-catch中,显示具体错误消息 | |
| - 状态清理: 成功时清除error状态 | |
| ## 4. 技术实现详情 | |
| ### 4.1 依赖管理 | |
| **核心依赖**: streamlit (UI), litellm (LLM调用), python-dotenv (环境变量), weasyprint (PDF,未使用), pydantic (验证,未使用) | |
| **安装和运行**: | |
| 1. `pip install uv` - 安装包管理器 | |
| 2. `uv sync` - 同步依赖 | |
| 3. `cp .env.example .env` - 配置环境变量 | |
| 4. `uv run streamlit run src/streamlit_app.py` - 启动应用 | |
| ### 4.2 LLM集成配置 | |
| **多Provider支持**: 优先Azure OpenAI,备用标准OpenAI | |
| **Azure OpenAI配置**: AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_MODEL, AZURE_OPENAI_API_VERSION(默认2024-12-01-preview) | |
| **OpenAI配置**: OPENAI_API_KEY(使用gpt-3.5-turbo模型) | |
| **配置逻辑**: | |
| - 优先检测Azure配置,如果完整则使用Azure | |
| - Azure不可用时回退到标准OpenAI | |
| - 支持模型参数覆盖,但仅支持azure/前缀的模型 | |
| - 包含详细的配置验证和错误提示 | |
| ### 4.3 开发和测试 | |
| **模拟数据测试**: | |
| - 无需配置LLM即可测试完整UI流程 | |
| - `src/mock_data.py` 包含完整测试数据集 | |
| - 点击"Mock Analyse"按钮即可加载预设结果 | |
| **调试和测试模式**: | |
| - `python src/llm/litellm_client.py` - 测试LLM连接和配置验证 | |
| - `python src/services/analyse_service.py` - 测试分析服务完整流程 | |
| - `python src/services/generation_service.py` - 测试文档生成流程 | |
| - 包含litellm._turn_on_debug()调试支持 | |
| ### 4.4 架构特点 | |
| **模块化设计**: | |
| - 业务逻辑与UI分离 | |
| - LLM集成层独立封装 | |
| - 服务层薄包装,便于替换实现 | |
| **扩展点**: | |
| - 添加新的LLM provider: 扩展 `litellm_client.py` 中的客户端配置函数 | |
| - 添加PDF导出: 实现 `pdf_service.py` 集成WeasyPrint | |
| - 添加新的生成模板: 在 `prompt_templates.py` 中添加新模板常量 | |
| - 数据验证增强: 当前使用Pydantic AnalysisResult模型,可扩展更多验证模型 | |
| - 多语言支持: 扩展prompt_templates支持不同语言的求职信生成 |