Chains com LCEL
LangChain Expression Language (LCEL)
A Linguagem de Expressão LangChain, ou LCEL, é uma forma declarativa de compor cadeias de maneira fácil. A LCEL foi projetada desde o primeiro dia para suportar a colocação de protótipos em produção, sem a necessidade de alterações no código.
Principais características do LCEL:
- Suporte a streaming de primeira classe: menor tempo possível para saída do primeiro token produzido
- Suporte assíncrono: Qualquer cadeia construída com a LCEL pode ser chamada tanto com a API síncrona
- Execução paralela otimizada: Sempre que suas cadeias LCEL tiverem etapas que podem ser executadas em paralelo
- Retentativas e fallbacks: Maneira de tornar suas cadeias mais confiáveis em grande escala
- Acessar resultados intermediários: auxiliando na depuração de uma cadeia
Configurando o ambiente
from dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())
Criando uma chain simples
Primeiro, vamos importar e configurar o modelo:
from langchain_openai import ChatOpenAImodel = ChatOpenAI()
Em seguida, criamos um template de prompt:
from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_template('Crie uma frase sobre o seguinte assunto: {assunto}')
Criando a chain com LCEL
Com LCEL, podemos criar chains de forma declarativa usando o operador pipe (|):
chain = prompt | modelchain.invoke({ 'assunto': 'futebol' })
Adicionando mais elementos à chain
Podemos adicionar um parser de saída para formatar o resultado:
from langchain_core.output_parsers import StrOutputParserchain = prompt | model | StrOutputParser()chain.invoke({ 'assunto': 'futebol' })
Como seria com chains clássicas? (Defasado)
Para comparação, veja como seria usando o método antigo de chains:
from langchain.chains.llm import LLMChainfrom langchain_openai import ChatOpenAIfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatemodel = ChatOpenAI(model='gpt-3.5-turbo')prompt = ChatPromptTemplate.from_template('Crie uma frase sobre o seguinte assunto: {assunto}')output_parser = StrOutputParser()chain = LLMChain(llm=model,prompt=prompt,output_parser=output_parser)chain.invoke({ 'assunto': 'border collie' })
Entendendo a ordem dos componentes
Para não errar a ordem dos componentes na chain, é importante entender que cada componente recebe um tipo de entrada e gera um tipo de saída específico:
Component | Tipo de Entrada | Tipo de Saída |
---|---|---|
Prompt | Dicionário | PromptValue |
ChatModel | String única, lista de mensagens de chat ou PromptValue | Mensagem de Chat |
LLM | String única, lista de mensagens de chat ou PromptValue | String |
OutputParser | A saída de um LLM ou ChatModel | Depende do parser |
Retriever | String única | Lista de Documentos |
Tool | String única ou dicionário | Depende da ferramenta |
Este guia apresenta os conceitos fundamentais do LCEL e como utilizá-lo para criar chains de forma mais eficiente e declarativa no LangChain.