本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
流的节点类型
Amazon Bedrock Flows 提供以下节点类型来构建您的流程。配置节点时,需要提供以下字段:
-
名称 – 输入节点的名称。
-
类型 – 在控制台中,您可以拖放要使用的节点类型。在 API 中,使用
type字段和configuration字段FlowNodeConfiguration中的相应字段。 -
输入 – 为每个输入提供以下信息:
-
Name – 输入的名称。有些节点有预定义名称或类型,您必须使用这些名称和类型。要了解哪些节点有预定义名称,请参阅逻辑节点类型。
-
表达式 – 定义整个输入中用作单个输入的部分。有关更多信息,请参阅 在 Amazon Bedrock Flows 中提取整个输入的相关部分,使用表达式来定义输入。
-
类型 – 输入的数据类型。在运行时到达此节点时,Amazon Bedrock 会将表达式应用到整个输入,并验证结果是否与数据类型相匹配。
-
-
输出 – 为每个输出提供以下信息:
-
名称 – 输出的名称。有些节点有预定义名称或类型,您必须使用这些名称和类型。要了解哪些节点有预定义名称,请参阅逻辑节点类型。
-
类型 – 输出的数据类型。在运行时到达此节点时,Amazon Bedrock 会验证节点输出是否与数据类型相匹配。
-
-
配置 – 在控制台中,您可以在节点顶部定义特定于节点的字段。在 API 中,使用相应的FlowNodeConfiguration并填写其字段。
下文介绍了每种节点类型,并提供了它们在 API 中的结构。展开一个部分可了解有关该节点类型的更多信息。
用于控制流程逻辑的节点
使用以下节点类型来控制流程的逻辑。
每个流程仅包含一个流程输入节点,并且必须以该节点开头。工作流输入节点从 InvokeFlow 请求中获取 content,验证数据类型,然后将其发送到下面的节点。
以下显示了 API 中输入FlowNode对象的一般结构:
{ "name": "string", "type": "Input", "outputs": [ { "name": "document", "type": "String | Number | Boolean | Object | Array", } ], "configuration": { "input": CONTEXT-DEPENDENT } }
工作流输出节点根据定义的表达式从前一个节点提取输入数据,然后将其返回。在控制台中,输出是在测试窗口中选择运行后返回的响应。在 API 中,输出将在 InvokeFlow 响应中 flowOutputEvent 的 content 字段中返回。一个流程可以有多个流量输出节点。
如果一个工作流中有多个分支,则该工作流可以有多个工作流输出节点。
下面显示了输出FlowNode对象的一般结构:
{ "name": "string", "type": "Output", "inputs": [ { "name": "document", "type": "String | Number | Boolean | Object | Array", "expression": "string" } ], "configuration": { "output": CONTEXT-DEPENDENT } }
条件节点会根据定义的条件将前一个节点的数据发送到其他节点。一个条件节点可以接受多个输入。
有关示例,请参阅创建具有条件节点的工作流。
定义条件节点
-
根据需要添加任意数量的输入,以评估您计划添加的条件。
-
为每个输入输入名称,指定预期的类型,然后编写一个表达式以从整个输入中提取相关部分。
-
将每个输入连接到上游节点的相关输出。
-
根据需要添加多个条件。
-
对于每个条件:
-
为连接输入名称。
-
使用关系运算符和逻辑运算符定义条件,以将输入与其他输入或常量进行比较。
注意
条件是按顺序进行评估的。如果满足多个条件,则排在前面的条件优先。
-
将每个条件连接到您想要发送数据的下游节点(如果满足该条件)。
-
条件表达式
要定义一个条件,您可以按输入的名称来引用输入,然后使用以下任意关系运算符将其与值进行比较:
| 运算符 | 含义 | 支持的数据类型 | 示例用法 | 示例含义 |
|---|---|---|---|---|
| == | 等于(数据类型也必须等于) | 字符串、数字、布尔值 | A == B | 如果 A 等于 B |
| != | 不等于 | 字符串、数字、布尔值 | A != 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 都是有效的表达式。
对于更复杂的条件,您可以使用以下逻辑运算符来组合表达式。我们建议您使用括号来解决表达式分组中的歧义:
| 运算符 | 含义 | 示例用法 | 示例含义 |
|---|---|---|---|
| 以及 | 两个表达式都有效 | (A < B) and (C == 1) | 如果两个表达式都有效:
|
| 或 | 至少有一个表达式有效 | (A != 2) or (B > C) | 如果任一表达式有效:
|
| not | 表达式无效 | not (A > B) | 如果 A 不大于 B(相当于 A <= B) |
在 API 中,您在发送CreateFlow或UpdateFlow请求时在definition字段中定义以下内容:
-
nodes数组中的一个条件FlowNode对象。一般格式如下(请注意,条件节点没有outputs):{ "name": "string", "type": "Condition", "inputs": [ { "name": "string", "type": "String | Number | Boolean | Object | Array", "expression": "string" } ], "configuration": { "condition": { "conditions": [ { "name": "string", "expression": "string" }, ... ] } } } -
对于条件节点的每个输入,
connections数组中的一个FlowConnection对象。在FlowDataConnectionConfiguration对象的configuration字段中包含一个FlowConnection对象。FlowConnection对象的一般格式如下:{ "name": "string", "source": "string", "target": "string", "type": "Data", "configuration": { "data": { "sourceOutput": "string", "expression": "string" } } } -
对于条件节点中的每个条件(包括默认条件),
connections数组中都有一个FlowConnection对象。在FlowConditionalConnectionConfiguration对象的configuration字段中包含一个FlowConnection对象。该FlowConnection对象的一般格式如下:{ "name": "string", "source": "string", "target": "string", "type": "Conditional", "configuration": { "conditional": { "condition": "string" } } }使用关系运算符和逻辑运算符定义连接此条件
source节点和下游target节点的condition。对于默认条件,请将该条件指定为default。
迭代器节点接收一个数组,并以迭代方式将其项目作为输出返回到下游节点。迭代器节点的输入是逐个处理的,而不是并行处理。流输出节点以不同的响应方式返回每个输入的最终结果。您还可以使用迭代器节点下游的收集器节点来收集迭代后的响应,并将其作为数组返回,此外还可以设置数组的大小。
下面显示了迭代器FlowNode对象的一般结构:
{ "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 } }
收集器节点除了接收迭代后的输入外,还可以设置数组的大小,然后将其作为数组返回。通过某些节点发送迭代后的项目后,您可以在迭代器节点的下游使用收集器节点将这些项目收集起来。
下面显示了收集器FlowNode对象的一般结构:
{ "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 循环节点会重复执行一系列节点。在评估条件之前,该循环至少执行一次,因此非常适合需要执行操作然后根据结果检查是否应该重复操作的场景。
DoWhile 循环节点获取输入数据并将其传递到循环主体。每次迭代后,都会评估条件以确定是继续循环还是退出。只要条件的计算结果为 true,或者未超过,循环就会继续。maxIterations
下面显示了 DoWhile 循环FlowNode对象的一般结构:
{ "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 或达到最大迭代次数时,循环就会退出。
用于处理流程中数据的节点
使用以下节点类型来处理流程中的数据:
提示节点定义了要在工作流中使用的提示。您可以使用提示管理器中的提示,也可以在节点中定义一个内联提示。有关更多信息,请参阅 在 Amazon Bedrock 中使用提示管理器构建和存储可重复使用的提示。
有关示例,请参阅尝试示例流程。
提示节点的输入是用于填充变量的值。输出则是模型生成的响应。
下面显示了提示FlowNode对象的一般结构:
{ "name": "string", "type": "prompt", "inputs": [ { "name": "content", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, ... ], "outputs": [ { "name": "modelCompletion", "type": "String" } ], "configuration": { "prompt": { "sourceConfiguration": PromptFlowNodeSourceConfiguration object (see below), "guardrailConfiguration": { "guardrailIdentifier": "string", "guardrailVersion": "string" } } } }
该PromptFlowNodeSourceConfiguration对象取决于你是使用 Prompt 管理中的提示还是内联定义它:
-
如果您使用的是提示管理器中的提示,对象的一般结构应类似以下内容:
{ "resource": { "promptArn": "string" } } -
如果您使用的是内联定义提示,请遵循使用提示管理器创建提示的 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 Guardrails 的护栏应用于您的提示或由此产生的响应,请在guardrailConfiguration字段中添加该字段并指定护栏的 ID 或 ARN,并在guardrailIdentifier字段中指定护栏的版本。guardrailVersion
代理节点允许您向代理发送提示,代理在 FMs 和关联的资源之间进行协调,以识别最终用户并为其执行操作。有关更多信息,请参阅 使用 AI 代理自动执行应用程序中的任务。
在配置中,指定要使用的代理别名的 Amazon 资源名称(ARN)。节点的输入是代理的提示以及任何相关的提示或会话属性。节点将代理的响应作为输出返回。
代理节点可以支持多回合调用,从而在流程执行期间启用用户与代理之间的交互式对话。当代理节点需要其他信息或澄清时,它可以暂停流程执行并请求用户提供特定输入。用户提供所请求的信息后,代理节点将继续处理新的输入。这种情况一直持续到代理节点获得完成其执行所需的所有信息为止
下面显示了代理FlowNode对象的一般结构:
{ "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" } } }
知识库节点允许您从 Amazon Bedrock 知识库向知识库发送查询。有关更多信息,请参阅 使用 Amazon Bedrock 知识库检索数据并生成 AI 响应。
在配置中,提供knowledgeBaseId最低限度。根据您的用例,您可以选择添加以下字段:
-
modelId— 如果要根据检索到的结果生成响应,请包含要使用的模型 ID。要以数组形式返回检索结果,请省略模型 ID。 -
guardrailConfiguration— 包括现场的 Amazon Bedrock Guardrails 中定义的护栏的 ID 或 ARN 以及guardrailIdentifier现场护栏的版本。guardrailVersion注意
只有在知识库节点
RetrieveAndGenerate中使用时才能应用护栏。
节点的输入是对知识库的查询。输出要么是模型响应(字符串形式),要么是检索到的结果的数组。
下图显示了知识库FlowNode对象的一般结构:
{ "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 存储节点允许您将数据流中的数据存储到 Amazon S3 存储桶。在配置中,您可以指定用于数据存储的 S3 存储桶。节点的输入是要存储的内容和对象键。节点的输出是其返回的 S3 位置的 URI。
以下显示了 S3 存储FlowNode对象的一般结构:
{ "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 检索节点让您可以从 Amazon S3 位置检索数据,并将其引入工作流。在配置中,您可以指定要从中检索数据的 S3 存储桶。节点的输入是对象键。节点的输出是其返回的 S3 位置的内容。
注意
目前,S3 位置中的数据必须是 UTF-8 编码字符串。
下面显示了 S3 检索FlowNode对象的一般结构:
{ "name": "string", "type": "Retrieval", "inputs": [ { "name": "objectKey", "type": "String", "expression": "string" } ], "outputs": [ { "name": "s3Content", "type": "String" } ], "configuration": { "retrieval": { "serviceConfiguration": { "s3": { "bucketName": "string" } } } } }
通过 Lambda 函数节点,您可以调用一个 Lambda 函数,在其中定义代码来执行业务逻辑。当您在流程中包含 Lambda 节点时,Amazon Bedrock 会向您指定的 Lambda 函数发送一个输入事件。
对于配置,请指定 Lambda 函数的 Amazon 资源名称(ARN)。定义要在 Lambda 输入事件中发送的输入。您可以根据这些输入编写代码并定义函数返回的内容。函数响应将在输出中返回。
下面显示了 Lambda 函数FlowNode对象的一般结构:
{ "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 输入事件
发送到 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/中的配置 Lambda 概念。
流的 Lambda 响应
编写 Lambda 函数时,您需要定义该函数返回的响应。此响应将作为 Lambda 节点的输出返回到您的流程。
内联代码节点可让您直接在流中编写和执行代码,无需使用外部 Lambda 函数即可实现数据转换、自定义逻辑和集成。当您在流程中包含内联代码节点时,Amazon Bedrock 会在隔离的 AWS 托管环境中执行您的代码,该环境不与任何人共享,也无法访问互联网。
注意
Amazon Bedrock 的内联代码节点处于预览版,可能会发生变化。
在节点配置中,指定要执行的代码以及编程语言(目前Python_3是唯一的选项)。将您的代码可以访问的输入定义为变量。代码中最后执行的行的结果将作为节点输出返回。
以下示例显示了内联代码FlowNode对象的一般结构:
{ "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" } } }
使用内联代码节点时的注意事项
在流程中使用内联代码节点时,请考虑以下几点:
重要
我们建议您在将代码添加到内联代码节点之前对其进行测试。
-
异步流程执行中不支持内联代码节点。
-
目前,内联代码节点支持的唯一编程语言是 Python 3.12 (
Python_3). -
内联代码就像交互式 Python 会话发挥作用。仅捕获最后执行的行的结果并作为节点输出返回。
-
不会捕获 Python 控制台输出(例如
print函数的输出)。 -
内联代码节点的输入在代码中以 Python 变量形式提供。使用节点输入的确切名称来引用它们。
-
正确地配置输入和输出类型以避免运行时错误。最多可以配置五个节点输入。
-
每个流最多可以有五个内联代码节点。
-
每个 AWS 账户最多可以有 25 个正在运行的内联代码节点。
-
代码不能超过 5 MB。
内联代码节点输入
您为内联代码节点定义的输入可在代码中作为 Python 变量使用。例如,如果您定义了一个名为的输入userData,则可以直接在代码中将其访问为userData。
每个输入的值将根据您定义的表达式进行填充。例如,如果节点的输入为{"name": "John",
"age": 30},表达式为$.name,则输入变量的值将为"John"。
内联代码节点输出
代码中最后执行行的结果将作为内联代码节点的输出返回。此输出可供流程中的后续节点使用。
例如,以下代码返回字典作为节点输出:
# Process input data result = {"processed": True, "data": userData} # The last line's result is returned as the node output result
注意
Lex 节点依赖于 Amazon Lex 服务,该服务可能会存储和使用客户内容来开发和持续改进其他 AWS 服务。作为 AWS 客户,您可以选择不存储您的内容或将其用于服务改进。要了解如何为 Amazon Lex 实施选择退出策略,请参阅 AI services opt-out policies。
通过 Lex 节点,您可以调用 Amazon Lex 机器人来使用自然语言处理功能处理语句,并根据机器人定义识别意图。有关更多信息,请参阅 Amazon Lex 开发人员指南。
在配置中,指定要使用的机器人别名的 Amazon 资源名称(ARN)和要使用的区域设置。节点的输入是语句以及任何随附的请求属性或会话属性。节点的输出是已识别的意图。
注意
目前,Lex 节点不支持多轮对话。一个 Lex 节点只能处理一个语句。
以下显示了 Lex FlowNode对象的一般结构:
{ "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" } } }
节点类型汇总表
以下各表总结了每种节点类型允许的输入和输出。请注意以下几点:
-
如果名称标记为任何,您可以提供任何字符串作为名称,否则必须使用表中指定的值。
-
如果类型标记为任何,您可以指定以下任何数据类型:字符串、数字、布尔值、对象、数组,否则必须使用表中指定的类型。
-
您可以为条件、提示、Lambda 函数和内联代码节点定义多个输入。
| 输入信息 | 输出信息 | |||||
|---|---|---|---|---|---|---|
| 节点类型 | 输入 | 名称 | 类型 | 输出 | 名称 | 类型 |
| 输入 | 不适用 | 不适用 | 不适用 | InvokeFlow 请求中的 content 字段。 |
document |
任何 |
| 输出 | 要在 InvokeFlow 响应中返回的数据。 |
document |
任何 | 不适用 | 不适用 | 不适用 |
| Condition |
基于条件发送的数据。 (允许的多个输入) |
任何 | 任何 |
基于条件发送的数据。 (为不同路径指定条件) |
任何 | 任何 |
| 迭代器 | 一个数组,您要将以下节点迭代应用到该数组的每个成员。 | array |
数组 | 数组中的每个项目 | arrayItem |
任何 |
| 输入数组的大小 | arraySize |
数字 | ||||
| 收集器 | 要合并到数组中的迭代。 | arrayItem |
任何 | 一个数组,其中附加了前一个节点的所有输出。 | collectedArray |
数组 |
| 输出数组的大小 | arraySize |
数字 | ||||
| DoWhile 循环 | 要在循环中处理的数据。 | loopInput |
任何 | 所有迭代后循环的最终输出。 | loopOutput |
任何 |
| 执行的迭代次数。 | iterationCount |
数字 | ||||
| 输入信息 | 输出信息 | |||||
|---|---|---|---|---|---|---|
| 节点类型 | 输入 | 名称 | 类型 | 输出 | 名称 | 类型 |
| 提示 |
在提示符中填充变量的值(允许多个输入)。 |
|
任何 | 模型返回的响应。 | modelCompletion |
字符串 |
| S3 存储 | 要存储在 S3 存储桶中的数据。 | content |
任何 | S3 位置的 URI。 | s3Uri |
字符串 |
| 用于 S3 对象的对象键。 | objectKey |
字符串 | ||||
| S3 检索 | S3 对象的对象密钥。 | objectKey |
字符串 | 要从 S3 存储桶中检索的数据。 | s3Content |
任何 |
| Agent | 要发送给代理的提示。 | agentInputText |
字符串 | 代理返回的响应。 | agentResponse |
字符串 |
| 要与提示一起发送的任何提示属性。 | promptAttributes |
对象 | ||||
| 要与提示一起发送的任何会话属性。 | sessionAttributes |
对象 | ||||
| 知识库 | 对知识库的查询。 | retrievalQuery |
字符串 | 知识库返回的结果或生成的响应。 | retrievalResults |
数组 |
| Lambda 函数 |
要发送到函数的数据(允许多个输入)。 |
任何 | 任何 | 函数返回的响应。 | functionResponse |
任何 |
| 内联代码节点 |
供您的代码执行的变量(允许多个输入)。 |
任何 | 任何 | 代码中执行的最后一行。 | response |
任何 |
| Lex | 要发送给机器人的语句。 | inputText |
字符串 | 机器人预测的语句的意图。 | predictedIntent |
字符串 |
| 要与语句一起发送的任何请求属性。 | requestAttributes |
对象 | ||||
| 要与语句一起发送的任何回话属性。 | sessionAttributes |
对象 | ||||