|
|
from typing import List |
|
|
from pathlib import Path |
|
|
from .base_agent import BaseAgent |
|
|
from prompt.template import TASK_DECOMPOSE_PROMPT, TASK_DESCRIPTION_PROMPT, TASK_DECOMPOSE_WO_COO_PROMPT |
|
|
from utils.utils import read_json_file |
|
|
|
|
|
|
|
|
class TaskDecompose(BaseAgent): |
|
|
def __init__(self, llm, coo=True): |
|
|
super().__init__(llm) |
|
|
self.coo = coo |
|
|
current_file = Path(__file__).resolve() |
|
|
path = current_file.parent.parent.parent / 'data/actor_data/input/decompose_prompt.json' |
|
|
self.decomposed_principles = read_json_file(str(path)) |
|
|
|
|
|
|
|
|
def decompose(self, modeling_problem: str, problem_analysis: str, modeling_solution: str, problem_type: str, tasknum: int, user_prompt: str=''): |
|
|
if self.coo: |
|
|
decomposed_principle = self.decomposed_principles.get(problem_type, self.decomposed_principles['C']) |
|
|
decomposed_principle = decomposed_principle.get(str(tasknum), decomposed_principle['4']) |
|
|
prompt = TASK_DECOMPOSE_PROMPT.format(modeling_problem=modeling_problem, problem_analysis=problem_analysis, modeling_solution=modeling_solution, decomposed_principle=decomposed_principle, tasknum=tasknum, user_prompt=user_prompt) |
|
|
|
|
|
answer = self.llm.generate(prompt) |
|
|
tasks = [task.strip() for task in answer.split('---') if task.strip()] |
|
|
else: |
|
|
prompt = TASK_DECOMPOSE_WO_COO_PROMPT.format(modeling_problem=modeling_problem, tasknum=tasknum, user_prompt=user_prompt) |
|
|
|
|
|
answer = self.llm.generate(prompt) |
|
|
tasks = [task.strip() for task in answer.split('---') if task.strip()] |
|
|
return tasks |
|
|
|
|
|
def refine(self, modeling_problem: str, problem_analysis: str, modeling_solution: str, decomposed_subtasks: List[str], task_i: int): |
|
|
decomposed_subtasks_str = '\n'.join(decomposed_subtasks) |
|
|
prompt = TASK_DESCRIPTION_PROMPT.format(modeling_problem=modeling_problem, problem_analysis=problem_analysis, modeling_solution=modeling_solution, decomposed_subtasks=decomposed_subtasks_str, task_i=task_i+1) |
|
|
answer = self.llm.generate(prompt) |
|
|
return answer |
|
|
|
|
|
def decompose_and_refine(self, modeling_problem: str, problem_analysis: str, modeling_solution: str, decomposed_principle: str, tasknum: int, user_prompt: str=''): |
|
|
if self.coo: |
|
|
decomposed_subtasks = self.decompose(modeling_problem, problem_analysis, modeling_solution, decomposed_principle, tasknum, user_prompt) |
|
|
for task_i in range(len(decomposed_subtasks)): |
|
|
refined_subtask = self.refine(modeling_problem, problem_analysis, modeling_solution, decomposed_subtasks, task_i) |
|
|
decomposed_subtasks[task_i] = refined_subtask |
|
|
else: |
|
|
decomposed_subtasks = self.decompose(modeling_problem, problem_analysis, modeling_solution, decomposed_principle, tasknum, user_prompt) |
|
|
|
|
|
return decomposed_subtasks |
|
|
|