Link Search Menu Expand Document Documentation Menu

工作流教程

您可以使用思维链(CoT)代理自动化常见用例的设置,例如对话式聊天。代理负责编排和运行机器学习模型和工具。工具执行一组特定的任务。本页面提供了设置 CoT 代理的完整示例。有关代理和工具的更多信息,请参阅代理和工具

此设置需要以下一系列 API 请求,其中已预置的资源将用于后续请求。以下列表概述了此工作流所需的步骤。步骤名称与模板中的名称对应

  1. 在集群上部署模型
  2. 使用已部署的模型进行推理
    • 设置执行特定任务的多个工具
    • 设置一个或多个使用工具组合的代理
      • sub_agent:创建一个使用 list_index_tool 的代理。
    • 设置代表这些代理的工具
      • agent_tool:封装 sub_agent,以便您可以将其用作工具。
    • root_agent:设置一个根代理,它可以将任务委托给工具或另一个代理。

以下部分详细介绍了这些步骤。有关完整的工作流模板,请参阅完整的 YAML 工作流模板

工作流图

上一节中描述的工作流被组织成一个模板。请注意,您可以以多种方式对步骤进行排序。在示例模板中,ml_model_tool 步骤在 root_agent 步骤之前指定,但您可以在 deploy_model_3 步骤之后和 root_agent 步骤之前的任何点指定它。下图显示了 OpenSearch 为模板中指定顺序的所有步骤创建的有向无环图 (DAG)。

Example workflow steps graph

1. 在集群上部署模型

要在集群上部署模型,您需要创建一个到模型的连接器,注册模型,然后部署模型。

create_connector_1

工作流的第一步是创建一个连接到外部托管模型的连接器(在以下示例中,此步骤称为 create_connector_1)。user_inputs 字段的内容与 ML Commons 创建连接器 API 完全匹配

nodes:
- id: create_connector_1
  type: create_connector
  user_inputs:
    name: OpenAI Chat Connector
    description: The connector to public OpenAI model service for GPT 3.5
    version: '1'
    protocol: http
    parameters:
      endpoint: api.openai.com
      model: gpt-3.5-turbo
    credential:
      openAI_key: '12345'
    actions:
    - action_type: predict
      method: POST
      url: https://${parameters.endpoint}/v1/chat/completions

当您创建连接器时,OpenSearch 会返回一个 connector_id,您需要此 ID 来注册模型。

register_model_2

注册模型时,previous_node_inputs 字段会指示 OpenSearch 从 create_connector_1 步骤的输出中获取所需的 connector_id注册模型 API 所需的其他输入包含在 user_inputs 字段中

- id: register_model_2
  type: register_remote_model
  previous_node_inputs:
    create_connector_1: connector_id
  user_inputs:
    name: openAI-gpt-3.5-turbo
    function_name: remote
    description: test model

此步骤的输出是 model_id。然后您必须将注册的模型部署到集群。

deploy_model_3

部署模型 API 需要前一步骤中的 model_id,如 previous_node_inputs 字段中指定的那样

- id: deploy_model_3
  type: deploy_model
  # This step needs the model_id produced as an output of the previous step
  previous_node_inputs:
    register_model_2: model_id

直接使用部署模型 API 时,会返回一个任务 ID,需要使用 任务 API 来确定部署何时完成。自动化工作流消除了手动状态检查,并直接返回最终的 model_id

步骤排序

要按顺序排列这些步骤,您必须通过图中的边将它们连接起来。当一个步骤中存在 previous_node_input 字段时,OpenSearch 会自动为该步骤创建一个包含 sourcedest 字段的节点。source 的输出是 dest 的必需输入。例如,register_model_2 步骤需要 create_connector_1 步骤中的 connector_id。类似地,deploy_model_3 步骤需要 register_model_2 步骤中的 model_id。因此,OpenSearch 按如下方式创建图中的前两条边,以将输出与所需输入匹配,并在缺少所需输入时引发错误

edges:
- source: create_connector_1
  dest: register_model_2
- source: register_model_2
  dest: deploy_model_3

如果您定义了 previous_node_inputs,那么定义边是可选的。

2. 使用已部署的模型进行推理

CoT 代理可以在工具中使用已部署的模型。此步骤并非严格对应于 API,而是注册代理 API 所需主体的一部分。这简化了注册请求,并允许在多个代理中重用同一工具。有关代理和工具的更多信息,请参阅代理和工具

list_index_tool

您可以配置其他工具供 CoT 代理使用。例如,您可以如下配置一个 list_index_tool。此工具不依赖于任何先前的步骤

- id: list_index_tool
  type: create_tool
  user_inputs:
    name: ListIndexTool
    type: ListIndexTool
    parameters:
      max_iteration: 5

sub_agent

要在代理配置中使用 list_index_tool,请在代理的 previous_node_inputs 字段中将其指定为工具之一。您可以根据需要将其他工具添加到 previous_node_inputs。代理还需要一个大型语言模型 (LLM) 来与工具进行推理。LLM 由 llm.model_id 字段定义。本示例假定将使用来自 deploy_model_3 步骤的 model_id。但是,如果已部署另一个模型,则可以将该先前部署模型的 model_id 包含在 user_inputs 字段中。

- id: sub_agent
  type: register_agent
  previous_node_inputs:
    # When llm.model_id is not present this can be used as a fallback value
    deploy-model-3: model_id
    list_index_tool: tools
  user_inputs:
    name: Sub Agent
    type: conversational
    description: this is a test agent
    parameters:
      hello: world
    llm.parameters:
      max_iteration: '5'
      stop_when_no_tool_found: 'true'
    memory:
      type: conversation_index
    app_type: chatbot

OpenSearch 将自动创建以下边,以便代理可以从上一个节点检索字段

- source: list_index_tool
  dest: sub_agent
- source: deploy_model_3
  dest: sub_agent

agent_tool

您可以将一个代理作为另一个代理的工具使用。注册代理会在输出中产生一个 agent_id。以下步骤定义了一个使用前一步骤中的 agent_id 的工具

- id: agent_tool
  type: create_tool
  previous_node_inputs:
    sub_agent: agent_id
  user_inputs:
    name: AgentTool
    type: AgentTool
    description: Agent Tool
    parameters:
      max_iteration: 5

OpenSearch 会自动创建边连接,因为此步骤指定了 previous_node_input

- source: sub_agent
  dest: agent_tool

ml_model_tool

工具可以引用 ML 模型。此示例从上一步部署的模型中获取所需的 model_id

- id: ml_model_tool
  type: create_tool
  previous_node_inputs:
    deploy-model-3: model_id
  user_inputs:
    name: MLModelTool
    type: MLModelTool
    alias: language_model_tool
    description: A general tool to answer any question.
    parameters:
      prompt: Answer the question as best you can.
      response_filter: choices[0].message.content

OpenSearch 会自动创建边以使用 previous_node_input

- source: deploy-model-3
  dest: ml_model_tool

root_agent

对话式聊天应用程序将与单个根代理通信,该代理在其 tools 字段中包含 ML 模型工具和代理工具。它还将从已部署的模型中获取 llm.model_id。一些代理要求工具以特定顺序排列,这可以通过在用户输入中包含 tools_order 字段来强制执行

- id: root_agent
  type: register_agent
  previous_node_inputs:
    deploy-model-3: model_id
    ml_model_tool: tools
    agent_tool: tools
  user_inputs:
    name: DEMO-Test_Agent_For_CoT
    type: conversational
    description: this is a test agent
    parameters:
      prompt: Answer the question as best you can.
    llm.parameters:
      max_iteration: '5'
      stop_when_no_tool_found: 'true'
    tools_order: ['agent_tool', 'ml_model_tool']
    memory:
      type: conversation_index
    app_type: chatbot

OpenSearch 会自动为 previous_node_input 源创建边

- source: deploy-model-3
  dest: root_agent
- source: ml_model_tool
  dest: root_agent
- source: agent_tool
  dest: root_agent

有关 OpenSearch 为此工作流创建的完整 DAG,请参阅工作流图

完整的 YAML 工作流模板

以下是包含所有 provision 工作流步骤的最终 YAML 格式模板

YAML 模板
# This template demonstrates provisioning the resources for a 
# Chain-of-Thought chat bot
name: tool-register-agent
description: test case
use_case: REGISTER_AGENT
version:
  template: 1.0.0
  compatibility:
  - 2.12.0
  - 3.0.0
workflows:
  # This workflow defines the actions to be taken when the Provision Workflow API is used
  provision:
    nodes:
    # The first three nodes create a connector to a remote model, registers and deploy that model
    - id: create_connector_1
      type: create_connector
      user_inputs:
        name: OpenAI Chat Connector
        description: The connector to public OpenAI model service for GPT 3.5
        version: '1'
        protocol: http
        parameters:
          endpoint: api.openai.com
          model: gpt-3.5-turbo
        credential:
          openAI_key: '12345'
        actions:
        - action_type: predict
          method: POST
          url: https://${parameters.endpoint}/v1/chat/completions
    - id: register_model_2
      type: register_remote_model
      previous_node_inputs:
        create_connector_1: connector_id
      user_inputs:
        # deploy: true could be added here instead of the deploy step below
        name: openAI-gpt-3.5-turbo
        description: test model
    - id: deploy_model_3
      type: deploy_model
      previous_node_inputs:
        register_model_2: model_id
    # For example purposes, the model_id obtained as the output of the deploy_model_3 step will be used
    # for several below steps.  However, any other deployed model_id can be used for those steps.
    # This is one example tool from the Agent Framework.
    - id: list_index_tool
      type: create_tool
      user_inputs:
        name: ListIndexTool
        type: ListIndexTool
        parameters:
          max_iteration: 5
    # This simple agent only has one tool, but could be configured with many tools
    - id: sub_agent
      type: register_agent
      previous_node_inputs:
        deploy-model-3: model_id
        list_index_tool: tools
      user_inputs:
        name: Sub Agent
        type: conversational
        parameters:
          hello: world
        llm.parameters:
          max_iteration: '5'
          stop_when_no_tool_found: 'true'
        memory:
          type: conversation_index
        app_type: chatbot
    # An agent can be used itself as a tool in a nested relationship
    - id: agent_tool
      type: create_tool
      previous_node_inputs:
        sub_agent: agent_id
      user_inputs:
        name: AgentTool
        type: AgentTool
        parameters:
          max_iteration: 5
    # An ML Model can be used as a tool
    - id: ml_model_tool
      type: create_tool
      previous_node_inputs:
        deploy-model-3: model_id
      user_inputs:
        name: MLModelTool
        type: MLModelTool
        alias: language_model_tool
        parameters:
          prompt: Answer the question as best you can.
          response_filter: choices[0].message.content
    # This final agent will be the interface for the CoT chat user
    # Using a flow agent type tools_order matters
    - id: root_agent
      type: register_agent
      previous_node_inputs:
        deploy-model-3: model_id
        ml_model_tool: tools
        agent_tool: tools
      user_inputs:
        name: DEMO-Test_Agent
        type: flow
        parameters:
          prompt: Answer the question as best you can.
        llm.parameters:
          max_iteration: '5'
          stop_when_no_tool_found: 'true'
        tools_order: ['agent_tool', 'ml_model_tool']
        memory:
          type: conversation_index
        app_type: chatbot
    # These edges are all automatically created with previous_node_input
    edges:
    - source: create_connector_1
      dest: register_model_2
    - source: register_model_2
      dest: deploy_model_3
    - source: list_index_tool
      dest: sub_agent
    - source: deploy_model_3
      dest: sub_agent
    - source: sub_agent
      dest: agent_tool
    - source: deploy-model-3
      dest: ml_model_tool
    - source: deploy-model-3
      dest: root_agent
    - source: ml_model_tool
      dest: root_agent
    - source: agent_tool
      dest: root_agent

完整的 JSON 工作流模板

以下是相同的 JSON 格式模板

JSON 模板
{
  "name": "tool-register-agent",
  "description": "test case",
  "use_case": "REGISTER_AGENT",
  "version": {
    "template": "1.0.0",
    "compatibility": [
      "2.12.0",
      "3.0.0"
    ]
  },
  "workflows": {
    "provision": {
      "nodes": [
        {
          "id": "create_connector_1",
          "type": "create_connector",
          "user_inputs": {
            "name": "OpenAI Chat Connector",
            "description": "The connector to public OpenAI model service for GPT 3.5",
            "version": "1",
            "protocol": "http",
            "parameters": {
              "endpoint": "api.openai.com",
              "model": "gpt-3.5-turbo"
            },
            "credential": {
              "openAI_key": "12345"
            },
            "actions": [
              {
                "action_type": "predict",
                "method": "POST",
                "url": "https://${parameters.endpoint}/v1/chat/completions"
              }
            ]
          }
        },
        {
          "id": "register_model_2",
          "type": "register_remote_model",
          "previous_node_inputs": {
            "create_connector_1": "connector_id"
          },
          "user_inputs": {
            "name": "openAI-gpt-3.5-turbo",
            "description": "test model"
          }
        },
        {
          "id": "deploy_model_3",
          "type": "deploy_model",
          "previous_node_inputs": {
            "register_model_2": "model_id"
          }
        },
        {
          "id": "list_index_tool",
          "type": "create_tool",
          "user_inputs": {
            "name": "ListIndexTool",
            "type": "ListIndexTool",
            "parameters": {
              "max_iteration": 5
            }
          }
        },
        {
          "id": "sub_agent",
          "type": "register_agent",
          "previous_node_inputs": {
            "deploy-model-3": "llm.model_id",
            "list_index_tool": "tools"
          },
          "user_inputs": {
            "name": "Sub Agent",
            "type": "conversational",
            "parameters": {
              "hello": "world"
            },
            "llm.parameters": {
              "max_iteration": "5",
              "stop_when_no_tool_found": "true"
            },
            "memory": {
              "type": "conversation_index"
            },
            "app_type": "chatbot"
          }
        },
        {
          "id": "agent_tool",
          "type": "create_tool",
          "previous_node_inputs": {
            "sub_agent": "agent_id"
          },
          "user_inputs": {
            "name": "AgentTool",
            "type": "AgentTool",
            "parameters": {
              "max_iteration": 5
            }
          }
        },
        {
          "id": "ml_model_tool",
          "type": "create_tool",
          "previous_node_inputs": {
            "deploy-model-3": "model_id"
          },
          "user_inputs": {
            "name": "MLModelTool",
            "type": "MLModelTool",
            "alias": "language_model_tool",
            "parameters": {
              "prompt": "Answer the question as best you can.",
              "response_filter": "choices[0].message.content"
            }
          }
        },
        {
          "id": "root_agent",
          "type": "register_agent",
          "previous_node_inputs": {
            "deploy-model-3": "llm.model_id",
            "ml_model_tool": "tools",
            "agent_tool": "tools"
          },
          "user_inputs": {
            "name": "DEMO-Test_Agent",
            "type": "flow",
            "parameters": {
              "prompt": "Answer the question as best you can."
            },
            "llm.parameters": {
              "max_iteration": "5",
              "stop_when_no_tool_found": "true"
            },
            "tools_order": [
              "agent_tool",
              "ml_model_tool"
            ],
            "memory": {
              "type": "conversation_index"
            },
            "app_type": "chatbot"
          }
        }
      ],
      "edges": [
        {
          "source": "create_connector_1",
          "dest": "register_model_2"
        },
        {
          "source": "register_model_2",
          "dest": "deploy_model_3"
        },
        {
          "source": "list_index_tool",
          "dest": "sub_agent"
        },
        {
          "source": "deploy_model_3",
          "dest": "sub_agent"
        },
        {
          "source": "sub_agent",
          "dest": "agent_tool"
        },
        {
          "source": "deploy-model-3",
          "dest": "ml_model_tool"
        },
        {
          "source": "deploy-model-3",
          "dest": "root_agent"
        },
        {
          "source": "ml_model_tool",
          "dest": "root_agent"
        },
        {
          "source": "agent_tool",
          "dest": "root_agent"
        }
      ]
    }
  }
}

后续步骤

要了解有关代理和工具的更多信息,请参阅代理和工具