颠覆传统数据筛选程序优先保留最优结果,编写程序,留存中等质量的中间数据,基于半成品数据继续迭代出新方案。

一、实际应用场景描述(基于心理健康与创新能力视角)

在心理健康与创新能力研究中,"迭代思维(Iterative Thinking)" 和 "孵化效应(Incubation Effect)" 被认为是创造性问题解决的核心机制。

一个典型的创新场景:

你在设计一个新功能、写一篇文章、或优化一个算法。

第一版出来了,但不够好。

你有两个选择:

1. 扔掉重来

2. 在现有基础上逐步改进

传统数据筛选程序(如 ETL 管道、数据清洗脚本、特征选择工具)几乎一致地选择 方案 1:

- 只保留"最优"结果

- 丢弃"次优"的中间产物

- 以最终指标(accuracy、F1、loss)为唯一筛选标准

这在工程优化场景中合理,但在创新探索场景中存在根本性盲区:

- 中间结果往往包含被当前评价函数低估的潜在价值

- 丢弃它们等于切断了迭代进化的可能性

- 创作者失去了对"过程"的感知,只剩"结果焦虑"

本程序的目标是颠覆这一逻辑:

✅ 不只要最优结果

✅ 系统性留存中等质量的中间数据

✅ 在新问题语境下,复用旧方案碎片生成新方案

二、引入痛点(中立、去情绪化)

1. 传统筛选程序的隐含假设

隐含假设 在创新场景中的问题

最优 = 全部 忽视了局部最优中的可用结构

中间产物 = 垃圾 切断了迭代进化的路径

指标可完全量化 创新价值常存在于"不可量化"部分

2. 创新能力视角的结构性问题

- 沉没成本谬误(Sunk Cost Fallacy)的反面效应人们倾向于认为"既然不够好,就该丢掉",实际上中等质量方案是宝贵的"认知半成品"。

- 评估函数单一化同一组数据,换一个评估维度(用户满意度 vs 技术复杂度),"次优"可能变成"最优"。

- 过程失忆(Process Amnesia)丢弃中间结果导致每次都从零开始,无法形成积累式创新。

3. 心理层面的代价

- 创作者陷入"要么完美要么重来"的二元思维

- 中间尝试得不到正反馈,降低探索意愿

- 长期只关注终点,削弱对过程的觉察(与正念理念相悖)

三、核心逻辑讲解(心理模型 → 工程模型)

1️⃣ 核心心理模型:双过程理论(Dual-Process Theory)

创造力研究普遍认同:

发散思维(Divergent) 生成选项

收敛思维(Convergent) 筛选选项

传统程序只做第二步。本程序把两步都纳入,并在收敛阶段保留"候选项"。

2️⃣ 工程化抽象

每个方案被记录为一个"迭代节点":

IterationNode:

- id: 唯一标识

- generation: 第几代

- parent_id: 父节点(追溯来源)

- score: 综合评分

- features: 方案特征向量

- is_kept: 是否被保留

- discarded_by: 被哪版筛选规则淘汰(如保留则空)

程序核心行为:

1. 生成阶段:产生一批候选方案(允许质量参差不齐)

2. 评估阶段:打分,但不删除低于阈值的方案

3. 归档阶段:中等质量方案进入"候选手库(Candidate Pool)"

4. 迭代阶段:新问题到来时,从候选手库中召回相关碎片,组合生成新方案

3️⃣ 核心筛选公式(保留而非淘汰)

def should_keep(score, threshold_low, threshold_high):

if score >= threshold_high:

return "primary" # 主选方案

elif score >= threshold_low:

return "candidate" # 候补方案(保留)

else:

return "discard" # 真正丢弃(极少)

关键设计理念:

默认只丢弃最差的 10%~20%,其余全部保留,留给未来自己。

四、代码模块化实现(Python)

项目结构

iterative_keeper/

├── README.md

├── requirements.txt

├── config.yaml

├── main.py

├── core/

│ ├── generator.py # 方案生成器

│ ├── evaluator.py # 多维评估引擎

│ ├── keeper.py # 留存与召回机制

│ └── mutator.py # 基于旧碎片生成新方案

└── utils/

├── logger.py

└── id_utils.py

requirements.txt

pyyaml>=6.0

rich>=13.0.0

numpy>=1.24.0

config.yaml

iteration:

candidate_pool_ratio: 0.3 # 中间方案保留比例

min_keep_ratio: 0.8 # 至少保留 80% 的方案

discard_threshold_percentile: 10 # 只丢弃最差的 10%

evaluation:

weights:

quality: 0.4

novelty: 0.3

feasibility: 0.3

core/generator.py

"""

方案生成器模块

模拟产生一批候选方案(在真实场景中可替换为模型/算法输出)

"""

import random

from typing import List, Dict, Any

from utils.id_utils import generate_id

from utils.logger import setup_logger

logger = setup_logger("Generator")

class Solution:

"""表示一个候选方案"""

def __init__(self, content: str, features: Dict[str, float]):

self.id = generate_id()

self.content = content

self.features = features

self.generation = 0

self.parent_id = None

def to_dict(self):

return {

"id": self.id,

"content": self.content,

"features": self.features,

"generation": self.generation,

"parent_id": self.parent_id

}

def generate_solutions(n: int = 10) -> List[Solution]:

"""生成 n 个模拟方案"""

solutions = []

for i in range(n):

s = Solution(

content=f"方案 {i+1}",

features={

"quality": random.uniform(0.3, 0.95),

"novelty": random.uniform(0.2, 0.9),

"feasibility": random.uniform(0.4, 0.85)

}

)

solutions.append(s)

logger.info(f"生成 {len(solutions)} 个候选方案")

return solutions

core/evaluator.py

"""

多维评估引擎

对方案进行多维度打分,而非单一指标筛选

"""

from typing import List, Dict, Any

from core.generator import Solution

from utils.logger import setup_logger

logger = setup_logger("Evaluator")

class Evaluator:

def __init__(self, weights: Dict[str, float]):

self.weights = weights

def score(self, solution: Solution) -> float:

"""加权综合评分"""

total = 0.0

for dim, w in self.weights.items():

total += solution.features.get(dim, 0.0) * w

return round(total, 4)

def evaluate_batch(self, solutions: List[Solution]) -> List[Dict[str, Any]]:

"""批量评估并返回结果列表"""

results = []

for s in solutions:

sc = self.score(s)

results.append({

**s.to_dict(),

"score": sc

})

# 按分数降序排列

results.sort(key=lambda x: x["score"], reverse=True)

return results

core/keeper.py

"""

留存与召回机制

核心模块:决定什么保留、什么丢弃、什么归档

"""

from typing import List, Dict, Any

from utils.logger import setup_logger

logger = setup_logger("Keeper")

class Keeper:

def __init__(

self,

min_keep_ratio: float = 0.8,

discard_percentile: int = 10

):

self.min_keep_ratio = min_keep_ratio

self.discard_percentile = discard_percentile

self.candidate_pool: List[Dict[str, Any]] = []

def filter(self, evaluated: List[Dict[str, Any]]) -> Dict[str, Any]:

"""

核心筛选逻辑:

- 前 (100 - discard_percentile)% 全部保留

- 其中最优的标记为主选(primary)

- 其余标记为准候补(candidate)

"""

n = len(evaluated)

keep_n = max(int(n * self.min_keep_ratio), 1)

discard_n = n - keep_n

# 前 keep_n 个保留(已经按分数降序排列)

kept = evaluated[:keep_n]

discarded = evaluated[keep_n:]

for item in kept:

item["is_primary"] = (item == kept[0])

item["status"] = "primary" if item["is_primary"] else "candidate"

if not item["is_primary"]:

self.candidate_pool.append(item)

report = {

"total": n,

"kept": len(kept),

"discarded": len(discarded),

"primary": kept[0] if kept else None,

"candidates": [k for k in kept if not k["is_primary"]],

"discarded_items": discarded

}

logger.info(

f"筛选完成: 保留 {report['kept']}/{n}, "

f"丢弃 {report['discarded']}/{n}"

)

return report

def recall(self, min_score: float = 0.0) -> List[Dict[str, Any]]:

"""从候补池中召回指定分数以上的方案"""

recalled = [c for c in self.candidate_pool if c["score"] >= min_score]

logger.info(f"召回 {len(recalled)} 个候补方案 (min_score={min_score})")

return recalled

core/mutator.py

"""

变异器模块

基于旧方案的碎片特征,组合生成新方案

模拟"跨界重组"式的创新过程

"""

import random

from typing import List, Dict, Any

from utils.id_utils import generate_id

from utils.logger import setup_logger

logger = setup_logger("Mutator")

def extract_features(solutions: List[Dict[str, Any]]) -> Dict[str, List[float]]:

"""提取各维度的特征值列表"""

dims = ["quality", "novelty", "feasibility"]

return {

d: [s["features"].get(d, 0.0) for s in solutions]

for d in dims

}

def mutate(solutions: List[Dict[str, Any]], n_new: int = 5) -> List[Dict[str, Any]]:

"""

从旧方案中抽样特征,重组为新方案

核心逻辑:每个新方案从不同旧方案中"借用"不同维度

"""

if not solutions:

return []

dims = ["quality", "novelty", "feasibility"]

new_solutions = []

for i in range(n_new):

# 随机选 3 个不同的父方案

parents = random.sample(solutions, min(3, len(solutions)))

# 每个维度从不同的父方案继承

new_features = {}

for j, dim in enumerate(dims):

parent = parents[j % len(parents)]

# 加入微小扰动模拟变异

inherited = parent["features"].get(dim, 0.5)

mutated = min(1.0, max(0.0, inherited + random.uniform(-0.1, 0.1)))

new_features[dim] = round(mutated, 4)

new_sol = {

"id": generate_id(),

"content": f"迭代方案 {i+1}(重组生成)",

"features": new_features,

"generation": max(s.get("generation", 0) for s in parents) + 1,

"parent_ids": [p["id"] for p in parents],

"score": 0.0 # 待评估

}

new_solutions.append(new_sol)

logger.info(f"生成 {len(new_solutions)} 个迭代方案")

return new_solutions

utils/id_utils.py

"""唯一 ID 生成工具"""

import uuid

def generate_id() -> str:

return str(uuid.uuid4())[:8]

utils/logger.py

from rich.logging import RichHandler

import logging

def setup_logger(name: str):

logger = logging.getLogger(name)

logger.setLevel(logging.INFO)

handler = RichHandler()

handler.setFormatter(logging.Formatter("%(message)s"))

logger.addHandler(handler)

return logger

main.py

"""

主程序入口

演示完整流程:生成 → 评估 → 筛选留存 → 迭代召回

"""

import yaml

from pathlib import Path

from core.generator import generate_solutions

from core.evaluator import Evaluator

from core.keeper import Keeper

from core.mutator import mutate

from utils.logger import setup_logger

from rich.console import Console

from rich.table import Table

logger = setup_logger("Main")

console = Console()

def load_config(path: str = "config.yaml"):

return yaml.safe_load(Path(path).read_text(encoding="utf-8"))

def display_report(report: dict):

console.print("\n[bold cyan]📊 筛选报告[/bold cyan]\n")

if report["primary"]:

p = report["primary"]

console.print(

f"[green]✅ 主选方案:[/green] {p['content']} "

f"(得分: {p['score']})"

)

table = Table(show_header=True, header_style="bold magenta")

table.add_column("方案", style="white")

table.add_column("得分", justify="center", style="cyan")

table.add_column("状态", justify="center", style="yellow")

for c in report["candidates"]:

table.add_row(c["content"], f"{c['score']:.4f}", c["status"])

console.print(table)

console.print(f"\n[dim]丢弃: {report['discarded']} 个(最差 {report['discarded']} 个)[/dim]\n")

def main():

config = load_config()

# Step 1: 生成候选方案

solutions = generate_solutions(n=10)

# Step 2: 多维评估

eval_cfg = config["evaluation"]

evaluator = Evaluator(weights=eval_cfg["weights"])

evaluated = evaluator.evaluate_batch(solutions)

# Step 3: 留存筛选

keep_cfg = config["iteration"]

keeper = Keeper(

min_keep_ratio=keep_cfg["min_keep_ratio"],

discard_percentile=keep_cfg["discard_threshold_percentile"]

)

report = keeper.filter(evaluated)

display_report(report)

# Step 4: 迭代 —— 从候补池召回并生成新方案

recalled = keeper.recall(min_score=0.0)

new_solutions = mutate(recalled, n_new=3)

# Step 5: 评估新方案

new_evaluated = evaluator.evaluate_batch(new_solutions)

console.print("[bold cyan]🧬 迭代生成的新方案:[/bold cyan]\n")

for s in new_evaluated:

console.print(

f" {s['content']} | 得分: {s['score']:.4f} | "

f"代际: {s['generation']}"

)

logger.info("迭代流程完成")

if __name__ == "__main__":

main()

五、README.md

# Iterative Keeper — 中间数据留存与迭代创新工具

## 是什么

一个基于心理健康与创新理论的 Python 工具,用于:

- 在方案筛选中保留中等质量的中间数据

- 基于旧方案碎片迭代生成新方案

- 把"丢弃"从默认行为变成"最后手段"

## 核心思想

> 不是"只保留最好的",而是"让过去的尝试都有未来"。

## 安装

bash

python -m venv .venv

source .venv/bin/activate

pip install -r requirements.txt

## 使用

bash

python main.py

## 配置说明

yaml

iteration:

min_keep_ratio: 0.8 # 至少保留 80%

discard_threshold_percentile: 10 # 只丢弃最差 10%

evaluation:

weights:

quality: 0.4

novelty: 0.3

feasibility: 0.3

## 模块说明

| 模块 | 职责 |

|----|----|

| core/generator.py | 方案生成器 |

| core/evaluator.py | 多维评估引擎 |

| core/keeper.py | 留存与召回机制 |

| core/mutator.py | 基于旧碎片生成新方案 |

## 许可

MIT License

六、核心知识点卡片(去营销、中立)

┌─────────────────────────────────────────────┐

│ 知识点 #1:Incubation Effect(孵化效应) │

├─────────────────────────────────────────────┤

│ 未被立即使用的想法在潜意识中持续加工 │

│ 留存中间数据 = 为孵化提供"原材料" │

└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐

│ 知识点 #2:Iterative Thinking(迭代思维) │

├─────────────────────────────────────────────┤

│ 创新不是一蹴而就,而是逐步逼近 │

│ 每个中间产物都是下一版的起点 │

└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐

│ 知识点 #3:Sunk Cost Fallacy(沉没成本谬误) │

├─────────────────────────────────────────────┤

│ 其"反面"同样有害:认为不够好就该丢弃 │

│ 中等质量方案有结构性复用价值 │

└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐

│ 知识点 #4:Multi-objective Evaluation │

├─────────────────────────────────────────────┤

│ 单一指标筛选会丢失维度信息 │

│ 多维加权评估保留方案的"侧面价值" │

└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐

│ 知识点 #5:Recombination(组合创新) │

├─────────────────────────────────────────────┤

│ 创新 ≈ 已有要素的新组合 │

│ 变异器从多个父方案中抽样不同维度重组 │

└─────────────────────────────────────────────┘

七、总结(中立、工程视角)

传统筛选程序的核心假设是"最优解即终点",这在确定性工程问题中成立,但在探索性创新任务中是一种认知 shortcuts。

本方案做了三件不同的事:

1. 翻转默认行为:从"默认丢弃"变为"默认留存,极少丢弃"

2. 多维评估:拒绝用单一指标概括方案价值

3. 迭代闭环:旧方案的碎片成为新方案的种子

从工程角度看,这是一个轻量级、规则驱动、可解释的系统;

从心理角度看,它帮助创作者建立对"过程"的信任,减少对"一步到位"的执念,更符合正念(Mindfulness)与成长型思维(Growth Mindset)的理念。

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!