Criar um fluxo de trabalho agêntico leve

Caso de utilização para o mundo real: Estimar as pegadas de carbono utilizando a IA (!)

TL;DR para leitores não técnicos

We built a smart, interactive system to quickly estimate the carbon footprint of chemicals. Instead of filling out complicated forms, you can just type questions naturally (like asking the CO₂ emissions of shipping chemicals). The system uses advanced AI to understand your request, gathers the needed data (even chatting with you if necessary), and calculates accurate results transparently. This approach blends human-friendly interactions with reliable numbers, ensuring clear and trustworthy estimates.

Experimente você mesmo: Este sistema está atualmente em desenvolvimento ativo. Pode testar o protótipo em direto em https://agents.lyfx.ai. Espere algumas arestas à medida que continuamos a construir e a aperfeiçoar o fluxo de trabalho.


O problema I have long learned that the gap between “we need to calculate something” and “we have a system that actually works” is often filled with more complexity than anyone initially expects. When we set out to build a quick first-order estimator for cradle-to-gate greenhouse gas emissions of any chemical, I thought: “How hard can it be? it is just a simple spreadsheet, right?”

Well, it turns out that when you want users to input free-form requests like “what is the CO₂ footprint of 50 tonnes of acetone shipped 200 km?” instead of filling out rigid forms, you need something smarter than a spreadsheet. Enter: agentic workflows.

Experimentei várias abordagens para criar fluxos de trabalho de agentes (desde camadas de orquestração personalizadas a outras estruturas), mas o LangGraph surgiu como a solução mais robusta para este tipo de interação híbrida homem-IA. Lida com a gestão do estado, interrupções e padrões de encaminhamento complexos com o tipo de fiabilidade de que se precisa quando se constrói algo que as pessoas vão realmente usar.

A Arquitetura: Caos Orquestrado

O nosso sistema pressupõe um ciclo de vida simplificado: produção num único local, transporte até ao ponto de utilização e libertação atmosférica parcial ou total. Mas a magia está na forma como lidamos com a confusa interação homem-IA necessária para reunir os parâmetros exigidos.

Here’s what we built using LangGraph como nosso mecanismo de orquestração, envolto em um Django aplicação servida via uvicórnio e nginx:

O agente do encaminhador de triagem

This is the conductor of our little orchestra. It uses OpenAI’s GPT-4o with structured outputs (Pydantic models, because type safety matters even in the age of LLMs) to classify incoming requests:

class TriageRouter(BaseModel):
    reasoning: str = Field(description="Step-by-step reasoning behind the classification.")
    classification: Literal["gather information", "calculate", "respond and conclude"]
    response: str = Field(description="Response to user's request")

O agente de triagem decide se precisamos de mais informações, se estamos prontos para calcular ou se podemos concluir com uma resposta. É essencialmente uma máquina de estados com um cérebro LLM.

O agente de recolha de informações

É aqui que as coisas se tornam interessantes. O agente é híbrido. Pode chamar ferramentas de forma programática ou encaminhar para um agente de conversação interactiva quando necessita de intervenção humana. As ferramentas disponíveis são:

Ferramenta da base de dados GWP: Instead of maintaining a static lookup table, we built an LLM-powered “database” that searches through our chemical inventory with over 200 entries. When you ask for methane’s GWP-100, it does not just do string matching; it understands that “CH₄” and “methane” refer to the same molecule. The tool returns a classification (found/ambiguous/not available) plus the actual GWP value.

CO₂ Price Checker: Currently a placeholder returning 0.5 €/ton (we are building incrementally!), but designed to be swapped with a real-time API.

Capacidade de conversação interactiva: When the information gatherer cannot get what it needs from tools, it seamlessly hands off to a chat agent. This is not just a simple handoff: we use LangGraph’s NodeInterrupt mechanism to pause the workflow, collect user input, then resume exactly where we left off.

O agente calculador

Este é o único agente que faz cálculos reais, e deliberadamente. É um agente ReAct equipado com duas ferramentas de cálculo:

@tool
def chemicals_emission_calculator(
    chemical_name: str,
    annual_volume_ton: float, 
    production_footprint_per_ton: float,
    transportation: list[dict],
    release_to_atmosphere_ton_p_a: float,
    gwp_100: float
) -> tuple[str, float]:

The transportation parameter accepts a list of logistics steps: [{‘step’:’production to warehouse’, ‘distance_km’:50, ‘mode’:’road’}, {‘step’:’warehouse to port’, ‘distance_km’:250, ‘mode’:’rail’}]. Each mode has hardcoded emission factors (road: 0.00014, rail: 0.000015, ship: 0.000136, air: 0.0005 ton CO₂e per ton·km) sourced from EEA data.

A matemática é intencionalmente simples: somar as emissões da produção, as emissões do transporte e os impactos da libertação na atmosfera, cada um calculado de forma determinística.

A pilha técnica: LangGraph + Django

Gestão do Estado: We use LangGraph’s StateGraph with a custom State class to maintain conversation context, collected data, and routing information across agent handoffs. For development, we use MemorySaver for in-memory persistence. For production with multiple uvicorn workers, we will switch to SqliteSaver with disk-based checkpoints.

Saídas estruturadas: Every agent uses Pydantic models for its responses. This gives us type safety and prevents the usual LLM hallucination issues around routing decisions. When the triage agent says “calculate”, it will always be exactly that string, not “Calculate” or “time to calculate” or other variations.

Interrupções e retoma: O agente de chat utiliza o NodeInterrupt para fazer uma pausa no fluxo de trabalho quando é necessária a entrada do utilizador. O estado inclui o rastreio do agente que chamou o chat (caller_node) para que possamos encaminhar de volta corretamente após a recolha de informações.

Integração Django: O fluxo de trabalho corre dentro de uma aplicação Django, permitindo-nos adicionar autenticação de utilizador, persistência de dados e pontos de extremidade API conforme necessário. Servimo-lo através de uvicorn para suporte assíncrono e nginx para robustez de produção.

O que está a faltar (Trabalho em curso)

Base de dados da pegada de produção: Currently, when the system needs the GHG footprint per ton of a chemical’s production, it asks the user. This is temporary. We are building a database of production routes and their associated emissions. Think of it as a more sophisticated version of what SimaPro or GaBi provides, but focused on chemicals and accessible via API.

Dados em tempo real: CO₂ prices, shipping routes, even chemical properties could be pulled from live APIs. But we are building the orchestration layer first, then swapping in real data sources.

Memória de conversação: Cada cálculo começa de novo. Acrescentar a persistência da sessão para recordar as consultas anteriores e construir sobre elas é simples com a nossa arquitetura atual.

Porque é que esta arquitetura funciona (e porque é que a pode querer roubar)

Separação das preocupações: Os LLMs tratam da interação humana e do encaminhamento. As funções Python tratam dos cálculos determinísticos. Os especialistas no domínio podem validar e modificar a matemática sem tocar na pilha de IA.

Fluxos de trabalho depuráveis: LangGraph’s state management means you can inspect exactly what each agent decided and why. When something goes wrong, you’re not debugging a black box.

Complexidade incremental: Comece com valores codificados, adicione pesquisas na base de dados e depois integre APIs em tempo real. A estrutura do fluxo de trabalho permanece a mesma.

Resultados auditáveis: Every calculation step is logged and traceable. When someone asks “where did that 142.7 tons CO₂e come from?”, you can show them the exact inputs and formula used.

O quadro geral

This is not just about carbon footprints. The pattern – use LLMs for natural language understanding and workflow orchestration, but keep the critical calculations in deterministic code – applies to any domain where you need to mix soft reasoning with hard numbers.

Supply chain risk assessment? Same pattern. Financial modeling with regulatory compliance? Same pattern. Any time you find yourself thinking “we need a smart interface to our existing calculations,” this architecture gives you a starting point.

O futuro é a inteligência híbrida, e não apenas o facto de se apostar tudo num LLM e esperar pelo melhor.

Built in Python with LangGraph, OpenAI APIs, Django. Co-programmed using Claude Sonnet 3.7 and 4, Chat GPT o3 (not “vibe coded”). Currently in active development. Try it at https://agents.lyfx.ai.

pt_PTPT