feat(memoir): 回忆录分段两阶段管线(Phase1 分类 / Phase2 叙事)与配置、测试

This commit is contained in:
Kevin
2026-04-02 16:37:14 +08:00
parent 3ae39838c0
commit 6b930808a3
27 changed files with 1550 additions and 430 deletions

View File

@@ -5,10 +5,24 @@
# 若仓库可被非授权人员访问,请不要在此文件中保留真实密钥。
# =============================================================================
# =============================================================================
# Docker Compose宿主机独立 Caddy 反代到本 API
# =============================================================================
# 映射到宿主机的端口,默认 8000与同机其它项目冲突时改为未占用端口并在独立 Caddy 的 Caddyfile 中 reverse_proxy 到 127.0.0.1:该端口。
# LIFE_ECHO_API_HOST_PORT=8000
# 若 Caddy 跑在独立容器且非 host 网络,不要用 127.0.0.1,应把 Caddy 加入与本 compose 相同的 Docker 网络,并对 http://life-echo-api-prod:8000 做 reverse_proxy。
# =============================================================================
# Loggingloguru sink 最低级别TRACE / DEBUG / INFO / WARNING / ERROR / CRITICAL
# =============================================================================
LOG_LEVEL=INFO
# Agent 单行 INFO 摘要(耗时、路由、段落规模);与 LOG_LEVEL 独立,便于生产短暂排查
# LOG_AGENT_VERBOSE=0
# DEBUG 下 prompt/响应预览最大字符数
# AGENT_LOG_MAX_CHARS=4096
# 第三方 stdlib logging空=自动LOG_LEVEL 为 DEBUG/TRACE 时 Celery→INFO、httpx/httpcore→WARNING减少刷屏
# CELERY_LOG_LEVEL=
# HTTPX_LOG_LEVEL=
# =============================================================================
# LLM / DeepSeek
@@ -42,6 +56,10 @@ EMBEDDING_MODEL=embedding-3
# CHAT_MEMORY_TOP_K=8
# CHAT_MEMORY_EVIDENCE_MAX_CHARS=4096
# Memoir批处理/抽取更新 slot 时是否允许改写 MemoirState.current_stage默认 false访谈 switch_stage 仍可推进)
# True 时仅当 proposed 与 existing 在同一 chat_bucket 才对齐 current_stage
# MEMOIR_EXTRACTION_UPDATES_CURRENT_STAGE=false
# Memoir叙事前口述归一segment 原文仍落库;仅 story 流水线派生输入)
MEMOIR_ORAL_NORMALIZE_ENABLED=true
# off | rules | llmllm 为先规则再 LLM 纠错,失败回退规则结果)
@@ -49,6 +67,13 @@ MEMOIR_ORAL_NORMALIZE_MODE=llm
MEMOIR_ORAL_NORMALIZE_LLM_MAX_TOKENS=512
MEMOIR_ORAL_NORMALIZE_LLM_MAX_INPUT_CHARS=8000
# Chat模型消费净稿segment 原文仍落库;访谈编排层归一后注入 Agent / 记忆检索)
# CHAT_INPUT_NORMALIZE_ENABLED=true
# off | rules | llmllm 为先规则再 LLM失败回退规则编排层已带 LLM 时不重复在 Agent 调)
# CHAT_INPUT_NORMALIZE_MODE=rules
# CHAT_INPUT_NORMALIZE_LLM_MAX_TOKENS=512
# CHAT_INPUT_NORMALIZE_LLM_MAX_INPUT_CHARS=8000
# =============================================================================
# Database
# =============================================================================
@@ -57,6 +82,11 @@ MEMOIR_ORAL_NORMALIZE_LLM_MAX_INPUT_CHARS=8000
# Docker / 服务端(主机名一般为 compose 服务名 postgres:
# DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
# 启动时 Alembicmain.py生产可设 ALEMBIC_STARTUP_FAIL_FAST=true迁移失败则拒绝启动
# ALEMBIC_RUN_ON_STARTUP=true
# ALEMBIC_STARTUP_FAIL_FAST=false
# ALEMBIC_STARTUP_MAX_RETRIES=3
# ALEMBIC_STARTUP_RETRY_BASE_SECONDS=1.0
# =============================================================================
# Redis
@@ -82,6 +112,18 @@ REDIS_SESSION_TTL=86400
# MEMORY_COMPACTION_TEXT_JACCARD_MIN=0.55
# MEMORY_COMPACTION_METADATA_EVENT_YEAR_WINDOW=1
# =============================================================================
# Story 流水线post-commit、章节物化、append 上限、evidence 检索)
# =============================================================================
# STORY_IMAGE_ENQUEUE_DEDUP_TTL=300
# RECOMPOSE_CHAPTER_DELAY_SECONDS=8
# CHAPTER_PIPELINE_LOCK_TTL_SECONDS=120
# STORY_APPEND_MAX_CANONICAL_CHARS=12000
# STORY_APPEND_MAX_VERSIONS=20
# EVIDENCE_TOP_K_DEFAULT=10
# EVIDENCE_TOP_K_LARGE_BATCH=5
# EVIDENCE_LARGE_BATCH_THRESHOLD=3
# =============================================================================
# Auth
# =============================================================================
@@ -135,7 +177,8 @@ TENCENT_SECRET_KEY=xiFbjlZ9XheS2NWYLvHRPAh2A5nGYcR2
# ENABLE_TTS仅控制是否合成并下发 TTS_AUDIO不影响用户语音转写ASR
ENABLE_TTS=true
TTS_PROVIDER=tencent
# 仅 TTS_PROVIDER=openai 时在控制台创建密钥后配置 OPENAI_API_KEY
# 仅 TTS_PROVIDER=openai 时需要
# OPENAI_API_KEY=your_openai_api_key
# 音色 ID 见 https://cloud.tencent.com/document/product/1073/92668
TTS_VOICE_TYPE=502001
TTS_CODEC=mp3
@@ -157,8 +200,11 @@ WECHAT_PAY_NOTIFY_URL=https://lifecho.worldsplats.com/api/payment/notify/wechat
# WECHAT_PAY_PLATFORM_PUBLIC_KEY_ID=PUB_KEY_ID_0116629790992026020700181671002400
# =============================================================================
# Alipay(启用时在此填写 ALIPAY_APP_ID / ALIPAY_PRIVATE_KEY / ALIPAY_PUBLIC_KEY
# Alipay
# =============================================================================
# ALIPAY_APP_ID=your_alipay_app_id
# ALIPAY_PRIVATE_KEY=your_alipay_private_key
# ALIPAY_PUBLIC_KEY=your_alipay_public_key
ALIPAY_NOTIFY_URL=https://lifecho.worldsplats.com/api/payment/notify/alipay
# =============================================================================
@@ -180,8 +226,12 @@ STORY_IMAGE_MIN_BODY_CHARS=800
# 叙事模型输出相对口述过短则回退为口述原文
MEMOIR_NARRATIVE_FALLBACK_BODY_RATIO=0.5
MEMOIR_NARRATIVE_FALLBACK_MIN_CHARS=20
# 回忆录 segment 入队:累计 strip 后字数未达此值则暂缓提交 Celery0=关闭字数门闸,仅静默防抖后提交)
# MEMOIR_SEGMENT_BATCH_MIN_CHARS=50
# 本批首条入队起最长等待(秒),超时仍提交;测试可调低,生产可调高
# MEMOIR_SEGMENT_BATCH_MAX_WAIT_SECONDS=60
# 可选Liblib 返回图片域名不在默认白名单时(逗号分隔)
# MEMOIR_IMAGE_DOWNLOAD_HOSTS=
# MEMOIR_IMAGE_DOWNLOAD_HOSTS=liblib.cloud,liblibai.cloud
# =============================================================================
# Liblib image provider