feat(modelengine-nexent): data-processing agent on Nexent+DataMate compat layers (task one).
Planner (决策组) understands the goal and profiles the data to auto-assemble a typed ETL DAG; Reviewer (质检组) enforces two deterministic gates (plan-time port compatibility, runtime data-quality); Executor (实现组) schedules DataMate operators with per-step state tracking and per-record fault isolation. Ships a runnable medical ETL pipeline (read CSV -> clean missing/dedup -> extract/normalize/derive -> PII redaction), CLI + Notebook demos, tests, and Docker. MIT.
Signed-off-by: 林晨 (Leo Cheng) leo-cheng@vip.qq.com
Data-processing agent on Nexent-compatible agent layer + DataMate-compatible operator layer (ModelEngine task one, MIT).
modelengine-nexent-agent — 数据处理智能体(ModelEngine 任务一)
一个可运行的数据处理智能体(Data Processing Agent):接收自然语言的数据处理需求, 自动完成任务理解 → 规划 → 多算子组合调度 → 执行 → 状态跟踪与异常处理,跑通一条典型 ETL / 文本处理流水线。构建在 Nexent 兼容的智能体层 与 DataMate 兼容的算子层 之上, 零重型依赖即可本地跑起来(只需 pandas + PyYAML)。
亮点(对齐评分项)
agent/(规划/审核/调度)从不直接碰 pandas 或算子内部,只经 DataMate 算子市场 API 与 Nexent 工具契约交互架构
flowchart TB NL([自然语言需求]) --> PL[决策组 Planner任务理解 + 产出类型化 ETL 计划] PL --> RV1{质检组 Reviewer 门1
计划期端口兼容校验} RV1 -- 封驳 --> PL RV1 -- 准入 --> EX[实现组 Executor
按计划调度算子·状态跟踪·异常隔离] EX --> RV2{质检组 Reviewer 门2
运行期数据质量硬门} RV2 --> OUT[(干净表 / 报告)] subgraph 数据处理层 · DataMate 兼容 OPS[(算子市场 OPERATORS
Mapper / Filter / Slicer)] end subgraph 智能体层 · Nexent 兼容 TOOLS[Tool 契约 · OpenAIModel · MessageObserver] end EX -. OPERATORS.build .-> OPS PL & EX -. 事件流 .-> TOOLS
三组分工(现代命名,非三省六部):
OPERATORS.build(name, **params)实例化算子并在样本流上调度,逐步跟踪状态(rows/drop/quarantine/耗时),单条脏数据抛错时隔离该记录而非崩溃。ETL 流水线(内置医疗样例)
flowchart LR SRC[(patients.csv)] --> D1[DropMissing清洗缺失] D1 --> D2[Dedup
去重] D2 --> D3[FieldExtract
血压→收缩/舒张] D3 --> D4[TypeNormalize
年龄→int·性别归一] D4 --> D5[FieldTransform
年龄分组] D5 --> D6[TextClean
备注脱敏] D6 --> SINK[(clean.csv)]
快速开始
CLI 会依次打印:数据画像 → 规划链路 → 逐算子执行状态 → 质检门指标 → 结果路径。 退出码 0 表示质检门通过。
真实运行输出(节选)
输出表:
age由" 52 "/"60岁"规范为整数;gender的female/male/男/女归一为F/M;blood_pressure "140/90"抽取为systolic/diastolic;派生age_group;notes中邮箱/电话脱敏为<email>/<phone>。智能体如何“自主规划”
规划分两层,诚实区分“推断”与“配置”:
Planner先对数据做画像(每列缺失率、数值占比、类别基数、是否A/B可拆分、是否性别枚举、文本长度),再结合目标里的意图关键词(清洗/去重/规范/抽取/转换/脱敏),自动决定用哪些算子、按什么顺序、作用在哪些列,并做 schema 投影推导目标列集。hints提供,或交给 LLM 后端推断。这样智能体对新数据集会自适应(缺失就补清洗、有重复就补去重、有可拆列就补抽取),而不把一切写死。LLM 规划后端(可选):设置环境变量即可让 Nexent
OpenAIModel产出受算子目录约束的 JSON 计划,任何失败自动回退确定性规划(demo 默认离线,不需要它):与 Nexent / DataMate 的集成(诚实交代)
两层均按从官方源码核实的真实接口复刻,接口同形,可无缝接回真库:
数据处理层 = DataMate 算子 ABI(源:
ModelEngine-Group/DataMateruntime/python-executor/datamate/core/base_op.py、runtime/ops/)Mapper(1:1) /Filter(保留或丢弃) /Slicer(1:N),实现execute(sample: Dict) -> ...;OPERATORS = Registry("Operators"),用 DataMate 的register_module(module_name, module_path)注册(算子市场);process.py+metadata.yml(name/type/description/inputs/outputs/...),与 DataMate 仓库结构一致;TextClean直接移植 DataMate 真实算子EmailNumberCleaner的行为。智能体层 = Nexent SDK 契约(源:
ModelEngine-Group/nexentsdk/nexent/core/...)CoreAgent(observer=, tools=, model=, name=, max_steps=)构造面复刻自 NexentCoreAgent;Tool(类属性name/description/inputs/output_type+forward()),无@tool装饰器——与 Nexent 一致;每个 DataMate 算子被包成一个 Nexent 工具(agent/tools.py);OpenAIModel(observer=, model_id=, api_key=, api_base=)与 Nexent 同形;MessageObserver复刻其流式观察者角色。为什么用兼容层而不是直接装真库:真实
nexentSDK 要求 Python>=3.11,<3.12且依赖 smolagents/mem0,真实 DataMate 运行时含 Java 后端 + Ray + Milvus + PaddleOCR(需 Docker 整栈)。本兼容层无这些约束,任何有 pandas 的环境都能跑,且把待接真库的位置显式标注在各文件顶部——接真库时改基类导入即可(详见docs/DESIGN.md)。这是工程取舍,不是臆造接口:所有类名/方法名/签名均来自上述源码。项目结构
算子市场
DropMissingDedupFieldExtractTypeNormalizeFieldTransformTextClean新增算子 = 放一个目录(
process.py+metadata.yml)并在ops/__init__.py注册一行。Docker
测试
路线图(任务二/三,本次不在 MVP 范围)
三任务共享同一套“规划 + 双质检门 + 算子市场”内核,详见
../方案.md。许可
MIT。参赛成果按赛题要求以 MIT 开源。