Capítulo 6
RAG no Prompt
A integração completa: como montar o prompt com contexto recuperado e enviar ao LLM para respostas fundamentadas.
🔄 Fluxo Completo
🔍
1Recuperar chunks
RetrievalService busca os k chunks mais similares
✅
2Verificar relevância
Descartar chunks com similarity < limiar (ex: 0.5)
📦
3Montar contexto
Juntar chunks em string
📝
4Montar prompt
System prompt + contexto + pergunta do usuário
🤖
5Enviar ao LLM
API OpenAI/Anthropic com temperature baixa (0.3)
💬
6Retornar resposta
Resposta fundamentada no contexto disponível
📝 Prompt Patterns
Pattern 1
Answer from Context
Use o contexto abaixo para responder.
Se não houver informação suficiente,
diga "Não tenho essa informação."
Contexto:
{chunk1}
{chunk2}
Pergunta: {question}
Pattern 2
Cite Sources
Responda usando apenas o contexto.
Cite de qual chunk veio.
Contexto:
{chunk1} [fonte: article_id={id1}]
{chunk2} [fonte: article_id={id2}]
Pergunta: {question}
💻 RAGService — Implementação Completa
app/Services/RAGService.php
<?php
class RAGService
{
public function __construct(
private RetrievalService $retrievalService,
private EmbeddingService $embeddingService,
) {}
public function ask(string $question): string
{
// 1. Recuperar chunks relevantes
$chunks = $this->retrievalService->search($question, 3);
if ($chunks->isEmpty()) {
return "Não encontrei informações
relevantes para responder.";
}
// 2. Montar contexto
$context = $chunks
->map(fn($r) => "- {$r->chunk}")
->join("
");
// 3. Montar prompt com RAG
$systemPrompt = "Você é um assistente técnico.
Use apenas o contexto fornecido.
Se não souber, diga que não sabe.";
$userPrompt = "Contexto:
{$context}
Pergunta: {$question}";
// 4. Enviar para LLM
$response = OpenAI::chat()->create([
"string">'model' => "string">'gpt-4o-mini',
"string">'messages' => [
["string">'role' => "string">'system', "string">'content' => $systemPrompt],
["string">'role' => "string">'user', "string">'content' => $userPrompt],
],
"string">'temperature' => 0.3, // Baixa = mais consistente
]);
return $response->choices[0]->message->content;
}
}