From ca921d35506410c3a9caaeaeaa1876420f29c7bc Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 12 Sep 2026 12:01:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(normalize):=20=E5=8E=9F=E5=AD=90=E5=8C=96?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=AE=B9=E9=94=99+=E4=BA=A7=E5=87=BA?= =?UTF-8?q?=E7=8E=87=E5=85=9C=E5=BA=95=E2=80=94=E2=80=94LLM=E8=BE=93?= =?UTF-8?q?=E5=87=BAno=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2/=E6=B5=AE?= =?UTF-8?q?=E7=82=B9=E6=97=B6isinstance(int)=E5=85=A8=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E8=87=B446=E6=96=87=E6=A1=A3=E4=BB=856=E5=8E=9F=E5=AD=90;int()?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2+=E8=8C=83=E5=9B=B4=E6=A0=A1=E9=AA=8C;?= =?UTF-8?q?=E6=89=B9LLM=E5=A4=B1=E8=B4=A5=E7=94=A8=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E4=BD=9C=E5=8E=9F=E5=AD=90;=E5=8E=9F=E5=AD=90=E8=A6=86?= =?UTF-8?q?=E7=9B=96<50%=E6=96=87=E6=A1=A3=E6=97=B6=E7=BC=BA=E8=80=85?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=85=9C=E5=BA=95(=E4=BC=97=E5=8C=85?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=8D=B3=E6=B5=93=E7=BC=A9=E8=AF=AD=E4=B9=89?= =?UTF-8?q?,=E4=BF=9D=E8=AF=81=E8=A6=86=E7=9B=96=E7=8E=87=E5=8F=AF?= =?UTF-8?q?=E7=AE=97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_opportunity/opp_normalize.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pipeline_opportunity/opp_normalize.py b/pipeline_opportunity/opp_normalize.py index 0c8739c..7dcde73 100644 --- a/pipeline_opportunity/opp_normalize.py +++ b/pipeline_opportunity/opp_normalize.py @@ -128,17 +128,33 @@ async def _atomize(sor, snaps, cfg, ctx): arr = json.loads(raw) items = [] for it in arr if isinstance(arr, list) else []: + if not isinstance(it, dict): + continue no = it.get("no") atom = str(it.get("atom") or "").strip()[:255] - if isinstance(no, int) and 1 <= no <= len(chunk) and atom: - items.append((chunk[no - 1]["id"], atom)) + # 容错:LLM 可能输出 "1"/1.0/True,统一 int() 转换后范围校验 + try: + no_i = int(no) + except (TypeError, ValueError): + continue + if 1 <= no_i <= len(chunk) and atom: + items.append((chunk[no_i - 1]["id"], atom)) async with lock: results.extend(items) except Exception as e: logger.debug("atomize chunk failed: %s", e) + async with lock: + results.extend([(s["id"], s["title"][:255]) for s in chunk]) chunks = [snaps[i:i + bs] for i in range(0, len(snaps), bs)] await asyncio.gather(*(_one(ch) for ch in chunks)) + # 产出率兜底:原子数 < 文档数 50% 时,缺原子的文档用标题作原子 + # (众包标题本身即浓缩需求语义;保证覆盖率统计可算,2026-09-12 实测 46 文档仅 6 原子) + covered = set(sid for sid, _ in results) + if len(covered) < len(snaps) * 0.5: + for s in snaps: + if s["id"] not in covered: + results.append((s["id"], s["title"][:255])) return results