Apresentando o LangFuse e seus componentes
Agora que introduzimos o problema, vamos começar a discutir a solução. Primeiro, vamos ao básico. O que é LangFuse? LangFuse é uma plataforma de observabilidade para aplicações de LLM (modelos de linguagem de grande porte — Large Language Models). Essa plataforma pretende resolver todos os problemas que vimos no vídeo anterior.
Como faz isso? Vamos entender os componentes principais da arquitetura do LangFuse. Esses componentes são um SDK (kit de desenvolvimento de software), uma API (interface de programação de aplicações), um sistema de armazenamento e a UI (interface do usuário) do LangFuse. Como se conectam e como funcionam em segundo plano junto com nossa aplicação?
Nossa aplicação envia e recebe dados. Quando usamos o LangFuse, o SDK integrado à aplicação captura esses dados e os envia para a API. A API armazena os dados no sistema de armazenamento, e a UI consome esses dados a partir do banco de dados para exibi-los no painel de controle, permitindo visualizar todos os dados, todos os logs (registros), todos os traces (rastreamentos) e todas as métricas que estamos instrumentando em nossa aplicação. Esses são os componentes principais da arquitetura.
Detalhando a arquitetura com foco em latência
Há um detalhe importante na arquitetura do LangFuse voltado a fluxos em produção que exigem latência muito baixa, principalmente fluxos de atendimento direto à pessoa cliente. Existe uma funcionalidade em segundo plano: quando estamos enviando os dados, isto é, quando o SDK envia os dados para a API, esse processo não bloqueia nossa aplicação; é executado de forma assíncrona, em paralelo. Isso evita adicionar uma camada extra de latência na aplicação.
Utilizar o LangFuse não elimina a latência, mas a plataforma busca minimizar a sobrecarga e evitar adicionar mais latência à aplicação. Sabemos que, às vezes, um prompt (instrução) muito grande ou uma chamada ao modelo pode gerar latência maior, e precisamos otimizar todos os pontos possíveis, principalmente em chatbots (robôs de conversa) e aplicações conversacionais.
A arquitetura do LangFuse já foi concebida e otimizada para esse cenário.
Explicando os conceitos de Trace, Span, Event e Generation
Agora que entendemos os componentes da arquitetura do LangFuse, vamos compreender como funciona, pois isso é essencial para pensarmos na instrumentação da nossa aplicação e em como organizá-la para visualizar tudo de forma clara e simples na UI (interface do usuário).
Os quatro componentes principais do LangFuse são Trace, Span, Event e Generation. O que é cada um deles?
Primeiro, o Trace. Ele representa o fluxo completo da aplicação. Ao executarmos a aplicação, é gerado um Trace. Independentemente do que estiver acontecendo, esse Trace registra que a aplicação foi executada. Temos uma arquitetura hierárquica desses componentes.
Dentro desse Trace principal da aplicação, podemos ter Spans. O que são Spans? Eles representam uma execução dentro desse fluxo, isto é, dentro do pipeline (fluxo de processamento) da aplicação. Ao instrumentarmos algo como Span, estamos registrando uma execução que ocorreu na aplicação, com início e fim, e, portanto, com duração.
Em relação ao Event, ele é semelhante ao Span, mas não é a mesma coisa. Em um Event, não registramos uma execução, pois uma execução tem início e fim, tem uma duração. O Event é utilizado para fatos que ocorrem pontualmente no modelo e não têm duração, não têm início nem fim. Pode ser, por exemplo, um registro de que recebemos uma determinada entrada (input) ou um registro de fallback (retorno alternativo) — o modelo entrou em fallback. Isso não consome tempo dessa execução; apenas deixa o registro no histórico do Trace para que possamos entender melhor, por meio de observabilidade, cada passo da aplicação.
Por fim, temos o Generation. O que é o Generation? É a chamada ao modelo. No momento em que fazemos a chamada ao modelo, ela não é registrada como um Span, não é registrada como um novo Trace e não é registrada como um Event. É registrada como Generation.
Pensando na hierarquia: ao executar a aplicação, temos um Trace e, dependendo do que instrumentarmos, dentro do Trace poderemos ter Spans, Events e Generations.
Antecipando a próxima aula e encerrando
Na próxima aula, teremos nosso primeiro contato com a UI (interface do usuário) do LangFuse. Vamos mostrar, passo a passo, como realizar essa configuração inicial e o primeiro acesso, e vamos instrumentar uma aplicação simples para iniciar, de fato, a parte mais prática do curso.
Agradecemos e até a próxima aula.