RAG na Prática: Construindo um Chatbot que Realmente Sabe o que Fala
RAG (Retrieval-Augmented Generation) é a técnica que transforma LLMs genéricos em especialistas no seu domínio. Em vez de depender só do que o modelo aprendeu no treino, você fornece contexto relevante em cada query.
Como RAG Funciona
O pipeline tem duas fases:
- Ingestion: seus documentos são divididos em chunks, convertidos em embeddings (vetores numéricos) e armazenados em um vector database.
- Query: a pergunta do usuário vira um embedding, os chunks mais similares são recuperados, e enviados junto com a pergunta ao LLM como contexto.
Implementando com Laravel e pgvector
Primeiro, habilite a extensão pgvector no PostgreSQL e instale as dependências:
composer require openai-php/laravel
php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"
Configure sua migration para armazenar embeddings:
Schema::create('document_chunks', function (Blueprint $table) {
$table->id();
$table->foreignId('document_id')->constrained()->cascadeOnDelete();
$table->text('content');
$table->vector('embedding', 1536); // dimensão do text-embedding-3-small
$table->integer('chunk_index');
$table->timestamps();
});
O ingestion pipeline converte documentos em chunks e gera embeddings:
class DocumentIngestionService
{
public function ingest(Document $document): void
{
$chunks = $this->splitIntoChunks($document->content, chunkSize: 500, overlap: 50);
foreach ($chunks as $index => $chunk) {
$embedding = OpenAI::embeddings()->create([
'model' => 'text-embedding-3-small',
'input' => $chunk,
])->embeddings[0]->embedding;
DocumentChunk::create([
'document_id' => $document->id,
'content' => $chunk,
'embedding' => $embedding,
'chunk_index' => $index,
]);
}
}
}
Resultado
Com este pipeline, você tem um chatbot que responde com precisão usando sua base de conhecimento, cita fontes e sabe quando não sabe a resposta — evitando alucinações.
Related posts
The 5 unglamorous commits I made before turning on paid traffic
Before paying for every click on Estoque Simples, I cleaned house: a single domain, script...
Hiding the menu is not access control: how I built modules each customer can switch on and off
A small shop does not want to see commissions, invoicing and a customer portal on day one....
My second SaaS started from the code of the first: what I could reuse and what I had to rewrite
Oficina Simples was born as a fork of Estoque Simples. Login, plans, billing, privacy comp...