

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Bedrock 流工作原理
<a name="flows-how-it-works"></a>

Amazon Bedrock 流可让您通过连接节点来构建生成式人工智能工作流，每个节点都对应调用 Amazon Bedrock 或相关资源的流中的一个步骤。要定义节点的输入和输出，您可以使用表达式来指定如何解释输入。要更好地了解这些概念，请查看以下主题：

**Topics**
+ [Amazon Bedrock 流的关键定义](key-definitions-flow.md)
+ [在 Amazon Bedrock 流中提取整个输入的相关部分，使用表达式定义输入](flows-expressions.md)
+ [流的节点类型](flows-nodes.md)

# Amazon Bedrock 流的关键定义
<a name="key-definitions-flow"></a>

以下列表向您介绍了 Amazon Bedrock 流的基本概念。
+ **流**：流是由名称、描述、权限、节点集合和节点之间的连接组成的结构。调用流时，调用中的输入将通过流的每个节点发送，直到到达输出节点。调用的响应返回最终输出。
+ **节点**：节点是流中的一个步骤。对于每个节点，您可以配置其名称、描述、输入、输出以及任何其他配置。节点的配置因其类型而异。要详细了解不同的节点类型，请参阅 [流的节点类型](flows-nodes.md)。
+ **连接**：Amazon Bedrock 流中使用了两种类型的连接：
  + **数据连接**是在一个节点（*源节点*）的输出和另一个节点（*目标节点*）的输入之间建立的，可以将数据从上游节点发送到下游节点。在 Amazon Bedrock 控制台中，数据连接是灰色的实线。
  + **条件连接**是在条件节点中的条件和下游节点之间建立的，如果满足条件，则将条件节点之前的节点的数据发送到下游节点。在 Amazon Bedrock 控制台中，条件连接是紫色虚线。
+ **表达式**：表达式定义如何从进入节点的整个输入中提取输入。若要了解如何编写表达式，请参阅[在 Amazon Bedrock 流中提取整个输入的相关部分，使用表达式定义输入使用表达式定义输入](flows-expressions.md)。
+ **流生成器**：流生成器是 Amazon Bedrock 控制台上的一款工具，用于通过可视化界面构建和编辑流。您可以使用可视化界面将节点拖放到界面上，并为这些节点配置输入和输出以定义流。
+ 在后面的章节中，我们将用到以下术语：
  + **整个输入**：从前一个节点发送到当前节点的整个输入。
  + **上游**：指在流中较早出现的节点。
  + **下游**：指在流中稍后出现的节点。
  + **输入**：一个节点可以有多个输入。您可以使用表达式提取整个输入的相关部分，以用于每个单独的输入。在 Amazon Bedrock 控制台工作流生成器中，输入以圆圈的形式出现在节点的左边缘。将每个输入连接到上游节点的输出。
  + **输出**：一个节点可以有多个输出。在 Amazon Bedrock 控制台工作流生成器中，输出以圆圈的形式显示在节点的右边缘。将每个输出连接到下游节点中的至少一个输入。
  + **分支**：如果将一个节点的输出发送到多个节点，或者如果包含一个条件节点，则工作流的路径将分成多个分支。每个分支都可能在工作流调用响应中产生另一个输出。

# 在 Amazon Bedrock 流中提取整个输入的相关部分，使用表达式定义输入
<a name="flows-expressions"></a>

为节点配置输入时，您必须根据要进入该节点的整个输入来定义输入。整个输入可以是字符串、数字、布尔值、数组或对象。要定义与整个输入相关的输入，您需要使用基于 [JsonPath](https://github.com/json-path/JsonPath) 的支持表达式子集。每个表达式都必须以 `$.data` 开头，它指的是整个输入。使用表达式时请注意以下几点：
+ 如果整个输入是字符串、数字或布尔值，则唯一可以用来定义单个输入的表达式是 `$.data`。
+ 如果整个输入是一个数组或对象，则可以通过提取部分内容来定义单个输入。

我们来举例说明如何使用表达式，假设整个输入是下面的 JSON 对象：

```
{
    "animals": {
        "mammals": ["cat", "dog"],
        "reptiles": ["snake", "turtle", "iguana"]
    },
    "organisms": {
        "mammals": ["rabbit", "horse", "mouse"],
        "flowers": ["lily", "daisy"]
    },
    "numbers": [1, 2, 3, 5, 8]
}
```

您可以使用以下表达式提取部分输入（示例引用的是将从前面的 JSON 对象返回的内容）：


****  

| Expression | 意义 | 示例 | 示例结果 | 
| --- | --- | --- | --- | 
| \$1.data | 整个输入。 | \$1.data | 整个对象 | 
| .name | JSON 对象中名为 name 的字段的值。 | \$1.data.numbers | [1, 2, 3, 5, 8] | 
| [int] | 数组中由 int 指定的索引中的成员。 | \$1.data.animals.reptiles[2] | iguana | 
| [int1, int2, ...] | 数组中由每个 int 指定的索引中的成员。 | \$1.data.numbers[0, 3] | [1, 5] | 
| [int1:int2] | 一个数组，由数组中 int1（含）和 int2（不含）之间的索引中的项目组成。省略 int1 或 int2 等同于标记数组的开头或结尾。 | \$1.data.organisms.mammals[1:] | ["horse", "mouse"] | 
| \$1 | 可以用来代替 name 或 int 的通配符。如果有多个结果，则以数组形式返回。 | \$1.data.\$1.mammals | [["cat", "dog"], ["rabbit", "horse", "mouse"]] | 

# 流的节点类型
<a name="flows-nodes"></a>

Amazon Bedrock 提供了以下节点类型用于构建流。配置节点时，您需要提供以下字段：
+ 名称 – 输入节点的名称。
+ 类型 – 在控制台中，您可以拖放要使用的节点类型。在 API 中，使用`type`字段和`configuration`字段[FlowNodeConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNodeConfiguration.html)中的相应字段。
+ 输入 – 为每个输入提供以下信息：
  + Name – 输入的名称。有些节点有预定义名称或类型，您必须使用这些名称和类型。要了解哪些节点有预定义名称，请参阅[逻辑节点类型](#flows-nodes-logic-table)。
  + 表达式 – 定义整个输入中用作单个输入的部分。有关更多信息，请参阅 [在 Amazon Bedrock 流中提取整个输入的相关部分，使用表达式定义输入使用表达式定义输入](flows-expressions.md)。
  + 类型 – 输入的数据类型。在运行时到达此节点时，Amazon Bedrock 会将表达式应用到整个输入，并验证结果是否与数据类型相匹配。
+ 输出 – 为每个输出提供以下信息：
  + 名称 – 输出的名称。有些节点有预定义名称或类型，您必须使用这些名称和类型。要了解哪些节点有预定义名称，请参阅[逻辑节点类型](#flows-nodes-logic-table)。
  + 类型 – 输出的数据类型。在运行时到达此节点时，Amazon Bedrock 会验证节点输出是否与数据类型相匹配。
+ 配置 – 在控制台中，您可以在节点顶部定义特定于节点的字段。在 API 中，使用相应的[FlowNodeConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNodeConfiguration.html)并填写其字段。

下文介绍了每种节点类型，并提供了它们在 API 中的结构。展开一个部分可了解有关该节点类型的更多信息。

## 用于控制流逻辑的节点
<a name="flows-nodes-logic"></a>

使用以下节点类型来控制流的逻辑。

### 工作流输入节点
<a name="flows-nodes-input"></a>

每个流仅包含一个流输入节点，并且必须以该节点开头。工作流输入节点从 `InvokeFlow` 请求中获取 `content`，验证数据类型，然后将其发送到下面的节点。

以下显示了 API 中输入[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Input",
    "outputs": [
        {
            "name": "document",
            "type": "String | Number | Boolean | Object | Array",
        }
    ],
    "configuration": {
        "input": CONTEXT-DEPENDENT
    }
}
```

### 工作流输出节点
<a name="flows-nodes-output"></a>

工作流输出节点根据定义的表达式从前一个节点提取输入数据，然后将其返回。在控制台中，输出是在测试窗口中选择**运行**后返回的响应。在 API 中，输出将在 `InvokeFlow` 响应中 `flowOutputEvent` 的 `content` 字段中返回。一个流可以有多个流输出节点。

如果一个工作流中有多个分支，则该工作流可以有多个工作流输出节点。

下面显示了输出[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Output",
    "inputs": [
        {
            "name": "document",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        }
    ],
    "configuration": {
        "output": CONTEXT-DEPENDENT
    }
}
```

### “条件” 节点
<a name="flows-nodes-condition"></a>

条件节点会根据定义的条件将前一个节点的数据发送到其他节点。一个条件节点可以接受多个输入。

有关示例，请参阅[创建具有条件节点的工作流](flows-ex-condition.md)。

**定义条件节点**

1. 根据需要添加任意数量的输入，以评估您计划添加的条件。

1. 为每个输入输入名称，指定预期的类型，然后编写一个表达式以从整个输入中提取相关部分。

1. 将每个输入连接到上游节点的相关输出。

1. 根据需要添加多个条件。

1. 对于每个条件：

   1. 为连接输入名称。

   1. 使用关系运算符和逻辑运算符定义条件，以将输入与其他输入或常量进行比较。
**注意**  
条件是按顺序进行评估的。如果满足多个条件，则排在前面的条件优先。

   1. 将每个条件连接到您想要发送数据的下游节点（如果满足该条件）。

#### 条件表达式
<a name="flows-nodes-condition-expr"></a>

要定义一个条件，您可以按输入的名称来引用输入，然后使用以下任意关系运算符将其与值进行比较：


****  

| 运算符 | 含义 | 支持的数据类型 | 示例用法 | 示例含义 | 
| --- | --- | --- | --- | --- | 
| == | 等于（数据类型也必须等于） | 字符串、数字、布尔值 | A == B | 如果 A 等于 B | 
| \$1= | 不等于 | 字符串、数字、布尔值 | A \$1= B | 如果 A 不等于 B | 
| > | Greater than | 数字 | A > B | 如果 A 大于 B | 
| >= | 大于或等于 | 数字 | A >= B | 如果 A 大于或等于 B | 
| < | Less than | 数字 | A < B | 如果 A 小于 B | 
| <= | 小于或等于 | 数字 | A <= B | 如果 A 小于或等于 B | 

在条件表达式中，您可以将输入与其他输入或常量进行比较。例如，如果您有一个名为 `profit` 的数字输入和另一个名为 `expenses` 的数字输入，那么 **profit > expenses** 或 **profit <= 1000** 都是有效的表达式。

对于更复杂的条件，您可以使用以下逻辑运算符来组合表达式。我们建议您使用括号来解决表达式分组中的歧义：


****  

| 运算符 | 含义 | 示例用法 | 示例含义 | 
| --- | --- | --- | --- | 
| and | 两个表达式都有效 | (A < B) and (C == 1) | 如果两个表达式都有效：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/flows-nodes.html) | 
| 或者 | 至少有一个表达式有效 | (A \$1= 2) or (B > C) | 如果任一表达式有效：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/flows-nodes.html) | 
| not | 表达式无效 | not (A > B) | 如果 A 不大于 B（相当于 A <= B） | 

在 API 中，您在发送[CreateFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateFlow.html)或[UpdateFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_UpdateFlow.html)请求时在`definition`字段中定义以下内容：

1. `nodes`数组中的一个条件[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象。一般格式如下（请注意，条件节点没有 `outputs`）：

   ```
   {
       "name": "string",
       "type": "Condition",
       "inputs": [
           {
               "name": "string",
               "type": "String | Number | Boolean | Object | Array",
               "expression": "string"
           }
       ],
       "configuration": {
           "condition": {
               "conditions": [
                   {
                       "name": "string",
                       "expression": "string"
                   },
                   ...
               ]
           }
       }
   }
   ```

1. 对于条件节点的每个输入，`connections`数组中的一个[FlowConnection](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowConnection.html)对象。在[FlowDataConnectionConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowDataConnectionConfiguration.html)对象的`configuration`字段中包含一个`FlowConnection`对象。`FlowConnection` 对象的一般格式如下：

   ```
   {
       "name": "string",
       "source": "string",
       "target": "string",
       "type": "Data",
       "configuration": {
           "data": {
               "sourceOutput": "string",
               "expression": "string"
           }
       }
   }
   ```

1. 对于条件节点中的每个条件（包括默认条件），`connections`数组中都有一个[FlowConnection](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowConnection.html)对象。在[FlowConditionalConnectionConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowConditionalConnectionConfiguration.html)对象的`configuration`字段中包含一个`FlowConnection`对象。该[FlowConnection](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowConnection.html)对象的一般格式如下：

   ```
   {
       "name": "string",
       "source": "string",
       "target": "string",
       "type": "Conditional",
       "configuration": {
           "conditional": {
               "condition": "string"
           }
       }
   }
   ```

   使用关系运算符和逻辑运算符定义连接此条件 `source` 节点和下游 `target` 节点的 `condition`。对于默认条件，请将该条件指定为 **default**。

### 迭代器节点
<a name="flows-nodes-iterator"></a>

迭代器节点接收一个数组，并以迭代方式将其项目作为输出返回到下游节点。迭代器节点的输入是逐个处理的，而不是并行处理。流输出节点以不同的响应方式返回每个输入的最终结果。您还可以使用迭代器节点下游的收集器节点来收集迭代后的响应，并将其作为数组返回，此外还可以设置数组的大小。

下面显示了迭代器[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Iterator",
    "inputs": [
        {
            "name": "array",
            "type": "Array",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "arrayItem",
            "type": "String | Number | Boolean | Object | Array",
        },
        {
            "name": "arraySize",
            "type": "Number"
        }
    ],
    "configuration": {
        "iterator": CONTEXT-DEPENDENT
    }
}
```

### 收集器节点
<a name="flows-nodes-collector"></a>

收集器节点除了接收迭代后的输入外，还可以设置数组的大小，然后将其作为数组返回。通过某些节点发送迭代后的项目后，您可以在迭代器节点的下游使用收集器节点将这些项目收集起来。

下面显示了收集器[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Collector",
    "inputs": [
        {
            "name": "arrayItem",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        {
            "name": "arraySize",
            "type": "Number"
        }
    ],
    "outputs": [
        {
            "name": "collectedArray",
            "type": "Array"
        },
    ],
    "configuration": {
        "collector": CONTEXT-DEPENDENT
    }
}
```

### DoWhile 循环节点
<a name="flows-nodes-dowhile"></a>

当指定的条件保持为真时， DoWhile 循环节点会重复执行一系列节点。在评测条件之前，该循环至少会执行一次，因此它非常适合需要执行某操作然后根据结果检查是否应该重复该操作的情况。

 DoWhile 循环节点获取输入数据并将其传递到循环主体。每次迭代后，系统都会评测条件以确定是继续循环还是退出。只要条件的评测结果为 true，或者未超出 `maxIterations`，循环就会继续。

下面显示了 DoWhile 循环[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "DoWhile",
    "inputs": [
        {
            "name": "loopInput",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "loopOutput",
            "type": "String | Number | Boolean | Object | Array"
        },
        {
            "name": "iterationCount",
            "type": "Number"
        }
    ],
    "configuration": {
        "doWhile": {
            "condition": "string",
            "maxIterations": "number"
        }
    }
}
```

在配置中：
+ `condition` – 决定是否继续循环的布尔表达式。使用与条件节点相同的关系和逻辑运算符。每次迭代后都会对条件进行评测。
+ `maxIterations` – 最大迭代次数。默认值为 10。您必须指定正数。此参数可帮助您避免无限循环。

**注意**  
`maxIterations` 参数的默认值为 10，并且只接受正数。当条件变为 false 或达到最大迭代次数时，循环就会退出。

## 用于处理流中数据的节点
<a name="flows-nodes-data"></a>

使用以下节点类型来处理流中的数据：

### 提示节点
<a name="flows-nodes-prompt"></a>

提示节点定义了要在工作流中使用的提示。您可以使用提示管理器中的提示，也可以在节点中定义一个内联提示。有关更多信息，请参阅 [在 Amazon Bedrock 中使用提示管理器构建和存储可重复使用的提示](prompt-management.md)。

有关示例，请参阅[试用示例流](flows-ex.md)。

提示节点的输入是用于填充变量的值。输出则是模型生成的响应。

下面显示了提示[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "prompt",
    "inputs": [
        {
            "name": "content",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        ...
    ],
    "outputs": [
        {
            "name": "modelCompletion",
            "type": "String"
        }
    ],
    "configuration": {
        "prompt": {
            "sourceConfiguration": [PromptFlowNodeSourceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_PromptFlowNodeSourceConfiguration.html) object (see below),
            "guardrailConfiguration": {
                "guardrailIdentifier": "string",
                "guardrailVersion": "string"
            }
        }
    }
}
```

该[PromptFlowNodeSourceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_PromptFlowNodeSourceConfiguration.html)对象取决于你是使用 Prompt 管理中的提示还是内联定义它：
+ 如果您使用的是提示管理器中的提示，对象的一般结构应类似以下内容：

  ```
  {
      "resource": {
          "promptArn": "string"
      }
  }
  ```
+ 如果您使用的是内联定义提示，请遵循[使用提示管理器创建提示](prompt-management-create.md)的 API 选项卡（但请注意，该对象中没有 `name` 字段）中有关定义变体的指导。您使用的对象的一般结构应类似以下内容：

  ```
  {
      "inline": {
          "modelId": "string",
          "templateType": "TEXT",
          "templateConfiguration": {
              "text": {
                  "text": "string",
                  "inputVariables": [
                      {
                          "name": "string"
                      },
                      ...
                  ]
              }
          },
          "inferenceConfiguration": {
              "text": {
                  "maxTokens": int,
                  "stopSequences": ["string", ...],
                  "temperature": float,
                  "topP": float
              }
          },
          "additionalModelRequestFields": {
              "key": "value",
              ...
          }
      }
  }
  ```

要将来自 Amazon Bedrock 护栏的一个护栏应用于您的提示或从提示生成的响应，请添加 `guardrailConfiguration` 字段，然后在 `guardrailIdentifier` 字段中指定该护栏的 ID 或 ARN 并在 `guardrailVersion` 字段中指定该护栏的版本。

### 代理节点
<a name="flows-nodes-agent"></a>

代理节点允许您向代理发送提示，代理在 FMs 和关联的资源之间进行协调，以识别最终用户并为其执行操作。有关更多信息，请参阅 [使用人工智能代理在应用程序中自动执行任务](agents.md)。

在配置中，指定要使用的代理别名的 Amazon 资源名称（ARN）。节点的输入是代理的提示以及任何相关的[提示或会话属性](agents-session-state.md)。节点将代理的响应作为输出返回。

代理节点可以支持多轮调用，从而在流执行期间实现了用户和代理之间的交互式对话。当代理节点需要更多信息或澄清时，它可以暂停流执行并向用户请求特定输入。用户提供请求的信息后，代理节点将使用新输入继续处理。这个过程会一直持续到代理节点获得完成其执行所需的一切信息。

下图显示了代理[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Agent",
    "inputs": [
       {
            "name": "agentInputText"
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        {
            "name": "promptAttributes"
            "type": "Object",
            "expression": "string"
        },
        {
            "name": "sessionAttributes"
            "type": "Object",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "agentResponse",
            "type": "String"
        }
    ],
    "configuration": {
        "agent": {
            "agentAliasArn": "string"
        }
    }
}
```

### 知识库节点
<a name="flows-nodes-kb"></a>

知识库节点让您可以从 Amazon Bedrock 知识库向知识库发送查询。有关更多信息，请参阅 [利用 Amazon Bedrock 知识库检索数据并生成人工智能响应](knowledge-base.md)。

在配置中，至少要提供 `knowledgeBaseId`。您可以根据使用案例选择性地添加以下字段：
+ `modelId` – 如果要根据检索到的结果生成响应，请添加要使用的[模型 ID](models-supported.md)。要以数组形式返回检索结果，请省略模型 ID。
+ `guardrailConfiguration` – 在 `guardrailIdentifier` 字段中添加在 Amazon Bedrock 护栏中定义的护栏的 ID 或 ARN，在 `guardrailVersion` 字段中添加护栏的版本。
**注意**  
只有在知识库节点中使用 `RetrieveAndGenerate` 时才能应用护栏。

节点的输入是对知识库的查询。输出要么是模型响应（字符串形式），要么是检索到的结果的数组。

下图显示了知识库[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "KnowledgeBase",
    "inputs": [
       {
            "name": "retrievalQuery",
            "type": "String",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "retrievalResults" | "outputText",
            "type": "Array | String"
        }
    ],
    "configuration": {
        "knowledgeBase": {
            "knowledgeBaseId": "string",
            "modelId": "string",
            "guardrailConfiguration": {
                "guardrailIdentifier": "string",
                "guardrailVersion": "string"
            }
        }
    }
}
```

### S3 存储节点
<a name="flows-nodes-storage"></a>

S3 存储节点可让您将流中的数据存储到 Amazon S3 存储桶。在配置中，您可以指定用于数据存储的 S3 存储桶。节点的输入是要存储的内容和[对象键](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html)。节点的输出是其返回的 S3 位置的 URI。

以下显示了 S3 存储[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Storage",
    "inputs": [
        {
            "name": "content",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        {
            "name": "objectKey",
            "type": "String",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "s3Uri",
            "type": "String"
        }
    ],
    "configuration": {
        "retrieval": {
            "serviceConfiguration": {
                "s3": {
                    "bucketName": "string"
                }
            }
        }
    }
}
```

### S3 检索节点
<a name="flows-nodes-retrieval"></a>

S3 检索节点让您可以从 Amazon S3 位置检索数据，并将其引入工作流。在配置中，您可以指定要从中检索数据的 S3 存储桶。节点的输入是[对象键](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html)。节点的输出是其返回的 S3 位置的内容。

**注意**  
目前，S3 位置中的数据必须是 UTF-8 编码字符串。

下面显示了 S3 检索[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Retrieval",
    "inputs": [
        {
            "name": "objectKey",
            "type": "String",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "s3Content",
            "type": "String"
        }
    ],
    "configuration": {
        "retrieval": {
            "serviceConfiguration": {
                "s3": {
                    "bucketName": "string"
                }
            }
        }
    }
}
```

### Lambda 函数节点
<a name="flows-nodes-lambda"></a>

通过 Lambda 函数节点，您可以调用一个 Lambda 函数，在其中定义代码来执行业务逻辑。您在流中添加 Lambda 节点时，Amazon Bedrock 会向您指定的 Lambda 函数发送输入事件。

对于配置，请指定 Lambda 函数的 Amazon 资源名称（ARN）。定义要在 Lambda 输入事件中发送的输入。您可以根据这些输入编写代码并定义函数返回的内容。函数响应将在输出中返回。

下面显示了 Lambda 函数[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "LambdaFunction",
    "inputs": [
       {
            "name": "codeHookInput",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        ...
    ],
    "outputs": [
        {
            "name": "functionResponse",
            "type": "String | Number | Boolean | Object | Array"
        }
    ],
    "configuration": {
        "lambdaFunction": {
            "lambdaArn": "string"
        }
    }
}
```

#### 流的 Lambda 输入事件
<a name="flows-nodes-lambda-input"></a>

发送到 Lambda 节点中 Lambda 函数的输入事件采用以下格式：

```
{
   "messageVersion": "1.0",
   "flow": {
        "flowArn": "string",
        "flowAliasArn": "string"
   },
   "node": {
        "name": "string",
        "inputs": [
            {
               "name": "string",
               "type": "String | Number | Boolean | Object | Array",
               "expression": "string",
               "value": ...
            },
            ...
        ]
   }
}
```

每个输入的字段都与您在定义 Lambda 节点时指定的字段相匹配，而 `value` 字段的值则由通过表达式解析后的节点的整个输入填充。例如，如果节点的整个输入为 `[1, 2, 3]`，表达式为 `$.data[1]`，那么在输入事件中发送到 Lambda 函数的值将是 `2`。

有关更多信息，请参阅《AWS Lambda 开发人员指南》[https://docs.aws.amazon.com/lambda/latest/dg/](https://docs.aws.amazon.com/lambda/latest/dg/)中的[配置 Lambda 概念](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event)。

#### 流的 Lambda 响应
<a name="flows-nodes-lambda-response"></a>

编写 Lambda 函数时，您需要定义该函数返回的响应。此响应将作为 Lambda 节点的输出返回到您的流。

### 内联代码节点
<a name="flows-nodes-inline-code"></a>

内联代码节点可让您直接在流中编写和执行代码，无需使用外部 Lambda 函数即可实现数据转换、自定义逻辑和集成。当您在流程中包含内联代码节点时，Amazon Bedrock 会在隔离的 AWS 托管环境中执行您的代码，该环境不与任何人共享，也无法访问互联网。

**注意**  
内联代码节点在 Amazon Bedrock 中为预览版，可能会有变化。

在节点配置中，指定要执行的代码以及编程语言（目前，`Python_3` 是唯一的选择）。将您的代码可以访问的输入定义为变量。代码中最后执行的行的结果将作为节点输出返回。

以下示例显示了内联代码[FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "InlineCode",
    "inputs": [{
            "name": "string",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        ...
    ],
    "outputs": [{
        "name": "response",
        "type": "String | Number | Boolean | Object | Array"
    }],
    "configuration": {
        "inlineCode": {
            "code": "string",
            "language": "Python_3"
        }
    }
}
```

#### 使用内联代码节点时的考虑因素
<a name="flows-nodes-inline-code-usage"></a>

在流中使用内联代码节点时，请考虑以下因素：

**重要**  
我们建议您在将代码添加到内联代码节点之前对其进行测试。
+ 内联代码节点在[异步流执行](flows-create-async.md)中不受支持。
+ 目前，内联代码节点支持的唯一编程语言是 Python 3.12 (`Python_3)`。
+ 内联代码的作用类似于交互式 Python 会话。仅捕获最后执行的行的结果，并将其作为节点输出返回。
+ 不捕获 Python 控制台输出（如来自 `print` 函数的输出）。
+ 内联代码节点的输入在代码中以 Python 变量形式提供。使用节点输入的确切名称来引用它们。
+ 正确地配置输入和输出类型以避免运行时错误。最多可以配置五个节点输入。
+ 每个流最多可以有五个内联代码节点。
+ 每个 AWS 账户最多可以有 25 个正在运行的内联代码节点。
+ 代码不能超过 5 MB。

#### 内联代码节点输入
<a name="flows-nodes-inline-code-input"></a>

内联代码节点的输入在代码中以 Python 变量形式提供。例如，如果您定义了一个名为 `userData` 的输入，则可以直接在代码中以 `userData` 的形式访问它。

每个输入的值将根据您定义的表达式进行填充。例如，如果节点的输入为 `{"name": "John", "age": 30}`，表达式为 `$.name`，则输入变量的值为 `"John"`。

#### 内联代码节点输出
<a name="flows-nodes-inline-code-output"></a>

代码中最后执行的行的结果将作为内联代码节点的输出返回。此输出可供流中的后续节点使用。

例如，以下代码将返回字典作为节点输出：

```
# Process input data
result = {"processed": True, "data": userData}

# The last line's result is returned as the node output
result
```

### Lex 节点
<a name="flows-nodes-lex"></a>

**注意**  
Lex 节点依赖于 Amazon Lex 服务，该服务可能会存储和使用客户内容来开发和持续改进其他 AWS 服务。作为 AWS 客户，您可以选择不存储您的内容或将其用于服务改进。要了解如何为 Amazon Lex 实施选择退出策略，请参阅 [AI services opt-out policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html)。

通过 Lex 节点，您可以调用 Amazon Lex 机器人来使用自然语言处理功能处理语句，并根据机器人定义识别意图。有关更多信息，请参阅 [Amazon Lex 开发人员指南](https://docs.aws.amazon.com/lex/latest/dg/)。

在配置中，指定要使用的机器人别名的 Amazon 资源名称（ARN）和要使用的区域设置。节点的输入是语句以及任何随附的[请求属性](https://docs.aws.amazon.com/lexv2/latest/dg/context-mgmt-request-attribs.html)或[会话属性](https://docs.aws.amazon.com/lexv2/latest/dg/context-mgmt-request-attribs.html)。节点的输出是已识别的意图。

**注意**  
目前，Lex 节点不支持多轮对话。一个 Lex 节点只能处理一个语句。

以下显示了 Lex [FlowNode](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_FlowNode.html)对象的一般结构：

```
{
    "name": "string",
    "type": "Lex",
    "inputs": [
       {
            "name": "inputText",
            "type": "String | Number | Boolean | Object | Array",
            "expression": "string"
        },
        {
            "name": "requestAttributes",
            "type": "Object",
            "expression": "string"
        },
        {
            "name": "sessionAttributes",
            "type": "Object",
            "expression": "string"
        }
    ],
    "outputs": [
        {
            "name": "predictedIntent",
            "type": "String"
        }
    ],
    "configuration": {
        "lex": {
            "botAliasArn": "string",
            "localeId": "string"
        }
    }
}
```

## 节点类型汇总表
<a name="flows-nodes-summary-table"></a>

以下各表总结了每种节点类型允许的输入和输出。注意以下几点：
+ 如果名称标记为**任何**，您可以提供任何字符串作为名称，否则必须使用表中指定的值。
+ 如果类型标记为**任何**，您可以指定以下任何数据类型：字符串、数字、布尔值、对象、数组，否则必须使用表中指定的类型。
+ 您可以为**条件**、**提示**、**Lambda 函数**和**内联代码**节点定义多个输入。


**逻辑节点类型**  
<a name="flows-nodes-logic-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/flows-nodes.html)


**数据处理节点类型**  
<a name="flows-nodes-data-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/flows-nodes.html)