From f66cc93781b139f76126ade4c901c108a8cf3da5 Mon Sep 17 00:00:00 2001 From: NathanAlex7 <18898599977@163.com> Date: Tue, 1 Sep 2026 17:13:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(xingbang):=20reward=20=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=90=8E=E5=86=99=E5=9B=9E=E8=BD=A8=E8=BF=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?,=20=E8=BF=9B=E5=8C=96=E9=97=AD=E7=8E=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AE=8C=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前 cumulative_reward 只存在于返回对象, 未写回磁盘轨迹文件 (finalize 先落盘, 之后改的 reward 只在内存)。新增 rewrite() 在 reward 计算后重新覆盖轨迹, 确保自进化数据(含奖励)完整可追溯。 --- backend/xingbang/evolution/trajectory.py | 13 +++++++++++++ backend/xingbang/workflow.py | 2 ++ 2 files changed, 15 insertions(+) diff --git a/backend/xingbang/evolution/trajectory.py b/backend/xingbang/evolution/trajectory.py index 4d9d4d0..6cd05d4 100644 --- a/backend/xingbang/evolution/trajectory.py +++ b/backend/xingbang/evolution/trajectory.py @@ -90,6 +90,19 @@ class TrajectoryRecorder: ) return path + def set_reward(self, reward: float) -> None: + """计算奖励后写回当前轨迹并重新落盘(进化闭环数据完整)。""" + if self._current is not None: + self._current["cumulative_reward"] = reward + # 若已有 trajectory_id, 覆盖落盘(full path 已知) + tid = self._current.get("trajectory_id") + if tid: + self._save(self._current) + + def rewrite(self, trajectory: dict[str, Any]) -> Path: + """写回一条已存在的轨迹(非当前进行中的), 返回路径。""" + return self._save(trajectory) + # ── 从调用侧采集 ──────────────────────────────────── def on_evidence(self, kind: str, data: dict) -> None: """订阅 agents 的 evidence 回调,累积成本步记录。""" diff --git a/backend/xingbang/workflow.py b/backend/xingbang/workflow.py index 4ca78e2..85df112 100644 --- a/backend/xingbang/workflow.py +++ b/backend/xingbang/workflow.py @@ -122,6 +122,7 @@ class XingbangWorkflow: ) reward = compute_reward_v1(trajectory) trajectory["cumulative_reward"] = reward + self._recorder.rewrite(trajectory) # 写回含 reward 轨迹, 进化数据完整 insights_path = self._evolution.save_insights() return { @@ -180,6 +181,7 @@ class XingbangWorkflow: trajectory = self._recorder.finalize(success=True) reward = compute_reward_v1(trajectory) trajectory["cumulative_reward"] = reward + self._recorder.rewrite(trajectory) # 写回含 reward 轨迹, 进化数据完整 insights_path = self._evolution.save_insights() yield {"event": "done", "workflow_id": workflow_id, "trajectory_id": traj_id, "reward": reward,