LangChain
LangChain fornece primitivas compostas para aplicações de LLM: modelos, retrievers, ferramentas e cadeias. A sintaxe de pipe do LCEL conecta etapas em pipelines.
Receita
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
llm = ChatOpenAI(model="gpt-4o-mini")
retriever = Chroma(embedding_function=OpenAIEmbeddings()).as_retriever()Exemplo de Trabalho
"""langchain.py - Cadeia RAG com LCEL."""
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
docs = ["pytest executa testes com fixtures.", "FastAPI usa Pydantic para validação."]
splits = RecursiveCharacterTextSplitter(chunk_size=200).split_text("\n".join(docs))
vectorstore = Chroma.from_texts(splits, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
prompt = ChatPromptTemplate.from_template(
"Responda apenas com base no contexto:\n{context}\n\nPergunta: {question}"
)
def format_docs(docs):
return "\n---\n".join(d.page_content for d in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| ChatOpenAI(model="gpt-4o-mini", temperature=0)
| StrOutputParser()
)
print(chain.invoke("Como o pytest funciona?"))Armadilhas
- Mudança constante de versão do LangChain - imports mudam entre versões. Correção: fixe versões; use primitivas
langchain-core. - Excesso de abstração - RAG simples não precisa de 10 classes wrapper. Correção: SDK OpenAI bruto para protótipos; LangChain quando a composição cresce.
- Uso oculto de tokens - wrappers obscurecem o custo. Correção: habilite verbose/callbacks para registrar o uso.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| LangChain | Pipelines LLM multi-etapa | Chamada de API única |
| LlamaIndex | RAG focado em dados | Cadeias simples |
| LangGraph | Agentes com estado | Pipelines lineares |
| SDK Bruto | Controle total, aprendizado | Aplicações complexas multi-etapa |
FAQs
LangChain vs LangGraph?
LangChain para cadeias lineares; LangGraph para ciclos, estado e loops de agente.O que é LCEL?
LangChain Expression Language - sintaxe de pipe `|` para encadear Runnables.Como adiciono memória?
RunnableWithMessageHistory ou checkpointer em LangGraph.Como depuro cadeias?
Rastreamento em langsmith.com com LANGCHAIN_TRACING_V2=true.Retriever customizado?
Subclasse BaseRetriever; implemente `_get_relevant_documents`.Como faço streaming?
chain.stream(input) produz tokens progressivamente.Chamada de ferramenta no LangChain?
Vincule ferramentas ao ChatModel; use ToolNode em LangGraph.LangChain é necessário para RAG?
Não - SDK bruto + vector DB funciona bem para casos simples.Como testo cadeias?
Simule LLM com FakeListChatModel; verifique a recuperação separadamente.Pacote dividido?
langchain-core, langchain-openai, langchain-chroma são pacotes separados.Como lido com erros?
Runnable com fallback: chain.with_fallbacks([backup_chain]).Implantação em produção?
LangServe expõe cadeias como endpoints FastAPI.Relacionados
- LangGraph e Loops de Agente
- LlamaIndex
- Noções Básicas de RAG
- Uso de Ferramentas e Chamada de Funções
- Bancos de Dados Vetoriais
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.