Skip to content

智能体工作流的人类输入

Supported in ADKPython v2.0.0Alpha

对于许多由智能体驱动的工作流来说,能够请求人类输入以进行数据录入、决策验证或操作权限确认是至关重要的一部分。ADK 中的基于图的工作流可以包含专门为在工作流中获取人类输入而构建的人机协同 (HITL) 节点。这些节点不需要人工智能 (AI) 模型来运行,这使得输入过程更加可预测且可靠。

Alpha 发布版

ADK 2.0 是一个 Alpha 发布版,与之前的 ADK 版本一起使用时可能会导致破坏性变更。如果你需要向后兼容性(例如在生产环境中),请不要使用 ADK 2.0。我们鼓励你测试此版本,并欢迎提供你的 反馈

快速入门

你可以使用 RequestInput 类和针对用户的文本提示在图中实现一个人类输入节点。以下代码示例展示了如何向工作流图中添加一个人类输入节点:

from google.adk.events import RequestInput
from google.adk import Workflow

# 定义两个步骤的简单工作流
def step1(): # 人类输入步骤
  yield RequestInput(message="请输入一个数字:")

def step2(node_input):
  return node_input * 2

root_agent = Workflow(
    name="root_agent",
    edges=[('START', step1, step2)],
)

在此代码示例中,step1 会暂停智能体的执行,直到系统收到来自用户的输入。一旦系统收到用户输入,该输入就会传递给下一个节点。

配置选项

人类输入节点可以使用带有以下配置选项的 RequestInput 类:

  • message:向用户提供的文本,用于解释人类输入请求。
  • payload:作为人类输入请求一部分使用的结构化数据。
  • response_schema:人类响应必须符合的数据结构。

注意:响应架构输入的限制

对于 response_schema 设置,RequestInput 类不会自动重新格式化人类响应以符合指定的数据结构。人类响应必须以指定的格式提供。为了获得更好的用户体验,请考虑提供一个用于收集结构化数据的用户界面,或使用智能体节点将非结构化数据转换为所需的格式。

人类输入示例

以下代码示例展示了更详细的人类输入请求,包括 messagepayloadresponse_schema 参数的使用。

带有响应架构的输入请求

以下代码示例展示了如何在工作流节点中构造一个包含 响应架构 (response schema)RequestInput 对象:

# 初始化提示词节点
async def initial_prompt(ctx: Context):
   """向用户询问行程信息"""
   input_message = """
       这是一个交互式礼宾服务工作流,任务是在你选择的城市为你制定一份精彩的行程。
       如果你能提供一些关于你自己或你大致需求的信息,我可以更好地为你个性化行程。
       例如,请输入你的:
           城市(必填)、
           年龄、
           爱好、
           你喜欢的景点示例
   """
   # 定义响应架构
   resp = {"user_response": str}

   yield RequestInput(message=input_message, response_schema=resp)

带有数据负载的输入请求

以下代码示例展示了如何在工作流节点中构造一个包含 负载 (payload)响应架构 (response schema)RequestInput 对象。在此示例中,ActivitiesList 预计由一个负责编写活动列表的智能体节点完成,而 get_user_feedback() 节点则请求用户的反馈。

# 定义活动列表模型
class ActivitiesList(BaseModel):
   """
   行程应该是每个活动的字典列表。
   每个活动都有名称和描述。
   """
   itinerary: List[Dict[str, str]]

# 获取用户反馈节点
async def get_user_feedback(node_input: ActivitiesList):
   """
   检索用户对智能体初始行程的想法,以便展开、更改列表或退出循环。
   """
   message = (
       f"""
       这是为你推荐的基础行程:\n{node_input}\n\n
       这些项目中哪些(如果有的话)吸引你?
       """
   )

   yield RequestInput(
       message=message,
       payload=node_input,
       response_schema={"user":"response"}
   )