simon ff911cf6f7 feat: Token Plan 迁移与 .env 热加载,并修复日报 AI 摘要为空
Token Plan 迁移 / 配置热加载:
- configs/llm_models.yaml: 各场景切到 Token Plan(deepseek-v4.1-flash / qwen3.6-flash)
- 新增 configs/runtime_env.py: .env 按 (mtime_ns, size) 热加载并同步 os.environ,
  统一 env_get 取值;llm / embedding / vectorstore / mcp / pipeline 改用 env_get
- configs/loader.py / scripts/run_scheduler.py 等配套调整
- 新增 tests/test_hot_reload.py

日报 AI 摘要为空修复(2026-09-25):
- 根因: 推理模型的 reasoning token 与正文共用 max_tokens, 预算 1500 被"思考"
  占满 -> text_tokens=0 / finish_reason=length, 摘要静默为空且不重试
- daily_report 场景新增 max_tokens(默认 4000, YAML 保存即热生效);
  LLMConfig 支持可选 max_tokens; 分块预算 800 -> 2000
- _llm_call 拆出 _call_once, 正文为空时自动加倍预算重试(上限 16000),
  用尽才降级返回空串; 网络异常重试语义不变
- docs/user-guide.md 新增 FAQ; continuation.md 记录本次排查
- 已重跑 2026-09-25 日报(report_id=357)补回 466 字摘要

测试: 相关用例 56 passed(test_hot_reload 12 passed);
      ruff 无新增问题; 3 个 crawler 既有失败与本改动无关
2026-09-25 11:13:37 +08:00

A 股 Deep Research 私有投研平台

面向 A 股投资研究的私有化 Deep Research 平台。

自动抓取财经新闻 → 正文提取 → LLM 投资事件抽取 → 向量化 → Qdrant 知识库 → MCP 语义检索 → 日报生成。

定位:A 股研究辅助与知识管理平台,非自动交易、非预测、非投资顾问。


技术栈

模块 选型
抓取 Crawl4AI (httpx 静态直连 + Playwright JS 渲染)
正文提取 GNE 中文新闻正文识别
事件抽取 DeepSeek / Qwen (百炼)
向量化 DashScope text-embedding-v3 / 本地 BGE-M3
向量库 Qdrant 本地文件模式 (零依赖,ARM64 兼容)
调度 APScheduler + systemd
服务化 MCP (FastMCP)
日报入库 MySQL/MariaDB (pymysql)
运行时 Python 3.11 + uv

快速开始

# 1. 安装
cd /home/pi/news
uv sync
cp .env.example .env    # 编辑填写 API Key

# 2. 跑通全链路
uv run a-share pipeline --once

# 3. 语义检索
uv run a-share search "宁德时代固态电池"

# 4. 查看数据总览
uv run a-share status

文档索引

文档 说明
docs/user-guide.md 用户手册 — CLI 全量参考、全链路、增量/断点续跑、MCP 服务、环境变量、FAQ
docs/architecture.md 项目架构 — 11 个包职责、数据模型、配置体系、产物目录
docs/db-schema.md 日报数据库表结构 — 供 API/前端对接
CLAUDE.md AI 编码约束
continuation.md 会话恢复上下文

当前状态

已完成 M0~M10
新闻源 14 个 (13 Web + 1 API: 新闻联播)
数据库 news_report / news_event (myquant 库)
生产部署 pi5 pi@192.168.1.160, systemd 常驻
测试 225+ passed (pytest)

常用命令速查

uv run a-share crawl                     # M1 抓取
uv run a-share extract --date 20260822   # M2 提取
uv run a-share dedup --date 20260822     # M3 去重
uv run a-share events --date 20260822    # M4 LLM 抽取
uv run a-share embed --date 20260822     # M5 向量化
uv run a-share ingest --date 20260822    # M6 入库
uv run a-share pipeline --once --report  # 全链路+日报
uv run a-share pipeline --once --resume  # 断点续跑
uv run a-share search "关键词"            # 语义检索
uv run a-share status                    # 数据总览
uv run a-share report --date 20260822    # 日报生成
uv run a-share cninfo                    # 公告抓取
uv run a-share discover <url> --add      # 新增新闻源

项目结构

news/
├── crawler/           # M1 新闻抓取
├── extractor/         # M2 正文提取
├── dedup/             # M3 三层去重
├── llm/               # M4 投资事件抽取
├── embedding/         # M5 向量化
├── vectorstore/       # M6 Qdrant 知识库
├── scheduler/         # M7 定时任务 + pipeline
├── mcp_server/        # M8 MCP 服务
├── a_share_cli/       # 统一 CLI
├── report_db/         # M10 日报 DB 层
├── report_import/     # M10 历史日报导入
├── configs/           # 配置文件
├── prompts/           # LLM Prompt 模板
├── scripts/           # 独立运行脚本
├── tests/             # pytest 测试
├── docs/              # 文档
└── data/              # 数据产物

—— README 结束 ——

S
Description
No description provided
Readme
4.1 MiB
Languages
Python 100%