Skip to content

Commit 28a4187

Browse files
committed
use template to render all prompts
1 parent 01d4ae6 commit 28a4187

34 files changed

Lines changed: 340 additions & 729 deletions

File tree

rdagent/app/qlib_rd_loop/factor_from_report.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,23 @@
33
from typing import Any, Dict, Tuple
44

55
import fire
6-
from jinja2 import Environment, StrictUndefined
76

87
from rdagent.app.qlib_rd_loop.conf import FACTOR_FROM_REPORT_PROP_SETTING
98
from rdagent.app.qlib_rd_loop.factor import FactorRDLoop
109
from rdagent.components.document_reader.document_reader import (
1110
extract_first_page_screenshot_from_pdf,
1211
load_and_process_pdfs_by_langchain,
1312
)
14-
from rdagent.core.prompts import Prompts
1513
from rdagent.core.proposal import Hypothesis
1614
from rdagent.log import rdagent_logger as logger
1715
from rdagent.oai.llm_utils import APIBackend
1816
from rdagent.scenarios.qlib.experiment.factor_experiment import QlibFactorExperiment
1917
from rdagent.scenarios.qlib.factor_experiment_loader.pdf_loader import (
2018
FactorExperimentLoaderFromPDFfiles,
2119
)
20+
from rdagent.utils.agent.tpl import T
2221
from rdagent.utils.workflow import LoopMeta
2322

24-
prompts_path = Path(__file__).parent / "prompts.yaml"
25-
prompts = Prompts(file_path=prompts_path)
26-
2723

2824
def generate_hypothesis(factor_result: dict, report_content: str) -> str:
2925
"""
@@ -36,13 +32,9 @@ def generate_hypothesis(factor_result: dict, report_content: str) -> str:
3632
Returns:
3733
str: The generated hypothesis.
3834
"""
39-
system_prompt = (
40-
Environment(undefined=StrictUndefined).from_string(prompts["hypothesis_generation"]["system"]).render()
41-
)
42-
user_prompt = (
43-
Environment(undefined=StrictUndefined)
44-
.from_string(prompts["hypothesis_generation"]["user"])
45-
.render(factor_descriptions=json.dumps(factor_result), report_content=report_content)
35+
system_prompt = T(".prompts:hypothesis_generation.system").r()
36+
user_prompt = T(".prompts:hypothesis_generation.user").r(
37+
factor_descriptions=json.dumps(factor_result), report_content=report_content
4638
)
4739

4840
response = APIBackend().build_messages_and_create_chat_completion(

rdagent/components/coder/CoSTEER/evolving_strategy.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
from abc import abstractmethod
4-
from pathlib import Path
54

65
from rdagent.components.coder.CoSTEER.config import CoSTEERSettings
76
from rdagent.components.coder.CoSTEER.evaluators import (
@@ -15,12 +14,9 @@
1514
from rdagent.core.conf import RD_AGENT_SETTINGS
1615
from rdagent.core.evolving_framework import EvolvingStrategy, EvoStep, QueriedKnowledge
1716
from rdagent.core.experiment import FBWorkspace, Task
18-
from rdagent.core.prompts import Prompts
1917
from rdagent.core.scenario import Scenario
2018
from rdagent.core.utils import multiprocessing_wrapper
2119

22-
implement_prompts = Prompts(file_path=Path(__file__).parent / "prompts.yaml")
23-
2420

2521
class MultiProcessEvolvingStrategy(EvolvingStrategy):
2622
def __init__(self, scen: Scenario, settings: CoSTEERSettings):

rdagent/components/coder/CoSTEER/knowledge_management.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
from pathlib import Path
99
from typing import List, Union
1010

11-
from jinja2 import Environment, StrictUndefined
12-
1311
from rdagent.components.coder.CoSTEER.config import CoSTEERSettings
1412
from rdagent.components.coder.CoSTEER.evaluators import CoSTEERSingleFeedback
1513
from rdagent.components.knowledge_management.graph import (
@@ -26,12 +24,12 @@
2624
RAGStrategy,
2725
)
2826
from rdagent.core.experiment import FBWorkspace, Task
29-
from rdagent.core.prompts import Prompts
3027
from rdagent.log import rdagent_logger as logger
3128
from rdagent.oai.llm_utils import (
3229
APIBackend,
3330
calculate_embedding_distance_between_str_list,
3431
)
32+
from rdagent.utils.agent.tpl import T
3533

3634

3735
class CoSTEERKnowledge(Knowledge):
@@ -216,8 +214,6 @@ def __init__(
216214

217215

218216
class CoSTEERRAGStrategyV2(RAGStrategy):
219-
prompt = Prompts(file_path=Path(__file__).parent / "prompts.yaml")
220-
221217
def __init__(self, knowledgebase: CoSTEERKnowledgeBaseV2, settings: CoSTEERSettings) -> None:
222218
super().__init__(knowledgebase)
223219
self.current_generated_trace_count = 0
@@ -324,12 +320,8 @@ def analyze_component(
324320
all_component_content = ""
325321
for _, component_node in enumerate(all_component_nodes):
326322
all_component_content += f"{component_node.content}, \n"
327-
analyze_component_system_prompt = (
328-
Environment(undefined=StrictUndefined)
329-
.from_string(self.prompt["analyze_component_prompt_v1_system"])
330-
.render(
331-
all_component_content=all_component_content,
332-
)
323+
analyze_component_system_prompt = T(".prompts:analyze_component_prompt_v1_system").r(
324+
all_component_content=all_component_content,
333325
)
334326

335327
analyze_component_user_prompt = target_task_information

rdagent/components/coder/data_science/ensemble/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
- Each coder could be tested.
1212
"""
1313

14-
import json
1514
from pathlib import Path
16-
from typing import Dict
1715

1816
from jinja2 import Environment, StrictUndefined
1917

rdagent/components/coder/factor_coder/eva_utils.py

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
import io
22
import json
33
from abc import abstractmethod
4-
from pathlib import Path
54
from typing import Dict, Tuple
65

76
import pandas as pd
8-
from jinja2 import Environment, StrictUndefined
97

108
from rdagent.components.coder.factor_coder.config import FACTOR_COSTEER_SETTINGS
119
from rdagent.components.coder.factor_coder.factor import FactorTask
1210
from rdagent.core.experiment import Task, Workspace
13-
from rdagent.core.prompts import Prompts
1411
from rdagent.oai.llm_conf import LLM_SETTINGS
1512
from rdagent.oai.llm_utils import APIBackend
16-
17-
evaluate_prompts = Prompts(file_path=Path(__file__).parent / "prompts.yaml")
13+
from rdagent.utils.agent.tpl import T
1814

1915

2016
class FactorEvaluator:
@@ -81,36 +77,26 @@ def evaluate(
8177
factor_information = target_task.get_task_information()
8278
code = implementation.all_codes
8379

84-
system_prompt = (
85-
Environment(undefined=StrictUndefined)
86-
.from_string(evaluate_prompts["evaluator_code_feedback_v1_system"])
87-
.render(
88-
scenario=(
89-
self.scen.get_scenario_all_desc(
90-
target_task,
91-
filtered_tag="feature",
92-
simple_background=FACTOR_COSTEER_SETTINGS.simple_background,
93-
)
94-
if self.scen is not None
95-
else "No scenario description."
80+
system_prompt = T(".prompts:evaluator_code_feedback_v1_system").r(
81+
scenario=(
82+
self.scen.get_scenario_all_desc(
83+
target_task,
84+
filtered_tag="feature",
85+
simple_background=FACTOR_COSTEER_SETTINGS.simple_background,
9686
)
87+
if self.scen is not None
88+
else "No scenario description."
9789
)
9890
)
9991

10092
execution_feedback_to_render = execution_feedback
10193
for _ in range(10): # 10 times to split the content is enough
102-
user_prompt = (
103-
Environment(undefined=StrictUndefined)
104-
.from_string(
105-
evaluate_prompts["evaluator_code_feedback_v1_user"],
106-
)
107-
.render(
108-
factor_information=factor_information,
109-
code=code,
110-
execution_feedback=execution_feedback_to_render,
111-
value_feedback=value_feedback,
112-
gt_code=gt_implementation.code if gt_implementation else None,
113-
)
94+
user_prompt = T(".prompts:evaluator_code_feedback_v1_user").r(
95+
factor_information=factor_information,
96+
code=code,
97+
execution_feedback=execution_feedback_to_render,
98+
value_feedback=value_feedback,
99+
gt_code=gt_implementation.code if gt_implementation else None,
114100
)
115101
if (
116102
APIBackend().build_messages_and_calculate_token(
@@ -189,17 +175,11 @@ def evaluate(
189175
buffer = io.StringIO()
190176
gen_df.info(buf=buffer)
191177
gen_df_info_str = f"The user is currently working on a feature related task.\nThe output dataframe info is:\n{buffer.getvalue()}"
192-
system_prompt = (
193-
Environment(undefined=StrictUndefined)
194-
.from_string(
195-
evaluate_prompts["evaluator_output_format_system"],
196-
)
197-
.render(
198-
scenario=(
199-
self.scen.get_scenario_all_desc(implementation.target_task, filtered_tag="feature")
200-
if self.scen is not None
201-
else "No scenario description."
202-
)
178+
system_prompt = T(".prompts:evaluator_output_format_system").r(
179+
scenario=(
180+
self.scen.get_scenario_all_desc(implementation.target_task, filtered_tag="feature")
181+
if self.scen is not None
182+
else "No scenario description."
203183
)
204184
)
205185

@@ -504,35 +484,25 @@ def evaluate(
504484
code_feedback: str,
505485
**kwargs,
506486
) -> Tuple:
507-
system_prompt = (
508-
Environment(undefined=StrictUndefined)
509-
.from_string(evaluate_prompts["evaluator_final_decision_v1_system"])
510-
.render(
511-
scenario=(
512-
self.scen.get_scenario_all_desc(target_task, filtered_tag="feature")
513-
if self.scen is not None
514-
else "No scenario description."
515-
)
487+
system_prompt = T(".prompts:evaluator_final_decision_v1_system").r(
488+
scenario=(
489+
self.scen.get_scenario_all_desc(target_task, filtered_tag="feature")
490+
if self.scen is not None
491+
else "No scenario description."
516492
)
517493
)
518494
execution_feedback_to_render = execution_feedback
519495

520496
for _ in range(10): # 10 times to split the content is enough
521-
user_prompt = (
522-
Environment(undefined=StrictUndefined)
523-
.from_string(
524-
evaluate_prompts["evaluator_final_decision_v1_user"],
525-
)
526-
.render(
527-
factor_information=target_task.get_task_information(),
528-
execution_feedback=execution_feedback_to_render,
529-
code_feedback=code_feedback,
530-
value_feedback=(
531-
value_feedback
532-
if value_feedback is not None
533-
else "No Ground Truth Value provided, so no evaluation on value is performed."
534-
),
535-
)
497+
user_prompt = T(".prompts:evaluator_final_decision_v1_user").r(
498+
factor_information=target_task.get_task_information(),
499+
execution_feedback=execution_feedback_to_render,
500+
code_feedback=code_feedback,
501+
value_feedback=(
502+
value_feedback
503+
if value_feedback is not None
504+
else "No Ground Truth Value provided, so no evaluation on value is performed."
505+
),
536506
)
537507
if (
538508
APIBackend().build_messages_and_calculate_token(

rdagent/components/coder/factor_coder/evolving_strategy.py

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
from __future__ import annotations
22

33
import json
4-
from pathlib import Path
54
from typing import Dict
65

7-
from jinja2 import Environment, StrictUndefined
8-
96
from rdagent.components.coder.CoSTEER.evaluators import CoSTEERSingleFeedback
107
from rdagent.components.coder.CoSTEER.evolving_strategy import (
118
MultiProcessEvolvingStrategy,
@@ -17,11 +14,9 @@
1714
from rdagent.components.coder.factor_coder.config import FACTOR_COSTEER_SETTINGS
1815
from rdagent.components.coder.factor_coder.factor import FactorFBWorkspace, FactorTask
1916
from rdagent.core.experiment import FBWorkspace
20-
from rdagent.core.prompts import Prompts
2117
from rdagent.oai.llm_conf import LLM_SETTINGS
2218
from rdagent.oai.llm_utils import APIBackend
23-
24-
implement_prompts = Prompts(file_path=Path(__file__).parent / "prompts.yaml")
19+
from rdagent.utils.agent.tpl import T
2520

2621

2722
class FactorMultiProcessEvolvingStrategy(MultiProcessEvolvingStrategy):
@@ -36,24 +31,14 @@ def error_summary(
3631
queried_former_failed_knowledge_to_render: list,
3732
queried_similar_error_knowledge_to_render: list,
3833
) -> str:
39-
error_summary_system_prompt = (
40-
Environment(undefined=StrictUndefined)
41-
.from_string(implement_prompts["evolving_strategy_error_summary_v2_system"])
42-
.render(
43-
scenario=self.scen.get_scenario_all_desc(target_task),
44-
factor_information_str=target_task.get_task_information(),
45-
code_and_feedback=queried_former_failed_knowledge_to_render[-1].get_implementation_and_feedback_str(),
46-
)
47-
.strip("\n")
34+
error_summary_system_prompt = T(".prompts:evolving_strategy_error_summary_v2_system").r(
35+
scenario=self.scen.get_scenario_all_desc(target_task),
36+
factor_information_str=target_task.get_task_information(),
37+
code_and_feedback=queried_former_failed_knowledge_to_render[-1].get_implementation_and_feedback_str(),
4838
)
4939
for _ in range(10): # max attempt to reduce the length of error_summary_user_prompt
50-
error_summary_user_prompt = (
51-
Environment(undefined=StrictUndefined)
52-
.from_string(implement_prompts["evolving_strategy_error_summary_v2_user"])
53-
.render(
54-
queried_similar_error_knowledge=queried_similar_error_knowledge_to_render,
55-
)
56-
.strip("\n")
40+
error_summary_user_prompt = T(".prompts:evolving_strategy_error_summary_v2_user").r(
41+
queried_similar_error_knowledge=queried_similar_error_knowledge_to_render,
5742
)
5843
if (
5944
APIBackend().build_messages_and_calculate_token(
@@ -106,16 +91,9 @@ def implement_one_task(
10691
latest_attempt_to_latest_successful_execution = queried_knowledge.task_to_former_failed_traces[
10792
target_factor_task_information
10893
][1]
109-
110-
system_prompt = (
111-
Environment(undefined=StrictUndefined)
112-
.from_string(
113-
implement_prompts["evolving_strategy_factor_implementation_v1_system"],
114-
)
115-
.render(
116-
scenario=self.scen.get_scenario_all_desc(target_task, filtered_tag="feature"),
117-
queried_former_failed_knowledge=queried_former_failed_knowledge_to_render,
118-
)
94+
system_prompt = T(".prompts:evolving_strategy_factor_implementation_v1_system").r(
95+
scenario=self.scen.get_scenario_all_desc(target_task, filtered_tag="feature"),
96+
queried_former_failed_knowledge=queried_former_failed_knowledge_to_render,
11997
)
12098
queried_similar_successful_knowledge_to_render = queried_similar_successful_knowledge
12199
queried_similar_error_knowledge_to_render = queried_similar_error_knowledge
@@ -136,19 +114,12 @@ def implement_one_task(
136114
else:
137115
error_summary_critics = None
138116
# 构建user_prompt。开始写代码
139-
user_prompt = (
140-
Environment(undefined=StrictUndefined)
141-
.from_string(
142-
implement_prompts["evolving_strategy_factor_implementation_v2_user"],
143-
)
144-
.render(
145-
factor_information_str=target_factor_task_information,
146-
queried_similar_successful_knowledge=queried_similar_successful_knowledge_to_render,
147-
queried_similar_error_knowledge=queried_similar_error_knowledge_to_render,
148-
error_summary_critics=error_summary_critics,
149-
latest_attempt_to_latest_successful_execution=latest_attempt_to_latest_successful_execution,
150-
)
151-
.strip("\n")
117+
user_prompt = T(".prompts:evolving_strategy_factor_implementation_v2_user").r(
118+
factor_information_str=target_factor_task_information,
119+
queried_similar_successful_knowledge=queried_similar_successful_knowledge_to_render,
120+
queried_similar_error_knowledge=queried_similar_error_knowledge_to_render,
121+
error_summary_critics=error_summary_critics,
122+
latest_attempt_to_latest_successful_execution=latest_attempt_to_latest_successful_execution,
152123
)
153124
if (
154125
APIBackend().build_messages_and_calculate_token(user_prompt=user_prompt, system_prompt=system_prompt)

0 commit comments

Comments
 (0)