Spaces:
Sleeping
Sleeping
File size: 7,739 Bytes
90c099b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | """
Utility for loading prompts from YAML configuration files
"""
import yaml
from pathlib import Path
from typing import Dict, Any, Optional
class PromptLoader:
"""Load and manage prompts from YAML files"""
def __init__(self, prompts_file: Optional[str] = None):
"""
Initialize prompt loader
Args:
prompts_file: Path to prompts YAML file. If None, uses default location.
"""
if prompts_file is None:
# Default to shared/configs/prompts.yaml relative to project root
project_root = Path(__file__).parent.parent.parent
prompts_file = project_root / "shared" / "configs" / "prompts.yaml"
self.prompts_file = Path(prompts_file)
self._prompts = None
self._load_prompts()
def _load_prompts(self):
"""Load prompts from YAML file"""
if not self.prompts_file.exists():
raise FileNotFoundError(f"Prompts file not found: {self.prompts_file}")
with open(self.prompts_file, 'r', encoding='utf-8') as f:
self._prompts = yaml.safe_load(f)
def get_keyword_generation_prompt(self, context: str) -> str:
"""
Get keyword generation prompt with context filled in
Args:
context: Paper information context
Returns:
Formatted prompt string
"""
template = self._prompts["keyword_generation"]["user"]
return template.format(context=context)
def get_keyword_generation_system(self) -> str:
"""Get keyword generation system message"""
return self._prompts["keyword_generation"].get("system", "")
def get_paper_summarization_prompt(self, reference_paper: str, related_paper: str) -> str:
"""
Get paper summarization prompt with reference_paper and related_paper filled in
Args:
reference_paper: Reference paper information (the paper being reviewed)
related_paper: Related paper information
Returns:
Formatted prompt string
"""
template = self._prompts["paper_summarization"]["user"]
return template.format(reference_paper=reference_paper, related_paper=related_paper)
def get_paper_results_summarization_prompt(self, content: str) -> str:
"""
Get paper results summarization prompt with content filled in
Args:
content: Paper content (experiment results section)
Returns:
Formatted prompt string
"""
template = self._prompts["paper_results_summarization"]["user"]
return template.format(content=content)
def get_paper_insight_miner_prompt(self, content: str, candidate_review: str) -> str:
"""
Get paper insight miner prompt with content and candidate_review filled in
Args:
content: Paper content
candidate_review: Candidate review draft
Returns:
Formatted prompt string
"""
template = self._prompts["paper_insight_miner"]["user"]
# Use replace instead of format to avoid issues with JSON braces in the template
prompt = template.replace("{content}", content)
prompt = prompt.replace("{candidate_review}", candidate_review)
return prompt
def get_paper_results_analyzer_prompt(self, content: str, candidate_review: str) -> str:
"""
Get paper results analyzer prompt with content and candidate_review filled in
Args:
content: Paper content
candidate_review: Candidate review draft
Returns:
Formatted prompt string
"""
template = self._prompts["paper_results_analyzer"]["user"]
# Use replace instead of format to avoid issues with JSON braces in the template
prompt = template.replace("{content}", content)
prompt = prompt.replace("{candidate_review}", candidate_review)
return prompt
def get_review_prompt(self, review_format: str = "detailed") -> str:
"""
Get review prompt for specified format
Args:
review_format: Review format ("detailed", "summary", "structured")
Returns:
Review prompt string
"""
if review_format not in self._prompts["review_prompts"]:
review_format = "detailed"
return self._prompts["review_prompts"][review_format]
def get_reviewer_system_message(self) -> str:
"""Get system message for reviewer"""
return self._prompts.get("reviewer_system", "You are an expert academic reviewer with deep knowledge in the field.")
def get_refiner_prompt(self, review_format: str = "detailed") -> str:
"""
Get refiner prompt for specified format
Args:
review_format: Review format ("detailed", "summary", "structured")
Returns:
Refiner prompt string
"""
if "refiner_prompts" not in self._prompts:
raise ValueError("refiner_prompts not found in prompts file")
if review_format not in self._prompts["refiner_prompts"]:
review_format = "detailed"
return self._prompts["refiner_prompts"][review_format]
def get_refiner_system_message(self) -> str:
"""Get system message for refiner"""
return self._prompts.get("refiner_system", "You are an expert review refiner with deep knowledge in academic review quality standards and meta rubrics.")
def get_rubrics_template(self) -> str:
"""
Get the rubrics template for generating paper-specific rubrics.
Returns:
Rubrics template string (JSON array format)
"""
return self._prompts.get("rubrics", "")
def get_rubric_generation_prompt(self, version: str = "v2") -> str:
"""
Get rubric generation prompt.
Args:
version: Prompt version ("v1" or "v2", default: "v2")
Returns:
Rubric generation prompt template string
"""
key = f"{version}_rubric_generation_prompt"
prompt = self._prompts.get(key, "")
# For v2, replace rubric_template placeholder with actual template
if version == "v2" and "<<rubric_template>>" in prompt:
rubric_template = self.get_rubrics_template()
prompt = prompt.replace("<<rubric_template>>", rubric_template)
return prompt
def get_evaluator_prompt(self, version: str = "v1") -> str:
"""
Get evaluator prompt for evaluating reviews using rubrics.
Args:
version: Prompt version ("v0" or "v1", default: "v1")
Returns:
Evaluator prompt template string
"""
key = f"{version}_evaluator_prompt"
return self._prompts.get(key, "")
def reload(self):
"""Reload prompts from file"""
self._load_prompts()
# Global prompt loader instance
_prompt_loader: Optional[PromptLoader] = None
def get_prompt_loader(prompts_file: Optional[str] = None) -> PromptLoader:
"""
Get or create global prompt loader instance
Args:
prompts_file: Optional path to prompts file
Returns:
PromptLoader instance
"""
global _prompt_loader
if _prompt_loader is None or prompts_file is not None:
_prompt_loader = PromptLoader(prompts_file)
return _prompt_loader
|