Um ângulo diferente das respostas acima, porque até agora todos estão limitando escritas: dinheiro, emails, registros. A ação que tive que aprender a limitar é aquela que não escreve nada, a IA respondendo um cliente diretamente.
Um chatbot respondendo a uma pessoa real também é uma ação externa irreversível. Uma vez que disse algo errado, você não pode desfazer. Mas nenhum dos instintos usuais dispara, porque nada foi inserido, nada atingiu uma API externa, nenhuma linha mudou. Não parece ser da classe perigosa de ação, então geralmente não recebe nenhuma porta de controle.
O que uso em vez de uma etapa de aprovação humana, já que você não pode colocar um humano na frente de uma resposta de chat ao vivo sem matar o produto: uma porta de confiança entre recuperação e resposta. Se a evidência recuperada é muito fraca ou a similaridade é muito baixa, o modelo não consegue responder. Ele diz que não tem essa informação e passa para um humano. A recusa é o padrão e responder é o que deve ser conquistado. Mesma forma que uma lista de permissões, só que aplicada a se o modelo pode falar em vez de se pode agir.
Duas coisas que errei e que provavelmente valem a pena passar adiante.
Sobre sua pergunta de auditoria: eu registro os chunks recuperados e seus scores de similaridade ao lado de cada resposta, não apenas o texto final. Sem isso, “por que disse isso” é impossível de responder, porque o texto da resposta sozinho não te diz nada sobre o que o modelo estava realmente vendo. É a versão de leitura do que nathan3 disse sobre armazenar o raciocínio do agente junto com a decisão.
Segundo, e este me pegou dois dias atrás: a porta em si pode falhar silenciosamente, e falha na direção que parece segura. Uma condição obsoleta em um nó de filtro a jusante da recuperação estava descartando cada linha, então a porta via zero evidência e corretamente recusava. Cada execução verde, nenhum erro lançado. O bot educadamente dizia às pessoas que não sabia coisas que comprovadamente sabia, e teria continuado fazendo isso indefinidamente, porque uma recusa nunca parece um fracasso. Só descobri perguntando uma questão que eu já sabia que os documentos de origem respondiam.
Então a coisa que eu adicionaria ao padrão propor então executar descrito acima: qualquer componente que decide “não prosseguir”, monitore com que frequência dispara. Um caminho de negação que silenciosamente passa de disparar 5 porcento das vezes para 100 porcento das vezes é um sistema quebrado que parece exatamente como um cauteloso.