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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions