Files
2026Technology-Competition/docs/config-design.md
T
lhl c170ec2edd feat(config): 删死配置 + 同步文档(T5 架构审查整改)
- Issue5: 删除 QdrantStoreConfig / VectorStoreConfig.qdrant / task_queue.redis_url
- OV1: 同步 6 处文档(api-design §1/§4.3/§5/§6、rag-layer §9、agent-runtime §3、
  design §5.5/§8.4.1、config-design、web-ui §4.1)+ tests/fixtures/rag.yaml
  - TaskQueue 标注 v1 仅 InMemory,Redis/Valkey 为 v2 预留(Scope 缩减裁定)
  - Storage Adapter 仅 ChromaAdapter,工厂移除 qdrant 分支
  - 历史评审记录保留原样不改写
- 新增 3 用例,同步 2 个 qdrant 依赖用例;全量 189 passed / 100.00%(991 stmts/252 br)
2026-08-12 10:54:56 +08:00

6.9 KiB
Raw Blame History

统一配置设计

版本: v1.0 | 日期: 2026-07-30 | 状态: 初版

本文档统一定义本项目的全部配置项:config/inference.yamlconfig/rag.yamlconfig/app.yaml.env 环境变量及 Docker Compose 草案。所有配置项一处定义、一处生效,避免散落。


目录

  1. 配置层次与加载顺序
  2. 环境变量(.env
  3. app.yaml(应用级)
  4. inference.yaml(推理引擎)
  5. rag.yamlRAG 层)
  6. Docker Compose 草案
  7. 配置校验与脱敏

1. 配置层次与加载顺序

优先级(高 → 低):
  1. 环境变量(.env / 系统环境)      ← API Key 等敏感项
  2. 环境特定 YAMLconfig/*.yaml   ← 模型/路径/阈值
  3. 代码默认值                       ← 兜底

加载方式:
  pydantic-settings 统一加载
  ├── BaseSettings 合并 .env + 环境变量
  └── YAML 文件经 pydantic 模型校验后加载

原则

  • 敏感项只走环境变量API Key),不落入 YAML、不硬编码(AGENTS.md 要求)
  • YAML 只放非敏感配置(模型名、路径、阈值、开关)
  • 每个配置项有默认值;YAML 缺失时用默认值,不阻塞启动

2. 环境变量(.env

# ── LLM Provider ─────────────────────────────────
DEEPSEEK_API_KEY=sk-xxx              # DeepSeek 主模型
QWEN_API_KEY=sk-xxx                  # Qwen 备用模型
VISION_API_KEY=sk-xxx                # Vision 模型(可复用主 Key
LLM_BASE_URL=https://api.deepseek.com # 可选:自定义 base_url

# ── 部署 ─────────────────────────────────────────
APP_ENV=dev                          # dev | prod
APP_HOST=0.0.0.0
APP_PORT=8000
DATA_DIR=/data                       # 用户数据根目录
CONFIG_DIR=/config                   # YAML 配置目录

# ── 队列(v1 仅 InMemoryRedis/Valkey 为 v2 预留,Scope 缩减裁定)──
QUEUE_BACKEND=memory                 # v1 仅 memory
变量 必填 默认 说明
DEEPSEEK_API_KEY 主模型 Key,缺失则相关功能不可用
QWEN_API_KEY 备用模型 Key,缺失时降级为「无备用」
VISION_API_KEY 同主 Key Vision 模型 Key
QUEUE_BACKEND memory 队列实现选择

3. app.yaml(应用级)

# config/app.yaml
app:
  name: genesis
  version: "1.0"
  timezone: Asia/Tokyo

server:
  max_upload_mb: 100          # 上传文件大小限制
  allowed_extensions:          # 允许的扩展名
    - .xlsx
    - .xls
    - .docx
    - .pptx
    - .java
    - .xml
    - .yml

session:
  sqlite_path: /data/db/genesis.db   # SQLite 会话库
  snapshot_dir: /data/db/snapshots   # 中间成果物快照目录

paths:
  user_root: /data/users
  shared_root: /data/shared

task_queue:
  backend: memory              # v1 仅 memoryredis/valkey 为 v2 预留)
  timeout_sec: 600             # 任务最长执行时间
  retry_default: 2             # 任务默认重试次数

4. inference.yaml(推理引擎)

对应 docs/agent-runtime-design.md §2。全部 LLM 相关配置集中于此:

# config/inference.yaml
models:
  primary:
    provider: deepseek          # deepseek | qwen | openai_compatible
    name: deepseek-chat         # 模型名
    temperature: 0.2
    max_tokens: 4096
    timeout_sec: 60
    retry_backoff: [1, 3, 7]    # 指数退避(秒)

  fallback:
    provider: qwen
    name: qwen-max
    temperature: 0.2
    max_tokens: 4096

  vision:
    provider: deepseek
    name: deepseek-vl            # Vision 模型(ImageAnalyzer 使用)
    timeout_sec: 90

llm_calls:
  token_estimation: tiktoken     # tiktoken | approximatetiktoken 缺失自动回落 approximate(内置估算器,T9 起对 CJK 保守 ×1.5/字符)
  max_context_tokens: 32000      # 上下文窗口上限
  truncation_policy:             # 超限裁剪策略(runtime §2.6
    priority:
      - shrink_rule_chunks       # 规则只保留 top-3
      - summarize_history        # 摘要历史
      - truncate_data            # 截断最不相关数据

structured_output:
  max_parse_retry: 2             # chat_structured 解析失败重试次数

prompt_registry:
  prompts_dir: ./prompts         # Prompt 模板目录
  default_version: latest        # latest | 具体版本号

5. rag.yamlRAG 层)

对应 docs/rag-layer-design.md §2 / §6 / §9

# config/rag.yaml
embedding:
  model: BAAI/bge-small-zh-v1.5   # 可切 BAAI/bge-m3
  device: cpu                     # cpu | cuda
  max_batch_size: 32              # 编码批大小
  cache_dir: /data/shared/models  # 模型缓存目录

vector_store:                     # StorageAdapter 配置(rag-layer §9.4
  adapter: chroma                 # v1 仅 chromaqdrant 为 v2 预留)
  chroma:
    persist_dir: /data/shared/rules-handbook/chroma

chunking:
  word_max_tokens: 512            # Word chunk 上限
  excel_rule_block_rows: 10       # Excel 规则块最大行数
  ppt_pages_per_chunk: 2          # PPT 每 chunk 页数
  min_tokens: 30                  # 过短合并阈值

retrieval:
  channel_top_k: 10               # 双通道各取 top-10
  rrf_k: 60                       # RRF 融合常数(rag-layer §6.2
  default_top_k: 5                # 融合后默认返回数
  contextual_enrichment: true     # 上下文增强开关(§6.3

6. Docker Compose 草案

6.1 最小(开发/演示,InMemoryQueue

# docker-compose.yml
services:
  api:
    build: .
    ports: ["8000:8000"]
    env_file: .env
    volumes:
      - ./data:/data
      - ./config:/config
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000

6.2 生产(v1 单容器;worker/queue 为 v2 预留)

# docker-compose.yml
services:
  api:
    build: .
    ports: ["8000:8000"]
    env_file: .env
    volumes:
      - ./data:/data
      - ./config:/config
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000

  # worker / queuevalkey: v2 预留(Scope 缩减裁定移除 Redis/Valkey 双实现)
  # qdrant: v2 预留(Qdrant 切换已移除)

7. 配置校验与脱敏

  • 校验:启动时 pydantic 模型校验全部 YAML 与环境变量;非法值直接报错并列出原因,不静默兜底(敏感项除外)
  • 脱敏GET /api/settingsapi-design §2.8)返回配置前,过滤所有含 key/secret/token 字段,以 *** 替代
  • 缺失 Key 行为:主模型 Key 缺失 → 启动成功但 LLM 相关 API 返回 503 LLM_NOT_CONFIGURED;备用模型 Key 缺失 → 降级日志警告,不使用 fallback