1. Introdução ao LangChain e LangGraph com Python [1]

thumbnail

<gen-image description="A visual representation contrasting LangChain and LangGraph: LangChain is depicted as a linear sequence of connected nodes (A -> B -> C), symbolizing fixed, sequential steps. LangGraph, in contrast, is shown as a complex, interconnected graph with nodes and arrows forming loops and conditional paths (A -> B -> A, A -> C -> D -> loop), illustrating its ability to handle dynamic, non-linear workflows and agentic behavior." /> LangChain e LangGraph são ferramentas para integrar inteligência artificial em programas Python, sendo LangChain ideal para fluxos sequenciais e LangGraph para fluxos complexos com loops.

1.1. Diferenças entre LangChain e LangGraph [15]

  1. LangChain é focado em cadeias de chamadas, o que significa que as ações seguem uma sequência fixa: A, depois B, depois C, e assim por diante, até o fim [18].
    1. Este modelo é adequado para tarefas que não exigem desvios ou retornos a passos anteriores [25].
  2. LangGraph é baseado na teoria dos grafos, permitindo fluxos mais complexos onde as ações podem ir e voltar entre os nós, como de A para B, de B para A, ou de C para D e entrar em um loop [21].
    1. Essa flexibilidade é essencial para criar agentes de IA que podem raciocinar e agir de forma dinâmica, como os React agents [27].
    2. Embora o LangChain possa realizar algumas tarefas semelhantes, o LangGraph foi projetado especificamente para esses cenários complexos [30].
    3. A combinação de ferramentas do LangChain com a estrutura de grafo do LangGraph oferece o melhor dos dois mundos para o desenvolvimento de IA [30].

1.2. Organização do Repositório e Engajamento [1]

  1. O conteúdo do curso será disponibilizado em um repositório no GitHub, com os textos das aulas na pasta Docs e os exemplos de código na pasta src/examples [32].
    1. Os arquivos são numerados (ex: 001, 002) para manter a ordem e facilitar o acompanhamento [35].
  2. A continuidade da playlist depende do engajamento dos espectadores, que inclui curtir, comentar, compartilhar e assistir aos vídeos completos [7].
    1. O engajamento é crucial para que o algoritmo do YouTube continue entregando o conteúdo e a playlist não seja interrompida [11].
  3. O formato do curso é uma playlist com vídeos mais curtos, preferido pela maioria dos inscritos, em vez de um único vídeo longo ou superficial [39].

2. Configuração do Ambiente de Desenvolvimento [41]

thumbnail

A configuração do ambiente de desenvolvimento envolve a criação de uma estrutura de pastas, a gestão de dependências com uv e a personalização do arquivo pyproject.toml.

2.1. Estrutura do Projeto e Ferramentas [41]

  1. O projeto utiliza uma estrutura de pastas organizada: src/examples para exemplos de aulas e src para produtos finais maiores [41].
    1. Cada exemplo de aula terá sua própria pasta (ex: X01, X02) contendo um arquivo main.py [47].
  2. O gerenciamento de dependências é feito com uv, uma ferramenta que otimiza a instalação e sincronização de pacotes Python [54].
    1. O arquivo pyproject.toml define as configurações do projeto, incluindo o nome, versão do Python e dependências [51].

2.2. Configuração do pyproject.toml e Ruff [65]

  1. O arquivo pyproject.toml inclui configurações para o Ruff, uma ferramenta de linting e formatação de código [66].
    1. As regras do Ruff são configuradas para serem mais rígidas inicialmente, com algumas desativadas para fins didáticos [68].
    2. Regras desativadas incluem a obrigatoriedade de __init__.py, docstrings e a proibição de código comentado, para facilitar a demonstração [73].
  2. A tipagem de código com PRight é definida como padrão ou básico para evitar atrasos no desenvolvimento, em vez de strict [80].
    1. Essa abordagem visa focar mais na escrita do código do que na tipagem, que pode ser demorada [84].

3. Gerenciamento de Chaves de API e Modelos de LLM [92]

thumbnail

Para interagir com LLMs, é necessário gerenciar chaves de API e escolher entre modelos locais ou baseados em nuvem, configurando-os de forma segura.

3.1. Obtenção e Configuração de Chaves de API [92]

  1. Para usar LLMs, é preciso uma chave de API do provedor (Google, OpenAI, Anthropic, etc.) [93].
  2. O Ollama permite rodar LLMs localmente, o que é recomendado para testes e evita custos de API [95].
    1. Modelos locais podem ter janelas de contexto menores e não ser tão bons quanto os pagos, mas são ideais para desenvolvimento [102].
  3. Para quem não pode usar o Ollama, o Google AI Studio oferece uma API gratuita [110].
    1. Outras APIs, como OpenAI e Anthropic, geralmente exigem um crédito mínimo para funcionar [111].
  4. As chaves de API devem ser armazenadas em um arquivo .env na raiz do projeto para segurança [130].
    1. O uv pode carregar essas variáveis de ambiente usando o comando uv run --env-file .env <arquivo> [155].

3.2. Instalação de Pacotes e Carregamento de Variáveis de Ambiente [147]

  1. Os pacotes necessários para o LangChain e o provedor de LLM (ex: google-generativeai) devem ser instalados [175].
    1. A instalação de versões pré-release (alfa) do LangChain requer o uso do parâmetro --pre no comando uv pip install [195].
    2. A instalação de um pacote específico do provedor (ex: langchain-google-genai) geralmente já inclui o langchain-core e outros componentes essenciais [190].
  2. Após a instalação, o uv lock mostrará todos os pacotes instalados, incluindo as versões alfa do LangChain [201].
  3. O carregamento das variáveis de ambiente é crucial para que o LangChain possa se conectar automaticamente aos provedores de LLM [171].

4. Enviando Mensagens para a LLM com LangChain [174]

thumbnail

O LangChain simplifica a interação com LLMs, permitindo instanciar modelos de forma genérica e enviar mensagens para obter respostas.

4.1. Instanciando Modelos de LLM de Forma Genérica [235]

  1. O LangChain permite instanciar uma LLM sem depender diretamente do provedor, usando a função initat_model [249].
    1. Essa função atua como um adaptador, inferindo o provedor com base no nome do modelo fornecido (ex: "openai", "anthropic", "google Gemini") [254].
    2. Isso torna o código menos acoplado a um modelo específico, facilitando a troca entre diferentes LLMs [276].
  2. Para enviar uma mensagem simples, utiliza-se o método invoke() da instância da LLM, passando a mensagem como uma string [278].
    1. A resposta da LLM é um objeto que contém o conteúdo da mensagem e metadados [291].
  3. Para uma visualização mais clara das respostas, pode-se usar a biblioteca rich para imprimir o conteúdo de forma formatada [295].

4.2. Criando um Chat em Loop com Contexto e Mensagens Estruturadas [323]

  1. Para manter o contexto da conversa, as mensagens devem ser estruturadas usando classes como SystemMessage, HumanMessage e AIMessage [350].
    1. SystemMessage define o comportamento da IA, como "Você é um guia de estudos que ajuda estudantes a aprenderem novos tópicos" [364].
    2. HumanMessage representa a mensagem enviada pelo usuário [400].
    3. AIMessage é a resposta da LLM, que deve ser adicionada ao histórico para manter o contexto [313].
  2. Um loop infinito pode ser criado para simular um chat contínuo, onde o histórico de mensagens é passado a cada nova interação com a LLM [414].
    1. O loop coleta a entrada do usuário, cria uma HumanMessage, adiciona ao histórico e chama a LLM com todas as mensagens anteriores [434].
    2. A resposta da LLM é então adicionada ao histórico como uma AIMessage, e o ciclo se repete [443].
  3. É importante ter cuidado com o tamanho do histórico em APIs pagas, pois enviar todo o contexto repetidamente pode gerar custos elevados [447].
    1. Modelos locais como o Ollama ou APIs gratuitas como o Gemini ajudam a mitigar esse problema [449].
  4. A mudança do comportamento da LLM é notável quando um SystemMessage é aplicado, fazendo com que ela responda de acordo com a persona definida [409].

5. Conclusão e Próximos Passos [486]

thumbnail

A aula demonstrou a configuração inicial e a interação básica com LLMs usando LangChain, preparando o terreno para tópicos mais avançados.

5.1. Testando Diferentes Modelos e Acompanhamento do Projeto [486]

  1. É possível trocar o modelo da LLM (ex: de Gemini para GPT OS) e observar como as respostas e o comportamento da IA mudam, mesmo com o mesmo SystemMessage [486].
    1. As respostas podem variar em tamanho e estilo, mas a IA ainda tentará seguir as instruções do SystemMessage [500].
  2. O histórico completo da conversa, incluindo SystemMessage, HumanMessage e AIMessage, é exibido no final do chat para demonstrar o contexto mantido [478].
  3. Todo o código e a documentação das aulas estão disponíveis no repositório do GitHub, com links diretos para os arquivos [515].

5.2. Engajamento e Futuro da Playlist [528]

  1. O feedback dos membros do canal é crucial para ajustar o ritmo e a profundidade das próximas aulas, garantindo que o conteúdo atenda às expectativas [528].
  2. A próxima aula provavelmente abordará o LangGraph, explorando suas funcionalidades para criar fluxos de IA mais complexos [532].