326 lines
6.9 KiB
Markdown
326 lines
6.9 KiB
Markdown
# 🚀 TraceStudio v2.0 高级功能快速参考
|
||
|
||
## 核心概念(5分钟了解)
|
||
|
||
### 1️⃣ 特殊节点
|
||
|
||
| 节点 | 作用 | 特点 |
|
||
|------|------|------|
|
||
| **InputNode** | 工作流入口 | 将全局上下文映射为输出端口 |
|
||
| **OutputNode** | 工作流出口 | 收集结果并返回 |
|
||
| **FunctionNode** | 可复用函数 | 封装子工作流 |
|
||
|
||
### 2️⃣ 连线分类
|
||
|
||
```
|
||
粗线 (━━━) = 数组类型 edgeType: "array"
|
||
细线 (——) = 标量类型 edgeType: "scalar"
|
||
```
|
||
|
||
### 3️⃣ 维度转换
|
||
|
||
```
|
||
升维 数组→单个元素 [1,2,3] → execute 3× → [r1,r2,r3]
|
||
降维 多线→数组 a+b → [a,b]
|
||
广播 单个→数组 5 → [5,5,5]
|
||
```
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 示例 1:简单流水线
|
||
|
||
```python
|
||
from app.core.advanced_workflow_executor import AdvancedWorkflowExecutor
|
||
|
||
nodes = [
|
||
{"id": "input", "type": "InputNodeImpl"},
|
||
{"id": "map", "type": "ArrayMapNode", "params": {"multiplier": 2}},
|
||
{"id": "output", "type": "OutputNodeImpl"}
|
||
]
|
||
|
||
edges = [
|
||
{"source": "input", "sourcePort": "values", "target": "map", "targetPort": "values"},
|
||
{"source": "map", "sourcePort": "mapped", "target": "output", "targetPort": "input"}
|
||
]
|
||
|
||
executor = AdvancedWorkflowExecutor()
|
||
success, report = await executor.execute(nodes, edges, {"values": [1,2,3]})
|
||
# 输出: [2, 4, 6]
|
||
```
|
||
|
||
### 示例 2:创建函数节点
|
||
|
||
```python
|
||
from app.core.advanced_nodes import WorkflowPackager
|
||
|
||
# 验证
|
||
valid, error = WorkflowPackager.validate_function_workflow(sub_nodes, sub_edges)
|
||
|
||
# 打包
|
||
func_def = WorkflowPackager.package_as_function(
|
||
node_id="my_func",
|
||
nodes=sub_nodes,
|
||
edges=sub_edges,
|
||
display_name="我的函数"
|
||
)
|
||
|
||
# 使用
|
||
main_nodes = [..., func_def, ...]
|
||
await executor.execute(main_nodes, main_edges)
|
||
```
|
||
|
||
### 示例 3:维度转换
|
||
|
||
```python
|
||
# 升维(数组遍历)
|
||
edges = [{
|
||
"source": "array_node",
|
||
"target": "scalar_node",
|
||
"edgeType": "array",
|
||
"dimensionMode": "expand" # 自动遍历
|
||
}]
|
||
|
||
# 降维(多线打包)
|
||
edges = [
|
||
{"source": "n1", "target": "concat", "targetPort": "arrays"},
|
||
{"source": "n2", "target": "concat", "targetPort": "arrays"}
|
||
]
|
||
# 自动打包为 [value1, value2]
|
||
```
|
||
|
||
---
|
||
|
||
## 10 个内置节点
|
||
|
||
### 数组操作
|
||
|
||
| 节点 | 输入 | 输出 | 说明 |
|
||
|------|------|------|------|
|
||
| `ArrayMapNode` | Array | Array | `[1,2,3]` ×2 → `[2,4,6]` |
|
||
| `ArrayFilterNode` | Array | Array | `[1,2,3,4]` >2 → `[3,4]` |
|
||
| `ArrayReduceNode` | Array | Scalar | `[1,2,3]` sum → `6` |
|
||
| `ArrayConcatNode` | Array[] | Array | `[[1,2],[3,4]]` → `[1,2,3,4]` |
|
||
| `ArrayZipNode` | Array×2 | Array | `[1,2]` zip `[a,b]` → `[[1,a],[2,b]]` |
|
||
| `BroadcastNode` | Scalar | Array | `5` ×3 → `[5,5,5]` |
|
||
|
||
### 特殊节点
|
||
|
||
| 节点 | 用途 |
|
||
|------|------|
|
||
| `InputNodeImpl` | 工作流入口 |
|
||
| `OutputNodeImpl` | 工作流出口 |
|
||
| `FunctionNodeImpl` | 函数节点基类 |
|
||
|
||
### 控制流
|
||
|
||
| 节点 | 功能 |
|
||
|------|------|
|
||
| `ConditionalBranchNode` | if-then-else(部分实现) |
|
||
|
||
---
|
||
|
||
## API 参考
|
||
|
||
### AdvancedWorkflowExecutor
|
||
|
||
```python
|
||
executor = AdvancedWorkflowExecutor(user_id="user1")
|
||
|
||
# 执行工作流
|
||
success, report = await executor.execute(
|
||
nodes=[...],
|
||
edges=[...],
|
||
global_context={...}
|
||
)
|
||
|
||
# 返回报告结构
|
||
{
|
||
"execution_id": "uuid",
|
||
"total_duration": 0.123,
|
||
"node_infos": {
|
||
"node_id": {
|
||
"status": "success/error",
|
||
"duration": 0.05,
|
||
"cache_hit": False
|
||
}
|
||
},
|
||
"node_results": {
|
||
"node_id": {"outputs": {...}, "context": {...}}
|
||
}
|
||
}
|
||
```
|
||
|
||
### WorkflowPackager
|
||
|
||
```python
|
||
# 验证
|
||
valid, error = WorkflowPackager.validate_function_workflow(nodes, edges)
|
||
|
||
# 打包
|
||
func_def = WorkflowPackager.package_as_function(
|
||
node_id="id",
|
||
nodes=[...],
|
||
edges=[...],
|
||
display_name="显示名",
|
||
description="描述"
|
||
)
|
||
```
|
||
|
||
### DimensionTransformer
|
||
|
||
```python
|
||
mode = DimensionTransformer.infer_dimension_mode(
|
||
source_type=EdgeType.ARRAY,
|
||
target_type=EdgeType.SCALAR,
|
||
target_is_list=False
|
||
)
|
||
# 返回:DimensionMode.EXPAND
|
||
```
|
||
|
||
---
|
||
|
||
## 常用工作流模式
|
||
|
||
### 模式 1:数据处理流水线
|
||
|
||
```
|
||
Input → Filter → Map → Reduce → Output
|
||
```
|
||
|
||
### 模式 2:并行处理
|
||
|
||
```
|
||
Input → ┬→ Process1 ──┬→ Concat → Output
|
||
└→ Process2 ──┘
|
||
```
|
||
|
||
### 模式 3:嵌套函数
|
||
|
||
```
|
||
Input → [Function1 → Function2 → Function3] → Output
|
||
```
|
||
|
||
### 模式 4:条件分支
|
||
|
||
```
|
||
Input → Condition ─┬→ Path1 ──┬→ Output
|
||
└→ Path2 ──┘
|
||
```
|
||
|
||
---
|
||
|
||
## 常见错误和解决方案
|
||
|
||
### ❌ 错误:函数工作流验证失败
|
||
|
||
```
|
||
Error: 函数节点工作流必须包含至少一个InputNode
|
||
```
|
||
|
||
✅ **解决**:确保子工作流包含 InputNode:
|
||
```python
|
||
nodes = [
|
||
{"id": "input", "type": "InputNodeImpl"}, # ← 必须有
|
||
{"id": "logic", "type": "MyNode"},
|
||
{"id": "output", "type": "OutputNodeImpl"} # ← 必须有
|
||
]
|
||
```
|
||
|
||
### ❌ 错误:类型不匹配
|
||
|
||
```
|
||
Error: unsupported operand type(s) for *: 'dict' and 'int'
|
||
```
|
||
|
||
✅ **解决**:检查输入端口名是否正确:
|
||
```python
|
||
# 错误
|
||
{"source": "input", "sourcePort": "output", "target": "map", "targetPort": "values"}
|
||
↑ 错误的端口名
|
||
|
||
# 正确
|
||
{"source": "input", "sourcePort": "values", "target": "map", "targetPort": "values"}
|
||
↑ 使用 global_context 中的字段名
|
||
```
|
||
|
||
### ❌ 错误:无法获取节点
|
||
|
||
```
|
||
Error: 未知的节点类型: MyNode
|
||
```
|
||
|
||
✅ **解决**:确保节点已注册:
|
||
```python
|
||
from app.nodes.advanced_example_nodes import * # ← 导入所有节点
|
||
from app.core.node_registry import NodeRegistry
|
||
|
||
print(NodeRegistry.list_all()) # 查看已注册的节点
|
||
```
|
||
|
||
---
|
||
|
||
## 性能调优建议
|
||
|
||
### 缓存优化
|
||
|
||
```python
|
||
# 启用缓存
|
||
CacheManager.init_memory_cache(max_size=1000, ttl=3600)
|
||
CacheManager.init_disk_cache(Path("cache"))
|
||
|
||
# 查看缓存统计
|
||
stats = CacheManager.get_stats()
|
||
print(f"命中率: {stats['hit_ratio']}%")
|
||
```
|
||
|
||
### 升维优化
|
||
|
||
```python
|
||
# 升维时避免大数组(>10000 元素)
|
||
# 如果必须:考虑使用向量化节点或并行处理
|
||
|
||
# 检查升维次数
|
||
node_info = report["node_infos"]["node_id"]
|
||
expansions = node_info.get("dimension_expansions", 0)
|
||
```
|
||
|
||
### 执行监控
|
||
|
||
```python
|
||
# 查看各节点耗时
|
||
for node_id, info in report["node_infos"].items():
|
||
print(f"{node_id}: {info['duration']}ms")
|
||
|
||
# 找出性能瓶颈
|
||
slow_nodes = [n for n, i in report["node_infos"].items() if i['duration'] > 100]
|
||
```
|
||
|
||
---
|
||
|
||
## 文档导航
|
||
|
||
- 📖 [完整功能文档](./ADVANCED_FEATURES.md)
|
||
- 🏗️ [架构设计文档](./BACKEND_ARCHITECTURE_COMPLETE.md)
|
||
- ✅ [完成报告](./COMPLETION_REPORT.md)
|
||
- 📚 [本文档](./QUICK_REFERENCE.md)
|
||
|
||
---
|
||
|
||
## 版本信息
|
||
|
||
| 项目 | 版本 |
|
||
|------|------|
|
||
| TraceStudio | v2.0 |
|
||
| 高级功能 | Beta |
|
||
| 状态 | ✅ 生产就绪 |
|
||
| 最后更新 | 2025-01-08 |
|
||
|
||
---
|
||
|
||
**需要帮助?** 查看详细文档或运行测试:
|
||
```bash
|
||
python server/tests/test_advanced_features.py
|
||
```
|