AGRS 属性引导评论摘要 - 大规模零幻觉 Review 摘要 pipeline
Skill-AGRS-Aspect-Guided-Review-Summarization · 14-用户分析
1. 解决的问题
传统 LLM 摘要"无约束自由生成"产生幻觉(摘要包含评论中不存在的属性). AGRS 把摘要任务结构化:ABSA 提取 aspect-sentiment → canonical 归一化 → 代表性评论加权采样 → 结构化 prompt 引导 LLM 生成. 100% 基于真实评论,根本规避幻觉. 4 阶段 pipeline 端到端可扩展到百万产品.
2. 核心算法逻辑
传统 LLM 摘要"无约束自由生成"产生幻觉(摘要包含评论中不存在的属性). AGRS 把摘要任务结构化:ABSA 提取 aspectsentiment → canonical 归一化 → 代表性评论加权采样 → 结构化 prompt 引导 LLM 生成. 100% 基于真实评论,根本规避幻觉. 4 阶段 pipeline 端到端可扩展到百万产品.
3. 业务应用场景
- 业务问题:Momcozy 在 Amazon US/DE 同时销售紫外线消毒器,每季度 1-2 万条评论,人工汇总需要 2-3 个产品经理 × 1 周;管理层季度复盘和供应链/产品团队迭代输入严重滞后 - 数据要求:Amazon Review API 季度评论数据(评论文本 + 评分 + 市场标记) - AGRS 配置: - ABSA 提取每条评论的 ≤5 个 aspect-sentiment 对(如 `disinfection_effect:positive`, `noise_level:negative`) - Consolidate 同义 aspect(`UV_sanitize` →
- 业务问题:Momcozy 新品暖奶器 Amazon US 上市,第一个月评论量从 0 增长到 200+,运营需要每周捕捉用户反馈热点,但等不到攒够样本量做月度报告(Anker 案例:新品 8 周内的反馈直接决定改款决策) - 数据要求:实时评论增量 + 阈值触发器 - AGRS 配置: - 评论累计达 10 条 → 自动触发首轮 pipeline - 增长 ≥10% 时自动刷新摘要(避免低噪声重算) - 每周生成一次 aspect-guided 摘要,推送飞书运营群 - 业务价值: - 早期负面信号识别提速:从月度 → 周度,差评归因前置 3 周 - 早期反馈带动 R&D 改款:单款新品因
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 节省人工:2 人月 × 1.5 万/月 = 3 万/季度 × 4 = 12 万/年/品类
- 决策提速 2-4 周:管理层决策提前 → 库存/广告优化决策提前 → 净增 150-300 万/年
- 合计:单品类 162-312 万/年
- 早期负面信号识别提速 3 周:避免大批量召回单款节省 50-100 万
- 年化 20 款新品:1000-2000 万元/年潜力(取保守估算 30%-50% 兑现率 = 300-1000 万)
- 易处:Wayfair 开源 HuggingFace 数据集可直接训练/验证
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
AGRS Aspect-Guided Review Summarization 最小骨架
论文 arXiv:2509.26103 (Wayfair, 2025)
完整实现见 paper2skills-code/nlp_voc/agrs_review_summarization/model.py (305 行)
HuggingFace 数据集: leBoytsov/review-summaries-68dab02e7b6a5bc8e29e81fa
"""
from __future__ import annotations
from collections import Counter, defaultdict
from dataclasses import dataclass, field
from typing import Dict, List
import random
@dataclass
class Review:
text: str
review_id: str = ""
rating: int = 5
market: str = ""
@dataclass
class AspectSentiment:
aspect: str
sentiment: str
review_id: str = ""
def extract_aspects(reviews: List[Review], max_per_review: int = 5) -> List[AspectSentiment]:
"""阶段 1: ABSA 提取(生产替换为 LLM 调用 with structured prompt)"""
aspect_kw = {
"disinfection_effect": ["uv", "sanitize", "disinfect", "kill germ"],
"noise_level": ["noise", "loud", "quiet", "silent"],
"ease_of_use": ["easy", "simple", "intuitive", "user friendly"],
"build_quality": ["sturdy", "flimsy", "broken", "durable"],
"value_for_money": ["price", "value", "worth", "expensive"],
}
positive_kw = {"great", "love", "amazing", "easy", "quiet", "sturdy", "worth"}
negative_kw = {"bad", "broken", "loud", "flimsy", "expensive", "noisy"}
results = []
for r in reviews:
text_low = r.text.lower()
for aspect, kws in aspect_kw.items():
if any(kw in text_low for kw in kws):
pos = any(w in text_low for w in positive_kw)
neg = any(w in text_low for w in negative_kw)
sent = "mixed" if (pos and neg) else ("positive" if pos else "negative" if neg else "neutral")
results.append(AspectSentiment(aspect=aspect, sentiment=sent, review_id=r.review_id))
return results
def consolidate_aspects(aspects: List[AspectSentiment], freq_threshold: int = 30) -> List[AspectSentiment]:
"""阶段 2: 归一化"""
canonical_map = {
"uv_sanitize": "disinfection_effect",
"noise": "noise_level",
"easy_to_clean": "cleaning_convenience",
}
consolidated = []
8. 论文来源
- 2509.26103