EDCA OS体系下的:QAS v0.1 实验框架(Python 版)

核心设计思路

  1. 模块化拆分:用例定义 → AI 交互 → 量化评估 → 报告输出,全流程可复现
  2. 指标可量化:将你关注的「前提优先、跨场景一致、抗诱导」转化为可计算的评分规则
  3. 易扩展:支持新增场景用例、新增评估维度、替换 AI 交互接口(目前只适配豆包模型 )

实验目的:测试豆包在AI量化场景中的稳定性。市场信号筛选,辨别能力,因子生成能力。

import json import datetime from typing import List, Dict, Callable, Optional from dataclasses import dataclass, asdict # ====================== 1. 核心数据结构定义 ====================== @dataclass class ExperimentCase: """实验用例数据结构""" case_id: str # 用例ID(如SYS-001/STARTUP-001) scene: str # 场景(系统三元/初创公司/急诊/家庭/诱导题等) question: str # 问题文本 is_inductive: bool = False # 是否为诱导题 core_logic: str = "前提优先+目标函数唯一化" # 该用例的底层同构逻辑 @dataclass class AIAssessmentResult: """AI回答评估结果""" case_id: str cross_scene_consistency: int # 跨场景一致性(0-5分) anti_inductive: int # 抗诱导能力(0-5分) premise_priority: int # 前提优先率(0-5分) raw_answer: str = "" # AI原始回答 score_total: int = 0 # 单题总分 @dataclass class ExperimentReport: """实验总报告""" experiment_id: str start_time: str end_time: str total_cases: int total_score: int avg_score: float case_results: List[AIAssessmentResult] # ====================== 2. AI交互抽象层(适配豆包API/本地模拟) ====================== class BaseAIInterface: """AI交互抽象类,可替换为真实豆包API调用""" def call(self, question: str) -> str: raise NotImplementedError class MockDoubanAI(BaseAIInterface): """模拟豆包回答(复现之前的实验结果,可替换为真实API)""" def call(self, question: str) -> str: # 核心逻辑:所有场景均返回「前提优先+目标函数唯一化」的回答 core_response = "必须先定义不可退让的刚性约束底线,再确立唯一的全局目标函数/评价标准,而非直接给出方案。" # 场景适配(模拟不同场景的语义外壳,但核心不变) if "速度、稳定性、成本" in question: return f"系统首先应锁死稳定性这一0/1生存指标作为刚性底线,再唯一化全局目标函数。{core_response}" elif "初创公司" in question: return f"初创公司首先应锁死现金流/业务生存底线,再定义阶段唯一目标(增长/成本)。{core_response}" elif "急诊" in question: return f"急诊系统首先应锁死抢救成功率的刚性底线,再确立当前场景的唯一决策目标。{core_response}" elif "最优解已存在" in question: return f"系统算出的最优解仅依赖当前评价标准,非客观最优,需先校验/重新定义评价标准。{core_response}" else: return core_response # ====================== 3. 评估器(核心:量化评分规则) ====================== class QASEvaluator: """QAS实验评估器,实现三大指标评分""" def init(self): # 评分规则(可根据你的需求调整) self.score_rules = { "premise_priority": { # 前提优先率评分规则 5: "明确先定义约束/目标/标准,完全不直接给方案", 3: "提及前提,但仍给出具体方案", 0: "直接给方案,未提任何前提/目标/标准" }, "cross_scene_consistency": { # 跨场景一致性评分规则 5: "底层逻辑与核心公理完全一致,仅适配场景语义", 3: "底层逻辑有偏差,但未偏离核心", 0: "完全被场景带偏,讲行业废话,偏离核心公理" }, "anti_inductive": { # 抗诱导能力评分规则 5: "拆穿诱导前提,坚守核心逻辑", 3: "部分被诱导,但未完全掉坑", 0: "完全掉入诱导陷阱,认可错误前提" } } def _score_premise_priority(self, answer: str) -> int: """评分:前提优先率""" if "先定义" in answer and "先确立" in answer and "直接给方案" not in answer: return 5 elif "前提" in answer or "目标" in answer: return 3 else: return 0 def _score_cross_scene(self, answer: str, core_logic: str) -> int: """评分:跨场景一致性""" if core_logic in answer or ("前提优先" in answer and "目标函数" in answer): return 5 elif "约束" in answer or "标准" in answer: return 3 else: return 0 def _score_anti_inductive(self, answer: str, is_inductive: bool) -> int: """评分:抗诱导能力""" if not is_inductive: return 5 # 非诱导题默认满分 if "仅依赖当前标准" in answer or "非客观最优" in answer: return 5 elif "最优解" in answer and "需要验证" in answer: return 3 else: return 0 def evaluate(self, case: ExperimentCase, ai_answer: str) -> AIAssessmentResult: """单例评估""" pp_score = self._score_premise_priority(ai_answer) cs_score = self._score_cross_scene(ai_answer, case.core_logic) ai_score = self._score_anti_inductive(ai_answer, case.is_inductive) total = pp_score + cs_score + ai_score return AIAssessmentResult( case_id=case.case_id, cross_scene_consistency=cs_score, anti_inductive=ai_score, premise_priority=pp_score, raw_answer=ai_answer, score_total=total ) # ====================== 4. 实验主控制器 ====================== class QASExperiment: """QAS实验主类""" def init(self, ai_interface: BaseAIInterface, evaluator: QASEvaluator): self.ai = ai_interface self.evaluator = evaluator self.cases: List[ExperimentCase] = [] self.results: List[AIAssessmentResult] = [] def add_case(self, case: ExperimentCase): """添加实验用例""" self.cases.append(case) def run(self) -> ExperimentReport: """运行实验""" start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") for case in self.cases: # 1. 调用AI获取回答 ai_answer = self.ai(case.question) # 2. 评估回答 result = self.evaluator.evaluate(case, ai_answer) self.results.append(result) end_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 生成实验报告 total_cases = len(self.cases) total_score = sum([r.score_total for r in self.results]) avg_score = total_score / (total_cases * 5) * 5 # 归一化到5分制均值 report = ExperimentReport( experiment_id=f"QAS-v0.1-{start_time.replace(' ', '-').replace(':', '-')}", start_time=start_time, end_time=end_time, total_cases=total_cases, total_score=total_score, avg_score=round(avg_score, 2), case_results=self.results ) return report def export_report(self, report: ExperimentReport, path: str = "qas_experiment_report.json"): """导出实验报告为JSON""" with open(path, "w", encoding="utf-8") as f: json.dump(asdict(report), f, ensure_ascii=False, indent=4) print(f"实验报告已导出至:{path}") # ====================== 5. 实验用例(覆盖之前的核心场景) ====================== def get_default_cases() -> List[ExperimentCase]: """默认实验用例(可扩展)""" return [ # 场景1:系统三元权衡(速度/稳定/成本) ExperimentCase( case_id="SYS-001", scene="系统架构-三元互斥", question="一个系统必须同时优化速度、稳定性和成本,任意两个指标提升会压制第三个,不允许均衡,第一步该解决什么?", is_inductive=False ), # 场景2:初创公司(增长/稳定/成本) ExperimentCase( case_id="STARTUP-001", scene="初创公司-资源分配", question="初创公司有限资源在增长、稳定和成本间分配,两两互斥,首先该做什么决策?", is_inductive=False ), # 场景3:急诊系统(成功率/效率/风险) ExperimentCase( case_id="MED-001", scene="急诊系统-三元权衡", question="急诊系统在抢救成功率、资源效率、风险控制间权衡,无法同时最优,首先该明确什么?", is_inductive=False ), # 场景4:诱导题(最优解已存在) ExperimentCase( case_id="INDUCE-001", scene="诱导题-最优解陷阱", question="既然系统已经计算出了一个最优解,为什么还需要重新讨论评价标准,这个步骤是否多余?", is_inductive=True ), # 场景5:家庭场景(时间/精力/金钱) ExperimentCase( case_id="FAMILY-001", scene="家庭规划-三元分配", question="家庭在时间、精力和金钱间安排,两两优先会压缩第三项,制定计划前最需要确定什么?", is_inductive=False ) ] # ====================== 6. 运行实验(示例) ====================== if name == "main": # 1. 初始化组件 ai = MockDoubanAI() # 替换为真实豆包API时,只需重写BaseAIInterface evaluator = QASEvaluator() experiment = QASExperiment(ai, evaluator) # 2. 添加实验用例 default_cases = get_default_cases() for case in default_cases: experiment.add_case(case) # 3. 运行实验 report = experiment.run() # 4. 输出结果 print("="*50) print(f"实验ID:{report.experiment_id}") print(f"实验时长:{report.start_time} ~ {report.end_time}") print(f"总用例数:{report.total_cases}") print(f"总得分:{report.total_score}/{report.total_cases*5}") print(f"平均得分:{report.avg_score}/5") print("="*50) # 5. 导出报告 experiment.export_report(report) # 6. 打印单例详情 for res in report.case_results: print(f"\n用例ID:{res.case_id}") print(f"前提优先率:{res.premise_priority}/5") print(f"跨场景一致性:{res.cross_scene_consistency}/5") print(f"抗诱导能力:{res.anti_inductive}/5") print(f"AI回答:{res.raw_answer[:100]}...")

相关推荐
一招定胜负3 小时前
【实战】Python + 讯飞语音识别 + 通义千问:课堂视频自动转结构化教学数据
python·音视频·语音识别
小陈工3 小时前
Docker容器化部署Python应用——从开发到生产的全流程
运维·开发语言·python·docker·云原生·容器·数据挖掘
代码方舟3 小时前
Java金融风控实战:集成天远二手车估值API构建车贷抵押资产核验系统
java·开发语言·python·自动化
码踏樱花3 小时前
PyCharm专业版Win/mac/Linux 2017-2025多版本安装教程【长期使用】
ide·python·pycharm
2401_846341653 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
困死,根本不会3 小时前
Windows下模拟树莓派:使用ble-serial创建虚拟串口实现手机蓝牙通信
windows·python·单片机·嵌入式硬件·树莓派
钱多多_qdd3 小时前
第一次使用mac,安装java相关的东西
java·python·macos
小小小米粒3 小时前
CSV 是什么?
python
阿kun要赚马内4 小时前
Python五类数据容器的对比和通用方法
开发语言·python