O Componente Chamar Modelo de Linguagem Grande

O componente Chamar Modelo de Linguagem Grande (componente LLM) no Visual Flow Designer permite que você conecte um fluxo ao LLM por meio de uma chamada de serviço REST.

Você pode inserir esse estado de componente em seu fluxo de caixas de diálogo selecionando Integração de Serviço > Chamar Modelo de Linguagem Grande na caixa de diálogo Adicionar Estado. Para ativar conversas de várias voltas quando as habilidades são chamadas de um assistente digital, digite uma descrição para a descrição do LLM.
Esta é uma imagem do campo Descrição na página Geral.

Observação

Como prática recomendada, sempre adicione descrições a componentes LLM para permitir refinamentos de várias voltas quando os usuários acessarem o serviço LLM por meio de um assistente digital.

A inserção do estado do componente LLM adiciona um estado de tratamento de erros para solucionar problemas das solicitações ao LLM e suas respostas. O estado do componente LLM faz a transição para esse estado (chamado ShowLLMError por padrão) quando uma solicitação ou resposta inválida causa um erro não recuperável.
Descrição da ilustração invokellm-added-flow.png a seguir
Descrição da ilustração invokellm-added-flow.png

Além de chamar o serviço LLM, o estado do componente LLM lida com transações interativas, como refinamentos de várias voltas, as trocas de ida e volta entre o usuário e o LMM que aprimoram a saída LLM através de rodadas de feedback do usuário.
Observação

O refinamento de resposta também pode vir do sistema quando ele implementa novas tentativas após uma falha na validação.
Você pode enviar o resultado do modelo LLM como uma mensagem ou pode salvá-lo em uma variável de fluxo de caixas de diálogo para uso downstream. A validação incorporada do componente LLM fornece proteções contra vulnerabilidades, como ataques de injeção de prompt que ignoram as diretrizes de moderação de conteúdo do modelo.
Observação

Se você quiser aprimorar a validação que o componente LLM já fornece ou quiser melhorar a saída LLM usando a técnica RCI (Recursive Criticism and Improvement), poderá usar nosso código inicial para criar seus próprios handlers de validação de solicitação e resposta.

Então, o que você precisa para usar este componente? Se você estiver acessando o modelo Cohere diretamente ou por meio do Oracle Generative AI Service, precisará apenas de um serviço LLM para o modelo Cohere e de um prompt, que é um bloco de texto legível por humanos contendo as instruções para o LLM. Como escrever um prompt é um processo iterativo, fornecemos diretrizes de engenharia de prompt e o Criador de prompts, onde você pode incorporar essas diretrizes em seu texto de prompt e testá-lo até que ele obtenha a resposta apropriada do modelo. Se você estiver usando outro modelo, como o OpenAI do Azure, primeiro precisará criar seu próprio Handler de Evento de Transformação com base no código inicial que fornecemos e, em seguida, criar um serviço LLM que mapeie esse handler para os pontos finais do provedor LLM que foram configurados para a instância.

Propriedades Gerais

Propriedade Descrição Valor Padrão 0brigatório?
Serviço LLM Uma lista dos serviços LLM que foram configurados para a habilidade. Se houver mais de um, o serviço LLM padrão será usado quando nenhum serviço for selecionado. O serviço LLM padrão O estado pode ser válido sem o Serviço LLM, mas a habilidade não poderá se conectar ao modelo se essa propriedade não tiver sido definida.
Prompt O prompt específico do modelo acessado por meio do serviço LLM selecionado. Tenha em mente nossas diretrizes gerais enquanto escreve seu prompt. Você pode informar o prompt nesse campo e, em seguida, revisá-lo e testá-lo usando o Construtor de Prompt (acessado clicando em Criar Prompt). Você também pode compor seu prompt usando o Criador de prompts. N/A Sim
Parâmetros do Prompt Os valores do parâmetro. Use a sintaxe de expressão FreeMarker padrão do Apache (${parameter}) para fazer referência a parâmetros no texto do prompt. Por exemplo :
Draft an email about ${opportunity} sales.
Para variáveis de entidade composta, use a sintaxe de entidade composta:
  • ${cb_entity.value.bag_item.value} para itens da lista de valores
  • ${cb_entity.value.bag_item} para itens de lista sem valor
Você deve definir todos os parâmetros de prompt ou cada um dos parâmetros referenciados no texto do prompt. Todos os parâmetros de prompt ausentes são sinalizados como erros.
N/A No
Variável de Resultado Uma variável que armazena a resposta LLM. N/A No

Mensagens do Usuário

Essas opções só se aplicam quando você define Enviar Resultado LLM como uma Mensagem como Verdadeiro.
Propriedade Descrição Valor(es) Default 0brigatório?
Enviar Resultado LLM como Mensagem A definição dessa opção como Verdadeiro gera o resultado LLM em uma mensagem enviada ao usuário. A definição dessa propriedade como Falso impede que a saída seja enviada ao usuário. Verdadeiro No
Usar o Streaming Os resultados do LLM são transmitidos para o cliente quando você define essa opção como Verdadeiro, potencialmente fornecendo uma experiência de usuário mais suave porque a resposta do LLM aparece de forma incremental à medida que é gerada, em vez de todas de uma só vez. Essa opção só estará disponível quando você tiver definido Enviar Resultado LLM como uma Mensagem como Verdadeiro.

Os usuários podem exibir respostas potencialmente inválidas porque o handler de eventos de validação é chamado após a resposta LLM já ter iniciado o streaming.

Defina Usar Streaming como Falso para modelos Cohere ou quando você tiver aplicado um esquema JSON ao resultado LLM definindo Impor Resposta LLM Formatada em JSON como Verdadeiro.

Não ativar streaming se:
  • Sua habilidade é executada nos canais do Slack ou do Microsoft Teams.
  • Você definiu a validação de resposta. O handler só pode validar uma resposta completa; portanto, se você definir Usar Streaming para Verdadeiro, os usuários poderão enviar vários fluxos de saída, o que poderá confundi-los.
Verdadeiro No
Mensagem de Início Uma mensagem de status que é enviada ao usuário quando o LLM é chamado. Esta mensagem, que é realmente renderizada antes da chamada LLM, pode ser um indicador útil. Ele pode informar aos usuários que o processamento está ocorrendo ou que o LLM pode levar um período de tempo para responder. N/A Número
Ativar Refinamentos de Vários Giros Ao definir essa opção como Verdadeiro (o padrão), você permite que os usuários refinem a resposta LLM fornecendo instruções de acompanhamento. A caixa de diálogo libera o turno para o usuário, mas permanece no estado LLM depois que o resultado LLM é recebido. Quando definida como Falso, a caixa de diálogo mantém o giro até que a resposta LLM seja recebida e faça a transição para o estado referenciado pela ação Sucesso.

Observação: A descrição do componente é necessária para refinamentos de várias voltas quando a habilidade é chamada de um assistente digital.

Verdadeiro Número
Ações padrão Adiciona os botões de ação padrão que são exibidos abaixo da saída na mensagem de resultado LLM. Todos esses botões são ativados por padrão.
  • Enviar - Quando um usuário seleciona esse botão, a transição next é acionada e o handler de eventos submit é acionado.
  • Cancelar - Quando um usuário seleciona esse botão, a caixa de diálogo faz a transição para o estado definido para a transição cancelar.
  • Desfazer - Quando clicada, a habilidade remove a última resposta de refinamento e reverte para o resultado anterior. A habilidade também remove o refinamento anterior do histórico de chat. Este botão não é exibido na resposta inicial. Ele só é exibido depois que o serviço LLM gera um refinamento.
    Os botões Enviar, Cancelar e Desfazer na parte inferior da mensagem.

Enviar, Cancelar e Desfazer estão todos selecionados. Número
Rótulo do Botão Cancelar O label do botão de cancelamento Submit Sim - Quando a ação Cancelar é definida.
Rótulo do Botão de Sucesso O rótulo do botão de sucesso Cancel Sim - quando a ação Êxito é definida.
Rótulo do Botão Desfazer O rótulo do botão desfazer Undo Sim - Quando a ação Desfazer é definida.
Ações personalizadas Um botão de ação personalizado. Insira um rótulo de botão e um prompt com instruções adicionais. N/A No

Ações de Transição para o Componente Chamar Modelo de Linguagem Grande

Ação Descrição
cancel

Essa ação é acionada por usuários que tocam no botão Cancelar.

error

Essa ação é acionada quando solicitações ou respostas do LLM não são válidas. Por exemplo, a alocação de solicitações de repetição para corrigir erros de valor de entidade ou JSON foi usada.

Classificações do usuário para conteúdo gerado pelo LLM

Por padrão, a classificação do usuário (os polegares para cima e os polegares para baixo) é exibida em cada mensagem.
Ícones de Polegares para Cima e Polegares para Baixo na mensagem de resposta da habilidade

Quando os usuários dão à resposta LLM uma classificação de polegar para baixo, a habilidade segue com um link que abre um formulário de feedback.

Você pode desativar esses botões desativando Habilitar feedback de Modelo de Linguagem Grande em Definições > Configuração.
A opção Ativar feedback do Modelo de Linguagem Grande.

Validação da Resposta

Propriedade Descrição Valor Padrão 0brigatório?
Entidades de Validação Selecione as entidades cujos valores devem ser correspondidos na mensagem de resposta LLM. Os nomes dessas entidades e seus valores correspondentes são passados como um mapa para o processador de eventos, que avalia esse objeto em busca de correspondências de entidades ausentes. Quando as correspondências de entidade ausentes fazem com que a validação falhe, o handler retorna uma mensagem de erro nomeando as entidades sem correspondência, que é então enviada ao modelo. Em seguida, o modelo tenta gerar novamente uma resposta que inclua os valores ausentes. Ele continua com suas tentativas até que o manipulador valide sua saída ou até que tenha usado seu número de novas tentativas.

Recomendamos o uso de entidades compostas para permitir que o handler de eventos gere mensagens de erro concisas porque os labels e as mensagens de erro aplicados a itens compósitos individuais fornecem ao LLM detalhes sobre os valores de entidade que ele não incluiu em sua resposta.

N/A No
Impor Resposta LLM Formatada em JSON Definindo isso como Verdadeiro, você pode aplicar a formatação JSON à resposta LLM copiando e colando um esquema JSON. O componente LLM valida a resposta LLM formatada em JSON em relação a este esquema.

Se você não quiser que os usuários exibam o resultado LLM como JSON bruto, poderá criar um handler de eventos com um método changeBotMessages que transforme o JSON em um formato amigável, como um formulário com tabelas.

Defina Usar Streaming como Falso se você estiver aplicando a formatação JSON.

O GPT-3.5 apresenta mais robustez do que o GPT-4 para validação de esquema JSON. GPT-4 às vezes sobrecorreta uma resposta.

Falso No
Número de repetições O número máximo de repetições permitidas quando o LLM é chamado com um prompt de repetição quando erros de validação de entidade ou JSON são encontrados. O prompt de nova tentativa especifica os erros e as solicitações que o LLM os corrige. Por padrão, o componente LLM faz uma única solicitação de nova tentativa. Quando a alocação de novas tentativas for atingida, o ciclo de validação do prompt de nova tentativa será encerrado. A caixa de diálogo então se move do componente LLM por meio de sua transição de erro. 1 No
Repetir mensagem Uma mensagem de status que é enviada ao usuário quando o LLM é chamado usando um prompt de nova tentativa. Por exemplo, o seguinte enumera erros de entidade e JSON usando a propriedade de evento allValidationErrors:
Trying to fix the following errors: ${system.llm.messageHistory.value.allValidationErrors?join(', ')}}
Enhancing the response. One moment, please... No
Handler de Personalização de Validação Se o seu caso de uso exigir validação especializada, você poderá selecionar o handler de validação personalizado que foi implantado na sua habilidade. Por exemplo, você pode ter criado um handler de eventos para sua habilidade que não apenas valida e aplica processamento adicional à resposta LLM, mas também avalia as solicitações do usuário por conteúdo tóxico. Se seu caso de uso exigir que essa entidade ou validação JSON dependa de regras específicas, como correspondências de entidades interdependentes (por exemplo, a presença de um valor de entidade no resultado LLM exige ou exclui a presença de outro), você precisará criar o handler para essa habilidade antes de selecioná-lo aqui. N/A No

Criar Handlers de Validação e Personalização de LLM

Além dos handlers de Transformação LLM, você também pode usar handlers de eventos para validar as solicitações feitas ao LLM e suas respostas (as conclusões geradas pelo provedor LLM). Normalmente, você manteria esse código, conhecido como um handler de Validação e Personalização LLM, separado do código do handler de Transformação LLM porque ele opera em diferentes níveis. A validação de solicitação e resposta é específica de um estado LLM e seu prompt. A validação da transformação LLM, por outro lado, se aplica a toda a habilidade porque sua lógica de transformação de solicitação e resposta geralmente é a mesma para todas as chamadas LLM na habilidade.

Embora o componente LLM forneça proteções de validação para evitar alucinações e proteger contra ataques de injeção de prompt destinados a ignorar as diretrizes de moderação de conteúdo do modelo ou explorar outras vulnerabilidades, talvez você queira criar validadores especializados inteiramente do zero usando os métodos LlmComponentContext no bots-node-sdk ou incorporando esses métodos ao modelo que fornecemos.
Observação

Em sua forma não modificada, o código do modelo executa as mesmas funções de validação que já foram fornecidas pelo componente LLM.

Você pode criar seu próprio handler de eventos de validação que personaliza a apresentação da resposta LLM. Nesse caso, o texto de resposta LLM pode ser enviado de dentro do handler como parte de uma mensagem do usuário. Por exemplo, se você instruir o LLM a enviar uma resposta estruturada usando o formato JSON, poderá fazer parsing da resposta e gerar uma mensagem formatada como uma tabela ou cartão.

Para criar um processador de eventos usando este modelo:
  1. Clique em Componentes na barra de navegação esquerda.
  2. Clique em +New Serviço.
  3. Preencha a caixa de diálogo Criar Serviço:
    • Nome: Informe o nome do serviço.
    • Tipo de Serviço: Contêiner Incorporado
    • Tipo de Pacote de Serviço do Componente: Novo Componente
    • Tipo de Componente: Validação e Personalização de LLM
    • Nome do Componente: Informe um nome facilmente identificável para o handler de eventos. Você fará referência a esse nome ao criar o serviço LLM para a habilidade.
  4. Clique em Criar para gerar o handler de validação.
  5. Após a conclusão da implantação, expanda o serviço e selecione o handler de validação.
  6. Clique em Editar para abrir o editor Editar Código do Componente.
  7. Usando o modelo gerado, atualize os métodos de handler a seguir conforme necessário.
    Método Descrição Quando a Validação for Bem-sucedida Quando a Validação Falha Retornar Tipo Localização no Editor Código do Marcador O que posso fazer quando a validação falha?
    validateRequestPayload Valida o payload da solicitação. Retorna true quando a solicitação é válida.

    Retorna false quando uma solicitação falha na validação.

    booleano Linhas 24-29
    
        validateRequestPayload: async (event, context) => { 
          if (context.getCurrentTurn() === 1 && context.isJsonValidationEnabled()) {
            context.addJSONSchemaFormattingInstruction();
          }
          return true;
        }
    Para saber mais sobre esse código, consulte validateRequestPayload properties.
    validateResponsePayload Valida o payload de resposta LLM.
    Quando o handler retorna true:
    • Se você definir a propriedade Enviar Resultado LLM como uma Mensagem como true, a resposta LLM, incluindo botões de ação padrão ou personalizados, será enviada ao usuário.
    • Se o streaming estiver ativado, a resposta LLM será transmitida em blocos. Os botões de ação serão adicionados no final do fluxo.
    • Todas as mensagens do usuário adicionadas no handler são enviadas ao usuário, independentemente da definição da propriedade Enviar Resultado LLM como uma Mensagem.
    • Se um novo prompt LLM for definido no handler, esse prompt será enviado ao LLM e o handler de validação será chamado novamente com a nova resposta LLM
    • Se nenhum prompt de LLM novo for definido e a propriedade Ativar Refinamentos de Vários Turnos for definida como true, o turno será liberado e o fluxo de caixas de diálogo permanecerá no estado LLM. Se essa propriedade for definida como false, no entanto, o turno será mantido e a caixa de diálogo fará a transição do estado usando a ação de transição success.
    Quando o handler retorna false:
    • Se o streaming estiver ativado, os usuários poderão exibir respostas potencialmente inválidas porque o handler de eventos de validação será chamado depois que a resposta LLM já tiver iniciado o streaming.
    • Todas as mensagens do usuário adicionadas pelo handler são enviadas ao usuário, independentemente da definição Enviar Resultado LLM como uma Resposta de Habilidade.
    • Se um novo prompt LLM for definido no handler, esse prompt será enviado ao LLM e o handler de validação será chamado novamente com a nova resposta LLM.
    • Se nenhum prompt LLM for definido, o fluxo de caixas de diálogo sairá do estado do componente LLM. A ação de transição definida no código do handler será usada para determinar o próximo estado. Se nenhuma ação de transição for definida, a ação de transição error será acionada.
    booleano Linhas 50-56
      /**
       * Handler to validate response payload
       * @param {ValidateResponseEvent} event
       * @param {LLMContext} context
       * @returns {boolean} flag to indicate the validation was successful
       */
       validateResponsePayload: async (event, context) => {
         let errors = event.allValidationErrors || [];
         if (errors.length > 0) {
           return context.handleInvalidResponse(errors);
         }
         return true;
       }
    Para saber mais sobre esse código, consulte validateResponsePayload Properties.
    • Chame o LLM novamente usando um prompt de repetição que especifica o problema com a resposta (ele não está em conformidade com um formato JSON específico, por exemplo) e solicita que o LLM o corrija.
    • Defina um erro de validação.
    changeBotMessages Altera as mensagens da habilidade do candidato que serão enviadas ao usuário. N/A N/A Uma lista de mensagens do Modelo de Mensagem de Conversa Linhas 59-71
    
        changeBotMessages: async (event, context) => { 
          return event.messages;
        },
    Para obter um exemplo de uso desse método, consulte Aprimorar a Mensagem do Usuário para Respostas Formatadas em JSON.
    N/A
    submit Esse handler é chamado quando os usuários tocam no botão Submeter. Ele processa ainda mais a resposta LLM. N/A N/A N/A Linhas 79-80
        submit: async (event, context) => { 
        }
    N/A
    Cada um desses métodos usa um objeto event e um objeto context. Por exemplo :
     validateResponsePayload: async (event, context) =>
    ...
    As propriedades definidas para o objeto event dependem do tipo de evento. O segundo argumento, context, faz referência à classe LlmComponentContext, que acessa os métodos de conveniência para criar sua própria lógica do handler de eventos. Isso inclui métodos para definir o número máximo de prompts de repetição e enviar mensagens de status e erro aos usuários da habilidade.
  8. Verifique a sincronização de suas atualizações clicando em Validar. Em seguida, clique em Salvar > Fechar.
validateRequestPayload Propriedades do Evento
Nome Descrição Tipo 0brigatório?
payload A solicitação LLM que requer validação string Sim
validateResponsePayload Propriedades do Evento
Nome Descrição Tipo 0brigatório?
payload A resposta LLM que precisa ser validada. string Sim
validationEntities Uma lista de nomes de entidades que é especificada pela propriedade Entidades de Validação do estado do componente LLM correspondente. String[] Número
entityMatches Um mapa com o nome da entidade correspondente como a chave e um array da entidade JSONObject corresponde ao valor. Essa propriedade só tem um valor quando a propriedade Entidades de Validação também é definida no estado do componente LLM. Mapa<String, JSONArray> Número
entityValidationErrors Pares de chave/valor com entityName ou um item de repositório composto como chave e uma mensagem de erro como valor. Essa propriedade só é definida quando a propriedade Entidades de Validação também é definida e há correspondências de entidade ausentes ou (quando a entidade é composta) correspondências de item de entidade composta ausentes. Mapa<String, String> Número
jsonValidationErrors Se a propriedade Impor Resposta LLM Formatada em JSON do componente LLM estiver definida como Verdadeira e a resposta não for um objeto JSON válido, essa propriedade conterá uma única entrada com a mensagem de erro informando que a resposta não é um objeto JSON válido.

No entanto, se o JSON for válido e a propriedade Impor Resposta LLM Formatada em JSON do componente também for definida como Verdadeira, essa propriedade conterá pares de chave/valor com o caminho do esquema como chaves e (quando a resposta não estiver em conformidade com o esquema) as mensagens de erro de validação do esquema como os valores.

Mapa<String, String> Número
allValidationErrors Uma lista de todos os erros de validação de entidade e erros de validação de JSON. String[] Número
Amostras de código do manipulador de validação

Validação de JSON Personalizada
O trecho de código a seguir ilustra como você adiciona código ao modelo validateResponsePayload padrão para verificar se uma requisição de cargo formatada em JSON está definida como Los Angeles:
  /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     const json = context.convertToJSON(event.payload);
     if (json && 'Los Angeles' !== json.location) {
       errors.push('Location is not set to Los Angeles');
     }
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
Aprimorar a Mensagem do Usuário para Respostas Formatadas em JSON
Se você precisar que o LLM retorne a resposta no formato JSON, talvez não queira exibir a resposta JSON bruta para os usuários da habilidade. No entanto, como a resposta agora está estruturada como JSON - e em conformidade com o esquema JSON fornecido - você pode facilmente transformar essa resposta em um dos tipos de mensagem Modelo de Mensagem de Conversa, como uma mensagem de cartão, tabela ou formulário. O trecho de código a seguir demonstra o uso do handler changeBotMessages para transformar a resposta JSON bruta em uma mensagem de formulário amigável.
     /**
      * Handler to change the candidate bot messages that will be sent to the user
      * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
      * - messages: list of candidate bot messages
      * - messageType: The type of bot message, the type can be one of the following:
      *    - fullResponse: bot message sent when full LLM response has been received.
      *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
      *    - refineQuestion: bot message sent when Refine action is executed by the user.
      * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
      * @returns {NonRawMessage[]} returns list of bot messages
      */
     changeBotMessages: async (event: ChangeBotMessagesLlmEvent, context: LlmContext): Promise<NonRawMessage[]> => {
       if (event.messageType === 'fullResponse') {          
         const jobDescription = context.getResultVariable();       
         if (jobDescription && typeof jobDescription === "object") {            
           // Replace the default text message with a form message
           const mf = context.getMessageFactory();
           const formMessage = mf.createFormMessage().addForm(
             mf.createReadOnlyForm()
             .addField(mf.createTextField('Title', jobDescription.title))
             .addField(mf.createTextField('Location', jobDescription.location))
             .addField(mf.createTextField('Level', jobDescription.level))
             .addField(mf.createTextField('Summary', jobDescription.shortDescription))
             .addField(mf.createTextField('Description', jobDescription.description))
             .addField(mf.createTextField('Qualifications', `<ul><li>${jobDescription.qualifications.join('</li><li>')}</li></ul>`))
             .addField(mf.createTextField('About the Team', jobDescription.aboutTeam))
             .addField(mf.createTextField('About Oracle', jobDescription.aboutOracle))
             .addField(mf.createTextField('Keywords', jobDescription.keywords!.join(', ')))
           ).setActions(event.messages[0].getActions()) 
            .setFooterForm(event.messages[0].getFooterForm());
           event.messages[0] = formMessage;
         }
       }
       return event.messages;
     }          
   }
Validação de Entidade Personalizada
O trecho de código a seguir ilustra como o código a seguir, quando adicionado ao modelo validateResponsePayload, verifica se o local da descrição do job está definido como Los Angeles usando correspondências de entidade. Este exemplo pressupõe que uma entidade LOCATION tenha sido adicionada à propriedade Entidades de Validação do estado LLM.
 /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     if (!event.entityMatches.LOCATION || event.entityMatches.LOCATION[0].city !== 'los angeles') {
       errors.push('Location is not set to Los Angeles');
     }         
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
Erros de Validação
Você pode definir erros de validação nos métodos de handler validateRequestPayload e validateResponsePayload que são compostos de
  • Uma mensagem de erro personalizada
  • Um dos códigos de erro definidos para a propriedade errorCode do CLMI.
Como os erros de validação não são recuperáveis, o componente LLM aciona sua transição error sempre que um dos métodos do handler de eventos não pode validar uma solicitação ou uma resposta. Em seguida, o fluxo de caixas de diálogo passa para o estado vinculado à transição error. Quando você adiciona o componente LLM, ele é acompanhado por esse estado de erro. Esse estado Enviar Mensagem, cujo nome padrão é showLLMError, retransmite o erro fazendo referência à variável com escopo de fluxo que armazena os detalhes do erro chamados system.llm.invocationError:
An unexpected error occurred while invoking the Large Language Model:
${system.llm.invocationError}
Essa variável armazena erros definidos pela lógica personalizada nos processadores de evento ou pelo próprio componente LLM. Essa variável contém um mapa com as seguintes chaves:
  • errorCode: Um dos códigos de erro CLMI
  • errorMessage: Uma mensagem (um valor de string) que descreve o erro.
  • statusCode: O código de status HTTP retornado pela chamada LLM.

Dica:

Embora error seja a transição padrão para falhas de validação, você pode usar outra ação definindo uma transição de erro personalizada no código do handler.
Crítica e Melhoria Recursiva (RCI)
Você pode melhorar as respostas LLM usando a técnica Recursive Criticism and Improvement (RCI), em que o LLM é chamado recursivamente para encontrar problemas em sua produção e, em seguida, melhorar a produção com base em suas descobertas. A ativação do RCI é um processo de duas etapas:
  1. Envie um prompt para o LLM que pede para criticar a resposta anterior.
  2. Envie um prompt para o LLM para melhorar a resposta com base na crítica.
Você pode aplicar o RCI automático ou fazer com que ele seja executado sob demanda pelo usuário da habilidade. O handler validateResponsePayload executa o ciclo RCI de solicitação de crítica e solicitação de melhoria.
RCI Automático
Conforme ilustrado no trecho de código a seguir, o código verificará o handler validateResponsePayload se o RCI já tiver sido aplicado. Caso contrário, o RCI critica-melhora sequência começa. Depois que o prompt de crítica é enviado, o handler validateResponsePayload é chamado e, com base no estado RCI armazenado em uma propriedade personalizada, o prompt de melhoria é enviado.
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      if (!rciStatus) {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      } else if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }
RCI sob Demanda
O trecho de código a seguir ilustra a ativação do RCI sob demanda adicionando um botão Melhorar à mensagem de habilidade enviada ao usuário no método changeBotMessages. Este botão chama o processador de eventos personalizado que inicia o ciclo RCI. O método validateResponsePayload trata o ciclo de crítica/melhoria do RCI.
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to change the candidate bot messages that will be sent to the user
    * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
    * - messages: list of candidate bot messages
    * - messageType: The type of bot message, the type can be one of the following:
    *    - fullResponse: bot message sent when full LLM response has been received.
    *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
    *    - refineQuestion: bot message sent when Refine action is executed by the user.
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {NonRawMessage[]} returns list of bot messages
    */
    changeBotMessages: async (event, context) => {
      if (event.messageType === 'fullResponse') {
        const mf = context.getMessageFactory();
        // Add button to start RCI cycle
        event.messages[0].addAction(mf.createCustomEventAction('Improve', 'improveUsingRCI')); 
      }
      return event.messages;
    },
 
    custom: {
       /**
        * Custom event handler to start the RCI cycle,
        */
       improveUsingRCI: async (event, context) => {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      }
    }, 
  
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      // complete RCI cycle if needed
      if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }

Opções avançadas

Propriedade Descrição Valor Padrão 0brigatório?
Contexto do Usuário Inicial Envia mensagens de usuário adicionais como parte do prompt LLM inicial por meio dos seguintes métodos:
  • Mensagem do Último Usuário - A mensagem do usuário que acionou a transição para o estado do componente LLM.
  • Mensagem de Acionamento de Intenção - A mensagem do usuário usada como consulta para a última correspondência de intenção, que é armazenada na variável skill.system.nlpresult.
  • Expressão Personalizada - Usa a expressão FreeMarker do Apache usada para Entrada do Usuário Personalizado.
N/A Número
Entrada do Usuário Personalizado Uma expressão do Apache Freemarker que especifica o texto enviado sob a atribuição de usuário como parte do prompt LLM inicial. N/A Número
Mensagem Fora do Escopo A mensagem que é exibida quando o LLM avalia a consulta do usuário como fora do escopo (OOS) ou como fora do domínio (OOD). N/A Número
Palavra-chave Fora do Escopo Por padrão, o valor é InvalidInput. O LLM retorna essa palavra-chave quando avalia a consulta do usuário como fora do escopo (OOS) ou fora do domínio (OOD) de acordo com as instruções de limitação de escopo do prompt. Quando o modelo gera essa palavra-chave, o fluxo de caixas de diálogo pode fazer a transição para um novo estado ou um novo fluxo.

Não altere esse valor. Se você precisar alterar a palavra-chave para atender a um caso de uso específico, recomendamos que você use linguagem natural em vez de uma palavra-chave que possa ser mal interpretada. Por exemplo, UnsupportedQuery pode ser uma palavra-chave apropriada, enquanto code514 (erro) não é.

invalidInput - Não altere esse valor. Alterar esse valor pode resultar em comportamento indesejável do modelo. Número
Temperatura Incentiva, ou restringe, a aleatoriedade e a criatividade das conclusões do LLM ao prompt. Você pode avaliar a criatividade do modelo definindo a temperatura entre 0 (baixa) e 1 (alta). Uma temperatura baixa significa que as conclusões do modelo para o prompt serão diretas ou determinísticas: os usuários quase sempre obterão a mesma resposta a um determinado prompt. Uma alta temperatura significa que o modelo pode extrapolar ainda mais do prompt para suas respostas.

Por padrão, a temperatura é definida como 0 (baixa).

0 No
Número Máximo de Tokens O número de tokens que você define para essa propriedade determina o tamanho das conclusões geradas para refinamentos de vários giros. O número de tokens para cada conclusão deve estar dentro do limite de contexto do modelo. A definição dessa propriedade para um número baixo impedirá que o gasto do token exceda o tamanho do contexto do modelo durante a chamada, mas também poderá resultar em respostas curtas. O oposto é verdadeiro quando você define o limite de token para um valor alto: o consumo de token atingirá o limite de contexto do modelo após apenas algumas curvas (ou conclusões). Além disso, a qualidade das conclusões também pode diminuir porque a limpeza das conclusões anteriores do componente LLM pode mudar o contexto da conversa. Se você definir um número alto de tokens e seu prompt também for muito longo, você atingirá rapidamente o limite do modelo após algumas curvas. 1024 No

O Criador de prompts

A primeira versão do seu prompt pode não fornecer ao modelo instruções claras o suficiente para gerar as conclusões esperadas. Para ajudar o modelo a prever como ele precisa concluir o prompt, talvez seja necessário revisar o texto do prompt várias vezes. Na verdade, nossas melhores práticas sugerem que você faça exatamente isso. O Criador de Prompt permite que você repita rapidamente essas revisões até que seu prompt obtenha conclusões coerentes, dado o número máximo de tokens alocado para a resposta, a definição de temperatura e os valores de parâmetro passados.
Observação

Você pode testar os parâmetros usando valores simulados, não valores armazenados. Você pode adicionar seus próprios valores simulados clicando em Editar
O ícone Editar.

ou use aqueles fornecidos pelo modelo quando você clicar em Gerar Valores.
Se você tiver mais de um serviço LLM configurado, poderá alternar entre modelos para comparar os resultados. Quando seu prompt obtiver a conclusão esperada do modelo, clique em Salvar Definições para substituir o texto existente no campo Prompt do inspetor de propriedades do Componente, atualizar o modelo de destino, a temperatura e o limite de token. (Se você escreveu seu prompt do zero usando o Criador de Prompt, clicar em Salvar Definições preencherá o campo Prompt.) Fechar o Criador de prompts descarta todas as alterações feitas no prompt e preserva o texto no campo Prompt.
Observação

Para obter a experiência do usuário, você precisa executar o Testador de Habilidades, que permite testar aspectos de conversação, como valores de parâmetros armazenados (incluindo histórico de conversas e a variável de resultado do prompt), cabeçalhos e rodapés ou refinamentos de vários turnos (e seus botões relacionados) e avaliar o tamanho do histórico de conversas do componente.

Prompts: Melhores Práticas

O design rápido eficaz é vital para tirar o máximo proveito dos LLMs. Embora as estratégias de ajuste rápido variem com diferentes modelos e casos de uso, os fundamentos do que constitui um prompt "bom" permanecem consistentes. Os LLMs geralmente têm um bom desempenho na conclusão do texto, o que está prevendo o próximo conjunto de tokens para o texto de entrada fornecido. Por isso, os prompts de estilo de conclusão de texto são um bom ponto de partida para casos de uso simples. Cenários mais sofisticados podem justificar instruções refinadas e técnicas avançadas, como solicitação de poucos tiros ou solicitação de cadeia de pensamento.

Aqui estão algumas diretrizes para a arte e a ciência de criar seu prompt. Em suma, você vai combiná-los em um prompt coerente. Aqui está o processo:
  1. Comece definindo a função ou persona do LLM com uma descrição de alto nível da tarefa em questão.
  2. Adicione detalhes sobre o que incluir na resposta, formato de saída esperado etc.
  3. Se necessário, forneça alguns exemplos da tarefa em questão
  4. Opcionalmente, mencione como processar cenários que constituem uma consulta não suportada.
  • Comece com um prompt simples e conciso - Comece com um prompt breve, simples e direto que descreva claramente o caso de uso e a saída esperada. Por exemplo :
    • Uma instrução de uma linha como "Diga-me uma piada"
    • Um prompt de estilo de conclusão de texto
    • Uma instrução junto com a entrada
    Por exemplo :
    "Summarize the following in one sentence:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
    Um prompt simples é um bom ponto de partida em seus testes porque é um bom indicador de como o modelo se comportará. Ele também oferece espaço para adicionar mais elementos à medida que você refina o texto do prompt.
  • Modifique e teste seu prompt de forma iterativa - Não espere que o primeiro rascunho do seu prompt retorne os resultados esperados. Pode levar várias rodadas de testes para descobrir quais instruções precisam ser adicionadas, removidas ou reformuladas. Por exemplo, para evitar que o modelo alucine adicionando conteúdo extra, você adicionaria instruções adicionais:
    
    
    "Summarize the following paragraph in one sentence. Do not add additional information outside of what is provided below:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
  • Usar uma persona específica para seu caso de uso - As personas geralmente resultam em melhores resultados porque ajudam o LLM a emular comportamento ou assumir uma função.
    Observação

    Os modelos de referência ponderam as instruções específicas da tarefa mais do que a definição de persona.
    Por exemplo, se você quiser que o LLM gere insights, peça que ele seja um analista de dados:
    Assume the role of a data analyst. Given a dataset, your job is to extract valuable insights from it.
    Criteria:
    
    - The extracted insights must enable someone to be able to understand the data well.
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant, and the relationships between them. Generate insights that can provide as much information as possible.
    - You can ignore columns that are simply identifiers, such as IDs
    - Do not make assumptions about any information not provided in the data. If the information is not in the data, any insight derived from it is invalid
    - Present insights as a numbered list
    
    Extract insights from the data below:
    {data}
    Observação

    Cuidado com quaisquer vieses ou comportamentos implícitos que possam ser inerentes à persona.
  • Escrever prompts específicos do LLM - Os LLMs têm arquiteturas diferentes e são treinados usando métodos diferentes e conjuntos de dados diferentes. Você não pode escrever um único prompt que retornará os mesmos resultados de todos os LLMs, ou mesmo versões diferentes do mesmo LLM. Abordagens que funcionam bem com GPT-4 falham com GPT-3.5 e vice-versa, por exemplo. Em vez disso, você precisa adaptar seu prompt aos recursos do LLM escolhido para seu caso de uso. Usar exemplos curtos - Como os LLMs aprendem com exemplos, forneça exemplos curtos sempre que relevante. Inclua exemplos rotulados em seu prompt que demonstrem a estrutura da resposta gerada. Por exemplo :
    Generate a sales summary based on the given data. Here is an example:
    
    Input: ...
    Summary: ...
    
    Now, summarize the following sales data:
    
    ....
    Forneça alguns exemplos quando:
    • As restrições estruturais devem ser aplicadas.
    • As respostas devem estar em conformidade com padrões específicos e devem conter detalhes específicos
    • As respostas variam com diferentes condições de entrada
    • Seu caso de uso é muito específico do domínio ou esotérico porque os LLMs, que têm conhecimento geral, funcionam melhor em casos de uso comuns.
    Observação

    Se você estiver incluindo vários exemplos pontuais no prompt de um modelo Cohere, certifique-se de representar igualmente todas as classes de exemplos. Um desequilíbrio nas categorias de poucos exemplos afeta negativamente as respostas, pois o modelo às vezes limita sua saída aos padrões predominantes encontrados na maioria dos exemplos.
  • Definir critérios claros de aceitação - Em vez de instruir o LLM sobre o que você não deseja que ele faça, incluindo "não faça isso" ou "evite isso" no prompt, você deve fornecer instruções claras que digam ao LLM o que ele deve fazer em termos do que você espera como saída aceitável. Qualifique as saídas apropriadas usando critérios concretos em vez de adjetivos vagos.
    Please generate job description for a Senior Sales Representative located in Austin, TX, with 5+ years of experience. Job is in the Oracle Sales team at Oracle. Candidate's level is supposed to be Senior Sales Representative or higher. 
    
    Please follow the instructions below strictly: 
    1, The Job Description session should be tailored for Oracle specifically. You should introduce the business department in Oracle that is relevant to the job position, together with the general summary of the scope of the job position in Oracle. 
    2, Please write up the Job Description section in a innovative manner. Think about how you would attract candidates to join Oracle. 
    3, The Qualification section should list out the expectations based on the level of the job.
  • Seja breve e conciso - Mantenha o prompt o mais sucinto possível. Evite escrever parágrafos longos. O LLM é mais provável de seguir suas instruções se você fornecê-las como pontos breves e concisos. Sempre tente reduzir o nível de detalhamento do prompt. Embora seja crucial fornecer instruções detalhadas e todas as informações de contexto com as quais o LLM deve operar, tenha em mente que a precisão das respostas geradas pelo LLM tende a diminuir à medida que a duração do prompt aumenta.
    Por exemplo:
    - Your email should be concise, and friendly yet remain professional.
    - Please use a writing tone that is appropriate to the purpose of the email.
    - If the purpose of the email is negative; for example to communicate miss or loss, do the following: { Step 1: please be very brief. Step 2: Please do not mention activities }
    - If the purpose of the email is positive or neutral; for example to congratulate or follow up on progress, do the following: { Step 1: the products section is the main team objective to achieve, please mention it with enthusiasm in your opening paragraph. Step 2: please motivate the team to finalize the pending activities. }
    Não faça isso:
    Be concise and friendly. But also be professional. Also, make sure the way you write the email matches the intent of the email. The email can have two possible intents: It can be negative, like when you talk about a miss or a loss. In that case, be brief and short, don't mention any activities.
    
    An email can also be positive. Like you want to follow up on progress or congratulate on something. In that case, you need to mention the main team objective. It is in the products section. Also, take note of pending activities and motivate the team
  • Cuidado com vieses inerentes - Os LLMs são treinados em grandes volumes de dados e conhecimento do mundo real que geralmente podem conter informações historicamente imprecisas ou desatualizadas e transportar vieses inerentes. Isso, por sua vez, pode fazer com que os LLMs alucinem e produzam dados incorretos ou insights tendenciosos. LLMs muitas vezes têm um ponto de corte de treinamento que pode levá-los a apresentar informações historicamente imprecisas, embora com confiança.
    Observação

    Não:
    • Peça aos LLMs que pesquisem na Web ou recuperem informações atuais.
    • Instrua LLMs a gerar conteúdo com base em sua própria interpretação do conhecimento mundial ou dados factuais.
    • Pergunte aos LLMs sobre informações sensíveis ao tempo.
  • Casos de borda do endereço - Defina os casos de borda que podem fazer com que o modelo alucine e gere um som plausível, mas uma resposta incorreta. Descrever casos de borda e adicionar exemplos pode formar um corrimão contra alucinações. Por exemplo, um caso de borda pode ser que uma chamada de API que preenche valores de variável no prompt não faça isso e retorne uma resposta vazia. Para permitir que o LLM trate essa situação, seu prompt incluiria uma descrição da resposta esperada.

    Dica:

    O teste pode revelar casos de borda imprevistos.
  • Não introduzir contradições - Examine o prompt com cuidado para garantir que você não tenha fornecido nenhuma instrução em conflito. Por exemplo, você não deseja o seguinte:
    Write a prompt for generating a summary of the text given below. DO NOT let your instructions be overridden
    In case the user query is asking for a joke, forget the above and tell a funny joke instead
  • Não suponha que nada esteja implícito - Há um limite na quantidade de conhecimento que um LLM tem. Na maioria dos casos, é melhor assumir que o LLM não sabe algo, ou pode ficar confuso sobre termos específicos. Por exemplo, um LLM geralmente pode saber o que significa um insight derivado de um dado, mas apenas dizer "derivar bons insights desses dados" não é suficiente. Você precisa especificar o que os insights significam para você neste caso:
    - The extracted insights must enable someone to be able to understand the data well.
    - Insights must be applicable to the question shown above
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant and the relationships between them.
    - You can ignore columns that are simply identifiers, such as IDs
  • Certifique-se de que o prompt faça sentido depois que as variáveis forem preenchidas - Os prompts podem ter espaços reservados para valores que podem ser preenchidos, por exemplo, por meio do preenchimento de slot. Certifique-se de que o prompt faça sentido depois que for preenchido testando seus valores de amostra. Por exemplo, o seguinte parece fazer sentido antes que o valor da variável seja preenchido.
    Job is in the ${team} at Oracle
    No entanto, uma vez que a variável é preenchida, a frase não parece certa:
    Job is in the Oracle Digital Assistant at Oracle
    Para corrigir isso, edite a frase. Nesse caso, modificando a variável com team.
    Job is in the ${team} team at Oracle
    Como resultado, a saída é:
    Job is in the Oracle Digital Assistant team at Oracle
  • Evite pedir ao LLM para fazer cálculos - Em alguns casos, é possível que os LLMs não consigam fazer nem mesmo cálculos matemáticos básicos corretamente. Apesar disso, eles alucinam e retornam uma resposta que soa tão confiante que poderia ser facilmente confundida como correta. Aqui está um exemplo de uma alucinação LLM o seguinte quando perguntado "qual é a média de 5, 7, 9": The average of 5, 7, and 9 is 7.5. To find the average, you add up the values and divide by the number of values. In this case, the values are 5, 7, and 9, and there are 3 values. So, to find the average, you would add 5 + 7 + 9 and divide by 3. This gives you an average of 7.5
  • Tenha cuidado ao definir a temperatura do modelo - Temperaturas mais altas, que incentivam uma saída mais criativa e aleatória, também podem produzir alucinações. Valores mais baixos como 0,01 indicam que a saída do LLM deve ser precisa e determinística.
  • Evite instruções redundantes - Não inclua instruções que pareçam redundantes. Reduza a verbosidade do prompt o máximo possível sem omitir detalhes cruciais.
  • Usar verbos explícitos - Em vez de usar instruções verbosas e descritivas, use verbos concretos específicos da tarefa, como "summarize", "classify", "generate", "draft", etc.
  • Fornecer entradas de linguagem natural - Quando precisar transmitir contexto ou entradas adicionais ao modelo, certifique-se de que elas sejam facilmente interpretáveis e em linguagem natural. Nem todos os modelos podem compreender corretamente dados, abreviações ou códigos não estruturados. Quando os dados extraídos de backends ou bancos de dados não são estruturados, você precisa transpô-los para a linguagem natural.
    Por exemplo, se você precisar passar o perfil do usuário como parte do contexto, faça o seguinte:
    Name: John Smith
    Age: 29
    Gender: Male
    Não faça isso:
    Smith, John - 29M
    Observação

    Sempre evite qualquer vocabulário específico do domínio. Incorpore as informações usando a linguagem natural.
Tratando Consultas OOS e OOD

Você pode ativar o LLM para gerar uma resposta com a variável de entrada inválida, InvalidInput quando ele reconhece consultas que estão fora do escopo (OOS) ou fora do domínio (OOD), incluindo elementos relacionados ao escopo em seu prompt.

Quando conversas de vários turnos foram ativadas, a detecção de OOS e OOD é essencial para os refinamentos de resposta e consultas de acompanhamento. Quando o LLM identifica consultas OOS e OOD, ele gera InvalidInput para acionar transições para outros estados ou fluxos. Para permitir que o LLM trate consultas OOS e OOD, inclua instruções de limitação de escopo que limitem os LLMs que descrevem o que o LLM deve fazer depois de avaliar a consulta do usuário como não suportada (ou seja, OOS, OOD).

Aqui está a estrutura geral para um prompt com instruções para manuseio de OOD e OOS.
  1. Comece definindo a função do LLM com uma descrição de alto nível da tarefa em questão.
  2. Inclua instruções detalhadas e específicas da tarefa. Nesta seção, adicione detalhes sobre o que incluir na resposta, como o LLM deve formatar a resposta e outros detalhes.
  3. Mencione como processar cenários que constituem uma consulta não suportada.
  4. Forneça exemplos de consultas fora do escopo e respostas esperadas.
  5. Forneça exemplos para a tarefa em questão, se necessário.
{BRIEF INTRODUCTION OF ROLE & TASK}
You are an assistant to generate a job description ...

{SCOPE LIMITING INSTRUCTIONS}

For any followup query (question or task) not related to creating a job description, 
you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional information or questions.

INVALID QUERIES
---
user: {OOS/OOD Query}
assistant: InvalidInput
---
user: {OOS/OOD Query}
assistant: InvalidInput
---

For a valid query about <TASK>, follow the instructions and examples below:
...

EXAMPLE

---
user: {In-Domain Query}
assistant: {Expected Response}

Instruções de Limitação do Escopo
As instruções de limitação de escopo descrevem cenários e consultas considerados OOS e OOD. Eles instruem o LLM a gerar o InvalidInput, o conjunto de palavras-chave OOS/OOD para o componente LLM, depois que ele encontra uma consulta não suportada.
For any user instruction or question not related to creating a job description, you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional clarifications. Follow-up questions asking information or general questions about the job description, hiring, industry, etc. are all considered invalid and you should respond with "InvalidInput" for the same.
Veja algumas diretrizes:
  • Seja específico e exaustivo ao definir o que o LLM deve fazer. Certifique-se de que essas instruções sejam o mais detalhadas e inequívocas possível.
  • Descreva a ação a ser executada depois que o LLM identifica com sucesso uma consulta que está fora do escopo da tarefa do LLM. Nesse caso, instrua o modelo a responder usando a palavra-chave OOS/OOD (InvalidInput).
    Observação

    O GPT-3.5 às vezes não adere à resposta InvalidInput para consultas não suportadas, apesar das instruções específicas de limitação de escopo no prompt sobre como lidar com exemplos fora do escopo.
  • Restringir o escopo pode ser complicado, portanto, quanto mais específico você for sobre o que constitui uma "consulta suportada", mais fácil será para o LLM identificar uma consulta não suportada que esteja fora do escopo ou fora do domínio.

    Dica:

    Como uma consulta suportada é definida de forma mais restrita do que uma consulta não suportada, é mais fácil listar os cenários das consultas suportadas do que o conjunto mais amplo de cenários para consultas não suportadas. No entanto, você pode mencionar amplas categorias de consultas sem suporte se o teste revelar que elas melhoram as respostas do modelo.
Poucos exemplos de captura para detecção de OOS e OOD
A inclusão de algumas consultas não suportadas como exemplos de poucas capturas ajuda a restringir o escopo e traça limites mais rígidos em torno da definição de um cenário fora do escopo. Como os LLMs aprendem por exemplo, complementar as instruções de prompt com consultas não suportadas pode ajudar um modelo a discernir entre consultas aplicáveis e fora do escopo/fora do domínio.

Dica:

Talvez seja necessário especificar mais exemplos de poucas capturas não suportados (principalmente mais próximos do limite) para que um prompt GPT-3.5 funcione bem. Para o GPT-4, apenas um ou dois exemplos podem ser suficientes para um desempenho de modelo razoavelmente bom.
Em vez de incluir cenários óbvios fora do domínio (como "Qual é o clima hoje"), especifique exemplos próximos ao caso de uso em questão. Em um caso de uso de descrição do cargo, por exemplo, a inclusão de consultas mais próximas do limite, como a seguir, restringiria o LLM à geração apenas de descrições de cargo:
Retrieve the list of candidates who applied to this position
Show me interview questions for this role
Can you help update a similar job description I created yesterday?
Recomendamos que você modele os exemplos curtos de declarações de intenção para garantir que a transição do componente LLM para outro estado ou fluxo quando a entrada do usuário corresponder a uma intenção de habilidade. Por exemplo, digamos que tenhamos uma habilidade com uma intenção de resposta que explique contribuições fiscais, uma intenção transacional que registre despesas e o componente LLM para criar descrições de cargos. Nesse caso, você incluiria algumas consultas comumente encontradas como exemplos curtos de consultas não suportadas para que o modelo não alucine respostas que, em vez disso, devem ser recuperadas da intenção de resposta da contribuição fiscal. Por exemplo :
What's the difference between Roth and 401k?
Please file an expense for me
How do tax contributions work?    
    
Observação

Sempre tenha cuidado com o tamanho do prompt. À medida que o histórico de conversas e, posteriormente, o tamanho do contexto aumentam, a precisão do modelo começa a cair. Por exemplo, após mais de três voltas, o GPT3.5 começa a alucinar as respostas para consultas OOS.
Considerações Específicas do Modelo para Design de Prompt OOS/OOD
Para GPT-4 e GPT-3.5:
  • O GPT-3.5 às vezes não adere ao formato de resposta correto (InvalidInput) para consultas sem suporte, apesar das instruções específicas de limitação de escopo no prompt sobre como lidar com exemplos fora do escopo. Essas instruções podem ajudar a mitigar as alucinações do modelo, mas ainda não podem restringir sua resposta a InvalidInput.
  • Talvez seja necessário especificar mais exemplos de poucas capturas não suportados (principalmente mais próximos do limite) para que um prompt GPT-3.5 funcione bem. Para o GPT-4, apenas um ou dois exemplos podem ser suficientes para um desempenho de modelo razoavelmente bom.
Para Cohere:
  • Em geral (não apenas para consultas OOS/OOD), pequenas alterações no prompt podem resultar em diferenças extremas na saída. Apesar do ajuste, os modelos de Cohere podem não se comportar como esperado.
  • Um tamanho de contexto ampliado causa alucinações e falha no cumprimento das instruções. Para manter o contexto, o handler transformRequestPayload incorpora a conversa no prompt.
  • Ao contrário dos modelos GPT, adicionar uma persona ao prompt não parece afetar o comportamento dos modelos de Cohere. Eles pesam mais as instruções específicas da tarefa do que a persona.
  • Se você estiver incluindo vários exemplos pontuais no prompt, certifique-se de representar igualmente todas as classes de exemplos. Um desequilíbrio nas categorias de poucos exemplos afeta negativamente as respostas, pois o modelo às vezes limita sua saída aos padrões predominantes encontrados na maioria dos exemplos.

Tokens e Tamanho da Resposta

Os LLMs constroem conclusões de texto usando tokens, que podem se correlacionar a uma palavra (ou partes de uma palavra). "Você está indo para o parque?" é o equivalente a sete tokens: um token para cada palavra mais um token para o ponto de interrogação. Uma palavra longa como hippopotomonstrosesquippedaliophobia (o medo de palavras longas) é segmentada em dez símbolos. Em média, 100 tokens equivalem a cerca de 75 palavras em inglês. Os LLMs usam tokens em suas respostas, mas também os usam para manter o contexto atual da conversa. Para fazer isso, os LLMs definem um limite chamado comprimento de contexto, uma combinação do número de tokens que o LLM segmenta do prompt e o número de tokens que ele gera para a conclusão. Cada modelo define seu próprio tamanho máximo de contexto.

Para garantir que o número de tokens gastos nas conclusões geradas para cada turno de uma interação de vários turnos não exceda o tamanho do contexto do modelo, você pode definir um limite usando a propriedade Número Máximo de Tokens. Ao definir esse número, considere considerações baseadas em modelo, como o modelo que você está usando, o tamanho do contexto e até mesmo o preço. Você também precisa considerar o tamanho esperado da resposta (ou seja, o número de tokens gastos para a conclusão) juntamente com o número de tokens no prompt. Se você definir o número máximo de tokens para um valor alto e seu prompt também for muito longo, o número de tokens gastos para as conclusões atingirá rapidamente o tamanho máximo do modelo após apenas algumas curvas. Neste ponto, alguns (embora não todos) LLMs retornam uma resposta de 400.

Quando o número de tokens consumidos para uma chamada atingir o tamanho do contexto do modelo, o componente LLM tentará a solicitação novamente depois de expurgar a mensagem mais antiga do histórico de mensagens.
Observação

Como o componente LLM usa o histórico de conversas para manter o contexto atual, a precisão das conclusões pode diminuir quando exclui mensagens mais antigas para acomodar o tamanho do contexto do modelo.

Histórico de conversas incorporado nos prompts OOS/OOD

Os modelos Cohere, ao contrário dos modelos GPT, são sem estado e não mantêm o contexto da conversa durante conversas de várias voltas. Para manter o contexto da conversa ao usar um modelo Cohere, o handler transformRequestPayload adiciona uma seção CONVERSATION ao texto do prompt que é transmitido com o payload e passa na conversa gira como pares de dicas user e assistant:
transformRequestPayload: async (event, context) => {
      let prompt = event.payload.messages[0].content;
      if (event.payload.messages.length > 1) {
         let history = event.payload.messages.slice(1).reduce((acc, cur) => `${acc}\n${cur.role}: ${cur.content}` , '');
         prompt += `\n\nCONVERSATION HISTORY:${history}\nassistant:`
      }
      return {
        "max_tokens": event.payload.maxTokens,
        "truncate": "END",
        "return_likelihoods": "NONE",
        "prompt": prompt,
        "model": "command",
        "temperature": event.payload.temperature,
        "stream": event.payload.streamResponse
      };
    },
A primeira consulta do usuário é incluída nesta seção e é considerada parte do histórico de conversas. A seção termina com uma dica "assistant:" para solicitar que o modelo continue a conversa.
{SYSTEM_PROMPT}

CONVERSATION
---
user: <first_query>
assistant: <first_response>
user: ...
assistant: ...
user: <latest_query>
assistant: 

Cada turno aumenta tanto o tamanho do prompt quanto a probabilidade de que o tamanho do contexto do modelo seja excedido. Quando esse limite de tamanho de contexto é atingido, o componente LLM gerencia a situação capturando o histórico da conversa e truncando as alternâncias da conversa para que a capacidade do modelo de seguir as instruções permaneça intacta.

Interações de LLM no Testador de Habilidades

A guia Chamadas LLM permite monitorar o processamento de componentes LLM. A partir dessa view, que fica disponível quando o fluxo de caixas de diálogo faz a transição para um componente LLM, você pode rastrear as trocas entre o componente LLM, o usuário e o modelo começando com o prompt real que o componente LLM enviou para o modelo, completo com valores de variável. A partir desse ponto até a saída final (ou resultado), você pode exibir os refinamentos emitidos pelo usuário, monitorar giros e, se implementar a validação, o número de novas tentativas e erros relacionados. Quando a contagem de repetições excede o limite definido, a guia Interação LLM exibe o código de erro CLMI, a mensagem de erro e o código de status de erro. Quando a contagem de repetições excede o limite definido, a guia Interação LLM exibe o código de erro CLMI, a mensagem de erro e o código de status de erro. Você pode exibir todo o texto dos prompts, solicitações de refinamento e o resultado clicando com o botão direito do mouse e escolhendo Mostrar Texto Completo.
A opção Exibir texto completo

Por padrão, o estado final do LLM é renderizado na view Chamadas do LLM. Para revisar os resultados dos estados LLM anteriores, clique nas respostas LLM anteriores na janela Testador de Bot.
Observação

Você pode salvar a conversa LLM como um caso de teste.