Tutorial Completo — RAG com
LangChain e [Link]
Baseado no minicurso: IA Além do ChatGPT - RAG com LangChain e [Link]
Autor: DECIO FERNANDO MATTEI – [Link]@[Link]
Este documento apresenta um guia completo para criar uma aplicação RAG
(Retrieval-Augmented Generation / Geração Aumentada por Retorno) utilizando [Link],
LangChain e OpenAI.
A implementação inclui:
• Leitura de PDFs
• Criação de embeddings
• Busca vetorial
• Integração com GPT
• Chat inteligente baseado em documentos
Pré-requisitos
• Ambiente com [Link] instalado
• Chave de API Open AI com crédito disponível
Conceitos Fundamentais
RAG (Retrieval-Augmented Generation)
Busca informações relevantes antes de gerar respostas.
Em português: Geração Aumentada por Recuperação
Embeddings
Representações matemáticas de textos.
Chunking
Divisão de documentos em pequenos blocos.
Vector Store
Banco especializado em busca vetorial.
Retriever
Busca os chunks mais relevantes.
1. Criando o Projeto
Nesta etapa criamos a estrutura inicial do projeto [Link].
O comando abaixo cria a pasta e inicializa o [Link].
mkdir langchain-rag
cd langchain-rag
npm init -y
2. Iniciando Editor de Código
Em nosso estudo utilizaremos VS Code
3. Instalando Dependências
Agora instalamos as bibliotecas necessárias para construir o sistema RAG.
npm install dotenv @langchain/classic @langchain/core @langchain/openai
@langchain/textsplitters langchain pdf-parse@1.1.1
4. Configurando [Link]
Precisamos habilitar ESModules no [Link].
{
"name": "langchain-rag",
"version": "1.0.0",
"type": "module"
}
5. Criando o .env
O .env armazena sua API Key da OpenAI.
OPENAI_API_KEY=sua_chave_aqui
6. Estrutura do Projeto
Após as configurações iniciais sua estrutura ficará assim.
langchain-rag/
│
├── node_modules/
├── [Link]
├── .env
├── [Link]
└── [Link]
7. Importações
Importamos bibliotecas para PDF, embeddings, GPT e vector store.
import "dotenv/config";
import fs from "fs";
import readline from "node:readline/promises";
import pdf from "pdf-parse/lib/[Link]";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory";
8. Função de Leitura do PDF
Essa função abre o PDF e extrai o texto.
async function loadPdfText(pdfPath) {
const pdfBuffer = [Link](pdfPath);
const parsed = await pdf(pdfBuffer);
return [Link] || "";
}
9. Chunking
Dividimos o documento em pequenos blocos chamados chunks.
const PDF_PATH = "[Link]";
const CHUNK_SIZE = 1200;
const CHUNK_OVERLAP = 200;
10. Split do Texto
O splitter cria automaticamente os chunks.
const pdfText = await loadPdfText(PDF_PATH);
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: CHUNK_SIZE,
chunkOverlap: CHUNK_OVERLAP,
});
const chunks = await [Link](pdfText);
11. Embeddings
Embeddings transformam texto em vetores matemáticos.
const embeddings = new OpenAIEmbeddings({
model: "text-embedding-3-small",
openAIApiKey: [Link].OPENAI_API_KEY,
});
12. Banco Vetorial
Armazenamos os embeddings no Vector Store.
const vectorStore = await [Link](
chunks,
[Link](() => ({})),
embeddings
);
13. Retriever
O retriever busca os chunks mais relevantes.
const TOP_K = 4;
const retriever = [Link](TOP_K);
14. GPT
Inicializamos o modelo GPT.
const model = new ChatOpenAI({
model: "gpt-4.1-mini",
temperature: 0,
openAIApiKey: [Link].OPENAI_API_KEY,
});
15. Chat Terminal
Criamos uma interface interativa no terminal.
[Link]("PDF carregado!");
const rl = [Link]({
input: [Link],
output: [Link],
});
16. answerQuestion()
Função principal do sistema RAG.
async function answerQuestion(question, retriever, model) {
const relevantDocs = await [Link](question);
const context = relevantDocs
.map(doc => [Link])
.join("\n\n");
const prompt = `
Você é um assistente que responde perguntas usando o contexto abaixo.
Contexto:
${context}
Pergunta:
${question}
`;
const response = await [Link](prompt);
[Link]("\nResposta:\n");
[Link]([Link]);
}
17. Loop Principal
Mantém o chat funcionando continuamente.
try {
while (true) {
const question = (
await [Link]("Pergunta> ")
).trim();
if (!question) continue;
const normalized = [Link]();
if (
normalized === "sair" ||
normalized === "exit" ||
normalized === "quit"
) {
break;
}
await answerQuestion(
question,
retriever,
model
);
[Link]("\n----------------\n");
}
} finally {
[Link]();
}
18. Executando o Projeto
Agora execute o sistema.
node [Link]