# Output Style Consistency — Three-Layer Defense ## Problem (2026-06-30 Maggie discovery) When processing multiple campuses in separate sessions, the LLM's data-extractor output drifts in style because earlier campus outputs are no longer in context. The first batch (解放中路→星月, 7 campuses) was consistent due to context anchoring — each campus saw the previous output and copied its style. When 跃龙路 was processed in a new session, the LLM had no reference and generated a different style: - H列: bullet-list format instead of paragraph-style - K列: statistical tag format ("10项风险(3高/5中/2低)") instead of narrative ("【整体评价】...") - L列: categorized headers ("【核心缺失16项】") instead of numbered list Maggie: "金额,风险,模版对比各列内容的审查和修改意见表达都不一样了" ## Root Cause LLM context anchoring effect: style consistency comes from seeing previous outputs in context, not from prompt instructions alone. When context window resets between sessions, the anchoring is lost. ## Three-Layer Defense (implemented in nantong-lease-audit v2 workflow) ### Layer 1: Fixed Templates in Workflow Prompt In the data-extractor role's procedure, embed concrete style examples with explicit "禁止" (prohibited) patterns: ```yaml # H列 format: paragraph-style with 【】category headers, no bullets # K列 format: 【整体评价】opening + ❗【需客户核实】numbered list # L列 format: one-line relationship statement + numbered diff list # J列: exactly "履行中"/"已到期"/"已解除", no parenthetical explanations ``` ### Layer 2: Reference Loading Before Generation Before generating data for a new campus, load the most recent completed campus's xlsx and extract H/K/L content as style anchor: ```bash REF_XLSX=$(ls -t /path/to/房租物业合同/*/*梳理*.xlsx 2>/dev/null | head -1) ``` Read with openpyxl, inject into prompt context. LLM sees "previous campus looks like this" and naturally aligns. ### Layer 3: Post-Processing Validation Run `output-style-check.py` after generation, before upload: ```bash python3 ~/.hermes/scripts/output-style-check.py -row-data.json ``` Checks 8 rules: - H列: no bullet symbols (•/-/*), no "【category·clause】" merged headers - K列: no statistical openings ("X项风险(Y高/Z中)"), no "序号·等级·条款号" tags, no markdown tables, must have 【整体评价】 - L列: no statistical openings ("X处差异(Y缺失/Z修改)"), no "【核心缺失/修改】" sub-headers, no "vs" separators - J列: exact match "履行中"/"已到期"/"已解除" Exit 0 = pass, exit 1 = list violations for fix. ## Workflow Integration In nantong-lease-audit.yaml v2 (hash C77579MQ9QPKE), the data-extractor procedure sections 5-6 implement layers 1-2. Layer 3 is run manually after workflow completes, before xlsx generation. ## Script Location `~/.hermes/scripts/output-style-check.py` — standalone, no dependencies beyond stdlib json/re/sys.