# Data-governance 工作流改进方案

**需求**: 完善元数据管理流程  
**日期**: 2025-11-04

---

## 📋 新需求分析

### 功能需求

1. **用户确认后收集信息** ✅
   - 当用户回答"是"时
   - 提示用户输入元数据信息
   - 需要收集：元数据中文名、数据类型、描述等

2. **检查元数据是否存在** ✅
   - 调用API检查元数据中文名是否已存在
   - API地址：`http://192.168.3.143:5000/api/meta/check`

3. **创建新元数据** ✅
   - 如果不存在，调用API创建
   - API地址：`http://192.168.3.143:5000/api/meta/add`

---

## 🎯 推荐方案：使用 AI Agent Tools

### 方案概述

由于 Chat Trigger + AI Agent 的架构限制（AI Agent 必须是终点），最佳方案是：

**让 AI Agent 使用 Tools（工具）来执行操作**

### 工作流结构

```
Chat Trigger
    ↓
AI Agent (带多个工具)
    ├─ Tool 1: 收集元数据信息
    ├─ Tool 2: 检查元数据是否存在
    └─ Tool 3: 创建元数据
    ↓
DeepSeek Chat Model (语言模型)
```

### AI Agent 的对话流程

```
用户: "是，我需要创建元数据"
  ↓
AI: "好的！请提供以下元数据信息：
     1. 元数据中文名（必填）
     2. 数据类型（string/int/float等）
     3. 描述信息"
  ↓
用户: "中文名：用户姓名，类型：string，描述：用户的真实姓名"
  ↓
AI 使用 Tool 1: 检查"用户姓名"是否存在
  ↓
如果不存在 → 使用 Tool 2: 创建元数据
  ↓
AI: "✅ 元数据创建成功！
     - 中文名：用户姓名
     - 类型：string
     - 描述：用户的真实姓名"
```

---

## 🛠️ 实现方案

### 方案 A: 使用 HTTP Request Tools（推荐）⭐⭐⭐

#### 节点配置

##### 1. Chat Trigger
```json
{
  "type": "@n8n/n8n-nodes-langchain.chatTrigger",
  "parameters": {
    "public": true,
    "initialMessages": "您好！我是数据治理助手。\n\n我可以帮助您创建和管理元数据。\n\n请问您需要创建新的元数据吗？",
    "options": {
      "title": "数据治理助手 🤖",
      "subtitle": "元数据管理专家"
    }
  }
}
```

##### 2. AI Agent
```json
{
  "type": "@n8n/n8n-nodes-langchain.agent",
  "parameters": {
    "promptType": "auto",
    "options": {
      "systemMessage": `你是一个专业的数据治理助手，负责帮助用户创建元数据。

工作流程：
1. 当用户表示需要创建元数据时，询问用户提供以下信息：
   - 元数据中文名（必填）
   - 数据类型（string/int/float/date等，默认string）
   - 描述信息（选填）

2. 收集完信息后：
   - 使用 check_metadata 工具检查元数据是否已存在
   - 如果不存在，使用 create_metadata 工具创建

3. 返回创建结果给用户

注意：
- 友好地引导用户提供信息
- 元数据中文名是必需的
- 如果元数据已存在，告诉用户并询问是否需要其他帮助`
    }
  }
}
```

##### 3. HTTP Request Tool - 检查元数据
```json
{
  "name": "check_metadata",
  "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
  "parameters": {
    "name": "check_metadata",
    "description": "检查元数据中文名是否已经存在。输入：元数据中文名。返回：存在返回true，不存在返回false",
    "method": "GET",
    "url": "=http://192.168.3.143:5000/api/meta/check?name_zh={{$parameter.name_zh}}",
    "authentication": "none"
  }
}
```

##### 4. HTTP Request Tool - 创建元数据
```json
{
  "name": "create_metadata",
  "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
  "parameters": {
    "name": "create_metadata",
    "description": "创建新的元数据。输入参数：name_zh(中文名), data_type(数据类型), description(描述)。返回创建结果",
    "method": "POST",
    "url": "http://192.168.3.143:5000/api/meta/add",
    "authentication": "none",
    "sendBody": true,
    "specifyBody": "json",
    "jsonBody": {
      "name_zh": "={{$parameter.name_zh}}",
      "data_type": "={{$parameter.data_type || 'string'}}",
      "description": "={{$parameter.description || ''}}",
      "source": "data-governance-workflow"
    }
  }
}
```

##### 5. DeepSeek Chat Model
```json
{
  "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
  "parameters": {
    "model": "deepseek-chat",
    "options": {
      "temperature": 0.7,
      "maxTokens": 1000
    }
  },
  "credentials": {
    "deepSeekApi": "LSdatLFCoTSCGXmn"
  }
}
```

#### 连接关系

```
Chat Trigger → AI Agent (main)
DeepSeek → AI Agent (ai_languageModel)
check_metadata Tool → AI Agent (ai_tool)
create_metadata Tool → AI Agent (ai_tool)
```

---

### 方案 B: 简化版（如果 Tools 不可用）⭐⭐

如果 HTTP Request Tools 配置复杂，可以使用简化方案：

#### AI Agent 系统消息

```
你是数据治理助手。

当用户表示需要创建元数据时，请按以下格式收集信息：

📝 请提供元数据信息：
1. 中文名称（必填）
2. 数据类型（string/int/float，默认string）
3. 描述信息（选填）

示例格式：
中文名：用户姓名
类型：string
描述：用户的真实姓名

收集完信息后，我会为您创建元数据。

注意：由于当前系统限制，请确保元数据名称不重复。
```

然后通过后端API的逻辑来处理检查和创建。

---

## 📊 对比分析

| 特性 | 方案A (Tools) | 方案B (简化) |
|------|--------------|-------------|
| 功能完整性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 实现复杂度 | 中等 | 简单 |
| 用户体验 | 很好 | 一般 |
| 可维护性 | 高 | 中 |
| 实时反馈 | ✅ | ❌ |
| 重复检查 | ✅ 自动 | ❌ 需后端处理 |

---

## 🚀 实施步骤

### 步骤 1: 准备 API 接口

确保以下API在 192.168.3.143 上可用：

#### 检查元数据接口
```http
GET /api/meta/check?name_zh=元数据中文名
Response: {
  "code": 200,
  "data": {
    "exists": true/false
  }
}
```

#### 创建元数据接口
```http
POST /api/meta/add
Content-Type: application/json

{
  "name_zh": "元数据中文名",
  "data_type": "string",
  "description": "描述信息",
  "source": "data-governance-workflow"
}

Response: {
  "code": 200,
  "data": {...},
  "msg": "success"
}
```

### 步骤 2: 在 n8n 中配置

#### 方案 A 配置步骤：

1. **添加 HTTP Request Tool 节点** (检查)
   ```
   - 节点类型：HTTP Request Tool
   - Name: check_metadata
   - Description: 检查元数据是否存在
   - Method: GET
   - URL: http://192.168.3.143:5000/api/meta/check
   ```

2. **添加 HTTP Request Tool 节点** (创建)
   ```
   - 节点类型: HTTP Request Tool
   - Name: create_metadata
   - Description: 创建新元数据
   - Method: POST
   - URL: http://192.168.3.143:5000/api/meta/add
   ```

3. **连接 Tools 到 AI Agent**
   ```
   - check_metadata → AI Agent (ai_tool端口)
   - create_metadata → AI Agent (ai_tool端口)
   ```

4. **更新 AI Agent 系统消息**
   ```
   使用上面提供的系统消息内容
   ```

5. **测试工作流**
   ```
   输入: "是，我要创建元数据"
   AI应该: 询问元数据信息
   输入: "中文名：测试字段，类型：string"
   AI应该: 检查并创建
   ```

---

## 🧪 测试场景

### 场景 1: 完整流程 - 成功创建

```
用户: "是，我需要创建元数据"
AI: "好的！请提供元数据信息..."
用户: "中文名：用户年龄，类型：int，描述：用户的年龄"
AI: [使用check_metadata检查]
AI: [不存在，使用create_metadata创建]
AI: "✅ 元数据创建成功！"
```

### 场景 2: 元数据已存在

```
用户: "是，我需要创建元数据"
AI: "好的！请提供元数据信息..."
用户: "中文名：用户姓名，类型：string"
AI: [使用check_metadata检查]
AI: "❌ 元数据"用户姓名"已经存在，无需重复创建。需要其他帮助吗？"
```

### 场景 3: 信息不完整

```
用户: "是，我需要创建元数据"
AI: "好的！请提供元数据信息..."
用户: "类型是string"
AI: "还需要提供元数据的中文名称哦，这是必填项。"
```

---

## 📄 API 实现示例

### 后端 API 代码（参考）

#### 检查元数据接口
```python
@app.route('/api/meta/check', methods=['GET'])
def check_metadata():
    name_zh = request.args.get('name_zh')
    
    if not name_zh:
        return jsonify({"code": 400, "message": "缺少name_zh参数"})
    
    # 查询数据库
    exists = check_metadata_exists(name_zh)
    
    return jsonify({
        "code": 200,
        "data": {"exists": exists},
        "msg": "success"
    })
```

#### 创建元数据接口（已存在）
```python
@app.route('/api/meta/add', methods=['POST'])
def add_metadata():
    data = request.get_json()
    name_zh = data.get('name_zh')
    
    # 检查是否存在
    if check_metadata_exists(name_zh):
        return jsonify({
            "code": 409,
            "message": "元数据已存在"
        })
    
    # 创建元数据
    result = create_metadata(data)
    
    return jsonify({
        "code": 200,
        "data": result,
        "msg": "success"
    })
```

---

## ⚠️ 注意事项

### Chat Trigger 限制

1. **AI Agent 必须是终点节点**
   - 不能在 AI Agent 后面添加普通节点
   - 只能通过 Tools 来执行操作

2. **Tools 的参数传递**
   - AI Agent 会自动从对话中提取参数
   - 需要在 Tool 的 description 中明确说明参数

3. **错误处理**
   - Tool 执行失败时，AI Agent 会告诉用户
   - 需要在系统消息中定义如何处理错误

### API 设计建议

1. **检查接口应该轻量**
   - 只返回存在性，不返回详细信息
   - 响应时间 < 100ms

2. **创建接口应该原子性**
   - 要么成功创建，要么失败
   - 返回明确的错误信息

3. **统一错误格式**
   ```json
   {
     "code": 错误码,
     "message": "错误描述",
     "data": null
   }
   ```

---

## ✅ 验收标准

工作流完成后应满足：

- [ ] 用户确认创建元数据后，AI 询问详细信息
- [ ] AI 能正确收集：中文名、类型、描述
- [ ] AI 自动检查元数据是否已存在
- [ ] 如果不存在，自动创建
- [ ] 如果已存在，友好提示用户
- [ ] 创建成功后给出明确反馈
- [ ] 整个流程顺畅，无需人工干预

---

## 📚 相关文档

- n8n LangChain Tools: https://docs.n8n.io/integrations/langchain/tools/
- HTTP Request Tool: https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolhttprequest/
- AI Agent: https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/

---

## 🎯 下一步

1. **确认 API 接口** - 在 192.168.3.143 上实现检查接口
2. **在 n8n 中配置** - 按照方案 A 添加 Tools
3. **测试工作流** - 使用上述测试场景验证
4. **优化体验** - 根据测试结果调整 AI 提示词

**推荐从方案 A 开始实施，因为它提供了最完整的功能和最好的用户体验！** 🚀







