对象提取
对象提取节点将大模型的语义理解能力与工作流的业务处理能力结合,从用户的自然语言输入中提取出完整的结构化业务参数。
工作流在处理复杂业务场景时,逻辑往往极其复杂甚至高达上百个工作流节点。例如对于银行转账业务,要把用户一句“给小刘转100”变成可调用接口的结构化参数,里面涉及到识别谁是转账人,收款人小刘是指谁,需要用哪张卡转账,100的币种是什么等一系列业务逻辑解析。这些逻辑如果全部平铺在一个工作流中,导致工作流极其庞大、难以维护。对象提取节点在此类场景下可以起到解耦复杂流程和结构化信息提取的作用。
- 解耦复杂流程:对象提取节点内部通过挂载多个“对象处理流”(子工作流)将不同的业务逻辑独立出去。主流程只需要维护对象提取节点中“领域对象”的参数列表,而不必关心底层复杂的编排逻辑。
- 结构化信息提取:大模型复杂在所有“业务数据”(由子工作流提取的数据)和“用户意图”之间建立关联,输出可供下游直接使用的信息。
执行逻辑
不同于传统工作流的顺序执行,对象提取节点的执行逻辑通常如下:
- 上下文准备
- 业务数据填充(对象处理流)
- 节点依次触发挂载的子工作流(如:获取收款人信息、获取付款人信息)。
- 调用对象处理流的执行逻辑,将结果回填给对应的“领域对象”。
- 结果存储:“领域对象”存储结构化的业务数据。
- 大模型语义提取
- 大模型读取用户输入、已填充的领域对象、上下文变量。
- 大模型根据提示词判断用户问题可以通过哪些信息实现,完成从领域对象中进行信息提取。
- 扩展工作流(流程增强)
对象提取节点允许配置额外的工作流,用于补充主流程未覆盖的处理逻辑,每个工作流可以指定一个特定的执行时机完成具体的任务。
- 首次进入: 进入节点后立即执行,且仅执行 1 次。适用于初始化操作,如预加载用户基础数据。
- 模型提参后: 大模型完成语义提取后执行,每轮均触发。适用于对大模型提取结果的预处理或格式校正。
- 退出条件判断前: 在节点判断是否退出之前执行,每轮均触发。适用于最终的合法性校验或状态汇总。
- 条件配置(流程控制)
- 模型提参条件: 控制是否调用大模型进行语义提取。满足条件时使用大模型提取,不满足时跳过。不配置时默认每轮均使用大模型。
- 节点退出条件: 控制节点是否结束执行并输出结果。
- 节点异常条件: 控制节点是否进入异常分支。满足条件时进入异常处理流程。不配置时无异常分支。
配置对象提取节点
输入参数:
定义从外部传入对象提取节点的数据。这些数据可以在提示词、子工作流中引用。
每个输入参数需要指定数据来源,支持两种方式:
- 引用:支持用户选择工作流中已包含的前置节点的输出变量值和全局配置中的记忆变量。前置节点为开始节点时,可以引用其输入参数。
- 输入:支持用户输入固定值。
上下文变量:
相当于会话级的全局变量。在整个会话期间持续有效,可以在所有子工作流中读取和赋值。上下文变量同时也会作为本节点的输出参数,传递给下游节点。
上下文变量的价值在于跨轮次、跨子工作流的状态传递。典型使用场景如下:
- 流程控制标记:由子工作流在校验通过后设置为true或者其他标记值,供退出条件判断使用。当所有必要参数都已提取并校验通过时,节点据此判断是否退出。
- 处理状态记录:记录整体处理状态(成功/失败/进行中),记录需要返回给用户的消息内容。
- 多轮对话记忆:记录上一轮的对话信息,子工作流可以对比当前轮与上一轮的差异。
- 跨子工作流数据传递:子工作流读取上下文变量结果。
- 外部数据初始化:每个上下文变量可以配置默认值,可以引用前置节点的参数或工作流级别的请求变量。通过默认值的引用功能,将数据直接初始化到上下文变量中,使子工作流无需额外步骤即可访问这些数据。
输入参数与上下文变量的区别:
|
对比 |
输入参数 |
上下文变量 |
|---|---|---|
|
生命周期 |
仅在当前节点执行时有效 |
在整个会话期间持续有效 |
|
可修改性 |
只读 |
可在子工作流中直接复制修改 |
|
是否作为输出 |
否 |
是,自动传递给下游节点 |
|
跨轮次保持 |
不涉及 |
值在多轮循环之间持续保留 |
|
典型用途 |
传入外部数据供子工作流使用 |
跨轮次传递状态、控制流程走向 |
领域对象:
领域对象是对象提取节点最核心的配置,用于定义业务实体及其属性结构。每个领域对象代表一个业务概念(如收款人信息、付款人信息),包含若干属性字段。领域对象在整个会话内生效,可被子工作流引用。
每个领域对象可挂载一个或多个对象处理流(子工作流),子工作流执行完成后将处理结果赋值回领域对象的属性中。
领域对象属性配置如下:
- 变量名称:只允许输入字母、数字、下划线,且不能以数字开头。
- 变量类型:支持String、Integer、Number、Boolean、Object、Array<String>、Array<Number>、Array<Integer>、Array<Boolean>、Array<Object>。
- 描述(可选):对于该领域对象的描述,需要表述清晰,方便大模型理解该字段用途。
单击
图标,可通过对象模板添加领域对象,对象模板创建详见对象管理页面。
对象处理流配置(可选):
对象处理流在领域对象的属性定义完成后方可配置。每个对象处理流是一个子工作流,添加工作流后,单击
可配置子工作流,设置允许用户配置工作流节点的进入条件。支持以下配置:
- 输入参数:设置子工作流的入参获取方式,支持手动输入或引用已有参数。
- 输出参数:取决于子工作流定义的输出结构,不支持自定义设置。
- 上下文变量:支持在子工作流中对上下文变量直接赋值,将处理结果传回主流程和领域对象。
- 进入条件(可选):控制该子工作流是否执行。
判断参数:条件表达式左边部分,需要选择来自前序节点的输出参数。
比较条件:条件表达式中间部分,当前支持的比较条件有:长度小于、长度小于等于、等于、不等于、包含、不包含、为空、不为空。
比较参数:条件表达式右边部分,支持“引用”和“输入”两种类型。
模型提参配置:
模型提参配置用于设置大模型如何从用户的自然语言中进行语义理解和参数提取。
大模型在对象提取节点中承担语义理解角色,将用户模糊的自然语言转化为结构化的语义线索。例如,“给小刘转100”中识别收款人是“小刘”、金额是“100”。这些线索是初步的语义判断,不直接等同于可以调用业务接口的精确参数。精确的业务参数由对象处理流(子工作流)通过查询数据库、调用接口等方式补全,并赋值给领域对象。
参数提取配置:
参数提取配置定义了大模型需要提取的目标变量。平台会将变量名称和描述作为指令的一部分传递给大模型,大模型从用户输入中尝试提取对应的值。若未能提取,变量值为空。
提示词配置说明:
提示词是大模型工作的核心指令,直接决定提取质量。也可以单击
快速插入输入参数,或在输入框中键入'{'快速引用参数,支持引用多个参数。
提示词设计要点:
- 角色定义:明确大模型的角色,如“你是一个专业的JSON格式字符串转换助手”。
- 字段提取规则:每个字段的提取条件、合法示例都需要明确说明。
- 易混淆场景区分:明确相似概念的边界,如付款卡与收款卡的区分。
- 多轮对话处理:说明在追问场景下如何解析用户的回复(确认、修改、补充等情况)。
- 输出格式定义:给出明确的输出格式要求和完整示例。
- Few-Shot示例:提供覆盖正常、边界、异常等各类场景的输入输出示例。
扩展工作流(可选):
扩展工作流允许在对象提取节点的执行流程中插入额外的子工作流,用于补充主流程未覆盖的处理逻辑。与领域对象的对象处理流不同,扩展工作流不绑定特定的领域对象,而是作用于整个节点流程的特定阶段。
每个扩展工作流需指定一个执行时机,节点支持三种执行时机:
|
执行时机 |
触发点 |
是否每轮执行 |
说明 |
使用场景 |
|---|---|---|---|---|
|
首次进入 |
进入节点后、大模型提参前 |
仅第一轮 |
进入节点后执行,且执行一次。 |
在大模型提参之前预加载用户基础数据、初始化上下文变量、调用前置接口获取会话所需的基础信息。例如查询用户的常用收款人列表并缓存到上下文变量中。此流程仅在第一轮执行,避免重复加载。 |
|
模型提参后 |
大模型完成参数提取后 |
每轮 |
大模型完成对象提取后执行。 |
在大模型提取完初步参数后、对象处理流执行前,对提取结果进行格式校正、数据清洗或逻辑预处理。例如将大模型提取的金额“一百块”标准化为数字“100”,或对提取结果做初步的合理性检查。 |
|
退出条件判断前 |
退出条件检查前 |
每轮 |
退出条件判断前执行。 |
在退出条件判断之前执行最终的合法性校验或状态汇总。例如检查所有必要参数是否齐全且合法,汇总各子工作流的处理结果到上下文变量中,为退出条件判断提供依据。 |
可配置多个扩展工作流。相同执行时机的扩展工作流按定义的先后顺序依次执行。每个扩展工作流支持以下配置:
- 执行时机:选择首次进入、模型提参后、退出条件判断前。
- 输入参数:设置子工作流的入参获取方式,支持手动输入或引用已有参数。
- 上下文变量:支持在子工作流中对上下文变量直接赋值,将处理结果传回主流程和领域对象。
- 进入条件(可选):控制该子工作流是否执行。
判断参数:条件表达式左边部分,需要选择来自前序节点的输出参数。
比较条件:条件表达式中间部分,当前支持的比较条件有:长度小于、长度小于等于、等于、不等于、包含、不包含、为空、不为空。
比较参数:条件表达式右边部分,支持“引用”和“输入”两种类型。
扩展工作流与对象处理流在整个节点执行流程中的位置如下:
① "首次进入"扩展工作流(仅第 1 轮)
↓
② 大模型参数提取
↓
③ "模型提参后"扩展工作流
↓
④ 领域对象的对象处理流(按定义顺序依次执行)
↓
⑤ "退出条件判断前"扩展工作流
↓
⑥ 退出条件判断
条件配置(可选):
条件配置用于控制对象提取节点的执行行为,决定节点在何时使用大模型、何时退出循环、何时进入异常处理。条件配置包含三种独立的条件,均为可选配置。
|
条件类型 |
作用 |
不配置时的默认行为 |
使用场景 |
|---|---|---|---|
|
模型提参条件 |
控制是否调用大模型进行参数提取 |
默认每轮均使用大模型 |
用于在特定情况下跳过大模型的参数提取步骤。例如在多轮对话中,如果上一轮已经提取了所有必要参数,本轮用户只是进行确认操作,可以通过条件判断跳过大模型调用,减少不必要的Token消耗和响应时间。 |
|
节点退出条件 |
控制节点是否结束执行并输出结果 |
执行一轮后直接退出 |
用于控制节点的多轮循环行为。不配置时节点执行一轮后直接退出;配置后,节点在每轮结束时检查条件,满足则退出并输出结果,不满足则停留在节点内部,与用户进行交互追问后进入下一轮循环。 |
|
节点异常条件 |
控制节点是否进入异常分支 |
无异常分支 |
用于处理异常场景。添加节点异常条件后需要在对象提取参数后设置异常处理分支。 |
三种条件的设置方式相同:选择一个参数;选择判断条件(长度大于、长度小于、包含、不包含、为空等);设置比较值(手动输入或引用对象提取节点的参数、前置节点的参数)。支持配置多个条件,多个条件之间为“且”关系。
多轮交互机制说明:
条件配置中的节点退出条件是对象提取节点实现多轮交互的核心。以下通过两个场景说明:
- 场景一:单轮完成
- 场景二:多轮补充
用户输入“给小刘转账”,只有收款人信息,缺少金额。第一轮退出条件不满足,节点向用户追问金额,用户回复后进入第二轮循环。
第 1 轮: 用户:"给小刘转账" → 大模型提取:收款人=小刘,金额=空 → 收款人校准:匹配到刘某某,卡号4566,工行 → 付款人校准:获取默认付款卡1111 → 金额校准:金额为空,跳过(进入条件不满足) → 退出条件:不满足 → 向用户追问"请问转账金额是多少?" 第 2 轮: 用户:"100块" → 大模型提取:金额=100 → 收款人校准:跳过(进入条件不满足,卡号已填充) → 付款人校准:跳过(进入条件不满足,已有付款卡) → 金额校准:100元,人民币 → 退出条件:满足 → 退出,输出结果
备注(可选):用于描述对象提取节点的功能。
配置示例
填写领域对象参数时,先确定最终业务需要哪些参数信息,再围绕这些参数进行构建。每个领域对象对应一个独立的业务关注点,通过各自挂载的对象处理流独立完成数据的查询匹配和校验。
以银行转账场景为例,最终需要调用动账接口,接口需要收款人、付款人、金额三组数据,因此可以建立三个领域对象,对应三个子工作流。在真实的业务开发中,子工作流通常需要对接银行核心系统的API或数据库。本示例中的三个子工作流均为模拟数据,通过“全局变量+变量赋值”的方式写入固定值,表示已经通过工作流提取到了最终需要的收款人、付款人、金额数据清单。对象提取节点专注于从数据清单中获取用户query中提及的数据值。
参考本示例时,请务必关注以下核心差异点,以便后续向生产环境迁移:
|
维度 |
本示例(快速原型) |
生产环境(真实业务) |
|---|---|---|
|
子工作流输入 |
引用原始query,子工作流仅作为演示,实际并不处理输入。 |
引用大模型提参变量,子流程接受大模型提取的信息去数据库精准匹配。 |
|
子工作流逻辑 |
固定值赋值,直接输出预设好的收款人小刘,账号1234……等信息。 |
动态业务逻辑,包含API调用、风控校验、模糊匹配及错误处理。 |
|
数据流转 |
硬编码模拟无论用户说什么,结果都是固定的。 |
语义驱动校验,系统根据用户输入的内容,动态查询并返回对应的结构化数据。 |
在运行本示例时,会发现即便用户输入“给张三转账100”,“给王五转账100”结果显示的收款人依然是“小刘”。这是因为子工作流内部使用了固定值。在实际应用中,需将子工作流内的“赋值”的方式改为真实的“数据库查询节点”,并将查询条件指向大模型提取的变量即可完成无缝切换。
构建收款人、付款人、金额数据工作流:
- 构建付款人信息工作流。
- 创建一个名为“银行转账1-校验付款人”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
图1 创建工作流
- 单击页面右上角“全局配置”,赋值以下参数。全局变量的其他配置使用默认值。
表5 全局变量参数 参数名称
类型
含义
payer
Object
表示付款人信息。
payCard
String
表示银行卡号,后续“变量赋值节点”设置为12345678。
accTypeDesc
String
表示银行卡类型,后续设置为借记卡
selectedPayCard
String
表示第几张银行卡,后续设置为卡1
图2 设置全局配置
- 修改变量赋值节点参数。引用全局配置中的付款人信息,值输入为固定值。
图3 设置变量赋值节点
- 结束节点引用开始节点的query,输出参数、指定回复设置为空。
图4 设置结束节点
- 单击“试运行”,输入任一内容,运行成功后,单击“提交版本”。
- 创建一个名为“银行转账1-校验付款人”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
- 构建收款人信息工作流。
- 创建一个名为“银行转账2-校验收款人”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
图5 创建工作流
- 单击页面右上角“全局配置”,赋值以下参数。全局变量的其他配置使用默认值。注意配图中的参数层级关系。
表6 全局变量参数 参数名称
类型
含义
payee
Object
表示收款人信息。
payeeName
String
表示收款人姓名,后续“变量赋值节点”设置为小刘。
payeeAcct
String
表示收款银行卡,后续设置为87654321。
payeeBankName
String
表示收款人银行,后续设置为工行。
res_status
String
用于演示对象提取节点的“上下文变量”功能,假设工作流运行后已经产生了“收款人已校准”的信息。
res_content
String
用于演示对象提取节点的“上下文变量”功能,假设工作流运行后已经产生了“匹配成功:小刘”的信息。
图6 设置全局配置
- 修改变量赋值节点参数。引用全局配置中的参数信息,值输入为固定值。
图7 设置变量赋值节点
- 结束节点的result引用开始节点的query,并新增2个输入参数模拟传递给对象提取节点的上下文变量。输出参数、指定回复设置为空。
图8 设置结束节点
- 单击“试运行”,输入任一内容,运行成功后,单击“提交版本”。
- 创建一个名为“银行转账2-校验收款人”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
- 构建转账金额信息工作流。
- 创建一个名为“银行转账3-校验金额”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
图9 创建工作流
- 单击页面右上角“全局配置”,赋值以下参数。全局变量的其他配置使用默认值。
表7 全局变量参数 参数名称
类型
含义
amountObj
Object
表示转账信息。
amount
String
表示金额描述,后续设置为转账100。
ExactAmount
String
表示实际金额,后续设置为100。
图10 设置全局配置
- 修改变量赋值节点参数。引用全局配置中的参数信息,值输入为固定值。
图11 设置变量赋值节点
- 结束节点的result引用开始节点的query,输出参数、指定回复设置为空。
图12 设置结束节点
- 单击“试运行”,输入任一内容,运行成功后,单击“提交版本”。
- 创建一个名为“银行转账3-校验金额”的工作流,内部包含“开始-->变量赋值-->结束”3个节点。
创建对象提取工作流:
- 创建一个名为“银行转账-对象提取”的工作流,内部包含“开始-->对象提取-->结束”3个节点。
图13 创建工作流
- 开始节点设置两个参数。
表8 开始节点参数 参数名称
参数类型
描述
query
String
用户输入
wap_userName
String
账户姓名
图14 设置开始节点
- 设置对象提取节点。
- 添加对象提取节点的输入参数,引用开始节点的两个参数。
表9 对象提取-输入参数 参数名称
类型
值
user_name
引用
引用开始节点的wap_userName
QueryContent
引用
引用开始节点的query
图15 配置输入参数
- 添加上下文变量。
表10 对象提取-上下文变量参数 参数名称
变量类型
描述
TransStatus
String
处理状态
TransContent
String
处理信息
图16 配置上下文变量
- 配置收款人领域对象。
将“银行转账2-校验收款人”工作流的参数填写到领域对象中,并绑定该工作流。
图17 配置收款人领域对象
子工作流绑定后,单击
图标修改子工作流的参数配置,输入参数引用开始节点的query。上下文变量引用领域对象的payee参数。并将子工作流中设置的res_status、res_content参数与对象提取节点的上下文变量绑定,用来模拟上下文变量的交互过程。图18 配置校验收款人子工作流
- 配置付款人领域对象。
新增一个领域对象,将“银行转账1-校验付款人”工作流的参数填写到领域对象中,并绑定该工作流。
图19 设置付款人领域对象
子工作流绑定后,单击
图标修改子工作流的参数配置,输入参数引用开始节点的query。上下文变量引用领域对象的payer参数。图20 配置校验付款人子工作流
- 配置金额领域对象。
新增一个领域对象,将“银行转账3-校验金额”工作流的参数填写到领域对象中,并绑定该工作流。
图21 设置金额领域对象
子工作流绑定后,单击
图标修改子工作流的参数配置,输入参数引用开始节点的query。上下文变量引用领域对象的amountObj参数。图22 配置金额子工作流
- 设置模型提参配置。
选择任一可用模型,设置如下所示的参数,并填写提示词。
表11 参数提取配置 变量名称
变量类型
描述
name
String
收款人姓名
card
String
付款人信息
amount
String
转账金额
bank
String
收款行名称
account
String
收款账户
提示词配置:
**角色定义:** 你是一个专业的 JSON 格式字符串转换助手,专注于从用户输入中精准提取转账相关的信息并生成符合预期的 JSON 格式输出。 **任务描述:** 你的任务是解析用户输入 {{QueryContent}},精准提取以下5个参数并生成 JSON 格式输出,**字段提取必须严格按如下规则**: ## 字段提取规则 ### 1. 收款人姓名(`name`) ### 2. 付款卡(`card`) ### 3. 转账金额(`amount`) ### 4. 收款人卡所属银行(`bank`) ### 5. 收款账户信息(`account`): ## 输出格式: 输出包含如下字段的JSON(不需要输出\`\`\`json) ```json { "name": "", "card": "", "amount": "", "bank": "", "account": "" } ```图23 配置模型提参
- 添加对象提取节点的输入参数,引用开始节点的两个参数。
- 设置结束节点。
结束节点设置如下参数,用于输出工作流运行后的付款人信息、收款人信息、金额信息、状态信息。并在回复中指定具体的输出参数。
表12 结束节点参数 参数名称
类型
值
payee
引用
引用对象提取节点的payee参数
payer
引用
引用对象提取节点的payer参数
amount
引用
引用对象提取节点的amountObj参数
transstatus
引用
引用对象提取节点的TransStatus参数
图24 设置结束节点
- 单击右上角“试运行”。输入任一wap_userName内容后,输入“转给小刘100元”。观察所需要的付款人、收款人、金额信息已经成功提取出来。
图25 试运行工作流
单击右上角“调试”可查看工作流的调用链信息。
图26 查看调用链
常见问题
- 配置了非常详细的提示词,为什么调用时发现大模型没有被触发
配置大模型和提示词时,“参数提取配置”选型是触发模型调用的实体开关。如果“参数提取配置”列表为空,会认为本节点不需要模型进行任何语义抓取,从而跳过LLM调用。
- 大模型提取到了结果,但为什么“领域对象”中的值还是空的
大模型提取的是“临时语义线索”,不会自动填充到领域对象中。大模型提参后的数据流向为:大模型提取-->临时变量-->子工作流(作为入参)-->子工作流处理-->回填给领域对象。
领域对象为空时确保在对象处理流(子工作流)的配置中,将模型的提取结果作为输入,并在子流程执行完成后,通过配置子工作流的上下文变量映射显式地将结果赋值给领域对象。
- 子工作流可以引用原始query吗
可以,但不建议。直接引用query会导致对象处理流(子工作流)需要重复处理自然语言,增加逻辑复杂度。推荐的做法是让子工作流引用大模型提取出来的参数,这样子工作流只需要处理精准的结构化信息。
- 在对象提取节点直接定义了“上下文变量”为什么运行后还是空值
上下文变量不会自动更新,需要显式地进行赋值。检查对象处理流(子工作流)的配置中是否对上下文变量进行了赋值处理,将子工作流的输出指向对象提取节点的上下文变量。
注意:子工作流的内部变量赋值仅在子工作流内部有效,需要通过节点的映射配置才能带回到节点中。子工作流是一个独立的“零件”,它无法直接访问对象处理节点的内部变量。在节点配置子工作流时,通过“输入参数”将变量以引用的方式“喂”给子工作流;子工作流处理完后,再通过“上下文变量映射”将结果“还”给对象提取节点。
- 有多个对象处理流(子工作流),它们修改同一个上下文变量会发生什么
所有子工作流共享同一个上下文变量空间,那么最终节点输出的值将取决于最后运行的那个子流程。如果需要记录全过程,建议每个子流负责不同的变量,或在“退出条件判断前”的扩展工作流中进行统一的逻辑汇总。
- 对象提取节点开发过程中如何排查“变量预期值不符”、“变量值莫名丢失”的问题;如何确认某个变量是在哪一步被修改的
利用工作流提供的“调试”功能查看调用链信息。对象提取节点运行时,会记录两个关键的时间节点快照:
对话前:记录尚未执行时,变量的初始状态。
对话后:记录执行结束后,变量的最终状态。
通过对比变量的前后变化,可以清晰的看到变量是如何被加工或修改的。
