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))