O que é Escolhendo a stack?
Escolhendo a stack (Choosing a stack) é um fundamento de engenharia de IA para quem trabalha com LLMs. As camadas de um sistema com LLM e quando LangChain, LangGraph, o SDK do provedor ou outra biblioteca pagam a conta.
Choosing a stack
Escolhendo a stack (Choosing a stack) é um fundamento de engenharia de IA para quem trabalha com LLMs. As camadas de um sistema com LLM e quando LangChain, LangGraph, o SDK do provedor ou outra biblioteca pagam a conta.
Você entra num time e o README diz “a gente usa Claude”. No emprego anterior o mesmo bot de pedidos estava em OpenAI. Um post manda jogar o LangChain fora. Um colega diz que tudo tem que ser LangGraph. O ticket da semana é só isto: classificar a mensagem do cliente e mandar fatura para um prompt, pedido para outro.
As três pastas resolvem o mesmo desenho. O que muda é quem escreve a sequência, o ramo e a retentativa. Aprender o nome de um fornecedor como se fosse a profissão deixa você recomeçando a cada troca de API.
Um sistema com LLM tem quatro camadas. A biblioteca mora numa delas.
flowchart TD
APP["1. Seu produto"]:::tool --> ORCH["2. Orquestração"]:::llm
ORCH --> MODEL(["3. Provedor do modelo"]):::io
ORCH --> SIDE["4. Busca, eval e trace"]:::tool
O padrão do catálogo descreve a camada 2. O SDK da aba Python descreve uma forma da camada 3. Trocar de aba não troca o padrão.
Antes da biblioteca, decida o degrau em Chains, agentes e workflows. Chain, workflow e agente cabem em LangGraph. Usar LangGraph não transforma a moderação de anúncios em agente.
| Você precisa | Escreva você | Biblioteca que já escreveu |
|---|---|---|
| Duas a quatro chamadas em ordem fixa | Funções | LangChain, se você vai trocar de provedor |
| Ramos, loop, pausa humana, retomada | Um punhado de funções | LangGraph |
| Loop de ferramentas até parar | Um while com teto |
create_agent (LangChain 1.x, roda em LangGraph), OpenAI Agents SDK, Claude Agent SDK ou Pydantic AI |
| Chat com streaming na interface | A sua API | Vercel AI SDK |
| Perguntas sobre uma base de documentos | O seu retriever | LlamaIndex, quando o índice é o produto |
| Saída com schema | Pydantic ou Zod no SDK do provedor | with_structured_output, se a stack já é LangChain |
| Prompt que melhora a partir de um dataset | O seu eval | DSPy, quando o dataset é a especificação |
init_chat_model("anthropic:claude-haiku-4-5") e init_chat_model("openai:gpt-4o-mini") devolvem o mesmo tipo de objeto. O prefixo é o fornecedor. O resto da função não muda. Isso é o que a aba LangChain está mostrando nas páginas de padrão: a decisão continua no seu if, o modelo é uma string.
Texto entra. Sai texto, um pedido de ferramenta ou um objeto no schema. A Anthropic devolve blocos em content e stop_reason. A OpenAI devolve choices[0].message e finish_reason. O Google usa outro envelope. Nenhum desses nomes deveria aparecer no módulo que grava a nota fiscal. O smell é Vazamento de Formato do Provedor.
LangChain e o Vercel AI SDK escondem o envelope. Um cliente fino que você escreve faz o mesmo serviço se você só tem dois pontos de chamada. A partir do terceiro, a abstração começa a se pagar, porque a troca de modelo deixa de ser um diff em cada arquivo.
create_agent esconde a volta. A aba Python de Loop ReAct é a que se lê primeiro.recursion_limit no LangGraph e max_turns no OpenAI Agents SDK contam passos do framework. Tempo, dinheiro e uma parada honesta continuam seus. Veja Condições de Parada.langchain.chains.LLMChain. Essa API saiu para langchain-classic na versão 1.0. Leia o padrão nesta página e o import na documentação atual, não o contrário.Pegue a mensagem “quero a segunda via do boleto do pedido 8831” e marque a camada de cada peça. Cinco minutos.
Classificar billing ou orders orquestração (workflow)
Chamar o modelo pequeno provedor
O if que escolhe a rota seu código
O prompt de financeiro seu produto
SDK da Anthropic ou da OpenAI adaptador, não a regra
A mesma classificação, dois fornecedores, uma função:
from typing import Literal
from langchain.chat_models import init_chat_model
from pydantic import BaseModel
class Route(BaseModel):
kind: Literal["billing", "orders", "other"]
confidence: float
# Troque só esta string. A forma é "provedor:modelo".
MODEL = "openai:gpt-4o-mini"
# MODEL = "anthropic:claude-haiku-4-5"
# MODEL = "google_genai:gemini-2.5-flash"
router = init_chat_model(MODEL, temperature=0).with_structured_output(Route)
def classify(message: str) -> Route:
return router.invoke([
("system", "Classifique: billing, orders ou other."),
("human", message),
])
Se a sua função classify ainda importa anthropic ou openai no meio da regra de negócio, o vazamento está aí, não na escolha do modelo.
if solto.with_structured_output.while à mão e o create_agent.interrupt e checkpointer do LangGraph quando a espera pode durar dias.Comece pelo degrau. Escolha a biblioteca que escreve aquele degrau com menos código que você consiga ler numa terça de incidente.
Escolhendo a stack (Choosing a stack) é um fundamento de engenharia de IA para quem trabalha com LLMs. As camadas de um sistema com LLM e quando LangChain, LangGraph, o SDK do provedor ou outra biblioteca pagam a conta.