[{"data":1,"prerenderedAt":1506},["ShallowReactive",2],{"article-\u002Fia\u002Flangchain-vs-llamaindex":3},{"id":4,"title":5,"author":6,"body":7,"category":1491,"date":1492,"description":1493,"extension":1494,"keywords":1495,"meta":1500,"navigation":262,"path":1501,"seo":1502,"slug":1503,"stem":1504,"updated":1492,"__hash__":1505},"content\u002Fia\u002Flangchain-vs-llamaindex.md","LangChain vs LlamaIndex: qual framework de IA usar?","Inicialize Tec",{"type":8,"value":9,"toc":1472},"minimark",[10,15,80,84,102,123,130,144,150,154,161,166,216,220,227,322,329,333,348,351,355,398,401,408,485,488,492,632,636,668,674,679,683,715,720,724,1070,1073,1077,1290,1293,1297,1311,1372,1381,1388,1392,1454,1457,1468],[11,12,14],"h2",{"id":13},"índice","Índice",[16,17,18,26,32,38,44,50,56,62,68,74],"ol",{},[19,20,21],"li",{},[22,23,25],"a",{"href":24},"#o-que-sao","O que são frameworks de LLM",[19,27,28],{},[22,29,31],{"href":30},"#langchain","LangChain: o canivete suíço",[19,33,34],{},[22,35,37],{"href":36},"#llamaindex","LlamaIndex: o especialista em dados",[19,39,40],{},[22,41,43],{"href":42},"#comparacao","Comparação direta",[19,45,46],{},[22,47,49],{"href":48},"#quando-langchain","Quando usar LangChain",[19,51,52],{},[22,53,55],{"href":54},"#quando-llamaindex","Quando usar LlamaIndex",[19,57,58],{},[22,59,61],{"href":60},"#codigo-langchain","Exemplo de código: RAG com LangChain",[19,63,64],{},[22,65,67],{"href":66},"#codigo-llamaindex","Exemplo de código: RAG com LlamaIndex",[19,69,70],{},[22,71,73],{"href":72},"#agentes","E os agentes?",[19,75,76],{},[22,77,79],{"href":78},"#erros","Erros comuns",[11,81,83],{"id":82},"o-que-são-frameworks-de-llm-o-que-sao","O que são frameworks de LLM {#o-que-sao}",[85,86,87,88,92,93,97,98,101],"p",{},"Antes de comparar, vamos ao conceito básico. Um ",[89,90,91],"strong",{},"LLM"," (",[94,95,96],"em",{},"Large Language\nModel",") é um modelo de IA treinado para entender e gerar texto — o ChatGPT é\no exemplo mais famoso. Sozinho, um LLM faz uma coisa: recebe texto e devolve\ntexto. Para virar um produto (um chatbot, um assistente que usa seus dados,\num agente que executa tarefas), você precisa de ",[89,99,100],{},"código ao redor"," que:",[103,104,105,108,111,114,117,120],"ul",{},[19,106,107],{},"Conecta ao modelo via API",[19,109,110],{},"Formata a pergunta do usuário (prompt)",[19,112,113],{},"Busca dados relevantes e injeta no prompt",[19,115,116],{},"Mantém o histórico da conversa",[19,118,119],{},"Decide quando chamar ferramentas externas",[19,121,122],{},"Trata erros e limita custos",[85,124,125,126,129],{},"Esse \"código ao redor\" é repetitivo. Da mesma forma que você não escreve um\nservidor HTTP do zero a cada projeto (usa Express, FastAPI, Django), você\nnão escreve a orquestração de LLM do zero: usa um ",[89,127,128],{},"framework",".",[85,131,132,135,136,139,140,143],{},[89,133,134],{},"LangChain"," e ",[89,137,138],{},"LlamaIndex"," são os dois frameworks Python mais populares\npara isso. Ambos são open source, ambos rodam em qualquer LLM (OpenAI,\nAnthropic, open source hospedado por você), ambos têm versão em TypeScript.\nMas têm ",[89,141,142],{},"filosofias diferentes"," — e entender essa diferença economiza\nsemanas de dor de cabeça.",[85,145,146,149],{},[89,147,148],{},"Analogia",": LangChain é um canivete suíço — tem ferramenta para tudo, mas\ncada uma é \"boa o suficiente\". LlamaIndex é uma caixa de chaves de boca\nprecisa — menos peças, mas cada uma é especializada e bem ajustada.",[11,151,153],{"id":152},"langchain-o-canivete-suíço-langchain","LangChain: o canivete suíço {#langchain}",[85,155,156,157,160],{},"LangChain nasceu em 2022 com uma proposta ampla: ",[89,158,159],{},"ser a camada de\nabstração para qualquer aplicação com LLM",". Ele não assume que você vai\nfazer RAG (Recall-Augmented Generation, técnica que explicamos adiante). Ele\nassume que você pode fazer qualquer coisa: RAG, agentes, chains de\nraciocínio, sumarização, extração, chat com memória, etc.",[162,163,165],"h3",{"id":164},"o-que-o-langchain-oferece","O que o LangChain oferece",[103,167,168,174,180,186,192,198,204,210],{},[19,169,170,173],{},[89,171,172],{},"Chains",": sequências de chamadas encadeadas (prompt → modelo → parser)",[19,175,176,179],{},[89,177,178],{},"Agents",": LLMs que decidem sozinhos quais ferramentas usar",[19,181,182,185],{},[89,183,184],{},"Memory",": gerenciar histórico de conversa",[19,187,188,191],{},[89,189,190],{},"Retrievers",": integração com vector stores (pgvector, Pinecone, Chroma)",[19,193,194,197],{},[89,195,196],{},"Document loaders",": ler PDF, HTML, Notion, GitHub, etc.",[19,199,200,203],{},[89,201,202],{},"Callbacks",": hooks para logging, streaming, monitoramento",[19,205,206,209],{},[89,207,208],{},"LangServe",": publicar chains como API REST",[19,211,212,215],{},[89,213,214],{},"LangSmith",": plataforma de observabilidade (paga)",[162,217,219],{"id":218},"estilo-de-uso","Estilo de uso",[85,221,222,223,226],{},"LangChain é ",[89,224,225],{},"componível e flexível",". Você monta peças pequenas e encaixa:",[228,229,234],"pre",{"className":230,"code":231,"language":232,"meta":233,"style":233},"language-python shiki shiki-themes github-light github-dark","from langchain_openai import ChatOpenAI\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\n\n# Cada peça é um objeto que pode ser encadeado com o operador |\nprompt = ChatPromptTemplate.from_template(\"Resuma: {texto}\")\nmodelo = ChatOpenAI(model=\"gpt-4o-mini\", temperature=0.2)\nparser = StrOutputParser()\n\n# O operador | encadeia: saída de um vira entrada do próximo\nchain = prompt | modelo | parser\n\n# Executa\nresumo = chain.invoke({\"texto\": \"Contrudo longo aqui...\"})\n","python","",[235,236,237,245,251,257,264,270,276,282,288,293,299,305,310,316],"code",{"__ignoreMap":233},[238,239,242],"span",{"class":240,"line":241},"line",1,[238,243,244],{},"from langchain_openai import ChatOpenAI\n",[238,246,248],{"class":240,"line":247},2,[238,249,250],{},"from langchain_core.prompts import ChatPromptTemplate\n",[238,252,254],{"class":240,"line":253},3,[238,255,256],{},"from langchain_core.output_parsers import StrOutputParser\n",[238,258,260],{"class":240,"line":259},4,[238,261,263],{"emptyLinePlaceholder":262},true,"\n",[238,265,267],{"class":240,"line":266},5,[238,268,269],{},"# Cada peça é um objeto que pode ser encadeado com o operador |\n",[238,271,273],{"class":240,"line":272},6,[238,274,275],{},"prompt = ChatPromptTemplate.from_template(\"Resuma: {texto}\")\n",[238,277,279],{"class":240,"line":278},7,[238,280,281],{},"modelo = ChatOpenAI(model=\"gpt-4o-mini\", temperature=0.2)\n",[238,283,285],{"class":240,"line":284},8,[238,286,287],{},"parser = StrOutputParser()\n",[238,289,291],{"class":240,"line":290},9,[238,292,263],{"emptyLinePlaceholder":262},[238,294,296],{"class":240,"line":295},10,[238,297,298],{},"# O operador | encadeia: saída de um vira entrada do próximo\n",[238,300,302],{"class":240,"line":301},11,[238,303,304],{},"chain = prompt | modelo | parser\n",[238,306,308],{"class":240,"line":307},12,[238,309,263],{"emptyLinePlaceholder":262},[238,311,313],{"class":240,"line":312},13,[238,314,315],{},"# Executa\n",[238,317,319],{"class":240,"line":318},14,[238,320,321],{},"resumo = chain.invoke({\"texto\": \"Contrudo longo aqui...\"})\n",[85,323,324,325,328],{},"Comentários explicam: cada peça é um objeto; o operador ",[235,326,327],{},"|"," (pipe) liga a\nsaída de um na entrada do próximo, como uma linha de montagem. Isso é o\ncoração do LangChain — componibilidade.",[11,330,332],{"id":331},"llamaindex-o-especialista-em-dados-llamaindex","LlamaIndex: o especialista em dados {#llamaindex}",[85,334,335,336,339,340,343,344,347],{},"LlamaIndex nasceu em 2022 com o nome ",[94,337,338],{},"GPT Index",", e o nome original já entrega\no foco: ",[89,341,342],{},"conectar LLMs aos seus dados",". Enquanto LangChain quer ser geral,\nLlamaIndex quer ser o melhor do mundo em ",[89,345,346],{},"RAG"," (Retrieval-Augmented\nGeneration), a técnica onde o LLM responde com base nos seus documentos.",[85,349,350],{},"RAG, em uma frase: antes de o LLM responder, você busca no seu acervo os\ntrechos mais relevantes e os entrega como contexto. O LLM então responde \"olhando\"\npara os seus dados, em vez de depender só do que memorizou no treino.",[162,352,354],{"id":353},"o-que-o-llamaindex-oferece","O que o LlamaIndex oferece",[103,356,357,363,369,375,381,386,392],{},[19,358,359,362],{},[89,360,361],{},"Data connectors",": conectores especializados para 100+ fontes (Notion,\nSalesforce, GitHub, Slack, bancos SQL, etc.)",[19,364,365,368],{},[89,366,367],{},"Index structures",": índices otimizados (vetorial, hierárquico, em árvore,\nem grafo de conhecimento)",[19,370,371,374],{},[89,372,373],{},"Advanced retrieval",": estratégias sofisticadas (reranking, hybrid search,\nsub-questões, roteamento)",[19,376,377,380],{},[89,378,379],{},"Response synthesis",": modos de geração de resposta (refine, compact,\ntree-summarize)",[19,382,383,385],{},[89,384,178],{},": agentes com ferramentas de consulta (mais focado em dados)",[19,387,388,391],{},[89,389,390],{},"LlamaCloud",": plataforma de ingestão e parsing (paga)",[19,393,394,397],{},[89,395,396],{},"Workflows",": orquestração de fluxos multi-etapa (mais novo)",[162,399,219],{"id":400},"estilo-de-uso-1",[85,402,403,404,407],{},"LlamaIndex é ",[89,405,406],{},"declarativo e alto nível",". Você descreve o que quer, ele\ncuida dos detalhes:",[228,409,411],{"className":230,"code":410,"language":232,"meta":233,"style":233},"from llama_index.core import VectorStoreIndex, SimpleDirectoryReader\n\n# Carrega documentos de uma pasta\ndocumentos = SimpleDirectoryReader(\".\u002Fmeus_docs\").load_data()\n\n# Constrói o índice vetorial automaticamente\n# (gera embeddings, armazena, configura retriever)\nindice = VectorStoreIndex.from_documents(documentos)\n\n# Cria um \"query engine\" - a interface para fazer perguntas\nmotor = indice.as_query_engine(similarity_top_k=3)\n\n# Pergunta\nresposta = motor.query(\"Qual a política de reembolso?\")\nprint(resposta)\n",[235,412,413,418,422,427,432,436,441,446,451,455,460,465,469,474,479],{"__ignoreMap":233},[238,414,415],{"class":240,"line":241},[238,416,417],{},"from llama_index.core import VectorStoreIndex, SimpleDirectoryReader\n",[238,419,420],{"class":240,"line":247},[238,421,263],{"emptyLinePlaceholder":262},[238,423,424],{"class":240,"line":253},[238,425,426],{},"# Carrega documentos de uma pasta\n",[238,428,429],{"class":240,"line":259},[238,430,431],{},"documentos = SimpleDirectoryReader(\".\u002Fmeus_docs\").load_data()\n",[238,433,434],{"class":240,"line":266},[238,435,263],{"emptyLinePlaceholder":262},[238,437,438],{"class":240,"line":272},[238,439,440],{},"# Constrói o índice vetorial automaticamente\n",[238,442,443],{"class":240,"line":278},[238,444,445],{},"# (gera embeddings, armazena, configura retriever)\n",[238,447,448],{"class":240,"line":284},[238,449,450],{},"indice = VectorStoreIndex.from_documents(documentos)\n",[238,452,453],{"class":240,"line":290},[238,454,263],{"emptyLinePlaceholder":262},[238,456,457],{"class":240,"line":295},[238,458,459],{},"# Cria um \"query engine\" - a interface para fazer perguntas\n",[238,461,462],{"class":240,"line":301},[238,463,464],{},"motor = indice.as_query_engine(similarity_top_k=3)\n",[238,466,467],{"class":240,"line":307},[238,468,263],{"emptyLinePlaceholder":262},[238,470,471],{"class":240,"line":312},[238,472,473],{},"# Pergunta\n",[238,475,476],{"class":240,"line":318},[238,477,478],{},"resposta = motor.query(\"Qual a política de reembolso?\")\n",[238,480,482],{"class":240,"line":481},15,[238,483,484],{},"print(resposta)\n",[85,486,487],{},"Veja a diferença: em LlamaIndex, três linhas construíram um RAG completo. Em\nLangChain, você teria que escolher o vector store, configurar o retriever,\nmontar a chain de QA, definir o prompt manualmente. Mais controle — também\nmais trabalho.",[11,489,491],{"id":490},"comparação-direta-comparacao","Comparação direta {#comparacao}",[493,494,495,509],"table",{},[496,497,498],"thead",{},[499,500,501,505,507],"tr",{},[502,503,504],"th",{},"Critério",[502,506,134],{},[502,508,138],{},[510,511,512,524,535,546,557,567,578,588,599,610,621],"tbody",{},[499,513,514,518,521],{},[515,516,517],"td",{},"Foco principal",[515,519,520],{},"Aplicações gerais com LLM",[515,522,523],{},"RAG e dados",[499,525,526,529,532],{},[515,527,528],{},"Curva de aprendizado",[515,530,531],{},"Íngreme (muitas abstrações)",[515,533,534],{},"Moderada (API mais direta)",[499,536,537,540,543],{},[515,538,539],{},"Flexibilidade",[515,541,542],{},"Muito alta",[515,544,545],{},"Alta em RAG, média fora disso",[499,547,548,551,554],{},[515,549,550],{},"Documentação",[515,552,553],{},"Volumosa, às vezes desatualizada",[515,555,556],{},"Mais enxuta e atual",[499,558,559,561,564],{},[515,560,178],{},[515,562,563],{},"Maduro, com LangGraph",[515,565,566],{},"Bom, mas mais focado em consulta",[499,568,569,572,575],{},[515,570,571],{},"Melhor RAG simples",[515,573,574],{},"OK",[515,576,577],{},"Excelente",[499,579,580,583,585],{},[515,581,582],{},"Melhor RAG avançado",[515,584,574],{},[515,586,587],{},"Excelente (reranking, hybrid)",[499,589,590,593,596],{},[515,591,592],{},"Comunidade",[515,594,595],{},"Maior",[515,597,598],{},"Grande, crescendo rápido",[499,600,601,604,607],{},[515,602,603],{},"Estabilidade de API",[515,605,606],{},"Mudou muito no passado",[515,608,609],{},"Mais estável recentemente",[499,611,612,615,618],{},[515,613,614],{},"TypeScript",[515,616,617],{},"Sim (separado)",[515,619,620],{},"Sim",[499,622,623,626,629],{},[515,624,625],{},"Observabilidade",[515,627,628],{},"LangSmith (pago)",[515,630,631],{},"LlamaCloud + integrações",[11,633,635],{"id":634},"quando-usar-langchain-quando-langchain","Quando usar LangChain {#quando-langchain}",[103,637,638,644,650,656,662],{},[19,639,640,643],{},[89,641,642],{},"Quando o problema não é RAG",": classificação de textos, extração\nestruturada, sumarização em pipeline, geração de código.",[19,645,646,649],{},[89,647,648],{},"Quando você quer agentes complexos",": LangGraph (subprojeto do\nLangChain) é hoje a ferramenta mais madura para agentes com estado,\nloops e múltiplos papéis.",[19,651,652,655],{},[89,653,654],{},"Quando você quer controle fino",": montar cada etapa do pipeline do\njeito que faz sentido para o seu caso.",[19,657,658,661],{},[89,659,660],{},"Quando você precisa de muitas integrações",": conectores para tudo que\nexiste (vector stores, ferramentas, fontes de dados).",[19,663,664,667],{},[89,665,666],{},"Quando vai publicar como API",": LangServe gera endpoints REST\nautomaticamente a partir de chains.",[85,669,670,673],{},[89,671,672],{},"Caso típico",": \"Quero um agente que recebe um e-mail do cliente, decide se\nencaminha para vendas ou suporte, busca o histórico no CRM, e responde. Tudo\nautomático.\" Esse é um problema de agente com várias ferramentas — LangChain",[103,675,676],{},[19,677,678],{},"LangGraph brilha aqui.",[11,680,682],{"id":681},"quando-usar-llamaindex-quando-llamaindex","Quando usar LlamaIndex {#quando-llamaindex}",[103,684,685,691,697,703,709],{},[19,686,687,690],{},[89,688,689],{},"Quando o problema é RAG",": chatbot que responde com base na sua base de\nconhecimento, assistente que consulta seus documentos internos.",[19,692,693,696],{},[89,694,695],{},"Quando você tem dados heterogêneos",": PDFs, Notion, Salesforce, banco\nSQL — LlamaIndex tem conectores prontos e otimizados.",[19,698,699,702],{},[89,700,701],{},"Quando você precisa de RAG avançado",": reranking, hybrid search,\nsub-questões, consulta multi-documento.",[19,704,705,708],{},[89,706,707],{},"Quando você quer velocidade de protótipo",": o caminho do \"documento →\nRAG funcionando\" é o mais rápido do mercado.",[19,710,711,714],{},[89,712,713],{},"Quando você quer qualidade de recuperação",": as estratégias padrão do\nLlamaIndex costumam acertar mais que as do LangChain out-of-the-box.",[85,716,717,719],{},[89,718,672],{},": \"Tenho 500 PDFs de manuais técnicos e quero um chatbot que\nresponda perguntas dos clientes só com base nesses manuais.\" LlamaIndex\nresolve isso em 30 linhas de código e com qualidade alta.",[11,721,723],{"id":722},"exemplo-de-código-rag-com-langchain-codigo-langchain","Exemplo de código: RAG com LangChain {#codigo-langchain}",[228,725,727],{"className":230,"code":726,"language":232,"meta":233,"style":233},"# pip install langchain langchain-openai langchain-community \\\n#             langchain-postgres tiktoken\n\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom langchain_community.document_loaders import DirectoryLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_postgres.vectorstores import PGVector\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\n\n# 1. Carregar documentos (PDFs, MDs, TXTs da pasta)\nloader = DirectoryLoader(\".\u002Fdocs\", glob=\"**\u002F*.md\")\ndocs = loader.load()\n\n# 2. Quebrar em pedaços menores (chunks) - o LLM não lê tudo de uma vez\n#    chunk_size: tamanho de cada pedaço em caracteres\n#    chunk_overlap: sobreposição para não cortar ideias no meio\nsplitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000, chunk_overlap=200\n)\nchunks = splitter.split_documents(docs)\n\n# 3. Gerar embeddings e salvar no Postgres com pgvector\n#    embeddings: vetores numéricos que representam o sentido do texto\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\nvectorstore = PGVector.from_documents(\n    documents=chunks,\n    embedding=embeddings,\n    connection_string=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fia\",\n    collection_name=\"meus_docs\",\n)\n\n# 4. Criar o retriever - a parte que busca chunks relevantes\nretriever = vectorstore.as_retriever(search_kwargs={\"k\": 4})\n\n# 5. Montar o prompt - como falar com o LLM\nprompt = ChatPromptTemplate.from_template(\"\"\"\nVocê é um assistente que responde SÓ com base no contexto abaixo.\nSe não souber, diga que não tem informação.\n\nContexto:\n{contexto}\n\nPergunta: {pergunta}\n\"\"\")\n\n# 6. Modelo\nmodelo = ChatOpenAI(model=\"gpt-4o-mini\", temperature=0.2)\n\n# 7. Montar a chain: busca contexto -> formata prompt -> chama LLM\ndef formatar_docs(docs):\n    return \"\\n\\n\".join(d.page_content for d in docs)\n\nchain = (\n    {\"contexto\": retriever | formatar_docs, \"pergunta\": RunnablePassthrough()}\n    | prompt\n    | modelo\n)\n\n# 8. Usar\nresposta = chain.invoke(\"Qual a política de reembolso?\")\nprint(resposta.content)\n",[235,728,729,734,739,743,748,753,758,763,767,772,776,781,786,791,795,800,806,812,818,824,830,836,841,847,853,859,865,871,877,883,889,894,899,905,911,916,922,928,934,940,945,951,957,962,968,974,979,985,990,995,1001,1007,1013,1018,1024,1030,1036,1042,1047,1052,1058,1064],{"__ignoreMap":233},[238,730,731],{"class":240,"line":241},[238,732,733],{},"# pip install langchain langchain-openai langchain-community \\\n",[238,735,736],{"class":240,"line":247},[238,737,738],{},"#             langchain-postgres tiktoken\n",[238,740,741],{"class":240,"line":253},[238,742,263],{"emptyLinePlaceholder":262},[238,744,745],{"class":240,"line":259},[238,746,747],{},"from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n",[238,749,750],{"class":240,"line":266},[238,751,752],{},"from langchain_community.document_loaders import DirectoryLoader\n",[238,754,755],{"class":240,"line":272},[238,756,757],{},"from langchain_text_splitters import RecursiveCharacterTextSplitter\n",[238,759,760],{"class":240,"line":278},[238,761,762],{},"from langchain_postgres.vectorstores import PGVector\n",[238,764,765],{"class":240,"line":284},[238,766,250],{},[238,768,769],{"class":240,"line":290},[238,770,771],{},"from langchain_core.runnables import RunnablePassthrough\n",[238,773,774],{"class":240,"line":295},[238,775,263],{"emptyLinePlaceholder":262},[238,777,778],{"class":240,"line":301},[238,779,780],{},"# 1. Carregar documentos (PDFs, MDs, TXTs da pasta)\n",[238,782,783],{"class":240,"line":307},[238,784,785],{},"loader = DirectoryLoader(\".\u002Fdocs\", glob=\"**\u002F*.md\")\n",[238,787,788],{"class":240,"line":312},[238,789,790],{},"docs = loader.load()\n",[238,792,793],{"class":240,"line":318},[238,794,263],{"emptyLinePlaceholder":262},[238,796,797],{"class":240,"line":481},[238,798,799],{},"# 2. Quebrar em pedaços menores (chunks) - o LLM não lê tudo de uma vez\n",[238,801,803],{"class":240,"line":802},16,[238,804,805],{},"#    chunk_size: tamanho de cada pedaço em caracteres\n",[238,807,809],{"class":240,"line":808},17,[238,810,811],{},"#    chunk_overlap: sobreposição para não cortar ideias no meio\n",[238,813,815],{"class":240,"line":814},18,[238,816,817],{},"splitter = RecursiveCharacterTextSplitter(\n",[238,819,821],{"class":240,"line":820},19,[238,822,823],{},"    chunk_size=1000, chunk_overlap=200\n",[238,825,827],{"class":240,"line":826},20,[238,828,829],{},")\n",[238,831,833],{"class":240,"line":832},21,[238,834,835],{},"chunks = splitter.split_documents(docs)\n",[238,837,839],{"class":240,"line":838},22,[238,840,263],{"emptyLinePlaceholder":262},[238,842,844],{"class":240,"line":843},23,[238,845,846],{},"# 3. Gerar embeddings e salvar no Postgres com pgvector\n",[238,848,850],{"class":240,"line":849},24,[238,851,852],{},"#    embeddings: vetores numéricos que representam o sentido do texto\n",[238,854,856],{"class":240,"line":855},25,[238,857,858],{},"embeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n",[238,860,862],{"class":240,"line":861},26,[238,863,864],{},"vectorstore = PGVector.from_documents(\n",[238,866,868],{"class":240,"line":867},27,[238,869,870],{},"    documents=chunks,\n",[238,872,874],{"class":240,"line":873},28,[238,875,876],{},"    embedding=embeddings,\n",[238,878,880],{"class":240,"line":879},29,[238,881,882],{},"    connection_string=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fia\",\n",[238,884,886],{"class":240,"line":885},30,[238,887,888],{},"    collection_name=\"meus_docs\",\n",[238,890,892],{"class":240,"line":891},31,[238,893,829],{},[238,895,897],{"class":240,"line":896},32,[238,898,263],{"emptyLinePlaceholder":262},[238,900,902],{"class":240,"line":901},33,[238,903,904],{},"# 4. Criar o retriever - a parte que busca chunks relevantes\n",[238,906,908],{"class":240,"line":907},34,[238,909,910],{},"retriever = vectorstore.as_retriever(search_kwargs={\"k\": 4})\n",[238,912,914],{"class":240,"line":913},35,[238,915,263],{"emptyLinePlaceholder":262},[238,917,919],{"class":240,"line":918},36,[238,920,921],{},"# 5. Montar o prompt - como falar com o LLM\n",[238,923,925],{"class":240,"line":924},37,[238,926,927],{},"prompt = ChatPromptTemplate.from_template(\"\"\"\n",[238,929,931],{"class":240,"line":930},38,[238,932,933],{},"Você é um assistente que responde SÓ com base no contexto abaixo.\n",[238,935,937],{"class":240,"line":936},39,[238,938,939],{},"Se não souber, diga que não tem informação.\n",[238,941,943],{"class":240,"line":942},40,[238,944,263],{"emptyLinePlaceholder":262},[238,946,948],{"class":240,"line":947},41,[238,949,950],{},"Contexto:\n",[238,952,954],{"class":240,"line":953},42,[238,955,956],{},"{contexto}\n",[238,958,960],{"class":240,"line":959},43,[238,961,263],{"emptyLinePlaceholder":262},[238,963,965],{"class":240,"line":964},44,[238,966,967],{},"Pergunta: {pergunta}\n",[238,969,971],{"class":240,"line":970},45,[238,972,973],{},"\"\"\")\n",[238,975,977],{"class":240,"line":976},46,[238,978,263],{"emptyLinePlaceholder":262},[238,980,982],{"class":240,"line":981},47,[238,983,984],{},"# 6. Modelo\n",[238,986,988],{"class":240,"line":987},48,[238,989,281],{},[238,991,993],{"class":240,"line":992},49,[238,994,263],{"emptyLinePlaceholder":262},[238,996,998],{"class":240,"line":997},50,[238,999,1000],{},"# 7. Montar a chain: busca contexto -> formata prompt -> chama LLM\n",[238,1002,1004],{"class":240,"line":1003},51,[238,1005,1006],{},"def formatar_docs(docs):\n",[238,1008,1010],{"class":240,"line":1009},52,[238,1011,1012],{},"    return \"\\n\\n\".join(d.page_content for d in docs)\n",[238,1014,1016],{"class":240,"line":1015},53,[238,1017,263],{"emptyLinePlaceholder":262},[238,1019,1021],{"class":240,"line":1020},54,[238,1022,1023],{},"chain = (\n",[238,1025,1027],{"class":240,"line":1026},55,[238,1028,1029],{},"    {\"contexto\": retriever | formatar_docs, \"pergunta\": RunnablePassthrough()}\n",[238,1031,1033],{"class":240,"line":1032},56,[238,1034,1035],{},"    | prompt\n",[238,1037,1039],{"class":240,"line":1038},57,[238,1040,1041],{},"    | modelo\n",[238,1043,1045],{"class":240,"line":1044},58,[238,1046,829],{},[238,1048,1050],{"class":240,"line":1049},59,[238,1051,263],{"emptyLinePlaceholder":262},[238,1053,1055],{"class":240,"line":1054},60,[238,1056,1057],{},"# 8. Usar\n",[238,1059,1061],{"class":240,"line":1060},61,[238,1062,1063],{},"resposta = chain.invoke(\"Qual a política de reembolso?\")\n",[238,1065,1067],{"class":240,"line":1066},62,[238,1068,1069],{},"print(resposta.content)\n",[85,1071,1072],{},"Cada bloco numerado é uma etapa do RAG. LangChain te faz explicitar todas —\nmais código, mais controle. Note como você escolhe splitter, retriever,\nprompt e modelo separadamente.",[11,1074,1076],{"id":1075},"exemplo-de-código-rag-com-llamaindex-codigo-llamaindex","Exemplo de código: RAG com LlamaIndex {#codigo-llamaindex}",[228,1078,1080],{"className":230,"code":1079,"language":232,"meta":233,"style":233},"# pip install llama-index llama-index-vector-stores-postgres \\\n#             llama-index-embeddings-openai llama-index-llms-openai\n\nfrom llama_index.core import VectorStoreIndex, SimpleDirectoryReader\nfrom llama_index.core import Settings\nfrom llama_index.llms.openai import OpenAI\nfrom llama_index.embeddings.openai import OpenAIEmbedding\nfrom llama_index.vector_stores.postgres import PGVectorStore\nfrom sqlalchemy import create_engine\n\n# 1. Configurar modelos globais (LLM e embeddings)\nSettings.llm = OpenAI(model=\"gpt-4o-mini\", temperature=0.2)\nSettings.embed_model = OpenAIEmbedding(model=\"text-embedding-3-small\")\n\n# 2. Carregar documentos - LlamaIndex cuida da leitura e parsing\ndocumentos = SimpleDirectoryReader(\".\u002Fdocs\").load_data()\n\n# 3. Conectar ao Postgres com pgvector\nengine = create_engine(\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fia\")\nvector_store = PGVectorStore.from_params(\n    database=\"ia\",\n    host=\"localhost\",\n    password=\"pass\",\n    port=5432,\n    user=\"user\",\n    table_name=\"meus_docs\",\n    embed_dim=1536,  # tamanho do vetor do text-embedding-3-small\n)\n\n# 4. Construir índice (chunking + embeddings + armazenamento automáticos)\nindice = VectorStoreIndex.from_documents(\n    documentos,\n    vector_store=vector_store,\n    chunk_size=1000,\n    chunk_overlap=200,\n)\n\n# 5. Criar o query engine - interface de pergunta\n#    similarity_top_k: quantos chunks relevantes recuperar\nmotor = indice.as_query_engine(similarity_top_k=4)\n\n# 6. Perguntar\nresposta = motor.query(\"Qual a política de reembolso?\")\nprint(resposta)\n",[235,1081,1082,1087,1092,1096,1100,1105,1110,1115,1120,1125,1129,1134,1139,1144,1148,1153,1158,1162,1167,1172,1177,1182,1187,1192,1197,1202,1207,1212,1216,1220,1225,1230,1235,1240,1245,1250,1254,1258,1263,1268,1273,1277,1282,1286],{"__ignoreMap":233},[238,1083,1084],{"class":240,"line":241},[238,1085,1086],{},"# pip install llama-index llama-index-vector-stores-postgres \\\n",[238,1088,1089],{"class":240,"line":247},[238,1090,1091],{},"#             llama-index-embeddings-openai llama-index-llms-openai\n",[238,1093,1094],{"class":240,"line":253},[238,1095,263],{"emptyLinePlaceholder":262},[238,1097,1098],{"class":240,"line":259},[238,1099,417],{},[238,1101,1102],{"class":240,"line":266},[238,1103,1104],{},"from llama_index.core import Settings\n",[238,1106,1107],{"class":240,"line":272},[238,1108,1109],{},"from llama_index.llms.openai import OpenAI\n",[238,1111,1112],{"class":240,"line":278},[238,1113,1114],{},"from llama_index.embeddings.openai import OpenAIEmbedding\n",[238,1116,1117],{"class":240,"line":284},[238,1118,1119],{},"from llama_index.vector_stores.postgres import PGVectorStore\n",[238,1121,1122],{"class":240,"line":290},[238,1123,1124],{},"from sqlalchemy import create_engine\n",[238,1126,1127],{"class":240,"line":295},[238,1128,263],{"emptyLinePlaceholder":262},[238,1130,1131],{"class":240,"line":301},[238,1132,1133],{},"# 1. Configurar modelos globais (LLM e embeddings)\n",[238,1135,1136],{"class":240,"line":307},[238,1137,1138],{},"Settings.llm = OpenAI(model=\"gpt-4o-mini\", temperature=0.2)\n",[238,1140,1141],{"class":240,"line":312},[238,1142,1143],{},"Settings.embed_model = OpenAIEmbedding(model=\"text-embedding-3-small\")\n",[238,1145,1146],{"class":240,"line":318},[238,1147,263],{"emptyLinePlaceholder":262},[238,1149,1150],{"class":240,"line":481},[238,1151,1152],{},"# 2. Carregar documentos - LlamaIndex cuida da leitura e parsing\n",[238,1154,1155],{"class":240,"line":802},[238,1156,1157],{},"documentos = SimpleDirectoryReader(\".\u002Fdocs\").load_data()\n",[238,1159,1160],{"class":240,"line":808},[238,1161,263],{"emptyLinePlaceholder":262},[238,1163,1164],{"class":240,"line":814},[238,1165,1166],{},"# 3. Conectar ao Postgres com pgvector\n",[238,1168,1169],{"class":240,"line":820},[238,1170,1171],{},"engine = create_engine(\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fia\")\n",[238,1173,1174],{"class":240,"line":826},[238,1175,1176],{},"vector_store = PGVectorStore.from_params(\n",[238,1178,1179],{"class":240,"line":832},[238,1180,1181],{},"    database=\"ia\",\n",[238,1183,1184],{"class":240,"line":838},[238,1185,1186],{},"    host=\"localhost\",\n",[238,1188,1189],{"class":240,"line":843},[238,1190,1191],{},"    password=\"pass\",\n",[238,1193,1194],{"class":240,"line":849},[238,1195,1196],{},"    port=5432,\n",[238,1198,1199],{"class":240,"line":855},[238,1200,1201],{},"    user=\"user\",\n",[238,1203,1204],{"class":240,"line":861},[238,1205,1206],{},"    table_name=\"meus_docs\",\n",[238,1208,1209],{"class":240,"line":867},[238,1210,1211],{},"    embed_dim=1536,  # tamanho do vetor do text-embedding-3-small\n",[238,1213,1214],{"class":240,"line":873},[238,1215,829],{},[238,1217,1218],{"class":240,"line":879},[238,1219,263],{"emptyLinePlaceholder":262},[238,1221,1222],{"class":240,"line":885},[238,1223,1224],{},"# 4. Construir índice (chunking + embeddings + armazenamento automáticos)\n",[238,1226,1227],{"class":240,"line":891},[238,1228,1229],{},"indice = VectorStoreIndex.from_documents(\n",[238,1231,1232],{"class":240,"line":896},[238,1233,1234],{},"    documentos,\n",[238,1236,1237],{"class":240,"line":901},[238,1238,1239],{},"    vector_store=vector_store,\n",[238,1241,1242],{"class":240,"line":907},[238,1243,1244],{},"    chunk_size=1000,\n",[238,1246,1247],{"class":240,"line":913},[238,1248,1249],{},"    chunk_overlap=200,\n",[238,1251,1252],{"class":240,"line":918},[238,1253,829],{},[238,1255,1256],{"class":240,"line":924},[238,1257,263],{"emptyLinePlaceholder":262},[238,1259,1260],{"class":240,"line":930},[238,1261,1262],{},"# 5. Criar o query engine - interface de pergunta\n",[238,1264,1265],{"class":240,"line":936},[238,1266,1267],{},"#    similarity_top_k: quantos chunks relevantes recuperar\n",[238,1269,1270],{"class":240,"line":942},[238,1271,1272],{},"motor = indice.as_query_engine(similarity_top_k=4)\n",[238,1274,1275],{"class":240,"line":947},[238,1276,263],{"emptyLinePlaceholder":262},[238,1278,1279],{"class":240,"line":953},[238,1280,1281],{},"# 6. Perguntar\n",[238,1283,1284],{"class":240,"line":959},[238,1285,478],{},[238,1287,1288],{"class":240,"line":964},[238,1289,484],{},[85,1291,1292],{},"Veja: mesmo resultado, bem menos código. LlamaIndex assume defaults\nsensatos e expõe só o que importa. Você troca 8 etapas explícitas por 6\ndeclarativas — e ganha estratégias de reranking \"de graça\" quando precisar.",[11,1294,1296],{"id":1295},"e-os-agentes-agentes","E os agentes? {#agentes}",[85,1298,1299,1300,1303,1304,1307,1308,129],{},"Agente de IA é um LLM que recebe ferramentas e decide sozinho qual usar para\nresolver uma tarefa — em vez de seguir um fluxo fixo. Exemplo: um agente que\nrecebe \"agende uma reunião com o João\" pode decidir chamar a ferramenta\n",[235,1301,1302],{},"buscar_email(joao)",", depois ",[235,1305,1306],{},"verificar_agenda(quinta)",", depois\n",[235,1309,1310],{},"criar_evento(...)",[493,1312,1313,1326],{},[496,1314,1315],{},[499,1316,1317,1320,1323],{},[502,1318,1319],{},"Ferramenta",[502,1321,1322],{},"Para que",[502,1324,1325],{},"Quando usar",[510,1327,1328,1339,1350,1361],{},[499,1329,1330,1333,1336],{},[515,1331,1332],{},"LangChain Agents",[515,1334,1335],{},"Agentes simples, few-shot",[515,1337,1338],{},"Provas de conceito rápidas",[499,1340,1341,1344,1347],{},[515,1342,1343],{},"LangGraph",[515,1345,1346],{},"Agentes com estado, loops, múltiplos papéis",[515,1348,1349],{},"Agentes de produção complexos",[499,1351,1352,1355,1358],{},[515,1353,1354],{},"LlamaIndex Agents",[515,1356,1357],{},"Agentes que consultam dados",[515,1359,1360],{},"Quando o trabalho principal é RAG",[499,1362,1363,1366,1369],{},[515,1364,1365],{},"CrewAI \u002F AutoGen",[515,1367,1368],{},"Multi-agentes colaborativos",[515,1370,1371],{},"Quando você quer \"uma equipe de IAs\"",[85,1373,1374,1377,1378,1380],{},[89,1375,1376],{},"Recomendação prática",": para agentes complexos com estado e fluxos\nelaborados, ",[89,1379,1343],{}," (do ecossistema LangChain) é hoje a escolha mais\nmadura. Para agentes cujo trabalho principal é consultar documentos e\nbancos, LlamaIndex Agents é mais direto.",[85,1382,1383,1384,1387],{},"Importante: ",[89,1385,1386],{},"agente não é bala de prata",". Antes de adotar um agente,\navalie se uma chain simples (fluxo fixo) não resolve. Agentes são mais\nflexíveis, mas mais lentos, mais caros e mais difíceis de debugar. Use só\nquando a decisão \"qual ferramenta usar\" realmente varia entre chamadas.",[11,1389,1391],{"id":1390},"erros-comuns-erros","Erros comuns {#erros}",[16,1393,1394,1400,1406,1412,1422,1432,1438,1444],{},[19,1395,1396,1399],{},[89,1397,1398],{},"Escolher framework antes do problema",": \"vou usar LangChain porque é o\nmais famoso\". Comece pelo problema, depois escolha a ferramenta.",[19,1401,1402,1405],{},[89,1403,1404],{},"Misturar os dois sem motivo",": usar LangChain pra agents e LlamaIndex\npra RAG no mesmo projeto, sem necessidade. Dá pra fazer, mas você paga\nduas curvas de aprendizado. Escolha um e vá fundo.",[19,1407,1408,1411],{},[89,1409,1410],{},"Achar que framework resolve tudo",": framework orquestra, mas a qualidade\nvem dos dados, do prompt e do modelo. Sem curadoria, nem LlamaIndex salva.",[19,1413,1414,1417,1418,1421],{},[89,1415,1416],{},"Usar defaults sem entender",": LlamaIndex tem ",[235,1419,1420],{},"chunk_size=1024"," default.\nPara manuais técnicos curtos, isso corta seções no meio. Entenda os\nparâmetros antes de aceitar.",[19,1423,1424,1427,1428,1431],{},[89,1425,1426],{},"Subestimar a instabilidade do LangChain",": a API mudou muito entre 2022\ne 2024. Travou em uma versão no ",[235,1429,1430],{},"requirements.txt"," para não quebrar.",[19,1433,1434,1437],{},[89,1435,1436],{},"Ignorar observabilidade",": sem LangSmith ou equivalente, você não sabe\no que o agente está decidindo. Em produção, isso vira caixa-preta.",[19,1439,1440,1443],{},[89,1441,1442],{},"Construir agente logo no primeiro projeto",": agentes são tentadores, mas\ncomeçar com uma chain simples evita 80% dos problemas de custo e\nimprevisibilidade.",[19,1445,1446,1449,1450,1453],{},[89,1447,1448],{},"Não isolar o framework do seu código",": importar ",[235,1451,1452],{},"langchain"," em todo\narquivo do sistema. Crie uma camada de abstração para poder trocar de\nframework (ou versão) sem reescrever tudo.",[1455,1456],"hr",{},[85,1458,1459,1462,1463,1467],{},[89,1460,1461],{},"Não sabe qual framework escolher para o seu caso?"," A Inicialize Tec\navalia sua necessidade e implementa com a ferramenta certa — sem viés de\nmodinha. ",[22,1464,1466],{"href":1465},"\u002F#top","Entre em contato"," e conversamos sobre seu projeto.",[1469,1470,1471],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":233,"searchDepth":253,"depth":253,"links":1473},[1474,1475,1476,1480,1484,1485,1486,1487,1488,1489,1490],{"id":13,"depth":247,"text":14},{"id":82,"depth":247,"text":83},{"id":152,"depth":247,"text":153,"children":1477},[1478,1479],{"id":164,"depth":253,"text":165},{"id":218,"depth":253,"text":219},{"id":331,"depth":247,"text":332,"children":1481},[1482,1483],{"id":353,"depth":253,"text":354},{"id":400,"depth":253,"text":219},{"id":490,"depth":247,"text":491},{"id":634,"depth":247,"text":635},{"id":681,"depth":247,"text":682},{"id":722,"depth":247,"text":723},{"id":1075,"depth":247,"text":1076},{"id":1295,"depth":247,"text":1296},{"id":1390,"depth":247,"text":1391},"inteligencia-artificial","2026-08-26","Comparativo dos dois frameworks mais populares para construir aplicações com LLMs. O que cada um faz, quando usar e exemplos de código.","md",[1452,1496,1497,91,346,1498,1499],"llamaindex","framework IA","Python","agentes",{},"\u002Fia\u002Flangchain-vs-llamaindex",{"title":5,"description":1493},"langchain-vs-llamaindex","ia\u002Flangchain-vs-llamaindex","18EQfFzsztHwZZansyawe1zPtUtoZb5rndGhpd9lVeM",1787796309109]