Files
2026-07-13 13:35:10 +08:00

108 lines
4.5 KiB
Python

import os
from openai import OpenAI
from ragas import Dataset, experiment
from ragas.llms import llm_factory
from ragas.metrics import DiscreteMetric
from .workflow import default_workflow_client
openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
workflow_client = default_workflow_client()
llm = llm_factory("gpt-4o", client=openai_client)
def load_dataset():
dataset_dict = [
{
"email": "Hi, I'm getting error code XYZ-123 when using version 2.1.4 of your software. Please help!",
"pass_criteria": "category Bug Report; product_version 2.1.4; error_code XYZ-123; response references both version and error code",
},
{
"email": "I need to dispute invoice #INV-2024-001 for 299.99 dollars. The charge seems incorrect.",
"pass_criteria": "category Billing; invoice_number INV-2024-001; amount 299.99; response references invoice and dispute process",
},
{
"email": "Would love to see a dark mode feature in the dashboard. This is really important for our team!",
"pass_criteria": "category Feature Request; requested_feature dark mode; product_area dashboard; urgency_level high/medium; response acknowledges dark mode request",
},
{
"email": "The system crashes with ERR_MEMORY_OVERFLOW but I can't find the version number anywhere.",
"pass_criteria": "category Bug Report; error_code ERR_MEMORY_OVERFLOW; product_version null; response handles missing version gracefully",
},
{
"email": "Please add the ability to export reports as PDF files. This is urgent for our quarterly review.",
"pass_criteria": "category Feature Request; requested_feature export PDF; product_area reports; urgency_level urgent/high; response reflects urgency",
},
{
"email": "It would cool to have a feature that allows users to customize their dashboard layout.",
"pass_criteria": "category Feature Request; requested_feature customize dashboard; product_area dashboard; urgency_level low/medium; response matches casual tone",
},
{
"email": "I am getting an error when I try to access the API. The error code is API-500 and I am using the latest version of the SDK.",
"pass_criteria": "category Bug Report; error_code API-500; product_version latest/null; response acknowledges API context and vague version",
},
{
"email": "The application crashed on me. I'm running v2.5.1-beta and got this weird message: 'FATAL_ERROR_001'. Can you help?",
"pass_criteria": "category Bug Report; product_version 2.5.1-beta; error_code FATAL_ERROR_001; response handles beta version and crash",
},
{
"email": "I was charged 1,299 dollars but my invoice number is BILL2024-March-001. This seems wrong.",
"pass_criteria": "category Billing; invoice_number BILL2024-March-001; amount 1299; response handles non-standard formats",
},
{
"email": "Feature needed:Real-time sync,Area:Mobile app,Priority:HIGH",
"pass_criteria": "category Feature Request; requested_feature Real-time sync; product_area mobile; urgency_level high; response parses structured format",
},
]
dataset = Dataset(
name="test_dataset",
backend="local/csv",
root_dir=".",
)
for sample in dataset_dict:
row = {"email": sample["email"], "pass_criteria": sample["pass_criteria"]}
dataset.append(row)
dataset.save() # Save the dataset
return dataset
my_metric = DiscreteMetric(
name="response_quality",
prompt="Evaluate the response based on the pass criteria: {pass_criteria}. Does the response meet the criteria? Return 'pass' or 'fail'.\nResponse: {response}",
allowed_values=["pass", "fail"],
)
@experiment()
async def run_experiment(row):
response = workflow_client.process_email(row["email"])
score = my_metric.score(
llm=llm,
response=response.get("response_template", " "),
pass_criteria=row["pass_criteria"],
)
experiment_view = {
**row,
"response": response.get("response_template", " "),
"score": score.value,
"score_reason": score.reason,
}
return experiment_view
async def main():
dataset = load_dataset()
experiment_result = await run_experiment.arun(dataset)
print("Experiment_result: ", experiment_result)
if __name__ == "__main__":
import asyncio
asyncio.run(main())