Files
mini-openclaw/backend/xingbang/evolution/reward.py
T
NathanAlex7 c4ac5aa82e feat(xingbang): 兴邦金租 AI 评审平台模块(构建于 mini-OpenClaw)
新增兴邦金租评审项目模块, 作为 mini-OpenClaw 之上的完整交付:
- 五智能体流水线(data_curator/risk_scout/case_finder/approval_advisor/risk_monitor)
- evolution 自进化子系统(轨迹采集+奖励计算+模式归纳prompt增强)
- /api/xingbang/* 端点(config/workflow/stream/evolution/trajectories)
- 运行时产物(客户产出情报卡 + 进化轨迹数据)已 gitignore, 不含隐私

遵循兴邦三档分级审批制度, 数据源指向兴邦实验数据包
2026-09-01 16:58:44 +08:00

83 lines
2.4 KiB
Python

"""Reward Calculator — 计算一条审批轨迹的奖励分数。
诚实分级设计 (对齐兴邦方案):
Level 1 (现在能做,不需要用户交互):
- 任务完成 +10
- 工具调用成功率
- 重复调用惩罚
- 时间惩罚
Level 2 (需前端加 👍/👎 按钮):
- 用户显式反馈
Level 3 (需人工标注):
- 专家打分
本文件实现 Level 1 + 预留 Level 2/3 参数。
不做不诚实的信号: 拒绝用"还款表现"当奖励(周期1-3年无法闭环)。
"""
from __future__ import annotations
from typing import Any
def compute_reward_v1(
trajectory: dict[str, Any],
feedback: str | None = None,
expert_score: float | None = None,
) -> float:
"""计算一条轨迹的奖励(Leve1 l 内置指标 + 可选 Level2 反馈 + Level3 专家分)。
Args:
trajectory: 轨迹 dict(含 steps 和 final_result)
feedback: Level2, "positive"/"negative"
expert_score: Level3, 1-5 分
Returns:
float 奖励分
"""
steps = trajectory.get("steps", [])
final = trajectory.get("final_result", {})
if not steps:
return 0.0
reward = 0.0
# 1. 任务完成奖励
if final.get("success"):
reward += 10.0
else:
reward -= 10.0
# 2. 工具调用成功率(成功工具 / 总工具)
total_tool_calls = 0
tool_success = 0
for s in steps:
tools = s.get("tools", [])
total_tool_calls += len(tools)
if tools:
tool_success += 1 # 该步骤至少调了工具视为尽力(简化)
if total_tool_calls > 0:
reward += (tool_success / max(1, total_tool_calls)) * 5.0
# 3. 步骤数惩罚(越少越好,常规 5 步流水线 5-15 步为佳)
n_steps = len(steps)
optimal = 5
step_penalty = abs(n_steps - optimal) * 0.3
reward -= step_penalty
# 4. 时间惩罚(超过 600 秒 = 10 分钟开始扣)
duration_ms = final.get("duration_ms", 0)
if duration_ms > 600_000:
reward -= ((duration_ms - 600_000) / 60_000) * 1.0
# ── Level 2: 用户反馈 (可选) ──
if feedback == "positive":
reward += 20.0
elif feedback == "negative":
reward -= 10.0
# ── Level 3: 专家打分 (可选, 1-5 归一化到 -10~+10) ──
if expert_score is not None:
reward += (expert_score - 3) * 5.0
reward = max(-30.0, min(reward, 50.0)) # 裁剪
return round(reward, 2)