import os
import json
from datasets import Dataset
from dotenv import load_dotenv
load_dotenv()
if not os.getenv("OPENAI_API_KEY"):
raise ValueError("OPENAI_API_KEY not found.")
# ------------------------
# RAGAS imports
# ------------------------
from ragas import evaluate
from ragas.metrics import (
Faithfulness,
AnswerRelevancy,
ContextPrecision,
ContextRecall,
)
from ragas.llms import llm_factory
from langchain_openai import OpenAIEmbeddings # Use langchain embeddings instead
from openai import OpenAI
# ------------------------
# Load files
# ------------------------
BASE_DIR = os.path.dirname(__file__)
retrieval_path = os.path.join(
BASE_DIR,
"run_retrieval",
"output",
"retrieval_output.json"
)
answer_path = os.path.join(BASE_DIR, "final_answer.txt")
with open(retrieval_path, "r") as f:
retrieval_data = json.load(f)
with open(answer_path, "r") as f:
answer_text = f.read().strip()
# ------------------------
# Build dataset
# ------------------------
ragas_data = {
"question": [retrieval_data["query"]],
"answer": [answer_text],
"contexts": [[
*retrieval_data.get("retrieved_chunks", []),
*retrieval_data.get("related_chunks", []),
]],
"ground_truth": [retrieval_data.get("ground_truth", "")],
}
dataset = Dataset.from_dict(ragas_data)
print("\nQUESTION:")
print(retrieval_data["query"])
print("\nFIRST RETRIEVED CHUNK:")
print(ragas_data["contexts"][0][0][:500])
print("\nANSWER:")
print(answer_text[:500])
# ------------------------
# LLM + Embeddings - FIXED
# ------------------------
openai_client = OpenAI()
# Increase max_tokens to avoid truncation
llm = llm_factory(
"gpt-4o-mini",
client=openai_client,
max_tokens=8000 # Increase this limit
)
# Use langchain's OpenAIEmbeddings (has proper methods)
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small"
)
# ------------------------
# Instantiate metrics
# ------------------------
faithfulness_metric = Faithfulness(llm=llm)
answer_relevancy_metric = AnswerRelevancy(
llm=llm,
embeddings=embeddings
)
context_precision_metric = ContextPrecision(llm=llm)
context_recall_metric = ContextRecall(llm=llm)
# ------------------------
# Run evaluation
# ------------------------
print("\nRunning RAGAS evaluation...")
print("=" * 60)
results = evaluate(
dataset,
metrics=[
faithfulness_metric,
answer_relevancy_metric,
context_precision_metric,
context_recall_metric,
],
)
print("\nRAGAS Evaluation Results")
print("=" * 60)
print(results)