93 lines
4.3 KiB
Python
93 lines
4.3 KiB
Python
"""
|
||
config.py
|
||
报告模板管理模块的全局配置。可通过 .env 或环境变量覆盖。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||
|
||
|
||
class Settings(BaseSettings):
|
||
# 应用基本信息
|
||
APP_TITLE: str = "报告模板管理模块 API"
|
||
APP_VERSION: str = "0.1.0"
|
||
APP_DESCRIPTION: str = "上传文档 → 远程解析为 Markdown → 拆解目录/章节 → 入库远程 MySQL"
|
||
|
||
# 服务监听
|
||
HOST: str = "0.0.0.0"
|
||
PORT: int = 8100
|
||
RELOAD: bool = False
|
||
|
||
CORS_ORIGINS: list[str] = ["*"]
|
||
|
||
# 日志
|
||
LOG_LEVEL: str = "INFO" # DEBUG / INFO / WARNING / ERROR
|
||
LOG_DIR: str = "logs" # 日志目录(相对启动目录或绝对路径)
|
||
LOG_TO_CONSOLE: bool = True # 是否同时输出到控制台
|
||
LOG_MAX_BYTES: int = 10 * 1024 * 1024 # 单文件最大字节数(轮转)
|
||
LOG_BACKUP_COUNT: int = 7 # 轮转保留份数
|
||
LOG_HTTP_ACCESS: bool = True # 是否记录每个 HTTP 请求
|
||
|
||
# 远程 MySQL:mysql+pymysql://用户:密码@主机:端口/库名?charset=utf8mb4
|
||
DATABASE_URL: str = (
|
||
"mysql+pymysql://root:Beidas0ft@192.168.4.177:3306/eval_report?charset=utf8mb4"
|
||
)
|
||
DB_POOL_SIZE: int = 10
|
||
DB_MAX_OVERFLOW: int = 20
|
||
DB_POOL_TIMEOUT: int = 60
|
||
DB_POOL_PRE_PING: bool = True
|
||
# 启动时自动建表(仅创建本模块用到的表,已存在则跳过)
|
||
DB_AUTO_CREATE_TABLES: bool = True
|
||
|
||
# 远程文档解析服务:上传文件 → Markdown
|
||
FILE_PARSE_API_URL: str = "http://192.168.4.194:8000/convert"
|
||
FILE_PARSE_FIELD_NAME: str = "file"
|
||
# 解析引擎(随 multipart 一起提交的表单字段 engine)
|
||
FILE_PARSE_ENGINE: str = "auto"
|
||
FILE_PARSE_HTTP_TIMEOUT_SEC: int = 600
|
||
FILE_PARSE_RETRY_COUNT: int = 3
|
||
FILE_PARSE_RETRY_BACKOFF_SEC: float = 15.0
|
||
|
||
# 章节正文:是否包含其下级小节内容(章/节聚合整棵子树正文,避免父章节正文为空)
|
||
SECTION_CONTENT_INCLUDE_SUBSECTIONS: bool = True
|
||
# 单章节正文入库字节上限(MySQL TEXT 列上限 65535 字节,留余量防止截断到半个字符)
|
||
SECTION_CONTENT_MAX_BYTES: int = 60000
|
||
|
||
# 章节内容脱敏:入库前过滤精确数据(数字/金额/日期/百分比等)
|
||
DESENSITIZE_ENABLED: bool = True
|
||
DESENSITIZE_PLACEHOLDER: str = "X" # 数字脱敏后的占位符
|
||
# 是否把表格中的数字也脱敏(表格通常是精确数据,默认开启)
|
||
DESENSITIZE_MASK_TABLE_NUMBERS: bool = True
|
||
|
||
# LLM(可选):为每个目录生成"声明"。未配置时使用确定性兜底模板。
|
||
LLM_API_BASE: str = ""
|
||
LLM_API_KEY: str = ""
|
||
LLM_MODEL_NAME: str = ""
|
||
LLM_HTTP_TIMEOUT_SEC: int = 120
|
||
# 关闭思考模型的思维链输出(vLLM/Qwen3 等:chat_template_kwargs.enable_thinking=false)。
|
||
# 既避免"思考过程"混入正文,又减少 token、降低截断与耗时。
|
||
LLM_DISABLE_THINKING: bool = True
|
||
# 是否调用 LLM 生成章节声明(关闭则始终使用兜底模板)
|
||
DECLARATION_USE_LLM: bool = True
|
||
# 上传模版时:用 LLM 匹配默认提示词 / 为无匹配章节生成提示词(复刻 eval_report)
|
||
TEMPLATE_UPLOAD_LLM_PROMPT_MAPPING: bool = True
|
||
# LLM 提示词匹配并发:把未匹配章节分批并行调用,缩短整体耗时。
|
||
# 多卡 A100 + 连续批处理(vLLM/TGI,TP 或多副本)下,提高并发在飞请求数即可打满 GPU:
|
||
# - 调小 BATCH_SIZE:请求更多更短,确保批次数 ≥ 线程数,单请求尾延迟更低
|
||
# - 调大 MAX_WORKERS:同时在飞的序列更多,填满推理服务的批,decode 吞吐接近峰值
|
||
# - 调小 MAX_TOKENS:每序列 KV 缓存预留更少,调度器可纳入更多并发序列
|
||
# 2×A100:并发目标约 16(较单卡的 8 翻倍);BATCH_SIZE=2 保证常见规模也能跑满 16 路。
|
||
TEMPLATE_UPLOAD_LLM_BATCH_SIZE: int = 2 # 每批未匹配章节数量
|
||
TEMPLATE_UPLOAD_LLM_MAX_WORKERS: int = 16 # 并行线程数上限(在飞请求数)
|
||
TEMPLATE_UPLOAD_LLM_MAX_TOKENS: int = 2048 # 单批最大输出 token
|
||
|
||
model_config = SettingsConfigDict(
|
||
env_file=".env",
|
||
env_file_encoding="utf-8",
|
||
extra="ignore",
|
||
)
|
||
|
||
|
||
settings = Settings()
|