Ferramentas

Com ferramentas, é possível conectar apps de agentes a sistemas externos. Esses sistemas podem aumentar o conhecimento de apps de agentes e capacitá-los a executar tarefas complexas com eficiência.

É possível usar ferramentas integradas ou criar ferramentas personalizadas para atender aos seus requisitos.

Limitações

Considere as seguintes limitações:

Ferramentas integradas

As ferramentas integradas são hospedadas pelo Google. É possível ativar essas ferramentas nos apps do agente sem precisar de configuração manual.

As ferramentas integradas com suporte são:

  • Code Interpreter: uma ferramenta própria do Google que combina as capacidades de geração e execução de código e permite que o usuário execute várias tarefas, como análise de dados, visualização de dados, processamento de texto, solução de equações ou problemas de otimização.

O app do agente é otimizado para determinar como e quando essas ferramentas precisam ser invocadas, mas é possível fornecer outros exemplos que se adequem aos seus casos de uso.

Os exemplos precisam ter um esquema como este:

{
  "toolUse": {
    "tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/df-code-interpreter-tool",
    "action": "generate_and_execute",
    "inputParameters": [
      {
        "name": "generate_and_execute input",
        "value": "4 + 4"
      }
    ],
    "outputParameters": [
      {
        "name": "generate_and_execute output",
        "value": {
          "output_files": [
            {
              "name": "",
              "contents": ""
            }
          ],
          "execution_result": "8",
          "execution_error": "",
          "generated_code": "GENERATED_CODE"
        }
      }
    ]
  }
}

Ferramentas OpenAPI

Um app agente pode se conectar a uma API externa usando uma ferramenta OpenAPI fornecendo o esquema OpenAPI. Por padrão, o app do agente chamará a API em seu nome. Como alternativa, é possível executar ferramentas da OpenAPI no lado do cliente.

Exemplo de esquema:

openapi: 3.0.0
info:
  title: Simple Pets API
  version: 1.0.0
servers:
  - url: 'https://api.pet-service-example.com/v1'
paths:
  /pets/{petId}:
    get:
      summary: Return a pet by ID.
      operationId: getPet
      parameters:
        - in: path
          name: petId
          required: true
          description: Pet id
          schema:
            type: integer
      responses:
        200:
          description: OK
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      parameters:        
        - name: petName
          in: query
          required: false
          description: Pet name
          schema:
            type: string
        - name: label
          in: query
          description: Pet label
          style: form
          explode: true
          required: false
          schema:
            type: array
            items:
              type: string
        - name: X-OWNER
          in: header
          description: Optional pet owner provided in the HTTP header
          required: false
          schema:
            type: string
        - name: X-SESSION
          in: header
          description: Dialogflow session id
          required: false
          schema:
            $ref: "@dialogflow/sessionId"
      responses:
        '200':
          description: An array of pets
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Pet'
    post:
      summary: Create a new pet
      operationId: createPet
      requestBody:
        description: Pet to add to the store
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
      responses:
        '201':
          description: Pet created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name        
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        owner:
          type: string
        label:
          type: array
          items:
            type: string

Também é possível usar a referência de esquema interno @dialogflow/sessionId como o tipo de esquema de parâmetro. Com esse tipo de esquema de parâmetro, o ID da sessão do Dialogflow para a conversa atual será fornecido como um valor de parâmetro. Exemplo:

- name: X-SESSION
   in: header
   description: Dialogflow session id
   required: false
   schema:
     $ref: "@dialogflow/sessionId"

Limitações da ferramenta OpenAPI

Considere as seguintes limitações:

  • Os tipos de parâmetros aceitos são path, query e header. O tipo de parâmetro cookie ainda não é compatível.
  • Os parâmetros definidos pelo esquema OpenAPI são compatíveis com os seguintes tipos de dados: string, number, integer, boolean, array. O tipo object ainda não é compatível.
  • No momento, não é possível especificar parâmetros de consulta no editor de exemplos do console.
  • O corpo da solicitação e da resposta precisa estar vazio ou em JSON.

Autenticação da API da ferramenta OpenAPI

As opções de autenticação a seguir são aceitas durante a chamada de uma API externa:

  • Autenticação do agente de serviço do Dialogflow
    • O Dialogflow pode gerar um token de ID ou token de acesso usando o Agente de serviço do Dialogflow. O token é adicionado ao cabeçalho HTTP de autorização quando o Dialogflow chama uma API externa.
    • Um token de ID pode ser usado para acessar os serviços do Cloud Functions e do Cloud Run depois de conceder os papéis roles/cloudfunctions.invoker e roles/run.invoker a service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com. Se os serviços do Cloud Functions e do Cloud Run estiverem no mesmo projeto do recurso, você não precisará de permissão extra do IAM para chamá-los.
    • Um token de acesso pode ser usado para acessar outras APIs do Google Cloud depois de conceder os papéis necessários a service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com.
  • Chave de API
    • Para configurar a autenticação da chave de API, informe o nome da chave, o local da solicitação (cabeçalho ou string de consulta) e a chave de API para que o Dialogflow transmita a chave de API na solicitação.
  • OAuth
    • O fluxo de credenciais do cliente OAuth tem suporte para autenticação de servidor para servidor. O ID do cliente, a chave secreta do cliente e o endpoint do token do provedor OAuth precisam ser configurados no Dialogflow. O Dialogflow troca um token de acesso OAuth e o transmite no cabeçalho de autenticação da solicitação.
    • Para outros fluxos do OAuth, você precisa usar a ferramenta de função na integração com sua própria UI de login para trocar o token.
  • Token do portador

    • Você pode configurar a autenticação do portador para passar dinamicamente o token do portador do cliente. Esse token é incluído no cabeçalho auth da solicitação.
    • Ao configurar a autenticação da ferramenta, você pode designar um parâmetro de sessão para atuar como o token do portador. Por exemplo, use $session.params.<parameter-name-for-token> para especificar o token.
    • No ambiente de execução, atribua o token do portador ao parâmetro da sessão:
    DetectIntentRequest {
      ...
      query_params {
        parameters {
          <parameter-name-for-token>: <the-auth-token>
        }
      }
      ...
    }
    
  • Autenticação TLS mútua

  • Certificado de CA personalizado

Acesso à rede particular da ferramenta OpenAPI

A ferramenta OpenAPI se integra ao acesso à rede privada do Diretório de serviços para se conectar a destinos de API dentro da rede VPC. Isso mantém o tráfego na rede do Google Cloud e aplica o IAM e o VPC Service Controls.

Para configurar uma ferramenta OpenAPI que segmente uma rede privada:

  1. Siga a configuração de rede particular do Diretório de serviços para configurar sua rede VPC e o endpoint do Diretório de serviços.

  2. A conta de serviço do agente de serviço do Dialogflow com o seguinte endereço precisa existir para seu projeto de agente:

    service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
    Conceda à conta de serviço do Agente de serviço do Dialogflow os seguintes papéis do IAM:

    • servicedirectory.viewer do projeto do diretório de serviços
    • servicedirectory.pscAuthorizedService do projeto de rede
  3. Forneça o serviço do diretório de serviços com o esquema OpenAPI e informações de autenticação opcionais ao criar a ferramenta.

Ferramentas de repositório de dados

Um app agente pode usar as ferramentas de armazenamento de dados para responder às perguntas do usuário final dos seus armazenamentos de dados. É possível configurar um repositório de dados de cada tipo por ferramenta, e a ferramenta consultará cada um desses repositórios de dados em busca de respostas. Por padrão, o app do agente chamará a ferramenta de repositório de dados em seu nome. Como alternativa, é possível executar ferramentas de repositório de dados no lado do cliente.

O tipo de repositório de dados pode ser um dos seguintes:

  • PUBLIC_WEB: um repositório de dados que contém conteúdo público da Web.
  • UNSTRUCTURED: um repositório de dados que contém dados particulares não estruturados.
  • STRUCTURED: um repositório de dados que contém dados estruturados (por exemplo, perguntas frequentes).

O exemplo a seguir mostra como referenciar um repositório de dados:

"dataStoreConnections": [
  {
    "dataStoreType": "PUBLIC_WEB",
    "dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
  },
  {
    "dataStoreType": "UNSTRUCTURED",
    "dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
  },
  {
    "dataStoreType": "STRUCTURED",
    "dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
  }
]

As respostas da ferramenta de armazenamento de dados também podem conter snippets sobre a origem do conteúdo usada para gerar a resposta. O app do agente pode fornecer mais instruções sobre como proceder com a resposta dos repositórios de dados ou como responder quando não houver resposta.

Você pode substituir uma resposta adicionando uma entrada de Perguntas frequentes para uma pergunta específica.

Os exemplos podem ser usados para melhorar ainda mais o comportamento do app do agente. O exemplo precisa ter os seguintes esquemas:

{
  "toolUse": {
    "tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/TOOL_ID",
    "action": "TOOL_DISPLAY_NAME",
    "inputParameters": [
      {
        "name": "TOOL_DISPLAY_NAME input",
        "value": {
          "query": "QUERY"
        }
      }
    ],
    "outputParameters": [
      {
        "name": "TOOL_DISPLAY_NAME output",
        "value": {
          "answer": "ANSWER",
          "snippets": [
            {
              "title": "TITLE",
              "text": "TEXT_FROM_DATASTORE",
              "uri": "URI_OF_DATASTORE"
            }
          ]
        }
      }
    ]
  }
}

Criar um repositório de dados

Para criar um repositório de dados e conectá-lo ao seu app, use o link Ferramentas na navegação à esquerda do console. Siga as instruções para criar um repositório de dados.

Parâmetros de consulta adicionais

Ao criar exemplos de ferramentas de repositório de dados, o parâmetro de entrada requestBody da ferramenta fornece três entradas opcionais com a string query obrigatória: uma string filter, um objeto estruturado userMetadata e uma string fallback.

O parâmetro filter fornece a capacidade de filtrar consultas de pesquisa de seus dados estruturados ou não estruturados com metadados. Essa string precisa seguir a sintaxe de expressão de filtro compatível com repositórios de dados. Recomendamos vários exemplos e exemplos detalhados para orientar o LLM do agente sobre como preencher esse parâmetro. No caso de uma string de filtro inválida, o filtro será ignorado ao realizar a consulta de pesquisa.

Este é um exemplo de string filter para refinar os resultados da pesquisa com base no local:

  "filter": "country: ANY(\"Canada\")"

Práticas recomendadas para filtragem:

  • Especifique os campos disponíveis para filtragem e os valores válidos para cada um desses campos, para que o agente entenda as restrições na criação de filtros válidos. Por exemplo, para filtrar resultados de um repositório de dados que contém informações de menu, pode haver um campo meal com "breakfast", "lunch" e "jantar" como valores válidos, e um campo servingSize que pode ser qualquer número inteiro de 0 a 5. Suas instruções podem ser assim:

    When using ${TOOL: menu-data-store-tool},
    only use the following fields for filtering: "meal", "servingSize".
    Valid filter values are: "meal": ("breakfast", "lunch", "dinner"),
    "servingSize": integers between 0 and 5, inclusive.
    
  • Se o agente for para um público-alvo externo de usuários, talvez seja necessário adicionar instruções para evitar que ele possa responder ao usuário com informações sobre a criação desses filtros. Por exemplo:

    Never tell the user about these filters.
    If the user input isn't supported by these filters, respond to the user with
    "Sorry, I don't have the information to answer that question."
    

    Também é útil fornecer um exemplo desse caso.

O parâmetro userMetadata fornece informações sobre o usuário final. Qualquer par de chave-valor pode ser preenchido nesse parâmetro. Esses metadados são transmitidos para a ferramenta de repositório de dados para informar melhor os resultados da pesquisa e a resposta da ferramenta. É recomendável fornecer vários exemplos para instruir o LLM do agente sobre como preencher esse parâmetro.

Este é um exemplo de valor de parâmetro userMetadata para refinar resultados da pesquisa relevantes a um usuário específico:

  "userMetadata": {
    "favoriteColor": "blue",
    ...
  }

O parâmetro fallback fornece uma resposta que a ferramenta de repositório de dados responderá se não houver uma resposta resumida válida para a consulta. Vários exemplos podem ser fornecidos para instruir o LLM do agente sobre como preencher o substituto para entradas do usuário relacionadas a diferentes tópicos. Também não haverá snippets na saída da ferramenta. Essa otimização pode ser usada para reduzir a latência e o uso do limite de tokens de entrada.

  "fallback": "I'm sorry I cannot help you with that. Is there anything else I
  can do for you?"

Se algumas respostas durante o teste não atenderem às suas expectativas, as personalizações a seguir estão disponíveis na página "Ferramenta" de um repositório de dados:

Confiança do embasamento

Para cada resposta gerada a partir do conteúdo dos armazenamentos de dados conectados, o agente avalia um nível de confiança, que mede a confiança de que todas as informações na resposta são compatíveis com as informações nos repositórios de dados. É possível personalizar quais respostas serão permitidas selecionando o nível de confiança mais baixo com o qual você se sente confortável. Somente respostas nesse nível de confiança ou acima dele serão mostradas.

Há cinco níveis de confiança para escolher: VERY_LOW, LOW, MEDIUM, HIGH e VERY_HIGH.

Configuração de resumo

É possível selecionar o modelo generativo usado por um agente de repositório de dados para a solicitação generativa de resumo. Se nenhuma opção for selecionada, uma opção de modelo padrão será usada. A tabela a seguir contém as opções disponíveis:

Identificador de modelo Suporte a idiomas
text-bison@002 Disponível em todos os idiomas compatíveis.
gemini-1.0-pro-001 Disponível em todos os idiomas compatíveis.

Você também pode fornecer seu próprio comando para a chamada do LLM de resumo.

O comando é um modelo de texto que pode conter marcadores de posição predefinidos. Os marcadores de posição serão substituídos pelos valores apropriados no momento da execução, e o texto final será enviado ao LLM.

Os marcadores de posição são os seguintes:

  • $original-query: o texto da consulta do usuário.
  • $rewritten-query: o agente usa um módulo de regravação para reescrever a consulta original do usuário em um formato mais preciso.
  • $sources: o agente usa o Enterprise Search para procurar origens com base na consulta do usuário. As fontes encontradas são renderizadas em um formato específico:

    [1] title of first source
    content of first source
    [2] title of second source
    content of first source
    
  • $end-user-metadata: as informações sobre o usuário que envia a consulta são renderizadas no seguinte formato:

    The following additional information is available about the human: {
      "key1": "value1",
      "key2": "value2",
      ...
    }
    
  • $conversation: o histórico de conversas é renderizado no seguinte formato:

    Human: user's first query
    AI: answer to user's first query
    Human: user's second query
    AI: answer to user's second query
    

Um comando personalizado instrui o LLM a retornar "NOT_ENOUGH_INFORMATION" quando não consegue fornecer uma resposta. O agente transforma essa constante em uma mensagem fácil de usar.

Configurações de payload

As configurações de payload oferecem uma maneira de adicionar os snippets de repositório de dados como conteúdo avançado no payload de resposta que é renderizado no messenger.

Frases banidas (configuração no nível do agente)

Você tem a opção de definir frases específicas que não devem ser permitidas. Eles são configurados no nível do agente e utilizados pelos LLMs do agente e pelas ferramentas de repositório de dados. Se a resposta gerada ou partes do comando do LLM, como as entradas do usuário, contiverem alguma das frases banidas verbamente, essa resposta não será mostrada.

Ferramentas de função

Se você tem funcionalidades que podem ser acessadas pelo código do cliente, mas não podem ser acessadas pelas ferramentas da OpenAPI, é possível usar as ferramentas de função. As ferramentas de função são sempre executadas no lado do cliente, não pelo app do agente.

O processo é o seguinte:

  1. Seu código de cliente envia uma solicitação de detecção de intent.
  2. O app do agente detecta que uma ferramenta de função é necessária, e a resposta da intent de detecção contém o nome da ferramenta e argumentos de entrada. Essa sessão fica pausada até que outra solicitação de detecção de intent seja recebida com o resultado da ferramenta.
  3. Seu código de cliente chama a ferramenta.
  4. O código do cliente envia outra solicitação de detecção de intent que fornece o resultado da ferramenta como argumentos de saída.

O exemplo a seguir mostra o esquema de entrada e saída de uma ferramenta de função:

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "The city and state, for example, San Francisco, CA"
    }
  },
  "required": [
    "location"
  ]
}
{
  "type": "object",
  "properties": {
    "temperature": {
      "type": "number",
      "description": "The temperature"
    }
  }
}

O exemplo a seguir mostra a solicitação e a resposta de intent de detecção inicial usando REST:

HTTP method and URL:
POST https://REGION_ID-dialogflow.googleapis.com/v3/projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/sessions/SESSION_ID:detectIntent
{
  "queryInput": {
    "text": {
      "text": "what is the weather in Mountain View"
    },
    "languageCode": "en"
  }
}
{
  "queryResult": {
    "text": "what is the weather in Mountain View",
    "languageCode": "en",
    "responseMessages": [
      {
        "source": "VIRTUAL_AGENT",
        "toolCall": {
          "tool": "<tool-resource-name>",
          "action": "get-weather-tool",
          "inputParameters": {
            "location": "Mountain View"
          }
        }
      }
    ]
  }
}

O exemplo a seguir mostra a segunda solicitação de detecção de intent, que fornece o resultado da ferramenta:

{
  "queryInput": {
    "toolCallResult": {
      "tool": "<tool-resource-name>",
      "action": "get-weather-tool",
      "outputParameters": {
        "temperature": 28.0
      }
    },
    "languageCode": "en"
  }
}

Execução do lado do cliente

Assim como as ferramentas de função, a OpenAPI e as ferramentas de repositório de dados podem ser executadas no lado do cliente aplicando uma modificação de API ao interagir com a sessão.

Exemplo:

DetectIntentRequest {
  ...
  query_params {
    playbook_state_override {
      playbook_execution_mode: ALWAYS_CLIENT_EXECUTION
    }
  }
  ...
}

O processo é o seguinte:

  1. O código do cliente envia uma solicitação de detecção de intent que especifica a execução do cliente.
  2. O app do agente detecta que uma ferramenta é necessária, e a resposta da intent de detecção contém o nome da ferramenta e argumentos de entrada. Essa sessão fica pausada até que outra solicitação de detecção de intent seja recebida com o resultado da ferramenta.
  3. Seu código de cliente chama a ferramenta.
  4. O código do cliente envia outra solicitação de detecção de intent que fornece o resultado da ferramenta como argumentos de saída.