Exclude extendible parents with young reply tasks (#1196)

* exclude extendible parents with young reply tasks

* fix typos
This commit is contained in:
Andreas Köpf
2023-02-05 20:22:45 +01:00
committed by GitHub
parent 8bc7d083e0
commit 2434d44c01
3 changed files with 17 additions and 20 deletions
+1 -1
View File
@@ -138,7 +138,7 @@ class TreeManagerConfiguration(BaseModel):
p_lonely_child_extension: float = 0.75
"""Probability to select a prompter message parent with less than lonely_children_count children."""
recent_tasks_span_sec: int = 3 * 60 # 3 min
recent_tasks_span_sec: int = 5 * 60 # 5 min
"""Time in seconds of recent tasks to consider for exclusion during task selection."""
+1 -1
View File
@@ -225,7 +225,7 @@ class TaskRepository:
self, max_age: timedelta = timedelta(minutes=5), done: bool = False, skipped: bool = False, limit: int = 100
) -> list[Task]:
qry = self.db.query(Task).filter(
func.age(Task.created_date) < max_age,
func.age(func.current_timestamp(), Task.created_date) < max_age,
or_(Task.payload_type == "AssistantReplyPayload", Task.payload_type == "PrompterReplyPayload"),
)
if done is not None:
+15 -18
View File
@@ -562,14 +562,6 @@ class TreeManager:
case TaskType.REPLY:
recent_reply_tasks = self.pr.task_repository.fetch_recent_reply_tasks(
max_age=timedelta(seconds=self.cfg.recent_tasks_span_sec),
done=False,
skipped=False,
limit=500,
)
recent_reply_task_parents = {t.parent_message_id for t in recent_reply_tasks}
if task_role == TaskRole.PROMPTER:
extendible_parents = list(filter(lambda x: x.parent_role == "assistant", extendible_parents))
elif task_role == TaskRole.ASSISTANT:
@@ -580,24 +572,17 @@ class TreeManager:
random_parent: ExtendibleParentRow = None
if self.cfg.p_lonely_child_extension > 0 and self.cfg.lonely_children_count > 1:
# check if we have extendible prompter parents with a small number of replies
lonely_children_parents = [
p
for p in extendible_parents
if 0 < p.active_children_count < self.cfg.lonely_children_count
and p.parent_role == "prompter"
and p.parent_id not in recent_reply_task_parents
]
if len(lonely_children_parents) > 0 and random.random() < self.cfg.p_lonely_child_extension:
random_parent = random.choice(lonely_children_parents)
if random_parent is None:
# try to exclude parents for which tasks were recently handed out
fresh_parents = [p for p in extendible_parents if p.parent_id not in recent_reply_task_parents]
if len(fresh_parents) > 0:
random_parent = random.choice(fresh_parents)
else:
random_parent = random.choice(extendible_parents)
random_parent = random.choice(extendible_parents)
# fetch random conversation to extend
logger.debug(f"selected {random_parent=}")
@@ -895,7 +880,7 @@ class TreeManager:
logger.warning("The intersection of ranking results ID sets has less than two elements. Skipping.")
continue
# keep only elements in command set
# keep only elements in common set
ordered_ids_list = [list(filter(lambda x: x in common_set, ids)) for ids in ordered_ids_list]
assert all(len(x) == len(common_set) for x in ordered_ids_list)
@@ -1087,14 +1072,23 @@ HAVING(COUNT(mr.message_id) FILTER (WHERE mr.user_id = :user_id) = 0)
_sql_find_extendible_parents = """
-- find all extendible parent nodes
WITH recent_reply_tasks (parent_message_id) AS (
-- recent incomplete tasks to exclude
SELECT parent_message_id FROM task
WHERE not done
AND not skipped
AND created_date > (CURRENT_TIMESTAMP - :recent_tasks_interval)
AND (payload_type = 'AssistantReplyPayload' OR payload_type = 'PrompterReplyPayload')
)
SELECT m.id as parent_id, m.role as parent_role, m.depth, m.message_tree_id, COUNT(c.id) active_children_count
FROM message_tree_state mts
INNER JOIN message m ON mts.message_tree_id = m.message_tree_id -- all elements of message tree
INNER JOIN message m ON mts.message_tree_id = m.message_tree_id -- all elements of message tree
LEFT JOIN message_emoji me ON
(m.id = me.message_id
AND :skip_user_id IS NOT NULL
AND me.user_id = :skip_user_id
AND me.emoji = :skip_reply)
LEFT JOIN recent_reply_tasks rrt ON m.id = rrt.parent_message_id -- recent tasks
LEFT JOIN message c ON m.id = c.parent_id -- child nodes
WHERE mts.active -- only consider active trees
AND mts.state = :growing_state -- message tree must be growing
@@ -1103,6 +1097,7 @@ WHERE mts.active -- only consider active trees
AND m.review_result -- parent node must have positive review
AND m.lang = :lang -- parent matches lang
AND me.message_id IS NULL -- no skip reply emoji for user
AND rrt.parent_message_id IS NULL -- no recent reply task found
AND NOT coalesce(c.deleted, FALSE) -- don't count deleted children
AND (c.review_result OR coalesce(c.review_count, 0) < :num_reviews_reply) -- don't count children with negative review but count elements under review
GROUP BY m.id, m.role, m.depth, m.message_tree_id, mts.max_children_count
@@ -1125,6 +1120,7 @@ HAVING COUNT(c.id) < mts.max_children_count -- below maximum number of children
"user_id": user_id,
"skip_user_id": self.pr.user_id,
"skip_reply": protocol_schema.EmojiCode.skip_reply,
"recent_tasks_interval": timedelta(seconds=self.cfg.recent_tasks_span_sec),
},
)
@@ -1165,6 +1161,7 @@ HAVING COUNT(m.id) < mts.goal_tree_size
"user_id": user_id,
"skip_user_id": self.pr.user_id,
"skip_reply": protocol_schema.EmojiCode.skip_reply,
"recent_tasks_interval": timedelta(seconds=self.cfg.recent_tasks_span_sec),
},
)
return [ActiveTreeSizeRow.from_orm(x) for x in r.all()]