# DataMeta 管理智能体技术文档 ## 1. 概述 DataMeta 管理智能体是一个基于 n8n 构建的智能对话系统,用于管理元数据(DataMeta)和数据标签(DataLabel)的增删改查操作。该智能体采用**主 Agent + 子 Agent**的架构设计,通过自然语言交互实现元数据的全生命周期管理。 ### 1.1 基本信息 | 属性 | 值 | | -------- | ----------------------------------------------------- | | 主工作流名称 | DataMeta管理智能体 | | 主工作流 ID | `74AYpVBKwYt8fhjx7rMzc` | | 子工作流名称 | 新增元数据子Agent | | 子工作流 ID | `Uv2FXcr80GtxBGxv` | | AI 模型 | DeepSeek | | API 基础地址 | `https://company.citupro.com:18183` | | 访问地址 | `https://n8n.citupro.com/webhook/datameta-agent/chat` | ### 1.2 功能清单 | 功能 | 描述 | 处理节点 | | ------- | ------------- | ---------------------------- | | 新增元数据 | 多轮对话引导收集信息并创建 | 子工作流 Add Metadata Agent | | 查询元数据列表 | 分页查询,支持筛选 | CRUD Agent → list_datameta | | 获取元数据详情 | 按 ID 查询详细信息 | CRUD Agent → get_datameta | | 更新元数据 | 修改现有元数据字段 | CRUD Agent → update_datameta | | 删除元数据 | 按 ID 删除(需确认) | CRUD Agent → delete_datameta | | 查看标签列表 | 获取可用标签 | CRUD Agent → list_labels | --- ## 2. 系统架构 ### 2.1 整体架构图 ![221782da-259e-444c-a9fc-6815bf7ee507](file:///C:/Users/Administrator/Pictures/Typedown/221782da-259e-444c-a9fc-6815bf7ee507.png) ### 2.2 意图分类与路由流程 ```mermaid flowchart LR subgraph Input direction LR UI["💬 用户消息"] end subgraph Classification direction LR IC["🧠 Intent Classifier"] MEM["📝 历史对话记忆"] end subgraph Routing direction LR SW{"🔀 Switch"} end subgraph Outputs direction LR O1["📤 新增元数据子流程"] O2["🤖 CRUD Agent"] O3["🤖 默认CRUD Agent"] end UI --> IC MEM --> IC IC -->|意图标签| SW SW -->|包含 add_metadata| O1 SW -->|包含 other_operations| O2 SW -->|其他/默认| O3 style Input fill:#e3f2fd style Classification fill:#f3e5f5 style Routing fill:#fff8e1 style Outputs fill:#e8f5e9 ``` ### 2.3 新增元数据多轮对话流程 ```mermaid sequenceDiagram participant U as 👤 用户 participant M as 🧠 主Agent participant S as 🤖 子Agent participant API as 🌐 后端API U->>M: "我想新增一个元数据" M->>M: Intent Classifier 识别为 add_metadata M->>S: 调用子工作流 (user_message, session_id) S->>U: "请输入元数据的中文名称" U->>M: "订单状态" M->>S: 继续对话流程 S->>API: translate_name(node_name: "订单状态") API-->>S: "order_status" S->>U: "英文名称已翻译为: order_status,请选择数据类型" U->>M: "varchar" M->>S: 继续对话流程 S->>U: "是否启用该元数据?" U->>M: "启用" M->>S: 继续对话流程 S->>U: "请选择分类: 系统类/应用类/DataOps" U->>M: "应用类" M->>S: 继续对话流程 Note over S: 继续收集: 归属、描述、标签... S->>U: "请确认以上信息" U->>M: "确认" M->>S: 提交创建 S->>API: add_datameta(name_zh, name_en, data_type, ...) API-->>S: 创建成功,ID: 2325 S->>U: "✅ 元数据创建成功!ID: 2325" ``` --- ## 3. 节点配置详解 ### 3.1 主工作流节点 #### 3.1.1 Chat Trigger | 配置项 | 值 | | ---------- | -------------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.chatTrigger` | | 版本 | 1.1 | | Webhook ID | `datameta-agent` | | 公开访问 | `true` | **UI 配置:** ```json { "title": "DataMeta管理助手", "subtitle": "我可以帮您管理元数据,支持查询、新增、更新、删除和标签管理", "inputPlaceholder": "请输入您的需求,例如:查看所有元数据" } ``` **输出数据结构:** ```json { "chatInput": "用户输入的消息", "sessionId": "会话唯一标识" } ``` #### 3.1.2 Intent Classifier (意图分类器) | 配置项 | 值 | | ------ | -------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.agent` | | 版本 | 1.7 | | 最大迭代次数 | 3 | **输入配置:** ``` promptType: define text: ={{ $json.chatInput }} ``` **系统提示语 (System Message):** ``` 你是一个意图分类器。分析用户的输入,判断用户的意图类型。 ## 重要:多轮对话上下文 你有记忆功能,可以看到之前的对话历史。如果用户之前表达了新增元数据的意图,并且当前正在进行新增元数据的多轮对话流程中(例如:用户正在回答中文名、英文名、数据类型、状态、分类等问题),那么当前输入应该继续被分类为 add_metadata。 **判断是否在新增元数据流程中的依据:** - 之前的对话中用户说过"新增"、"添加"、"创建"元数据 - 系统正在询问元数据的各个字段(中文名、英文名、数据类型、状态、分类、归属、描述、标签) - 用户的当前输入是在回答这些字段的值 - **系统展示了元数据信息汇总并询问确认** - **用户正在回应确认请求(无论是确认、否认还是修改)** **特别注意:确认阶段的用户回复** 如果对话历史中系统最近展示了"元数据信息汇总"并询问"请确认以上信息是否正确",那么用户的任何回复都应该分类为 add_metadata,包括: - 确认类:"确认"、"正确"、"没问题"、"可以" - 否认类:"不正确"、"有问题"、"不对"、"错了" - 修改类:"修改xxx"、"把xxx改成xxx"、"xxx不对" ## 意图分类 请将用户意图分类为以下类型之一: 1. **add_metadata** - 用户想要新增、添加、创建元数据,或者正在新增元数据的多轮对话流程中 - 关键词:新增、添加、创建、新建、录入 - 或者:用户正在回答新增元数据流程中的问题 - 或者:用户正在确认/修改元数据信息汇总 2. **other_operations** - 其他所有操作 - 查询、列出、搜索元数据 - 查看元数据详情 - 更新、修改已存在的元数据(不是新增流程中的修改) - 删除元数据 - 查看标签 - 其他任何操作 ## 输出格式 你必须严格按照以下JSON格式输出,不要输出任何其他内容: {"intent": "add_metadata"} 或 {"intent": "other_operations"} 只输出JSON,不要有任何解释或其他文字。 ``` #### 3.1.3 Intent Switch (意图路由) | 配置项 | 值 | | ---- | ----------------------- | | 节点类型 | `n8n-nodes-base.switch` | | 版本 | 3.4 | | 模式 | rules | **路由规则:** | 输出端口 | 名称 | 条件 | 目标节点 | | ---- | ----- | ------------------------------------------ | ----------------------------- | | 0 | 新增元数据 | `$json.output` contains "add_metadata" | Execute Add Metadata Workflow | | 1 | 其他操作 | `$json.output` contains "other_operations" | CRUD Agent | | 2 | 默认 | fallback | CRUD Agent | **完整配置:** ```json { "mode": "rules", "rules": { "values": [ { "conditions": { "conditions": [ { "leftValue": "={{ $json.output }}", "rightValue": "add_metadata", "operator": { "type": "string", "operation": "contains" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "新增元数据" }, { "conditions": { "conditions": [ { "leftValue": "={{ $json.output }}", "rightValue": "other_operations", "operator": { "type": "string", "operation": "contains" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "其他操作" } ] }, "options": { "fallbackOutput": "extra", "renameFallbackOutput": "默认" } } ``` #### 3.1.4 Execute Add Metadata Workflow (执行子工作流) | 配置项 | 值 | | ------- | -------------------------------- | | 节点类型 | `n8n-nodes-base.executeWorkflow` | | 版本 | 1.3 | | 子工作流 ID | `Uv2FXcr80GtxBGxv` | | 等待完成 | `true` | **参数传递配置:** ```json { "workflowInputs": { "mappingMode": "defineBelow", "value": { "user_message": "={{ $('Chat Trigger').item.json.chatInput }}", "session_id": "={{ $('Chat Trigger').item.json.sessionId }}" } } } ``` #### 3.1.5 Prepare CRUD Input (准备 CRUD 输入) | 配置项 | 值 | | ----- | -------------------- | | 节点类型 | `n8n-nodes-base.set` | | 版本 | 3.4 | | 节点 ID | `prepare-crud-input` | **用途:** 在 Intent Switch 路由到 CRUD Agent 之前,从 Chat Trigger 提取原始用户输入和会话 ID,确保 CRUD Agent 收到的是用户的实际请求,而不是 Intent Classifier 的输出。 **配置:** ```json { "mode": "manual", "duplicateItem": false, "assignments": { "assignments": [ { "id": "chatInput", "name": "chatInput", "value": "={{ $('Chat Trigger').item.json.chatInput }}", "type": "string" }, { "id": "sessionId", "name": "sessionId", "value": "={{ $('Chat Trigger').item.json.sessionId }}", "type": "string" } ] }, "options": {} } ``` > **为什么需要这个节点?** > > Intent Switch 接收的输入是 Intent Classifier 的输出(如 `{"intent": "other_operations"}`)。如果直接将这个输出传递给 CRUD Agent,CRUD Agent 会收到意图分类结果而不是用户的实际请求,导致无法正确执行查询、更新等操作。 > > 通过 `Prepare CRUD Input` 节点,我们显式地从 Chat Trigger 获取原始的 `chatInput` 和 `sessionId`,确保 CRUD Agent 总是收到正确的用户消息。 #### 3.1.6 CRUD Agent | 配置项 | 值 | | ------ | -------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.agent` | | 版本 | 1.7 | | 最大迭代次数 | 25 | **输入配置:** ``` promptType: define text: ={{ $json.chatInput }} ``` > **注意:** CRUD Agent 的 `text` 参数从 `Prepare CRUD Input` 节点获取 `$json.chatInput`,而不是直接从 Chat Trigger 获取。这是因为 CRUD Agent 的上游节点是 `Prepare CRUD Input`。 **系统提示语 (System Message):** ``` 你是一个元数据管理智能体,负责帮助用户管理DataMeta(元数据)和DataLabel(数据标签)。 ## 你的职责 根据用户的意图,选择合适的工具来完成任务: ### 1. 查询元数据列表 - 当用户想要**查看、列出、搜索**元数据时 - 使用 `list_datameta` 工具 - 可以按关键词、分类等条件筛选 ### 2. 获取元数据详情 - 当用户想要**查看某个具体元数据的详细信息**时 - 使用 `get_datameta` 工具 - 需要提供元数据ID ### 3. 更新元数据 - 当用户想要**修改、更新**现有元数据时 - 使用 `update_datameta` 工具 - 需要提供元数据ID和要修改的字段 ### 4. 删除元数据 - 当用户想要**删除**元数据时 - 使用 `delete_datameta` 工具 - 需要提供元数据ID - 删除前请确认用户意图 ### 5. 查看标签列表 - 当用户想要**查看可用的标签**时 - 使用 `list_labels` 工具 ## 回复要求 - 请用中文回复用户 - 清晰地展示操作结果 - 如果操作失败,解释原因并提供建议 ``` ### 3.2 子工作流节点 #### 3.2.1 Execute Workflow Trigger | 配置项 | 值 | | ---- | --------------------------------------- | | 节点类型 | `n8n-nodes-base.executeWorkflowTrigger` | | 版本 | 1.1 | **输入参数定义:** ```json { "inputSource": "workflowInputs", "workflowInputs": { "values": [ { "name": "user_message", "type": "string" }, { "name": "session_id", "type": "string" } ] } } ``` #### 3.2.2 Add Metadata Agent | 配置项 | 值 | | ------ | -------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.agent` | | 版本 | 1.7 | | 最大迭代次数 | 25 | **输入配置:** ``` promptType: define text: ={{ $json.user_message }} ``` **系统提示语 (System Message):** ``` 你是一个专门负责新增元数据的助手。你的任务是通过多轮对话收集用户输入的元数据信息,然后创建新的元数据。 ## 信息收集流程 按以下顺序依次收集信息: ### 步骤1:收集中文名称(必填) - 询问用户:"请输入元数据的中文名称" - 记录 name_zh ### 步骤2:自动翻译英文名称并等待确认 - 获取中文名称后,立即调用 translate_name 工具进行翻译 - 展示翻译结果给用户:"英文名称已自动翻译为: xxx" - **重要:必须等待用户确认或提供修改后的英文名** - 询问用户:"请确认英文名称是否正确,或输入您希望使用的英文名称" - 用户可能的回复: - "确认"、"好的"、"可以"、"没问题" → 使用翻译结果 - 提供新的英文名称 → 使用用户提供的名称 - 确认后记录 name_en,然后才进入步骤3 ### 步骤3:收集数据类型(必填) - 询问用户:"请选择数据类型,常见类型有: varchar, integer, string, number, boolean, date" - **等待用户输入** - 记录 data_type ### 步骤4:收集使用状态(可选) - 询问用户:"是否启用该元数据?请回复"启用"或"禁用"(默认启用)" - **等待用户回复** - 用户可能的回复: - "启用"、"是"、"默认"、"确认" → status = true - "禁用"、"否" → status = false - 确认后记录 status ### 步骤5:选择分类(可选) - 询问用户:"请选择元数据分类:系统类 / 应用类 / DataOps,或输入"跳过"" - **等待用户回复** - 用户可能的回复: - "系统类"、"应用类"、"DataOps" → 记录对应分类 - "跳过"、"无"、"不选" → 留空 - 确认后记录 category ### 步骤6:输入制作单位/归属部门(可选) - 询问用户:"请输入制作单位/归属部门,或输入"跳过"" - **等待用户回复** - 用户可能的回复: - 具体部门名称 → 记录部门名称 - "跳过"、"无"、"不填" → 留空 - 确认后记录 affiliation ### 步骤7:输入描述(可选) - 询问用户:"请输入元数据描述,或输入"跳过"" - **等待用户回复** - 用户可能的回复: - 具体描述内容 → 记录描述 - "跳过"、"无"、"不填" → 留空 - 确认后记录 describe ### 步骤8:选择标签(可选) - 先调用 list_labels 获取可用标签列表 - 展示标签选项给用户(显示ID和名称) - 询问用户:"请选择要添加的标签(输入标签ID,多个用逗号分隔),或输入"跳过"" - **等待用户回复** - 用户可能的回复: - 标签ID(如 "51" 或 "51,59,82") → 记录标签ID数组 - "跳过"、"无"、"不选" → 留空 - 确认后记录 tag ### 步骤9:确认并提交 - 展示所有收集到的信息汇总给用户确认 - **等待用户确认** - **用户回复处理:** - 如果用户回复"确认"、"正确"、"没问题"、"可以"、"提交" → 调用 add_datameta 工具提交 - 如果用户回复"不正确"、"有问题"、"不对"、"需要修改" → 询问用户"请告诉我您要修改哪个字段?" - 如果用户指定了要修改的字段(如"修改中文名"、"把数据类型改成integer") → 直接询问该字段的新值 - 修改完成后,重新展示更新后的信息汇总,再次询问确认 ### 步骤10:处理返回结果 **情况1:完全匹配(已存在)** - 如果返回信息包含"已存在"或"完全匹配" - 从返回信息中提取已存在的元数据ID - 调用 get_datameta 获取详情并展示给用户 - 告知用户:"该元数据已存在,无需重复创建" **情况2:疑似重复** - 如果返回信息包含"疑似重复" - 展示新创建的元数据信息 - 提示用户:"元数据已创建成功,但发现疑似重复的元数据,已创建审核记录。" - 询问用户:"是否需要前往审核页面处理?" - 如果用户需要审核,提供链接:https://company.citupro.com:18183/dataReview **情况3:成功创建** - 展示新创建的元数据完整信息 - 告知用户创建成功 ## 回复要求 - 请用中文回复用户 - 在多轮对话中记住用户已提供的所有字段,不要重复询问 - 如果用户一次性提供了多个字段,直接记录并继续下一步 ``` --- ## 4. Simple Memory 配置 ### 4.1 主工作流 Memory #### Simple Memory Intent (意图分类器记忆) | 配置项 | 值 | | ------------- | --------------------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.memoryBufferWindow` | | 版本 | 1.3 | | 上下文窗口长度 | 20 | | Session ID 类型 | customKey | | Session Key | `=intent-{{ $json.sessionId }}` | **用途:** 记住用户的对话历史,以便 Intent Classifier 能够识别用户是否正在进行新增元数据的多轮对话流程。 **关键配置:** ```json { "contextWindowLength": 20, "sessionIdType": "customKey", "sessionKey": "=intent-{{ $json.sessionId }}" } ``` > **重要**:Session Key 使用 `intent-` 前缀以区分不同 Agent 的记忆空间。 #### Simple Memory CRUD (CRUD Agent 记忆) | 配置项 | 值 | | ------------- | --------------------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.memoryBufferWindow` | | 版本 | 1.3 | | 上下文窗口长度 | 20 | | Session ID 类型 | customKey | | Session Key | `=crud-{{ $json.sessionId }}` | **用途:** 记住用户在执行查询、更新、删除等操作时的上下文。 **关键配置:** ```json { "contextWindowLength": 20, "sessionIdType": "customKey", "sessionKey": "=crud-{{ $json.sessionId }}" } ``` > **重要:Memory 隔离机制** > > `Simple Memory Intent` 和 `Simple Memory CRUD` 必须使用不同的 sessionKey 前缀(`intent-` 和 `crud-`),以确保两个 Agent 的对话记忆完全隔离。 > > **问题背景:** 如果两个 Memory 使用相同的 sessionKey,Intent Classifier 输出的意图分类结果(如 `{"intent": "other_operations"}`)会被存入记忆。当 CRUD Agent 读取记忆时,会读到这个不相关的意图分类结果,导致 CRUD Agent 无法正确理解用户的实际请求。 > > **解决方案:** 通过添加前缀(`intent-` 或 `crud-`),使得即使在同一个 session 中,两个 Agent 的记忆也完全独立,互不干扰。 ### 4.2 子工作流 Memory #### Simple Memory Sub (子 Agent 记忆) | 配置项 | 值 | | ------------- | --------------------------------------------- | | 节点类型 | `@n8n/n8n-nodes-langchain.memoryBufferWindow` | | 版本 | 1.3 | | 上下文窗口长度 | 20 | | Session ID 类型 | customKey | | Session Key | `={{ $json.session_id }}` | **用途:** 使用从主工作流传递的 `session_id` 作为会话标识,保持多轮对话的上下文连续性。 **关键配置:** ```json { "contextWindowLength": 20, "sessionIdType": "customKey", "sessionKey": "={{ $json.session_id }}" } ``` --- ## 5. HTTP 工具配置 ### 5.1 主工作流工具 #### list_datameta (查询元数据列表) | 配置项 | 值 | | ------------ | ------------------------------------------------------ | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/meta/node/list` | | Content-Type | application/json | **工具描述:** ``` 查询元数据列表。可选参数:current(页码,默认1), size(每页数量,默认10), name_zh(中文名筛选), name_en(英文名筛选), category(分类筛选) ``` **请求体配置 (JSON 表达式):** ```javascript ={{ JSON.stringify({ current: $fromAI('current', '页码', 'number') || 1, size: $fromAI('size', '每页数量', 'number') || 10, name_zh: $fromAI('name_zh', '中文名筛选', 'string') || '', name_en: $fromAI('name_en', '英文名筛选', 'string') || '', category: $fromAI('category', '分类筛选', 'string') || '' }) }} ``` #### get_datameta (获取元数据详情) | 配置项 | 值 | | ------------ | ------------------------------------------------------ | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/meta/node/edit` | | Content-Type | application/json | **工具描述:** ``` Get metadata details by ID. Required: id (metadata ID as number). ``` **请求体参数:** | 参数名 | 说明 | |--------|------| | id | 元数据 ID | #### update_datameta (更新元数据) | 配置项 | 值 | | ------------ | -------------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/meta/node/update` | | Content-Type | application/json | **工具描述:** ``` Update existing metadata. Required: id (metadata ID as number). Optional: data_type (new data type like varchar, string, integer). ``` **请求体参数:** | 参数名 | 说明 | |--------|------| | id | 元数据 ID (必填) | | data_type | 新的数据类型 (可选) | #### delete_datameta (删除元数据) | 配置项 | 值 | | ------------ | -------------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/meta/node/delete` | | Content-Type | application/json | **工具描述:** ``` Delete metadata by ID. Required: id (metadata ID as number to delete). ``` **请求体参数:** | 参数名 | 说明 | |--------|------| | id | 要删除的元数据 ID | #### list_labels (查询标签列表) | 配置项 | 值 | | ------------ | ----------------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/interface/labellist` | | Content-Type | application/json | **工具描述:** ``` Query available data labels list. Returns label ID, Chinese name, English name. ``` **请求体参数 (固定值):** | 参数名 | 值 | |--------|-----| | current | 1 | | size | 10 | ### 5.2 子工作流工具 #### translate_name (翻译名称) | 配置项 | 值 | | ------------ | -------------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/system/translate` | | Content-Type | application/json | **工具描述:** ``` Translate Chinese name to English name. Required: node_name (Chinese name to translate). Returns translated English name. ``` **请求体参数:** | 参数名 | 说明 | |--------|------| | node_name | 要翻译的中文名称 | #### add_datameta (新增元数据) | 配置项 | 值 | | ------------ | ----------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/meta/node/add` | | Content-Type | application/json | **工具描述:** ``` Add new metadata. Required: name_zh (Chinese name), data_type. Optional: name_en, status (default true), category (one of: 系统类, 应用类, DataOps), affiliation, describe, tag (array of tag IDs). ``` **请求体参数:** | 参数名 | 必填 | 说明 | |--------|------|------| | name_zh | ✅ | 中文名称 | | data_type | ✅ | 数据类型 | | name_en | ❌ | 英文名称 | | status | ❌ | 启用状态 (默认 true) | | category | ❌ | 分类 (系统类/应用类/DataOps) | | affiliation | ❌ | 归属部门 | | describe | ❌ | 描述 | | tag | ❌ | 标签 ID 数组 | #### list_labels (查询标签列表 - 子工作流) | 配置项 | 值 | | ------------ | ----------------------------------------------------------- | | 方法 | POST | | URL | `https://company.citupro.com:18183/api/interface/labellist` | | Content-Type | application/json | **工具描述:** ``` Query available labels list filtered by DataOps category. Returns label ID, Chinese name, English name. ``` **请求体参数 (固定值):** | 参数名 | 值 | 说明 | |--------|-----|------| | current | 1 | 页码 | | size | 50 | 每页数量 | | category_filter | DataOps | 分类过滤,只返回 DataOps 类别的标签 | > **说明**:子工作流中的 `list_labels` 工具添加了 `category_filter` 参数,只返回 DataOps 分类下的标签,便于用户在新增元数据时选择相关标签。 --- ## 6. DeepSeek 模型配置 ### 6.1 模型实例 | 实例名称 | 用途 | Temperature | | -------------------------- | ----------------------- | ----------- | | DeepSeek Chat Model | Intent Classifier 意图分类 | 0.3 | | DeepSeek Chat Model CRUD | CRUD Agent 操作执行 | 0.7 | | DeepSeek Chat Model (子工作流) | Add Metadata Agent 新增流程 | 0.7 | ### 6.2 凭证配置 ```json { "credentials": { "deepSeekApi": { "id": "N8PgEL20Nk88KXMp", "name": "DeepSeek account" } } } ``` --- ## 7. 工作流设置 ### 7.1 主工作流设置 ```json { "executionOrder": "v1", "binaryMode": "separate", "availableInMCP": false, "callerPolicy": "workflowsFromSameOwner" } ``` ### 7.2 子工作流设置 ```json { "executionOrder": "v1", "saveDataErrorExecution": "all", "saveDataSuccessExecution": "all", "saveManualExecutions": true, "saveExecutionProgress": true, "callerPolicy": "any", "availableInMCP": false } ``` **关键配置说明:** - `callerPolicy: "any"` - 允许任何工作流调用此子工作流 --- ## 8. 连接关系图 ### 8.1 主工作流连接 ```mermaid graph LR subgraph Trigger["触发层"] CT["Chat Trigger"] end subgraph Intent["意图识别层"] IC["Intent Classifier"] DSM1["DeepSeek Model"] SMI["Simple Memory Intent"] end subgraph Routing["路由层"] SW["Intent Switch"] end subgraph DataPrep["数据准备层"] PCI["Prepare CRUD Input"] end subgraph Execution["执行层"] EW["Execute Add Metadata Workflow"] CA["CRUD Agent"] DSM2["DeepSeek Model CRUD"] SMC["Simple Memory CRUD"] end subgraph Tools["工具层"] T1["list_datameta"] T2["get_datameta"] T3["update_datameta"] T4["delete_datameta"] T5["list_labels"] end CT -->|main| IC DSM1 -->|ai_languageModel| IC SMI -->|ai_memory| IC IC -->|main| SW SW -->|"output[0]"| EW SW -->|"output[1]"| PCI SW -->|"output[2]"| PCI PCI -->|main| CA DSM2 -->|ai_languageModel| CA SMC -->|ai_memory| CA T1 -->|ai_tool| CA T2 -->|ai_tool| CA T3 -->|ai_tool| CA T4 -->|ai_tool| CA T5 -->|ai_tool| CA ``` ### 8.2 子工作流连接 ```mermaid graph LR subgraph Trigger["触发层"] EWT["Execute Workflow Trigger"] end subgraph Agent["Agent 层"] AMA["Add Metadata Agent"] DSM["DeepSeek Model"] SMS["Simple Memory Sub"] end subgraph Tools["工具层"] ST1["translate_name"] ST2["add_datameta"] ST3["list_labels"] ST4["get_datameta"] end EWT -->|main| AMA DSM -->|ai_languageModel| AMA SMS -->|ai_memory| AMA ST1 -->|ai_tool| AMA ST2 -->|ai_tool| AMA ST3 -->|ai_tool| AMA ST4 -->|ai_tool| AMA ``` --- ## 9. API 端点汇总 | 端点 | 方法 | 用途 | | -------------------------- | ---- | ------- | | `/api/meta/node/list` | POST | 查询元数据列表 | | `/api/meta/node/edit` | POST | 获取元数据详情 | | `/api/meta/node/add` | POST | 新增元数据 | | `/api/meta/node/update` | POST | 更新元数据 | | `/api/meta/node/delete` | POST | 删除元数据 | | `/api/interface/labellist` | POST | 获取标签列表 | | `/api/system/translate` | POST | 翻译中文名称 | --- ## 10. 测试验证 ### 10.1 功能测试结果 | 测试场景 | 输入示例 | 期望路由 | 测试结果 | | ----- | ----------------------- | ------------ | ---- | | 新增元数据 | "我想新增一个元数据" | → 子工作流 | ✅ 通过 | | 查询列表 | "查看所有元数据" | → CRUD Agent | ✅ 通过 | | 查看详情 | "查看ID为2158的元数据" | → CRUD Agent | ✅ 通过 | | 更新元数据 | "把ID为2158的数据类型改成bigint" | → CRUD Agent | ✅ 通过 | | 删除元数据 | "删除ID为2325的元数据" | → CRUD Agent | ✅ 通过 | | 查看标签 | "查看可用的标签列表" | → CRUD Agent | ✅ 通过 | ### 10.2 多轮对话测试 | 步骤 | 用户输入 | 系统响应 | 状态 | | --- | -------------------- | -------------- | --- | | 1 | "我想新增一个元数据,中文名叫订单状态" | 自动翻译英文名,询问数据类型 | ✅ | | 2 | "varchar" | 记录,询问是否启用 | ✅ | | 3 | "启用" | 记录,询问分类 | ✅ | | 4 | "应用类" | 记录,询问归属 | ✅ | | 5 | "跳过" | 询问描述 | ✅ | | 6 | "用于记录订单的当前状态" | 展示标签列表,询问选择 | ✅ | | 7 | "跳过" | 展示信息汇总,请求确认 | ✅ | | 8 | "确认,提交创建" | 创建成功,返回 ID | ✅ | --- ## 11. 注意事项 ### 11.1 架构设计要点 1. **意图分类与路由分离**:使用 Switch 节点进行明确的路由控制,而非依赖 AI Agent 自行选择工具 2. **子工作流独立性**:新增元数据流程封装在独立的子工作流中,便于维护和扩展 3. **会话状态管理**:通过 `session_id` 在主工作流和子工作流之间传递会话标识,保持多轮对话的连续性 ### 11.2 配置注意事项 1. **子工作流必须激活**:被 Execute Workflow 调用的子工作流需要处于激活状态 2. **callerPolicy 设置**:子工作流的 `callerPolicy` 需设置为 `"any"` 以允许外部调用 3. **Memory Session Key**:子工作流的 Simple Memory 必须使用 `customKey` 类型,并绑定传入的 `session_id` ### 11.3 扩展建议 1. 可以添加更多的意图分类类型,如"批量操作"、"数据导出"等 2. 可以为其他复杂操作创建独立的子工作流 3. 可以添加用户权限验证节点 --- ## 12. 版本信息 | 项目 | 版本 | | -------- | ------------------------------------------ | | 文档版本 | 1.1 | | 创建日期 | 2026-02-05 | | 最后更新 | 2026-02-05 | | 主工作流版本 | 159+ | | 子工作流版本 | 18 | | n8n 节点版本 | Agent 1.7, Switch 3.4, Memory 1.3, Set 3.4 | ### 12.1 更新日志 **v1.1 (2026-02-05)** - 新增 `Prepare CRUD Input` 节点,解决 CRUD Agent 接收到 Intent Classifier 输出而非用户原始输入的问题 - 修改 Simple Memory 的 sessionKey 配置,添加 `intent-` 和 `crud-` 前缀以隔离不同 Agent 的对话记忆 - 更新架构图和连接图以反映新的节点结构 **v1.0 (2026-02-05)** - 初始版本发布