1
resposta

[Projeto] 04 Faça como eu fiz: avaliação RAG

IMPLEMENTAÇÃO

1️ Manual de Avaliação do Conjunto de Dados

Criar lista emenda:

evaluation_dataset = [
{
"query": "Qual o prazo de vigência do contrato?",
"answer": "O prazo de vigência é de 12 meses, podendo ser prorrogado."
},
{
"query": "Qual a penalidade por inadimplemento?",
"answer": "Multa de 10% sobre o valor contratual."
}
]

Formato obrigatório:

consulta

responder

2️ Base do Pipeline (Sem RAG)
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0
)

def generate_without_rag(question):
return llm.invoke(question).content

3️ Pipeline com RAG

Supondo que o retriever já esteja configurado:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("""
Responda usando apenas o contexto:

{context}

Pergunta:
{question}
""")

rag_chain = (
{
"context": retriever,
"question": RunnablePassthrough()
}
| prompt
| llm
| StrOutputParser()
)

def generate_with_rag(question):
return rag_chain.invoke(question)

4️ Geração Automática de Pergunt
from langchain.chains import QAGenerationChain

qa_gen_chain = QAGenerationChain.from_llm(llm)

generated_qa = qa_gen_chain.run(chunks[:5])
print(generated_qa)

Isso cria pares automáticos de:

pergunta

resposta esperado

Agora você tem um conjunto de dados sintético.

5️ Integração QA-Eval
from langchain.evaluation.qa import QAEvalChain

eval_chain = QAEvalChain.from_llm(llm)

6️ Função de Avaliação Iterativa
def evaluate_pipeline(dataset, generator_function):

predictions = []
references = []

for item in dataset:
    prediction = generator_function(item["query"])
    
    predictions.append({
        "query": item["query"],
        "result": prediction
    })
    
    references.append({
        "query": item["query"],
        "answer": item["answer"]
    })

graded_outputs = eval_chain.evaluate(
    references,
    predictions
)

return graded_outputs

7️ Executar Avaliação
Sem RAG
results_no_rag = evaluate_pipeline(
evaluation_dataset,
generate_without_rag
)

Com RAG
results_rag = evaluate_pipeline(
evaluation_dataset,
generate_with_rag
)

8️ Análise de Resultados

Resultados típicos:

[
{'results': 'CORRECT'},
{'results': 'INCORRECT'}
]

Calcular taxa de acerto:

def compute_accuracy(results):
correct = sum(1 for r in results if "CORRECT" in r["results"])
return correct / len(results)

print("Sem RAG:", compute_accuracy(results_no_rag))
print("Com RAG:", compute_accuracy(results_rag))

1 resposta

Oi, Moacir! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Você estruturou muito bem a avaliação do RAG! O seu código mostra clareza na organização do pipeline e entendimento da comparação entre sem RAG e com RAG, o que é importante nessa etapa de validação.

Continue assim!

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura

Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!