From 9a271cacb09bd756d30e68270ca962f042cb8a8c Mon Sep 17 00:00:00 2001 From: Haewon Kam Date: Tue, 1 Sep 2026 11:18:31 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20QB=20=EC=97=91=EC=85=80=EC=97=90=20AI?= =?UTF-8?q?=20Discovery=20TOP20=20=EC=8B=9C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20(=EB=85=BC=EB=B8=8C=EB=9E=9C=EB=93=9C=2084=EB=AC=B8=ED=95=AD?= =?UTF-8?q?=202=EC=97=94=EC=A7=84=20=ED=95=A9=EC=82=B0,=20=EC=88=9C?= =?UTF-8?q?=EC=9C=84=20=EA=B0=80=EC=A4=91=20=EC=A0=90=EC=88=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0155BJMHJyhqqAPGYjGKYhPS --- docs/reports/Viewclinic_QB_Results.xlsx | Bin 205645 -> 207726 bytes scripts/export_qb_excel.py | 50 +++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/reports/Viewclinic_QB_Results.xlsx b/docs/reports/Viewclinic_QB_Results.xlsx index 12695d35bbb67b98935eaf2aa5fef218a10bd87f..837e8a0ec4acccf3b088eb97a0a3f72f6d9fcb7f 100644 GIT binary patch delta 4730 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 20: + shown = ranked[:20] + [ranked[view_rank - 1]] + for idx, a in enumerate(shown): + rank = idx + 1 if idx < 20 else view_rank + cats = " · ".join(k for k, _ in sorted(a["cats"].items(), key=lambda x: -x[1])[:3]) + ws.append([rank, a["label"], a["score"], a["gpt"] + a["pplx"], a["gpt"], a["pplx"], a["first"], cats]) + if canon(a["label"]) == "뷰성형외과": + for c in range(1, 9): + ws.cell(row=ws.max_row, column=c).fill = PatternFill("solid", fgColor=WARN) + ws.cell(row=ws.max_row, column=c).font = Font(bold=True) + for col, w in zip("ABCDEFGH", [6, 30, 16, 16, 10, 10, 10, 40]): + ws.column_dimensions[col].width = w + # ── 엔진별 상세 (답변 전문 + 인용) ──────────────────── for sheet, data in (("GPT상세", oa), ("PPLX상세", px)): ws = wb.create_sheet(sheet)