Files
2026Technology-Competition/docs/config-design.md
T
lhl 3decdfc31c feat(rag): v1 rerank 精排 + bge-m3 多语言切换(T6/T11 架构审查整改)
- T6 (Issue6): RerankConfig(enabled/model=BAAI/bge-reranker-v2-m3/device)
  - rag-layer-design §6.3 Rerank 精排:窗口=RRF top-10、候选≤top_k 跳过、
    故障降级 RRF 原序;原 §6.3-6.6 顺延 6.4-6.7
  - config-design §5 新增 rerank 段;design §5.5 检索策略加 rerank
- T11 (OV2): EmbeddingConfig.model 默认 bge-small-zh-v1.5 → BAAI/bge-m3(日文语料)
  - rag-layer-design 选型表/依赖表/manifest/流程图同步 + 新增 §2.3 日文样本验证
  - design.md / implementation-plan 4.3 / config-design embedding 同步
- 新增 test_rag_design_consistency.py 一致性门禁(6 用例防文档漂移)
- TDD: RED(默认模型仍旧 + rerank 字段不存在)→ GREEN → 全量 198 passed / 100.00%(996 stmts/252 br)
2026-08-12 11:32:28 +08:00

231 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 统一配置设计
> 版本: v1.0 | 日期: 2026-07-30 | 状态: 初版
>
> 本文档统一定义本项目的全部配置项:`config/inference.yaml`、`config/rag.yaml`、`config/app.yaml`、`.env` 环境变量及 Docker Compose 草案。所有配置项**一处定义、一处生效**,避免散落。
---
## 目录
1. [配置层次与加载顺序](#1-配置层次与加载顺序)
2. [环境变量(.env](#2-环境变量env)
3. [app.yaml(应用级)](#3-appyaml应用级)
4. [inference.yaml(推理引擎)](#4-inferenceyaml推理引擎)
5. [rag.yamlRAG 层)](#5-ragyamlrag-层)
6. [Docker Compose 草案](#6-docker-compose-草案)
7. [配置校验与脱敏](#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
```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(应用级)
```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 相关配置集中于此:
```yaml
# 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
```yaml
# config/rag.yaml
embedding:
model: BAAI/bge-m3 # 多语言(中/日/英),适配日文语料(OV2/T11)
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.4
rerank: # Rerank 精排(rag-layer §6.3v1 新增 I6/T6
enabled: true # false 时跳过精排,直接取 RRF 前 top_k
model: BAAI/bge-reranker-v2-m3 # 多语言 Cross-Encoder
device: cpu # cpu | cuda
```
---
## 6. Docker Compose 草案
### 6.1 最小(开发/演示,InMemoryQueue
```yaml
# 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 预留)
```yaml
# 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/settings`api-design §2.8)返回配置前,过滤所有含 `key`/`secret`/`token` 字段,以 `***` 替代
- **缺失 Key 行为**:主模型 Key 缺失 → 启动成功但 LLM 相关 API 返回 `503 LLM_NOT_CONFIGURED`;备用模型 Key 缺失 → 降级日志警告,不使用 fallback