Skip to main content
Um agente erra menos por falta de memória do que por afirmar o que não consultou: um preço que ninguém cotou, um prazo três dias fora, uma promessa sem ação por trás, a citação de um artigo que diz outra coisa. O contrato de afirmação declara o que um agente pode afirmar e a evidência que cada tipo de afirmação precisa ter no registro do turno. A conferência roda sem modelo, no processo do agente, no último ponto antes do cliente ou antes de um documento ser salvo; a Niadra só recebe os vereditos e os soma. O contrato nunca reescreve por padrão, nunca reescreve uma saída imutável, e vem com uma lista versionada de frases do ofício que nunca podem disparar.

Ligar

O contrato é a funcionalidade claims do espaço, desligada por padrão e ligada no documento features pelo papel security. O próprio contrato fica no documento claim-contract, dos papéis integration e security, e chega ao SDK pelo perfil do SDK, sem as frases do corpus negativo (só a versão dele), que só o niadra contract test do seu CI lê, da sua própria cópia. As afirmações que o SDK confere entram no registro de turno, então a funcionalidade turns é o que as leva à Niadra e ao aproveitamento. Sem contrato, nada é conferido.

O documento

A detecção é lexical: números de certas classes (com terms, um número só conta numa frase que traz um dos termos), roles (as palavras que dão a um número o papel dele: “de” e “antes” para o preço de lista, “por” e “com desconto” para o preço promocional), terms do ofício sozinhos (“separei”, “já enviei o link”), patterns nomeados (article_citation, precedent_citation) ou document_sections, em que toda frase é uma afirmação de fato. A evidência é exatamente uma de: value (um valor com proveniência no turno, do resultado de uma ferramenta ou de uma leitura de estado, com same_role, fresh_for: claim para exigir a idade de afirmação do tipo, e must_state_gaps para exigir que as lacunas declaradas do valor sejam ditas com ele), tool (uma chamada desta ferramenta no turno: a fronteira do que o agente pode saber, e um agente sem a ferramenta sempre falha), tool_any (uma chamada de qualquer uma destas ferramentas: uma promessa de ação precisa da ação) ou anchor (o texto cita uma fonte por uma âncora que bate com ela, a 0,90 ou mais). Um exemplo de categoria, de um contrato de varejo:

Os números

O analisador lê todo número de uma saída, num idioma, e cada número cai em no máximo uma menção: primeiro os rótulos pela forma (um número de processo, um CEP, um telefone, uma hora) e pela palavra anterior (pedido, protocolo, artigo, tamanho, página); depois as datas, dia primeiro em português e espanhol, mês primeiro em inglês; depois as quantias, pelo que vem antes ou depois (moeda, %, dias úteis, mg, kg, 10x); depois códigos e ordinais, que são rótulos; e o resto (cinco dígitos ou mais e um ano são rótulos, dois decimais são dinheiro sem moeda, um inteiro antes de uma palavra é uma contagem). Um número por extenso só conta antes de uma unidade (“quinze dias úteis”), porque “um” também é artigo. Duas quantias ligadas por “a”, “até” ou um hífen fazem uma faixa. As classes são money, percent, date, duration, quantity, count, dosage e label; um rótulo nomeia em vez de medir, nenhuma categoria o detecta e nada jamais o reescreve. Quando um número tem . e ,, o último é o decimal; “R$ 511.06” em português é 511,06 mesmo assim. Um papel vale quando o termo dele está a até 6 palavras do número, na mesma frase; o termo mais próximo dá o papel, e dois papéis empatados deixam o número ambiguous, que nunca é aprovado.

As três naturezas

O validador que derruba toda quantia ausente do histórico é uma categoria de classe money com model: block.

Vereditos e ações

matched, quoted_found e anchored não tomam ação; not_checked é contado. Todo outro veredito toma a ação da categoria para o contexto da saída (actions.contexts, ou actions.default), e unsupported toma natures.model quando definida: Uma reescrita é inequívoca só quando tudo vale: a saída é mutável; a classe é dinheiro, porcentagem, data ou duração (uma dose, uma medida técnica, um tamanho, uma posição e um identificador nunca são reescritos, em nenhum contexto); o número é um valor só, não uma faixa; o veredito é stale e o número é uma cópia literal de um campo de um objeto, cujo valor fresco no turno é outro; e nenhum outro número da classe está na frase. Um contrato não pode nomear rewrite_if_unequivocal como padrão, nem para um contexto que não lista como mutável. O princípio: corrigir, anotar ou contar; nunca bloquear com uma mensagem genérica, e nunca reescrever o que é imutável. Dizer a lacuna é uma resposta aceitável.

O corpus negativo

Todo contrato com categorias vem com a lista versionada de frases do ofício que um léxico ingênuo pegaria e que nunca podem disparar (“não temos certeza do prazo”, “o prazo para contestação é de 15 dias úteis”, “Seu CEP é 01310-100?”). Uma frase dispara quando, lida em qualquer idioma do contrato e para qualquer agente dele, uma categoria acha uma afirmação nela. O comando niadra contract test dos SDKs falha quando uma dispara, e é feito para o seu CI: um falso positivo que bloqueia um documento com prazo correndo é o maior risco do contrato, e o teste faz parte dele.
O comando lê a sua cópia do contrato (ou o do perfil, com o corpus em --corpus) e arquivos de turnos de exemplo, e sai com 0 quando tudo vale, 1 quando não, 2 quando não conseguiu rodar.

Texto interno

A sua empresa pode registrar impressões digitais do próprio prompt: hashes de cada n palavras seguidas (8 por padrão), calculados pelo SDK, nunca o prompt. Uma saída que repete uma delas dá lugar a redact: o trecho vira uma afirmação da categoria reservada internal_text, com o veredito internal_text_found e a ação block (numa saída imutável, a saída inteira vai a uma pessoa), e o turno é marcado guard_acted. O registro nunca guarda o texto redigido.

A âncora de texto

Uma ferramenta ou o agente emite âncoras: onde na saída, o texto citado e o documento que ele cita. Os dois textos são normalizados do mesmo jeito (minúsculas, sem acentos, tudo que não é letra ou dígito vira um espaço) e a distância de edição entre a citação e algum trecho do documento dá a pontuação 1 - d / len(citação). Uma âncora vale a 0,90 ou mais; abaixo disso é descartada e contada, nunca consertada. Um número dentro de um trecho ancorado é conferido como número mesmo assim: a pontuação sozinha deixaria passar uma quantia trocada. coverage separa lei e fato, que nunca se somam.

Onde roda

No SDK, na ponte do stream, antes do cliente (um candidato fica retido no máximo 150 ms e uma mensagem no máximo 300 ms; passado isso, o texto vai como está, anotado guard_budget_exceeded), ou antes de um documento ser salvo. O servidor nunca roda a conferência num turno.
Cada afirmação vira uma entrada de claims no registro do turno: a categoria, a classe, a natureza e o papel de um número, o trecho em pontos de código, o valor normalizado, a evidência (a chamada e o campo, o objeto e o campo, ou o documento e a pontuação), o veredito e a ação tomada (none, block, warn, count, rewrite ou discard_anchor). Um valor que não está seguro para afirmar pode ser lido de novo pelo seu resolvedor, dentro da sua empresa e em 300 ms, antes de a resposta sair: conversation.verify_claim() em Python, convo.verifyClaim() em TypeScript. Veja O worker de resolução.

Ler os números

GET /v1/context-use, com a funcionalidade claims ligada, traz em claims, por fonte e agente, as afirmações das saídas dele por categoria e veredito, e quantas se apoiam em evidência (evidenced). É a taxa do que o agente afirma sem consultar. Um contrato com categorias, um corpus negativo que o CI mantém e essa taxa no Console são o que a sua empresa mede; a Niadra soma, e nunca roda um modelo a mais por turno.

Próximos passos

Tipos de objeto e estado

a idade de afirmação de cada campo e as proibições.

Registros de turno

onde os vereditos ficam.

Agentes de varejo

um contrato de preço, disponibilidade e promessa de ação.

Agentes jurídicos

prazos com lacunas declaradas e citações ancoradas.