Chains Complexas e LangSmith
Criando Chains mais complexas
Agora que sabemos criar chains simples com LCEL, podemos começar a nos aventurar em chains mais complexas e compreender o verdadeiro poder do LangChain.
Podemos utilizar a capacidade de compor chains para criar chains de chains. Isso mesmo, podemos acoplar pequenos blocos de chains, domando-os para criar aplicações bem mais complexas e, consequentemente, mais poderosas.
A capacidade de um modelo de linguagem aumenta drasticamente conforme mais específica for nossa chamada, e é isso que buscamos fazer ao quebrar uma aplicação em múltiplas cadeias.
Configurando o ambiente
from dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())
Somando chains
Primeiro, vamos criar uma chain para gerar curiosidades:
from langchain_openai import ChatOpenAIfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatechat = ChatOpenAI()prompt = ChatPromptTemplate.from_template('Fale uma curiosidade sobre o assunto: {assunto}')chain_curiosidade = prompt | chat | StrOutputParser()
Em seguida, criamos uma chain para gerar histórias baseadas em fatos:
prompt = ChatPromptTemplate.from_template('Crie uma história sobre o seguinte fato curioso: {assunto}')chain_historia = prompt | chat | StrOutputParser()
Combinando as chains
Podemos combinar as duas chains para criar uma chain mais complexa:
chain = chain_curiosidade | chain_historiafinalChain = chain.invoke({'assunto': 'atibaia'})
Como entender o que está acontecendo?
Para isso, podemos utilizar o LangSmith. O LangSmith é uma espécie de observabilidade para LangChain, incluindo as chaves e valores de configuração.
Exemplo com saída estruturada
Podemos usar o LangSmith junto com saídas estruturadas para analisar os resultados:
from typing import Optionalfrom pydantic import BaseModel, Fieldclass AvaliacaoReview(BaseModel):"""Avalia a qualidade da história"""personas: int = Field(description='Enumera a quantidade de personas envolvidas na história')local: Optional[str] = Field(description='Extraia a localização onde aconteceu a história')nota_historia: int = Field(description='Dê uma nota de 0 a 10 para a história criada')llm_estruturada = chat.with_structured_output(AvaliacaoReview)resposta = llm_estruturada.invoke(finalChain)
Benefícios do LangSmith
O LangSmith oferece várias funcionalidades importantes:
- Observabilidade: Acompanhe todas as chamadas e respostas do modelo
- Depuração: Identifique onde as chains podem estar falhando
- Otimização: Analise o desempenho e faça ajustes conforme necessário
- Monitoramento: Acompanhe o uso e a qualidade das respostas em produção
Este guia demonstra como criar chains mais complexas combinando múltiplas chains simples e como usar o LangSmith para monitorar e depurar suas aplicações LangChain.