fix(ai-outfit): 标题解析改为「按逗号分割」,避开 Markdown 表格坑 (§19.23)

实测模型常返回 Markdown 表格(編號/標題/字元數估算 三列),按行解析会把
表头/分隔线/带 | 数字的行当成标题,写进 Excel A 全是「| 編號 | 標題 | … |」。
改用「提示词约定标题逗号分隔 + 解析按逗号拆分」,简单可靠。

- ai_text_service._clean_titles:从按行拆改为按逗号拆(半角 , / 全角 ,,
  换行作兜底分隔),每段走 _clean_title_line 去空白/序号/引号、丢空
- config_service.DEFAULT_TITLE_PROMPT:改逗号分隔风格,明确禁 Markdown 表格/
  换行/序号/編號/字元數/引号/表情
- extract_text_from_response(取首条)、generate_texts/generate_titles/
  _TitleWorker 均不变

测试:逗号分隔(全角/半角)→ 多条;逗号+换行混用都拆开;逐段去序号/引号;
Markdown 表头单行不再炸成多条垃圾。全套 py37 通过(test_config_service 的
packaging 模板失败属并行 §19.13,与本改动无关)。离屏冒烟:逗号响应解析 +
按序回填 Excel A。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 16:24:34 +08:00
co-authored by Claude Opus 4.8
parent e7fab724fc
commit 61d8e20d86
5 changed files with 64 additions and 19 deletions
+20 -3
View File
@@ -47,16 +47,33 @@ class TestExtractText(unittest.TestCase):
self.assertEqual(extract_text_from_response({"choices": []}), "")
self.assertEqual(extract_text_from_response({}), "")
def test_extract_titles_multiline_to_list_cleaned(self):
"""§17.1: 多行 → 多条,逐行去序号/引号、丢空行。"""
def test_extract_titles_comma_separated(self):
"""§19.23: 逗号分隔(全角/半角)→ 多条,逐段去空白。"""
from services.ai_text_service import extract_titles_from_response
full = {"choices": [{"message": {"content": "甲款,乙款,丙款,丁款"}}]}
self.assertEqual(extract_titles_from_response(full),
["甲款", "乙款", "丙款", "丁款"])
half = {"choices": [{"message": {"content": "甲款, 乙款 ,丙款"}}]}
self.assertEqual(extract_titles_from_response(half), ["甲款", "乙款", "丙款"])
def test_extract_titles_mixed_comma_newline_and_cleaning(self):
"""§19.23: 逗号 + 换行混用都拆开;逐段去序号/引号。"""
from services.ai_text_service import extract_titles_from_response
data = {"choices": [{"message": {"content":
"1. 「韩版宽松卫衣」\n\n2) 复古工装外套\n- 简约百搭T恤\n "}}]}
"1. 「韩版宽松卫衣」,2) 复古工装外套\n- 简约百搭T恤"}}]}
self.assertEqual(
extract_titles_from_response(data),
["韩版宽松卫衣", "复古工装外套", "简约百搭T恤"])
def test_extract_titles_markdown_table_not_exploded(self):
"""§19.23: 表头单行无逗号 → 至多 1 条,不再炸成表头/分隔/多行垃圾。"""
from services.ai_text_service import extract_titles_from_response
data = {"choices": [{"message": {"content": "| 編號 | 標題 | 字元數估算 |"}}]}
self.assertEqual(len(extract_titles_from_response(data)), 1)
def test_extract_titles_empty_when_no_text(self):
from services.ai_text_service import extract_titles_from_response