Improve LLM rewrite classification pipeline
This commit is contained in:
@@ -27,7 +27,7 @@ class MarkdownRenderingTests(unittest.TestCase):
|
||||
|
||||
md, _ = assemble_markdown(items, guide)
|
||||
|
||||
self.assertIn("## 导览", md)
|
||||
self.assertNotIn("## 导览", md)
|
||||
self.assertIn("## 模型与能力", md)
|
||||
self.assertIn("[OpenAI:Blog ↗](https://openai.com/blog/test)", md)
|
||||
self.assertNotIn("> >", md)
|
||||
|
||||
@@ -37,6 +37,7 @@ class Stage0To5PipelineTests(unittest.TestCase):
|
||||
"id": entry["id"],
|
||||
"title": entry["title_raw"],
|
||||
"summary": entry["summary_raw"],
|
||||
"section": "模型与能力" if "GPT-5" in entry["title_raw"] else "公司与资本",
|
||||
"flags": [],
|
||||
}
|
||||
for entry in payload["items"]
|
||||
|
||||
@@ -66,7 +66,7 @@ class Stage0To7PipelineTests(unittest.TestCase):
|
||||
guide_llm_call=guide_llm_call,
|
||||
)
|
||||
|
||||
self.assertIn("## 导览", result["markdown"])
|
||||
self.assertNotIn("## 导览", result["markdown"])
|
||||
self.assertIn("## 模型与能力", result["markdown"])
|
||||
self.assertIn("## 今日脉络", result["markdown"])
|
||||
self.assertEqual(result["reports"]["stage7"]["blocking_errors"], [])
|
||||
|
||||
@@ -48,6 +48,31 @@ class Stage4RewriteTests(unittest.TestCase):
|
||||
self.assertEqual(report["rewritten_count"], 1)
|
||||
self.assertEqual(report["fallback_count"], 0)
|
||||
|
||||
def test_rewrite_items_accepts_llm_section_classification(self):
|
||||
items = [news_item("a")]
|
||||
|
||||
def llm_call(prompt):
|
||||
return json.dumps(
|
||||
{
|
||||
"rewrites": [
|
||||
{
|
||||
"id": "a",
|
||||
"title": "OpenAI 发布 GPT-5 API",
|
||||
"summary": "OpenAI 发布 GPT-5 API,延迟表现更好。",
|
||||
"section": "模型与能力",
|
||||
"confidence": 0.92,
|
||||
"flags": [],
|
||||
}
|
||||
]
|
||||
},
|
||||
ensure_ascii=False,
|
||||
)
|
||||
|
||||
rewritten, report = rewrite_items(items, llm_call=llm_call, batch_size=10)
|
||||
|
||||
self.assertEqual(rewritten[0].section, "模型与能力")
|
||||
self.assertEqual(report["llm_section_count"], 1)
|
||||
|
||||
def test_rewrite_items_falls_back_when_llm_fails(self):
|
||||
items = [news_item("a")]
|
||||
|
||||
|
||||
@@ -45,6 +45,33 @@ class Stage5ClassifyTests(unittest.TestCase):
|
||||
self.assertEqual(by_id["b"].section, "开发与基础设施")
|
||||
self.assertEqual(report["rule_classified"], 2)
|
||||
|
||||
def test_classify_prefers_valid_llm_section_from_rewrite_stage(self):
|
||||
item = news_item(
|
||||
"a",
|
||||
"API 发布",
|
||||
summary="这其实是一个面向开发者的基础设施能力更新。",
|
||||
section_hint="产品发布/更新",
|
||||
)
|
||||
item.section = "开发与基础设施"
|
||||
|
||||
classified, report = classify_and_order_items([item])
|
||||
|
||||
self.assertEqual(classified[0].section, "开发与基础设施")
|
||||
self.assertEqual(report["llm_classified"], 1)
|
||||
self.assertEqual(report["hint_classified"], 0)
|
||||
self.assertEqual(report["rule_classified"], 0)
|
||||
|
||||
def test_classify_falls_back_when_llm_section_is_invalid(self):
|
||||
item = news_item("a", "GPT-5 发布", section_hint="模型发布/更新")
|
||||
item.section = "热点新闻"
|
||||
|
||||
classified, report = classify_and_order_items([item])
|
||||
|
||||
self.assertEqual(classified[0].section, "模型与能力")
|
||||
self.assertEqual(report["llm_classified"], 0)
|
||||
self.assertEqual(report["hint_classified"], 1)
|
||||
self.assertEqual(report["invalid_llm_section_count"], 1)
|
||||
|
||||
def test_classify_orders_items_by_local_rank_score_within_sections(self):
|
||||
items = [
|
||||
news_item("low", "普通模型更新", section_hint="模型发布/更新", source_priority=80),
|
||||
|
||||
@@ -45,8 +45,8 @@ class Stage7AssembleTests(unittest.TestCase):
|
||||
md, report = assemble_markdown(items, guide)
|
||||
|
||||
self.assertTrue(md.startswith("## 引言\n\n> 今天的 AI 行业继续围绕模型、产品和资本展开。"))
|
||||
self.assertIn("## 导览", md)
|
||||
self.assertIn("> 模型和资本两条线都在推进。", md)
|
||||
self.assertNotIn("## 导览", md)
|
||||
self.assertNotIn("> 模型和资本两条线都在推进。", md)
|
||||
self.assertIn("## 模型与能力", md)
|
||||
self.assertIn("**1. GPT-5 API 发布**", md)
|
||||
self.assertIn("**2. Anthropic 提交 IPO 文件**", md)
|
||||
|
||||
Reference in New Issue
Block a user