格式化选择摘要 Args: selected: 选中的编号集合 total_papers: 推送的论文总数 papers: 论文列表 Returns: 摘要文本
(
selected: Set[int],
total_papers: int,
papers: List[Dict],
*,
newly_selected: Optional[Set[int]] = None,
previously_selected: Optional[Set[int]] = None,
skipped_label: str = "暂未选择",
profile_updated: bool = True,
reliability_note: str = "",
)
| 476 | def format_selection_summary( |
| 477 | selected: Set[int], |
| 478 | total_papers: int, |
| 479 | papers: List[Dict], |
| 480 | *, |
| 481 | newly_selected: Optional[Set[int]] = None, |
| 482 | previously_selected: Optional[Set[int]] = None, |
| 483 | skipped_label: str = "暂未选择", |
| 484 | profile_updated: bool = True, |
| 485 | reliability_note: str = "", |
| 486 | ) -> str: |
| 487 | """ |
| 488 | 格式化选择摘要 |
| 489 | |
| 490 | Args: |
| 491 | selected: 选中的编号集合 |
| 492 | total_papers: 推送的论文总数 |
| 493 | papers: 论文列表 |
| 494 | |
| 495 | Returns: |
| 496 | 摘要文本 |
| 497 | """ |
| 498 | skipped = set(range(1, total_papers + 1)) - selected |
| 499 | selection_rate = len(selected) / total_papers if total_papers > 0 else 0 |
| 500 | learning_signals = build_learning_signals(selected, skipped, papers) |
| 501 | newly_selected = set(newly_selected or selected) |
| 502 | previously_selected = set(previously_selected or set()) |
| 503 | |
| 504 | lines = [] |
| 505 | if selected: |
| 506 | if previously_selected: |
| 507 | if newly_selected: |
| 508 | lines.append(f"收到,本次新增 {len(newly_selected)} 篇,累计 {len(selected)} 篇已进入偏好学习流程。") |
| 509 | else: |
| 510 | lines.append(f"收到,这些论文此前已记录过;当前累计 {len(selected)} 篇在偏好学习流程中。") |
| 511 | else: |
| 512 | lines.append(f"收到,{len(selected)} 篇已进入偏好学习流程。") |
| 513 | else: |
| 514 | lines.append("收到,今天先都不看。") |
| 515 | lines.append("📊 今日反馈已记录:") |
| 516 | if previously_selected: |
| 517 | lines.append(f"累计选择:{format_number_ranges(selected)}({len(selected)} 篇)") |
| 518 | lines.append(f"本次新增:{format_number_ranges(newly_selected)}({len(newly_selected)} 篇)") |
| 519 | lines.append(f"此前已选:{format_number_ranges(previously_selected)}({len(previously_selected)} 篇)") |
| 520 | else: |
| 521 | lines.append(f"选择:{format_number_ranges(selected)}({len(selected)} 篇)") |
| 522 | lines.append(f"{skipped_label}:{format_number_ranges(skipped)}({len(skipped)} 篇)") |
| 523 | lines.append(f"选择率:{selection_rate:.1%}") |
| 524 | |
| 525 | if learning_signals: |
| 526 | lines.append("学到的信号:") |
| 527 | lines.extend(learning_signals) |
| 528 | |
| 529 | if reliability_note: |
| 530 | lines.append(reliability_note) |
| 531 | lines.append("以上推断我会继续用后续行为自动校正;如果哪条明显不对,直接补一句纠正我就行。") |
| 532 | if profile_updated: |
| 533 | lines.append("画像已更新,下次推送会据此调整。") |
| 534 | else: |
| 535 | lines.append("本次只记录选择结果,不更新偏好模型;下次完整浏览后再继续学习。") |
no test coverage detected