Do protótipo à produção: como PromptFoo e Vitest Made Podcast-é confiável

Introdução No meu artigo anterior, da Idea ao Audio: Construindo o Trabalhador do Podcast-It CloudFlare, detalhei como havia criado um simples trabalhador do CloudFlare que poderia criar scripts e áudio de podcast a partir de uma postagem de blog de origem. Embora eu não tivesse certeza se continuaria trabalhando no projeto, fiz alguns avanços no entendimento de como criar um aplicativo sem servidor alimentado por um LLM. Uma das principais peças que eu estava faltando foram as avaliações LLM (Evals). Com o EVALS, consegui melhorar maciçivamente minha velocidade de desenvolvimento e me sentir muito mais confiante no progresso do projeto. Estar confiante na qualidade dos podcasts me deu a energia necessária para continuar com o projeto. Por que o LLM Evalals importa quando você está criando software tradicional, o teste geralmente significa garantir que seu código se comporte corretamente: essa função retorna o valor certo, essa API responde no tempo, esse componente renderiza conforme o esperado? Mas com aplicativos de IA generativos, há uma nova dimensão – a qualidade da própria saída do modelo. Mesmo que seus pontos de extremidade da API funcionem perfeitamente, o aplicativo ainda poderá “falhar” se o script gerado parecer robótico, pular informações importantes ou produzir estruturas de episódios inconsistentes. É aí que entra o LLM EVals. Em vez de apenas testar o código em torno do modelo, o EVALS testar o comportamento do modelo dentro do seu aplicativo. Eles permitem medir se o texto produzido é útil, preciso e consistente em muitas corridas – o que é crítico se você deseja passar de um protótipo divertido para algo que as pessoas podem realmente confiar. Uma maneira de trouxer o poder do Evalas para este projeto é através do PromptFoo. Com o PromptFoo, pude começar rapidamente a criar testes de avaliação no meu ambiente de texto digital. Um teste pode verificar, por exemplo: todo script gerado inclui uma introdução e conclusão? O nome do host aparece no diálogo? A transcrição está livre de alucinações óbvias (como citar uma fonte que não está no post do blog)? Para começar com o PromptFoo, eu o instalei como assim: NPM Install-Save-dev PromptFoo Digite o modo de saída do modo de tela cheia depois de configurar e configurar o PremptFoo, pude criar um script chamado “Evals-Scret-SCRIRT My Package.json e executá-lo como seguinte: NPM Run Evals DOTENVX RUN -F .DEV.VARS -SH -C ‘CD EVALS && PRONTRFOO_DISABLE_TELEMETRY = 1 PromptFoo avaliar’ Digite o modo de saída da tela completa Modo de tela cheia aqui está o que ele faz: um script personalizado é usado para converter tipos de tipcret do meu código -fonte em arquivos de esquema JSON nos eves/ consultório. O pacote DOTENVX é usado para ler as variáveis ​​de ambiente do .dev.vars na memória, para que o PromptFoo tenha acesso a elas. PromptFoo espera um arquivo .env, mas o trabalhador espera um arquivo .dev.vars localmente. Esta etapa preenche essa lacuna. O script muda para o EVALS/ diretório e depois executa o PromptFoo usando o arquivo de configuração nesse diretório. Atualmente, tenho Evalas que confirmam o seguinte: Os hosts esperados são usados ​​e nenhum outro participante alucinado está presente. O título do show é mencionado no script. O esquema JSON correto é usado. Os alunos da LLM estão dando pontuações passantes para os scripts. O conteúdo do script é relevante para a postagem. O script passa os critérios de moderação do OpenAI. O papel dos testes de integração nos aplicativos da Gen AI, enquanto o LLM Evals me diz se o conteúdo é bom, os testes de integração me dizem se o sistema está se comportando corretamente. A maioria das questões que eu não encontrei não era “o modelo produziu uma frase estranha”. Eles eram as coisas chatas, mas importantes: uma solicitação que não persistia corretamente, um episódio que nunca deixou o processamento ou um ponto de extremidade que retornou o código de status errado. Para pegá -los, escrevi testes de integração com o Vitest. Em vez de apenas zombar de tudo, os testes aumentam um banco de dados temporário e exercem os pontos de extremidade de restos reais. Isso significa que posso simular a criação de um episódio, verificar se ele se move pelo ciclo de vida e verificar se o áudio e os metadados acabam onde pertencem. Para instalar o ViteSt no meu projeto, executei o seguinte comando: NPM Install-Save-Dev Vitest Entre no modo de saída de tela cheia, pois estava trabalhando com a estrutura do CloudFlare Workers, pude configurar meus testes para ter um banco de dados D1 temporário e um balde R2. Os mesmos scripts de migração usados ​​para executar o aplicativo são aplicados antes que os testes sejam executados. Para o contexto, os funcionários do CloudFlare têm um recurso em que os desenvolvedores podem versões em seu banco de dados alterações usando scripts de migração. A configuração do banco de dados de teste corresponde à configuração real do banco de dados é muito fácil com esse recurso. Aqui está como me parece o arquivo My Vitest.config.ts: Importar caminho de “Node: Path”; importar {defineworkersproject, readd1migrações,} de “@CloudFlare/Vitest-Pool-Workers/config”; exportação define definirworkersProject (async () => {const migrationsPath = path.join (__ Dirname, “migrações”); const migrações = aguarda readd1migrações (migraçõesPath); return {test: {SetupFiles: [“./tests/apply-migrations.ts”]PoolOptions: {Workers: {miniflare: {compatibilityDate: “2025-08-03”, d1Databases: {db: “: memória:”}, d1Persist: false, encadernamentos: {test_migrações: migrações}, r2buckets: [“podcasts”]
},},},},}; }); Digite o modo de saída do modo de tela cheia com esses testes de integração, posso confirmar coisas como: criação de episódios e exclusão de trabalho conforme o esperado. O código de status certo é retornado quando uma solicitação para fazer o mesmo episódio é feita duas vezes. Os arquivos de áudio são enviados para o local certo. Os testes de integração também são úteis para garantir que as alterações feitas na base de código não quebrem nada. Como tal, também adicionei Husky ao projeto para poder executar os testes toda vez que tentava empurrar o código do meu laptop para o GitHub. Meu script husky, .husky/pré-push, é bem simples: #!/Bin/sh npm run prepush Digite o modo de tela cheia de tela cheia. Em inglês, este script faz o seguinte: Executa o tipo de verifica no projeto para procurar erros do desenvolvedor. Executa todos os testes disponíveis com o Vitest. Executa o script do EVALS para confirmar os modelos ainda se comportam conforme o esperado. Iterando mais rápido com o PromptFoo + Vitest, o maior desbloqueio ocorreu quando comecei a executar o Evalas e os testes de integração juntos no meu loop de desenvolvimento. O PromptFoo me deu um feedback imediato sobre a qualidade do conteúdo – se os scripts ainda tinham uma introdução e conclusão, se o nome do host apareceu de forma consistente e se as alucinações entram. Ao mesmo tempo, o Vitest confirmou que as APIs, as migrações de banco de dados e os fluxos de armazenamento funcionavam como esperado. Essa combinação me deu confiança para me mover mais rápido. Eu poderia ajustar os avisos, o código de refattor ou ajustar a infraestrutura sem se preocupar constantemente em quebrar alguma coisa. Se uma avaliação falhou, eu sabia que era um problema de conteúdo. Se um teste falhou, eu sabia que era um problema do sistema. Juntos, eles formaram um ciclo de feedback que tornou a iteração mais suave, reduziu surpresas e fez as atualizações de remessa se sentirem muito menos arriscadas. Lições que os esquemas aprendidos eliminam a deriva. A conversão dos tipos de tipscript em esquemas JSON manteve os Evalas alinhados com o código -fonte e reduzidos na configuração manual. Evals pega regressões sutis. Os cheques automatizados surgiram em problemas – como o nome do host que desapareceu silenciosamente – que passaram pela revisão manual. Testes e Evals se reforçam. Testes protege o sistema (rotas, estado, armazenamento) enquanto o EVALS protege a saída (tom, estrutura, relevância). Juntos, eles constroem confiança. O que vem a seguir aqui está o que está por vir para o podcast-it: integração no meu blog. Vou gerar episódios de podcast para todas as minhas postagens de blog existentes. Enriquecendo scripts com conteúdo relevante da Web. Adicionando edição de script através de um micro front -end. Investigar o ajuste fino do modelo para ver se scripts mais longos podem ser gerados sem perder a qualidade. Conclusão Mover o podcast-it de “It Works” para “É confiável” não era sobre o envio de novos recursos-era sobre a construção de confiança. O PromptFoo me deu uma maneira de medir a qualidade da saída, os testes de integração mantiveram o sistema estável e os testes de unidade ainda pegam as pequenas coisas mais cedo. Juntos, eles criam uma rede de segurança que torna sustentável o aplicativo de IA generativo. Se você estiver construindo com o LLMS, configure esse loop mais cedo – você evitará muita dor mais tarde.

Fonte

Você pode ter perdido