Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| from collections import Counter | |
| from typing import List, Dict, Any | |
| from src.parser.parser import Parser | |
| from src.ontology.matcher import ConceptMatcher | |
| from src.embeddings.engine import EmbeddingEngine | |
| from src.enrichment.enricher import Enricher | |
| from src.prompt_builder.builder import PromptBuilder | |
| class PromptEvaluator: | |
| def __init__(self, profiles: List[str]): | |
| self.profiles = profiles | |
| def evaluate_prompts(self, count: int = 1000): | |
| matcher = ConceptMatcher("data/ontology") | |
| engine = EmbeddingEngine(index_dir="data/faiss_indices") | |
| engine.load_index() | |
| parser = Parser(matcher, engine) | |
| enricher = Enricher(matcher) | |
| # Sample inputs for 1000 prompts | |
| # We'll use the benchmark generator logic or just some variants | |
| from src.benchmarks.benchmark import BenchmarkSuite | |
| suite = BenchmarkSuite("data/ontology") | |
| benchmarks = suite.generate_benchmarks(count) | |
| report = {} | |
| for profile in self.profiles: | |
| builder = PromptBuilder(profile_name=profile) | |
| profile_results = { | |
| "duplicate_terms": 0, | |
| "avg_length": 0, | |
| "total_prompts": count, | |
| "concept_coverage": Counter() | |
| } | |
| total_len = 0 | |
| for case in benchmarks: | |
| ir = parser.parse(case["input"]) | |
| ir = enricher.enrich(ir) | |
| prompt_bundle = builder.build(ir) | |
| pos = prompt_bundle["positive"] | |
| tags = [t.strip() for t in pos.split(",")] | |
| if len(tags) != len(set(tags)): | |
| profile_results["duplicate_terms"] += 1 | |
| total_len += len(tags) | |
| for tag in tags: | |
| profile_results["concept_coverage"][tag] += 1 | |
| profile_results["avg_length"] = total_len / count | |
| profile_results["top_concepts"] = dict(profile_results["concept_coverage"].most_common(10)) | |
| del profile_results["concept_coverage"] | |
| report[profile] = profile_results | |
| return report | |
| if __name__ == "__main__": | |
| evaluator = PromptEvaluator(["generic", "sdxl", "pony", "illustrious"]) | |
| print("Evaluating 1000 prompts per profile...") | |
| report = evaluator.evaluate_prompts(1000) | |
| os.makedirs("reports", exist_ok=True) | |
| with open("reports/quality_report.json", "w", encoding="utf-8") as f: | |
| json.dump(report, f, indent=2) | |
| with open("reports/quality_report.md", "w", encoding="utf-8") as f: | |
| f.write("# Prompt Quality Evaluation\n\n") | |
| for profile, metrics in report.items(): | |
| f.write(f"## Profile: {profile.upper()}\n") | |
| f.write(f"- **Avg Prompt Length**: {metrics['avg_length']} tags\n") | |
| f.write(f"- **Prompts with Duplicates**: {metrics['duplicate_terms']}\n") | |
| f.write(f"- **Top Concepts**: {', '.join(metrics['top_concepts'].keys())}\n\n") | |
| print("Quality report generated in reports/") | |