Skip to content

Interactive EEG search returns query_count=0 because EEG timestamps are stored as YYYYMMDDHHMMSSmmm but searched as Unix ms` #61

Description

@aaa-wxl

环境

  • OS: Windows 11
  • NeuroSkill: 1.3.29.57168
  • Device: virtual LSL source SkillVirtualEEG
  • EEG model: Zyphra/ZUNA
  • Inference device: CPU
  • CLI port: 18444

现象

neuroskill interactive "work" --json 能查到 text labels,但 EEG 搜索始终为空:

{
  "labels": [
    {
      "id": 17,
      "text": "work",
      "context": "cpu zuna test after embeddings started",
      "created_at": 1777890154.0
    }
  ],
  "eeg_results": [
    {
      "label_ts": 1777890154,
      "search": {
        "query_count": 0,
        "results": [],
        "searched_days": []
      }
    }
  ]
}

UI 中 Interactive 图也没有 EEG neighbors。

已排查

ZUNA 模型文件存在:

C:\Users\ASUS\.cache\huggingface\hub\models--Zyphra--ZUNA\snapshots\...\config.json
C:\Users\ASUS\.cache\huggingface\hub\models--Zyphra--ZUNA\snapshots\...\model-00001-of-00001.safetensors

日志显示 ZUNA 成功加载:

loading EXG encoder backend="zuna" gpu=false
ZUNA weights resolved ...
ZUNA encoder loaded
encoder loaded successfully backend="zuna"

SQLite 中实际已经写入 EEG embeddings:

nonempty eeg embeddings: 11

示例 EEG rows:

id=18015 timestamp=20260504101931000 hnsw_id=0 length(eeg_embedding)=128
id=18383 timestamp=20260504101936000 hnsw_id=1 length(eeg_embedding)=128
id=18656 timestamp=20260504101941000 hnsw_id=2 length(eeg_embedding)=128

怀疑原因

interactive_search 根据 label 的 Unix timestamp 构造搜索窗口,例如:

label created_at = 1777890154
start_utc = 1777889554
end_utc = 1777890754

搜索代码再乘以 1000 后按 Unix milliseconds 查:

let start_ts = (start_utc as i64) * 1000;
let end_ts = (end_utc as i64) * 1000;
WHERE timestamp BETWEEN ?1 AND ?2

embeddings.timestamp 实际存储格式是:

YYYYMMDDHHMMSSmmm
20260504101931000

而不是 Unix ms:

1777890154000

两种时间格式不一致,导致 SQL range query 永远匹配不到 EEG rows,因此 query_count=0

代码线索:

// _ns_skill/crates/skill-daemon/src/embed/accumulator.rs
timestamp: skill_exg::yyyymmddhhmmss_utc()
// _ns_skill/crates/skill-commands/src/lib.rs
let start_ts = (start_utc as i64) * 1000;
let end_ts = (end_utc as i64) * 1000;

WHERE timestamp BETWEEN ?1 AND ?2

期望行为

Interactive search 应该能找到 label 时间窗附近已有的 EEG embeddings,并返回 EEG neighbors / graph edges。

建议修复方向

搜索时需要统一 timestamp 格式。可选方案:

  • 将写入 embeddings.timestamp 改为 Unix ms。
  • 或在 read_embeddings_in_range 前把 Unix range 转换为 YYYYMMDDHHMMSSmmm range。
  • 或在查询中兼容两种格式,因为代码中 ts_ms_to_unix() 已经说明历史上存在两种 timestamp 格式。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions