paper2skills Playbook

AGRS 属性引导评论摘要 - 大规模零幻觉 Review 摘要 pipeline

Skill-AGRS-Aspect-Guided-Review-Summarization · 14-用户分析

causalexperimentpricing供应链与补货客服与VOC数据采集与治理定价与利润WF-A 智能补货WF-C 客服分诊WF-D 选品扫描WF-E Review监控WF-F 动态定价WF-G Listing内容优化
年化 ROI1.5 万/月
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色运营负责人 / 用户增长负责人 · CMO · 产品经理
适用平台Amazon 买家分层 · DTC 站 LTV 预测 · Klaviyo/Brevo 邮件分群
什么情况下用有大量老客户,但不知道谁是高价值客户、谁快要流失;新客获取成本越来越高,老客复购却上不去
成功是什么样的用户按 RFM/LTV 分层精准触达,高价值用户留存率提升,老客贡献收入占比从 30% 提升到 50%
业务痛点
老客复购率上不去不知道哪些用户要流失了所有用户用同一套活动买过一次就不见了

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