统一抽象 封装 模型配置配置管理
This commit is contained in:
@@ -135,11 +135,32 @@ inclusion: manual
|
||||
|
||||
## AI 调用规范
|
||||
|
||||
- 通过 `LLM` 枚举创建模型实例:`LLM.DEEPSEEK_V3.create(temperature=0)`
|
||||
- kwargs 透传给 LangChain `ChatOpenAI`(temperature、max_tokens 等)
|
||||
- 业务代码**不直接使用** `LLM` 枚举,而是从 `app.ai.model_config` 中引用对应模块的场景配置类
|
||||
- `model_config.py` 中每个模块一个 class,每个场景一个类属性,属性值为预创建的 `ChatOpenAI` 实例
|
||||
- 修改模型或调整参数只需改 `model_config.py` 一个文件,业务代码不动
|
||||
- AI 调用应做好异常捕获和容错,单次失败不应影响整体流程
|
||||
- 长耗时 AI 调用考虑异步执行
|
||||
|
||||
### 模型引用示例
|
||||
```python
|
||||
from app.ai.model_config import SkillGapModel
|
||||
|
||||
# chain 中直接使用配置类属性(已经是 ChatOpenAI 实例)
|
||||
_plan_chain = (
|
||||
ChatPromptTemplate.from_messages([...])
|
||||
| SkillGapModel.AGENT_PLAN
|
||||
| StrOutputParser()
|
||||
)
|
||||
|
||||
# 非 chain 场景直接 await 调用
|
||||
result = await JobAgentModel.CHAT.ainvoke(messages)
|
||||
```
|
||||
|
||||
### 新增 AI 场景步骤
|
||||
1. 在 `app/ai/model_config.py` 对应模块的 class 中新增一个类属性,指定模型和参数
|
||||
2. 在业务代码中 `from app.ai.model_config import XxxModel`,引用该属性
|
||||
3. 如需新增模块,在 `model_config.py` 中新建一个 class
|
||||
|
||||
### AI 输出 JSON 解析
|
||||
- LLM 返回的 JSON 经常被 markdown 代码块(` ```json ... ``` `)包裹,**禁止**直接使用 LangChain 的 `JsonOutputParser`
|
||||
- 统一使用 `app.tool.json_helper.parse_llm_json` 解析 AI 输出的 JSON 文本
|
||||
|
||||
@@ -31,7 +31,8 @@ offerpie_python_ai/
|
||||
│ └─ responses.py # 统一响应模型 StandardResponse(code/msg/data/timestamp/uuid)
|
||||
│
|
||||
├─ ai/ # **AI 能力层**
|
||||
│ ├─ models.py # LLM 模型枚举(LLM.DOUBAO_PRO_256K、DEEPSEEK_V3、GPT_4O 等),基于 LangChain ChatOpenAI
|
||||
│ ├─ models.py # LLM 模型枚举(LLM.DOUBAO_PRO_32K、DEEPSEEK_V3、GPT_4O 等),基于 LangChain ChatOpenAI
|
||||
│ ├─ model_config.py # AI 模型场景配置(集中管理各模块的模型选择与参数,业务代码引用此文件而非直接使用 LLM 枚举)
|
||||
│ ├─ resume_extractor/ # 简历 AI 提取模块
|
||||
│ │ ├─ prompts.py # 5 个提取任务的 System Prompt(个人信息/教育/工作+实习/项目/竞赛)
|
||||
│ │ └─ extractor.py # AI 并行提取(extract_all 入口,asyncio.gather 5 路并行)
|
||||
@@ -101,7 +102,7 @@ offerpie_python_ai/
|
||||
|------|----------|-------------|
|
||||
| **config** | 统一配置管理,基于 Pydantic Settings,支持 .env 文件加载 | `Settings`(数据库、Redis、LLM供应商、JWT、CORS、日志等全部配置项) |
|
||||
| **core** | 核心基础设施:数据库连接、Redis连接、鉴权、日志、中间件、异常处理、统一响应 | `database.py`、`redis.py`、`auth.py`、`middleware.py`、`exceptions.py`、`logger.py`、`StandardResponse` |
|
||||
| **ai** | AI 模型管理 + 业务 AI 能力 | `LLM` 枚举、`resume_extractor/`(简历并行提取)、`resume_diagnoser/`(简历诊断)、`skill_gap_analyzer/`(技能差距分析 + 定制简历优化 + Agent 原子化规划 + 单条记录修改/新增)、`job_agent/`(求职助手对话 + 岗位简历优化)、`nova_chat/`(Nova 对话助手,纯对话) |
|
||||
| **ai** | AI 模型管理 + 业务 AI 能力 | `LLM` 枚举(models.py)、`model_config.py`(场景模型配置)、`resume_extractor/`(简历并行提取)、`resume_diagnoser/`(简历诊断)、`skill_gap_analyzer/`(技能差距分析 + 定制简历优化 + Agent 原子化规划 + 单条记录修改/新增)、`job_agent/`(求职助手对话 + 岗位简历优化)、`nova_chat/`(Nova 对话助手,纯对话) |
|
||||
| **api** | REST API 路由定义 | `health.py`(健康检查)、`resume.py`(简历上传解析)、`resume_diagnose.py`(简历诊断)、`skill_gap.py`(技能差距分析 + 生成定制简历 + AI对话编辑)、`customize_resume.py`(定制简历查询/修改/回滚)、`job_agent_chat.py`(求职助手对话 + 岗位简历优化)、`nova_chat.py`(Nova 对话助手) |
|
||||
| **models** | SQLAlchemy ORM 模型,与 Java 端共享同一数据库 | `FuncPermission`、`UserFuncPermissionStock`、`UserFuncUsageLog`、`UserResume`、`UserResumeEducation`/`Work`/`Internship`/`Project`/`Competition`、`ResumeDiagnosisReport`、`ResumeDiagnosisIssue`、`Job`(只读)、`JobAgentConfig`、`UserJobCustomizeResume` |
|
||||
| **tool** | 无状态通用工具,不依赖数据库/Redis/用户上下文 | `file_parser.py`(PDF/Word/TXT 文件解析为纯文本)、`json_helper.py`(AI 输出 JSON 解析,去 markdown 代码块 + json_repair 容错)、`snowflake.py`(雪花ID生成) |
|
||||
@@ -141,11 +142,15 @@ offerpie_python_ai/
|
||||
4. 业务异常自动回退
|
||||
|
||||
## 6️⃣ AI 模型配置
|
||||
|
||||
### 模型定义(`app/ai/models.py`)
|
||||
| 供应商 | 模型 | 枚举值 |
|
||||
|--------|------|--------|
|
||||
| 火山引擎 | doubao-1-5-pro-32k-250115 | `LLM.DOUBAO_PRO_32K` |
|
||||
| 火山引擎 | doubao-1-5-lite-32k-250115 | `LLM.DOUBAO_LITE_32K` |
|
||||
| 火山引擎 | deepseek-v3-250324 | `LLM.DEEPSEEK_V3` |
|
||||
| 火山引擎 | deepseek-r1-250528 | `LLM.DEEPSEEK_R1` |
|
||||
| 火山引擎 | doubao-seed-2-0-mini-260215 | `LLM.DOUBAO_SEED_MINI` |
|
||||
| 火山引擎 | doubao-seed-2-0-lite-260215 | `LLM.DOUBAO_SEED_LITE` |
|
||||
| 火山引擎 | doubao-seed-2-0-pro-260215 | `LLM.DOUBAO_SEED_PRO` |
|
||||
| 加鱼 | gpt-4o | `LLM.GPT_4O` |
|
||||
@@ -157,9 +162,28 @@ offerpie_python_ai/
|
||||
| 加鱼 | glm-5 | `LLM.JIAYU_GLM_5` |
|
||||
| 加鱼 | qwen3-coder-next | `LLM.JIAYU_QWEN3_CODER_NEXT` |
|
||||
| 加鱼 | minimax-m2.5 | `LLM.JIAYU_MINIMAX_M2_5` |
|
||||
| ZM | gpt-5.5 | `LLM.ZM_GPT_5_5` |
|
||||
| ZM | gpt-5.4 | `LLM.ZM_GPT_5_4` |
|
||||
| ZM | gpt-5.4-mini | `LLM.ZM_GPT_5_4_MINI` |
|
||||
| ZM | gpt-5.2 | `LLM.ZM_GPT_5_2` |
|
||||
|
||||
所有模型通过 `LLM.XXX.create(**kwargs)` 创建 LangChain `ChatOpenAI` 实例,kwargs 透传 temperature、max_tokens 等参数。
|
||||
|
||||
### 场景模型配置(`app/ai/model_config.py`)
|
||||
|
||||
业务代码**不直接使用** `LLM` 枚举,而是通过 `model_config.py` 中的场景配置类引用预创建的模型实例。修改模型或参数只需改此文件。
|
||||
|
||||
| 配置类 | 场景 | 说明 |
|
||||
|--------|------|------|
|
||||
| `SkillGapModel` | ANALYSIS / SUMMARY / EXPERIENCE / AGENT_PLAN / AGENT_EDIT / AGENT_ADD | 技能差距分析模块 |
|
||||
| `JobAgentModel` | CHAT / SUMMARY / EXPERIENCE | 求职助手Agent模块 |
|
||||
| `NovaChatModel` | CHAT | Nova智能聊天模块 |
|
||||
| `ResumeExtractorModel` | PARSE | 简历解析模块 |
|
||||
| `DiagnoserModel` | MODULE / SUMMARY / POLISH | 简历诊断模块 |
|
||||
| `BrowserPlugModel` | FORM_FILL | 浏览器插件模块 |
|
||||
|
||||
业务代码引用示例:`from app.ai.model_config import SkillGapModel`,然后在 chain 中直接使用 `SkillGapModel.ANALYSIS`。
|
||||
|
||||
## 7️⃣ 与 Java 后端的关系
|
||||
- **共享数据库**:Python 端与 Java 端(back-end)连接同一 MySQL 数据库(offerpie),ORM 模型对应相同的表
|
||||
- **共享 Redis**:共享登录态(`login:token:{userId}`),JWT Secret 一致
|
||||
|
||||
Reference in New Issue
Block a user