📚 RAG System

将RAG思路应用到5G CSI人体动作识别

← 返回首页

项目技术亮点

本项目将 RAG 思路应用到 5G CSI 人体动作识别中。传统 RAG 面向的是自然语言文本,而 CSI 原始数据是形如 (816, 3, 4) 的高维 NumPy 数值矩阵,其中 816 表示子载波/采样点维度,3 表示接收端,4 表示不同 CSI 特征,包括幅度、相位、相位差等。

因此,项目的核心难点不是简单"把文件读出来",而是如何把缺乏语义上下文的无线信号矩阵,转换成既能被 embedding 检索,又能保留动作波形差异的结构化文档。

1. CSI 数据解析器设计

CSI 原始矩阵无法直接套用文本 RAG:如果把大量浮点数直接拼成文本,embedding 模型并不会真正理解"曲线形状""峰谷位置""导数变化"这些信号特征;如果只提取均值、方差等统计量,又会丢失人体动作造成的波形扰动模式。

因此我设计了 CSIDataParser,解析流程可以概括为:

1. 读取 .npy 文件
2. 校验数据形状: (n, 816, 3, 4)
3. 对每个样本单独生成 sample-level document
4. 对 current_amp 做鲁棒归一化
5. 提取多接收端波形、均值波形、导数、趋势 token、峰谷位置
6. 生成 content 和 metadata

解析后一条样本在切块前大致长这样,以下是项目中 IDLE_all_0 的真实解析片段:

{
  "样本ID": "IDLE_all_0",
  "文本内容": "CSI波形形状标记:\n当前幅度:特征=current_amp 前段-中等-下降 前段峰值位置=0.27 前段谷值位置=0.33 中段-中等-平稳 ... 转折点数量=39 粗糙度=中等 转折点=较多 能量=较高 幅度范围=较大 峰值=较多 谷值=较多",
  "元数据": {
    "动作标签": "静止",
    "幅度检索特征": {
      "特征名称": "当前幅度 current_amp",
      "粗召回波形点数": 102,
      "精排波形点数": 204,
      "102点平均粗粒度幅度波形": [-0.1555,-0.0629,-0.2326,-0.4561,"……共102个归一化幅度点"],
      "204点平均细粒度幅度波形": [-0.2313,-0.0797,-0.0706, -0.0551,"……共204个归一化幅度点"],
      "204点平均幅度导数序列": [0.0,0.1517,0.009,0.0156,"……共204个相邻差分点"
      ]
    }
  }
}

项目采用的是样本级切块策略,即一个 CSI 样本对应一个 chunk。这样做的原因是动作识别依赖整段波形结构,如果按时间片或子载波片段切得过碎,可能会破坏完整动作模式。

入库时,每个样本在 Elasticsearch 中存储:

{
  "样本ID": "IDLE_all_0",
  "文本内容": "CSI波形形状标记:...",
  "文本向量": ["1024维 embedding 向量"],
  "元数据": {
    "动作标签": "静止",
    "矩阵波形签名": "包含幅度、相位、相位差、多接收端波形、导数、峰谷和相关性等结构化特征"
  }
}

其中 content 用于向量检索,metadata 用于后续波形匹配和重排。

2. 检索召回策略优化

最初的方案接近传统文本 RAG:将 CSI 样本解析成文本,然后通过文本 embedding 做相似样本召回。但实验中发现,CSI 动作分类的关键不在自然语言语义,而在幅度曲线和相位曲线的形状差异。例如前进、后退、出拳、静止对应的不是"文本描述相似",而是多接收端波形在峰谷位置、起伏幅度、变化方向上的差异。

因此我将召回策略优化为两阶段:

第一阶段:混合粗召回
文本向量检索 + 少量 current_amp 波形匹配

第二阶段:波形重排
使用更完整的 current_amp 多接收端曲线、导数、尺度统计和接收端关系进行精排