一句话:让大模型在沙箱里"自己动手解题",把解题过程录下来、打分、筛选,变成训练 Agent 的高质量数据。
这份文档讲清楚三件事:我们为什么做这个、它怎么设计的、能用在哪些场景。不需要先读代码也能看懂。
要训练一个会用工具的 Agent(会搜索、会查数据库、会读文档……),最缺的就是轨迹数据(trajectory):
任务 → [想法 → 调用工具 → 看到结果] → [想法 → 调用工具 → 看到结果] → …… → 最终答案
这种数据人工标太贵、太慢。于是我们让大模型自己去沙箱里探索,自动把这些轨迹生产出来。
但"能生产"还不够。直接收集的轨迹质量参差不齐——有的走了弯路、有的工具用错、有的根本没答对。如果把垃圾数据喂给模型,只会越训越差。
所以 DataFlow-Agent 的核心主张是:
不只是"采集"轨迹,而是"采集 → 打分 → 筛选",只留下高质量的那部分。
这就是我们和"只会收集轨迹的沙箱"最大的区别。
我们把整个过程拆成六个独立的算子(operator),像积木一样拼起来:
┌─────────────┐
任务列表 ───► │ 生成器 │ 让模型在沙箱里探索,产出轨迹
│ Generator │ (线性链 / 分支探索树)
└──────┬──────┘
│ 轨迹
▼
┌─────────────┐
│ 评估器 │ 大模型当裁判,给每条轨迹打分(0~1)
│ Evaluator │
└──────┬──────┘
│ 轨迹 + 分数
▼
┌─────────────┐
│ 选择器/过滤器 │ 选择器:从一堆里挑 top-N 且多样(不调模型)
│Selector/Filter│ 过滤器:按规则丢掉不合格的(不调模型)
└──────┬──────┘
│ 高质量轨迹
▼
┌─────────────┐
│ 修复器 │ 对低分/失败的轨迹"带着诊断重做一次"
│ Refiner │ 救回来,而不是直接扔掉
└──────┬──────┘
│
▼
高质量轨迹数据集
注:选择器、过滤器、修复器是三种处理轨迹的策略,可按需组合—— 「选器」从探索树的多条路径里挑精华,「过滤器」快速丢掉明显不合格的, 「修复器」尽量救回可挽救的。想要又快又纯净就用过滤器,想从树里选多样样本就用选择器,想尽量不浪费数据就加修复器。
| 算子 | 类型 | 干什么 | 要点 |
|---|---|---|---|
| AgentExploreGenerator | 生成 | 让模型一步步"想 → 调工具 → 看结果",直到给出答案 | 产出一条线性轨迹 |
| AgentExploreTreeGenerator | 生成 | 每一步同时尝试多个不同动作,展开成一棵"探索树" | 产出多条候选路径,还能做正负样本对比 |
| TrajectoryQualityEvaluator | 评估 | 大模型当裁判,从 4 个维度打分:目标达成 / 效率 / 连贯性 / 工具使用 | 给出 overall 总分 + 评语 |
| TrajectorySelector | 选择 | 从候选池里挑 top-N 条高质量且多样的轨迹(深度+信息量+工具多样性打分 → Jaccard 去重) | 不调大模型;确定性树搜索选择算法 |
| TrajectoryFilter | 过滤 | 用确定性规则筛掉坏轨迹(没成功、答案为空、工具用错、死循环……) | 不调大模型,又快又稳定、可复现 |
| TrajectoryRefiner | 修复 | 对失败/低分的轨迹,带上"上次哪里错了"的诊断重新探索一次,把它救回来 | 只修坏的(好的原样放行,不花钱);自己不评分,交给下游重评择优 |
💡 为什么过滤器不用大模型? 因为很多"坏"是显而易见的(比如根本没给出答案)。先用便宜的规则过滤器把明显的垃圾扔掉,再用昂贵的大模型裁判去评估剩下的——省钱、省时间。
💡 为什么要有修复器? 过滤器直接丢掉低分轨迹有点浪费——有些只是"中途走错一步"。修复器给它们第二次机会: 把上一次的失败诊断(没给答案?用错工具?死循环?)塞进提示里,让模型避开老错误再做一遍。 这样补齐了"生成 → 评估 → 过滤 → 修复"的完整闭环,提升数据利用率。
这是整个项目最值得讲的设计点。
算子永远不知道自己连的是哪个沙箱。 它只依赖两个抽象接口:
LLMServingABC—— 负责"想下一步做什么 / 当裁判打分"(任何大模型 API 都行)SandboxClientABC—— 负责"真正去执行工具调用"(任何沙箱后端都行)
┌───────────────────────────────┐
│ 六个算子 (业务逻辑) │
│ 只认两个抽象接口,不认具体实现 │
└───────┬───────────────┬────────┘
│ │
┌───────▼──────┐ ┌─────▼─────────┐
│ LLMServingABC│ │SandboxClientABC│
└───────┬──────┘ └─────┬─────────┘
│ │
任意大模型API ┌────┴────┬─────────┬──────────┐
(GPT/Claude/…) Mock沙箱 远程HTTP沙箱 你自己的沙箱
(离线测试) (HTTP通信) (写个子类即可)
好处很直接:
- 想换个沙箱?写一个
SandboxClientABC的子类就行,六个算子一行都不用改。 - 我们和远程沙箱的通信只走 HTTP(普通
requests),不 import 任何外部沙箱的 SDK,彻底解耦。 - 测试时用
MockSandboxClient(纯内存、不联网、不要 GPU、不要 API key),CI 里就能把整条流水线跑通。
我们内置了两个后端,你也可以加自己的:
| 后端 | 用途 |
|---|---|
MockSandboxClient |
离线开发 / 测试,零依赖 |
CodingSandboxClient |
真实工作区:文件读写 + 跑 Python + pytest + shell |
HTTPSandboxClient |
连任意远程沙箱服务器(通用 HTTP 协议) |
| 你自己的 | 实现 list_tools + execute 两个方法即可 |
本项目构建在 DataFlow 之上,并向"远程沙箱"延伸:
DataFlow (底座:数据流水线平台,提供算子基类/大模型服务/存储/注册表)
▲ ▲
│ 复用基类 │ 通过 HTTP 调工具
│ │
DataFlow-Agent ──────────────────────► 远程沙箱服务器
(本项目:探索 + 打分 + 筛选 + 修复) (多环境沙箱:采集轨迹)
- DataFlow:成熟的数据处理平台(已发布到 PyPI:
open-dataflow)。我们的算子直接挂到它的注册表里,像内置算子一样按名字调用。 - 远程沙箱:任何暴露通用 HTTP 协议(
/api/v1/execute+{code,message,data,meta}信封)的多环境 Agent 沙箱(RAG / 文档 / Text2SQL / 数据分析……),负责"采集"。通过HTTPSandboxClient对接,不依赖任何具体沙箱 SDK。 - DataFlow-Agent(本项目):桥梁 + 增值。它把 DataFlow 的能力延伸到 Agent 领域,补上"采集之后"最关键的一环——质量评估、选择、过滤与修复。
一句话总结分工:沙箱负责"采",DataFlow-Agent 负责"筛与修",DataFlow 提供"地基"。
我们是面向文本 / 结构化领域的探索器——只要工具的返回结果是文字或 JSON,就能用。
| 场景 | 典型工具 | 例子 |
|---|---|---|
| Coding / Working Agent | read_file, write_file, run_python, run_tests, run_shell |
"修复这个 bug,让测试通过" → 改文件 → 跑 pytest 验证 |
| Web 搜索 | web-search, web-visit |
"查一下某事件的最新进展" |
| RAG 检索 | rag-search |
"从知识库里找答案" |
| Text2SQL | get_schema, execute |
"每个城市有多少客户?" → 自动写 SQL 查库 |
| 文档问答 | doc-search, doc-read |
"这份合同的违约条款是什么?" |
| 数据分析 | read_csv, run_python |
"分析这个 CSV,算出月度趋势" |
🛠️ Coding Agent 已内置:
CodingSandboxClient给智能体一个真实隔离的工作目录, 带文件读写 + 跑 Python + 跑 pytest + shell 工具(路径锁在 workspace 内、命令带超时、可关 shell)。 真实模型实测能自主完成看目录 → 读代码 → 改 bug → 跑测试通过 → 收尾的完整闭环。
| 场景 | 为什么 |
|---|---|
| GUI / 虚拟机操作 | 这类工具返回的是截图(图片),而我们的循环是把"观察结果"当文字喂回给模型的,大模型服务接口里也没有图像通道。 |
多模态(图像观察)的探索器是未来工作。不过底层的沙箱通信层本身是领域无关的,加多模态时不用推倒重来。
装好就能跑离线 demo(零依赖、不要网络、不要 API key):
pip install open-dataflow # 提供算子基类 / 大模型服务 / 存储
pip install -e . # 安装本项目
# 跑离线流水线(Mock 沙箱 + 脚本化模型)
python examples/agentic_explore/run_mock_pipeline.py
# 跑离线测试套件(21 个测试,无网络/无 GPU/无 API key)
pytest test/test_agentic_explore.py -v接真实模型也只要几行(把 Mock 换成真实组件):
import dataflow_agent # 导入即自动注册六个算子
from dataflow.serving import APILLMServing_request
from dataflow.utils.storage import FileStorage
from dataflow_agent import AgentExploreGenerator, HTTPSandboxClient
storage = FileStorage(first_entry_file_name="queries.jsonl", cache_path="./cache")
llm = APILLMServing_request(api_url="https://.../v1/chat/completions", model_name="...")
sandbox = HTTPSandboxClient(base_url="http://127.0.0.1:18890", domain="text2sql")
op = AgentExploreGenerator(llm_serving=llm, sandbox=sandbox, domain="text2sql", max_steps=10)
op.run(storage.step(), input_key="query", output_key="trajectory")每条产出的轨迹长这样:
{
"task": "每个城市有多少客户?",
"steps": [
{"thought": "先看表结构", "action": {"tool": "get_schema", "args": {...}}, "observation": {...}},
{"thought": "写SQL查询", "action": {"tool": "execute", "args": {...}}, "observation": {...}}
],
"final_answer": "北京2个,上海1个",
"num_steps": 2,
"success": true
}如果只记三句话:
- 采集 ≠ 数据。 价值在于打分、筛选和修复,只留(或救回)高质量轨迹。
- 算子不认沙箱。 一切通过抽象接口解耦,换后端不改业务代码。
- 便宜的先上。 规则过滤器(不花钱)打头阵,大模型裁判/修复(花钱)殿后,且只对需要的轨迹动用。
- 多模态探索器:支持 GUI / 虚拟机的图像观察(目前只支持文本/结构化领域)。
- 偏好数据导出:从探索树里取"最好 vs 最差"的兄弟路径,产出 DPO 式的偏好训练对。
✅ 已实现:
生成 → 评估 → 选择/过滤 → 修复闭环已完整落地(TrajectorySelector选择器、TrajectoryRefiner修复器,见上文第 2 节)。