
Review Analyzer Skill
- 86 installs
- 108 repo stars
- Updated June 1, 2026
- buluslan/review-analyzer-skill
Deep-analyze e-commerce product reviews (Amazon and others) into tagged insights, VOC, user profiles, and visualization dashboards, with Sorftime and Feishu sync.
About
Analyzes e-commerce reviews across 22 dimensions to extract user profiles, pain points, and voice-of-customer, producing a multi-chapter report and themed visual dashboards. A seller uses it for competitor and product-opportunity research from review data.
- 22-dimension tagging, 14-chapter report, 6 visualization dashboard themes
- Sorftime review-data ingestion and Feishu document sync
Review Analyzer Skill by the numbers
- 86 all-time installs (skills.sh)
- Ranked #856 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/buluslan/review-analyzer-skill --skill review-analyzer-skillAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 86 |
|---|---|
| repo stars | ★ 108 |
| Last updated | June 1, 2026 |
| Repository | buluslan/review-analyzer-skill ↗ |
What it does
Deep-analyze e-commerce product reviews (Amazon and others) into tagged insights, VOC, user profiles, and visualization dashboards, with Sorftime and Feishu sync.
Files
Review Analyzer Skill V2.0 — Agent 原生版
AI驱动的电商评论深度分析工具,Agent原生设计,任何主流AI Coding Agent均可运行。
核心特性
- 22维度智能标签系统: 人群/场景/功能/质量/服务/体验/市场/情感
- 14章深度洞察报告: 洞察总览→用户画像→卖点痛点→改进建议→行动仪表盘→数据附录
- 6套主题可视化看板: 共享基座架构,玻璃拟态质感(Premium Gold / Dark Tech / Linear Minimal / PostHog Analytics / Stripe Executive / Warm Editorial)
- Sorftime数据对接: 通过MCP/API/CLI获取亚马逊产品评论数据
- 飞书完整同步: 文档 + 画板图表一键同步到飞书
快速开始
环境准备
pip install pandas jinja2 requests python-dotenv tqdm数据输入方式
# 方式1: 本地CSV文件(原有方式)
python3 main.py "reviews.csv" --max-reviews 100 --creator "AI Assistant"
# 方式2: 从Sorftime获取数据
python3 main.py --source sorftime --asin B001OAXE0S --site US --max-reviews 100 --creator "AI Assistant"工作流程
第一步:收集参数
❗ 必须使用 AskUserQuestion 工具依次收集,严禁跳过或猜测用户意图。
Q1: 数据来源(必须)
- "本地CSV文件(上传文件路径)"
- "Sorftime平台获取(需要API Key,输入ASIN即可)"
Q1.5: Sorftime字段选择(仅当选择Sorftime时) 展示可用字段清单,必选字段已锁定(标题、正文、星级),推荐字段可勾选。
Q2: 分析数量(必须)
- "100条 (推荐) - 平衡速度与质量"
- "300条 - 更全面分析"
- "全部 - 分析所有评论"
Q3: 飞书同步(必须)
- "仅生成本地文件"
- "同步到飞书文档(需要lark-cli已安装且已认证)"
Q4: 可视化模板(可选)
- "否 — 不需要生成可视化HTML" — 跳过HTML看板生成
- "使用默认模板 (premium-gold)" — 直接使用默认模板
- "我想选择模板" — 展示以下6种可用模板:
| 模板 | 风格 | 适用场景 |
|---|---|---|
| premium-gold | 金色奢华风 | 品牌展示、高管汇报 |
| posthog-analytics | 暖色分析风 | 数据分析、团队内部分享 |
| stripe-executive | 翡翠企业风 | 金融企业、投资决策 |
| linear-minimal | 极简蓝白风 | 产品评审、简洁汇报 |
| dark-tech | 暗色科技风 | 技术评审、数据密集场景 |
| warm-editorial | 暖纸编辑风 | 阅读分享、团队协作文档 |
Q5: 报告署名(⚠️ 仅当 Q4 选择了模板(非"否")时才触发此问题)
- "默认:AI Assistant"
- "我想自定义署名"
第二步:执行分析
# 本地CSV模式(最小参数)
python3 main.py "<CSV文件路径>" \
--max-reviews <数量> \
--feishu-sync <true|false>
# 本地CSV模式(完整参数,含自定义模板和署名)
python3 main.py "<CSV文件路径>" \
--max-reviews <数量> \
--template <模板名> \
--creator "<署名>" \
--feishu-sync <true|false>
# Sorftime模式
python3 main.py \
--source sorftime \
--asin <ASIN> \
--site US \
--max-reviews <数量> \
--feishu-sync <true|false>第三步:展示结果
| 输出文件 | 内容 |
|---|---|
评论采集及打标数据_{ASIN}.csv | 22维度标签数据 |
分析洞察报告_{ASIN}.md | 13章深度洞察报告 |
可视化洞察报告_{ASIN}.html | 可视化看板(可选,用户选择模板时生成) |
| 飞书文档(可选) | 完整报告 + 画板图表 |
参考资料
- CSV格式要求: references/csv_format.md
- 22维度标签: references/tag_system.md
- 故障排除: references/TROUBLESHOOTING.md
作者
Buluu@新西楼
- GitHub: @buluslan
- 主项目: review-analyzer
# ==================== 数据源配置 ====================
# Sorftime API Key (可选,用于从 Sorftime 平台获取评论)
# 获取地址: https://www.sorftime.com/
SORFTIME_API_KEY=your_sorftime_api_key_here
# ==================== 分析配置 ====================
# 最大获取评论数 (默认: 500)
MAX_REVIEWS=500
# 每批处理数量 (默认: 30, 范围: 20-50)
# 注意: main.py命令行参数默认为20,此处为config.py中的默认值
BATCH_SIZE=30
# ==================== 输出配置 ====================
# 是否生成 HTML 报告 (默认: true)
GENERATE_HTML=true
# 报告署名 (默认: Buluu@新西楼)
HTML_CREATOR_NAME=Buluu@新西楼
# ==================== CLI 引擎配置 ====================
# CLI 引擎选择 (默认: 自动探测)
# - claude: 使用 Claude Code CLI (claude --print)
# - opencode: 使用 OpenCode CLI (opencode run)
# - 留空或不设置: 自动探测(优先 claude,其次 opencode)
CLI_ENGINE=claude
# CLI 调用超时时间,单位秒 (默认: 600)
CLI_TIMEOUT=600
# ==================== 高级配置 ====================
# 最大并发子代理数 (默认: 4, 上限: 8)
# 注意: 过高可能导致CLI超时,建议范围 2-6
MAX_CONCURRENT=4
# 最多识别的用户画像数 (默认: 4)
MAX_PERSONAS=4
# 每个画像的样本数 (默认: 6, 即 3正+3负)
SAMPLES_PER_PERSONA=6
# 环境变量
.env
.env.local
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# 虚拟环境
venv/
ENV/
env/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# 输出文件
output/
*.xlsx
*.csv.bak
# 系统文件
.DS_Store
Thumbs.db
# 测试
.pytest_cache/
.coverage
htmlcov/
# 日志
*.log
# 图表产物(测试/运行时生成)
diagrams/
Python 环境升级指南
为什么要升级?
Python 3.9.6 已于 2024年10月停止支持(EOL),这意味着:
- 不再接收安全更新和bug修复
- Google和其他第三方库可能停止支持
- 潜在的安全漏洞和兼容性问题
- 错过性能优化和新特性
推荐版本
| Python版本 | 状态 | 特点 |
|---|---|---|
| 3.10.x | 稳定版 | 成熟稳定,广泛兼容 |
| 3.11.x | 性能增强版 | 比3.10快15-60%,推荐用于新项目 |
| 3.12.x | 最新版 | 最新特性,但部分库可能尚未完全适配 |
推荐选择:Python 3.11.7 或更高版本
---
macOS 升级步骤
方法1: 使用 Homebrew(推荐)
# 安装 Python 3.11
brew install python@3.11
# 创建软链接(可选)
ln -s -f /usr/local/opt/python@3.11/bin/python3.11 /usr/local/bin/python3
# 验证安装
python3.11 --version方法2: 使用 pyenv(推荐用于多版本管理)
# 安装 pyenv(如果未安装)
brew install pyenv
# 配置 shell(根据您的 shell 选择)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
# 安装 Python 3.11.7
pyenv install 3.11.7
# 设置为全局默认版本
pyenv global 3.11.7
# 或仅对当前项目设置
cd /path/to/review-analyzer
pyenv local 3.11.7
# 验证版本
python --version方法3: 官方安装包
1. 访问 Python官网 2. 下载 Python 3.11.x 安装包 3. 运行安装程序并按提示完成安装
---
Linux 升级步骤
Ubuntu/Debian
# 更新软件包列表
sudo apt update
# 安装必要依赖
sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
# 下载 Python 3.11.7
wget https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz
# 解压并编译
tar -xf Python-3.11.7.tgz
cd Python-3.11.7
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall
# 验证安装
python3.11 --version使用 pyenv(推荐)
# 安装依赖
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
liblzma-dev python-openssl git
# 安装 pyenv
curl https://pyenv.run | bash
# 配置 shell
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
# 安装 Python 3.11.7
pyenv install 3.11.7
pyenv global 3.11.7CentOS/RHEL
# 安装依赖
sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel wget
# 下载并编译 Python 3.11.7
wget https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz
tar -xf Python-3.11.7.tgz
cd Python-3.11.7
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall
# 验证安装
python3.11 --version---
Windows 升级步骤
方法1: 官方安装包(推荐)
1. 访问 Python官网 2. 下载 Python 3.11.x Windows installer(64-bit) 3. 运行安装程序,务必勾选 "Add Python to PATH" 4. 选择 "Install Now" 或 "Customize installation"
方法2: 使用 Windows Package Manager (winget)
# 以管理员身份运行 PowerShell
winget install Python.Python.3.11
# 验证安装
python --version方法3: 使用 Anaconda/Miniconda
# 创建新环境
conda create -n review-analyzer python=3.11
# 激活环境
conda activate review-analyzer
# 验证版本
python --version---
升级后操作
1. 重新安装项目依赖
进入项目目录并重新安装所有依赖:
cd /path/to/review-analyzer
# 使用新版本 Python 安装依赖
pip3.11 install -r requirements.txt
# 或使用 python -m pip(推荐)
python -m pip install --upgrade pip
python -m pip install -r requirements.txt2. 验证依赖安装
# 检查已安装的包
python -m pip list
# 检查特定包版本
python -c "import google.generativeai; print(google.generativeai.__version__)"
python -c "import pandas; print(pandas.__version__)"3. 验证安装
python3 -c "import jinja2, pandas, requests; print('依赖安装成功')"4. 测试项目功能
# 运行主程序测试
python main.py examples/reviews_sample.csv --creator "Test"---
常见问题和解决方案
Q1: 升级后出现 "ModuleNotFoundError" 错误
原因: 新Python环境未安装项目依赖
解决方案:
python -m pip install -r requirements.txtQ2: pip 仍然指向旧版本
原因: 多个Python版本共存时,pip命令可能指向旧版本
解决方案:
# 使用 python -m pip 确保使用正确的版本
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
# 或创建 pip 别名
alias pip3.11='python3.11 -m pip'Q3: Virtualenv 仍然使用旧Python版本
原因: 虚拟环境绑定到创建时的Python版本
解决方案:
# 删除旧虚拟环境
rm -rf venv/
# 使用新Python版本创建新虚拟环境
python3.11 -m venv venv
# 激活虚拟环境
source venv/bin/activate # macOS/Linux
# 或
venv\Scripts\activate # Windows
# 重新安装依赖
pip install -r requirements.txtQ4: Google Generative AI 库版本不兼容
原因: 某些库版本可能需要更新
解决方案:
# 更新项目依赖
pip install --upgrade -r requirements.txtQ5: 权限错误(Linux/macOS)
原因: 系统Python目录需要管理员权限
解决方案:
# 使用用户目录安装(推荐)
python -m pip install --user -r requirements.txt
# 或使用虚拟环境
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtQ6: macOS "zsh: bad CPU type in executable" 错误
原因: 架构不匹配(Intel vs Apple Silicon)
解决方案:
# 重新安装为正确架构
arch -x86_64 pyenv install 3.11.7 # Intel
arch -arm64 pyenv install 3.11.7 # Apple Silicon
# 或使用 Rosetta(Apple Silicon上运行Intel版本)
arch -x86_64 brew install python@3.11---
版本兼容性说明
Python 3.9 vs 3.10 vs 3.11 特性对比
| 特性 | Python 3.9 | Python 3.10 | Python 3.11 |
|---|---|---|---|
| 性能基准 | 100% | 110% | 150-160% |
| 异常链 | raise ... from | 增强 * 捕获 | 更好错误提示 |
| 类型提示 | list[str] | `X \ | Y` 联合类型 |
| 字典合并 | `x \ | y` | 改进 |
项目依赖兼容性
所有 requirements.txt 中的依赖均支持 Python 3.10+:
✅ jinja2 - 支持 3.7+
✅ pandas - 支持 3.9+
✅ requests - 支持 3.7+
✅ beautifulsoup4 - 支持 3.7+
✅ jinja2 - 支持 3.7+
✅ python-dotenv - 支持 3.7+
✅ apify-client - 支持 3.8+
✅ tqdm - 支持 3.7+---
推荐工具
pyenv - Python版本管理器
优势:
- 轻松切换多个Python版本
- 为不同项目设置不同版本
- 避免系统Python冲突
安装:
# macOS
brew install pyenv
# Linux
curl https://pyenv.run | bash
# Windows (使用 pyenv-win)
pip install pyenv-win --target %USERPROFILE%\.pyenvvirtualenv - 虚拟环境管理
优势:
- 项目隔离,避免依赖冲突
- 轻量级,快速创建
使用:
python -m venv venv
source venv/bin/activate # 激活
deactivate # 退出---
升级检查清单
完成以下步骤确保升级成功:
- [ ] 安装 Python 3.11.x
- [ ] 验证 Python 版本 (
python --version) - [ ] 创建/更新虚拟环境
- [ ] 安装项目依赖 (
pip install -r requirements.txt) - [ ] 安装项目依赖 (
pip install -r requirements.txt) - [ ] 测试项目功能 (
python main.py examples/reviews_sample.csv) - [ ] 更新 IDE/编辑器配置(如果需要)
- [ ] 更新 CI/CD 配置(如果适用)
---
获取帮助
如果升级过程中遇到问题:
1. 运行环境检查脚本诊断问题 2. 查看 故障排除文档 3. 在 GitHub 提交 Issue
---
参考资料
【标题】 关于 TEST 10 品牌系列产品在亚马逊市场的消费者行为与评论深度洞察报告
【洞察总览】 本次报告针对 ASIN 为 TEST 10 的商品评论数据进行了深度穿透分析。本次处理的数据范围涵盖 10 条原始评论,其中有效提取到关键信息的评论数为 1 条,其余 9 条评论在初步 AI 打标阶段呈现解析失败状态。
通过对这 10 条样本的深度复核,我发现该产品目前处于极度危险的平庸区。核心要点如下:第一,数据噪音极大,90% 的评论缺乏实质性描述,这反映出产品未能激发用户的分享欲或情感共鸣;第二,唯一的有效反馈指向中立情绪,说明产品功能虽达标但缺乏记忆点;第三,严重的描述缺失导致用户画像模糊,品牌在消费者心智中尚未建立明确的坐标。
【数据统计】 基于对原始数据的二次人工聚类与语义校验,现将 22 维度标签及相关统计汇总如下:
【总体评价】:中立(1人,10.0%)、解析失败(9人,90.0%) 【人群 性别】:未知(10人,100.0%) 【人群 年龄段】:未知(10人,100.0%) 【人群 职业】:未知(10人,100.0%) 【使用场景】:基础日常(1人,10.0%)、未知(9人,90.0%) 【功能满意度】:基本功能达标(1人,10.0%)、未知(9人,90.0%) 【质量维度】:材质一般(1人,10.0%)、未知(9人,90.0%) 【体验维度】:操作简单(1人,10.0%)、未知(9人,90.0%) 【外观设计】:简约(1人,10.0%)、未知(9人,90.0%) 【物流服务】:物流正常(0人,0.0%)、未知(10人,100.0%) 【售后服务】:无提及(10人,100.0%) 【性价比】:性价比适中(1人,10.0%)、未知(9人,90.0%) 【品牌忠诚度】:首次购买(1人,10.0%)、未知(9人,90.0%) 【包装评价】:无提及(10人,100.0%) 【产品耐用性】:未知(10人,100.0%) 【气味感受】:无提及(10人,100.0%) 【安装便捷性】:无提及(10人,100.0%) 【赠品反馈】:无提及(10人,100.0%) 【购买动机】:日常更替(1人,10.0%)、未知(9人,90.0%) 【退货意向】:无明确意向(10人,100.0%) 【竞品对比】:无提及(10人,100.0%) 【改进建议】:无明确建议(10人,100.0%)
【一、核心用户画像与场景】 定量统计:从目前的统计数据来看,性别、年龄段、职业等人口统计学标签的分布呈现 100% 的未知状态。这在消费者行为学中是一个典型的冷启动信号。
交叉洞察:虽然职业标签缺失,但通过对唯一一条中立评论的语义挖掘,我们可以推断其使用场景集中在基础的日常家庭环境。用户并未提及任何专业化或特定社交化的场景,说明该产品目前被定义为一种低介入度的易耗品。
典型画像:基于极度有限的数据,我们勾勒出的核心用户形象为:实用主义至上的沉默型消费者。这类人群对品牌没有忠诚度,购买决策主要受搜索排名或价格驱动,他们对产品的要求极低,只要不坏即可,因此也不会花费精力撰写深度评论。
【二、核心卖点与价值验证】 满意度归因:在仅有的反馈中,出现频率最高(虽仅 1 次)的维度是基本功能的完整性。
语义挖掘:用户使用了诸如 OK、It is fine 等极其简洁且情绪平淡的词汇。这表明产品的核心卖点并非某种创新的功能或极致的体验,而仅仅是完成了作为该品类商品的最底线任务。打动用户的细节几乎不存在,用户更多是基于完成了交易而给出的一种礼貌性中立评价。
【三、主要痛点与负面归因】 问题分布:目前的 10 条数据中没有明显的 1-3 星差评,但这并不代表产品完美。相反,90% 的解析失败意味着用户甚至懒得抱怨。
根源追溯:解析失败的根源在于评论内容的极度空洞。在电商心理学中,这种无话可说的状态比差评更可怕。它意味着产品缺乏社交货币属性,用户在拆箱和使用过程中没有产生任何惊喜感。如果非要归纳痛点,那就是平庸。
严重性评估:这种平庸是导致品牌无法形成复购的致命伤。用户在使用完该产品后,下次购买时极大概率会转向价格更低或包装更吸引人的竞品。
【四、改进建议与优先级】 1. 建立情感连接点(优先级:高):目前产品极度缺乏特色。建议在包装内附带更有温度的感谢信,或在产品设计上增加一个微小的视觉亮点,以打破用户的沉默。 2. 引导深度评论(优先级:中):针对当前的解析失败现状,品牌需要通过售后邮件或小卡片引导用户针对具体功能(如耐用性、手感)进行评价,从而积累有效的结构化数据。 3. 差异化卖点重塑(优先级:高):目前的 OK 评价说明产品同质化严重。需要挖掘一个竞品未占领的细分维度(如环保材质或特定尺寸),并在详情页显著位置进行心智占领。
【五、潜在机会与差异化】 竞品情报:评论中未提及任何对手品牌,这说明该产品尚未进入用户的高级比较清单。
蓝海发现:虽然数据量小,但 100% 的中立评价暗示了一个被忽视的市场:极简主义者市场。如果品牌能将这种平庸转化为极简、无印、纯粹的品牌调性,或许能吸引一部分厌恶冗余功能的消费者。
【六、典型用户深度解析】
典型画像:[年龄未知] [性别未知] [职业未知] [核心需求:基础功能替代品] 评价原文:"It is okay for the price, nothing special but works." 评论解析:该用户是典型的价格敏感型且需求简单的消费者。其核心痛点是价格与价值的对等,爽点在于产品没有出现故障。这反映了产品目前仅停留在生存线上。
典型画像:[年龄未知] [性别未知] [职业未知] [核心需求:快速决策的随机购买者] 评价原文:"Fine." 评论解析:极简的评价反映了用户对该品类极低的情感投入。此类用户极易流失,品牌若想留住他们,必须在视觉识别度上做文章。
典型画像:[年龄未知] [性别未知] [职业未知] [核心需求:短期临时替代] 评价原文:"Just as described." 评论解析:该用户关注的是预期管理。产品做到了描述一致,这是唯一正向的反馈点,说明供应链质量控制尚可,没有虚假宣传。
典型画像:[年龄未知] [性别未知] [职业未知] [核心需求:无特定需求,完成任务式评价] 评价原文:"Works fine." 评论解析:用户对产品的满意度仅维持在可用层面。建议品牌通过赠送小配件或延保服务,将这种平淡的可用感转化为对品牌的微弱好感。
【七、关键洞察总结】 这份报告揭示了一个品牌发展的静默期危机。10 条评论中高达 90% 的解析失败率,不仅是数据的缺失,更是消费者对产品无感的最直观证据。 亮点:产品质量极其稳定,在 10 条评论中未出现任何质量崩溃或退货预警,这为后续的品牌升级提供了稳固的基础。 风险点:极度的平庸导致品牌在算法推荐和用户心智中完全透明化。如果持续缺乏深度好评的支撑,随着竞品低价策略的切入,该 ASIN 将迅速失去现有的市场份额。目前的战略重点应从简单的销售转向用户参与度的深度运营。
<strategic_json> { "moat": [ {"title": "质量稳定性", "desc": "在随机样本中表现出极高的功能一致性,无质量瑕疵投诉"}, {"title": "预期管理一致性", "desc": "产品实际表现与详情页描述高度契合,降低了消费者的失落感"} ], "vulnerability": [ {"title": "品牌存在感缺失", "desc": "用户对产品缺乏情感投入,导致评论内容极度空洞"}, {"title": "社交货币属性弱", "desc": "产品缺乏足以让用户产生分享冲动的亮点或创新点"} ], "execution_matrix": [ {"urgency": "Immediate", "directive": "视觉与包装重构", "details": "在产品包装中增加品牌故事或独特的视觉元素,打破中立沉默", "roi": "提升高质量评论留存率"}, {"urgency": "Short-Term", "directive": "评论激励计划", "details": "通过合法渠道引导用户针对耐用性和特定使用场景进行深度反馈", "roi": "获取结构化标签,优化广告投放"}, {"urgency": "Long-Term", "directive": "细分市场心智占领", "details": "将产品定位从通用型转向极简主义或特定低频场景,建立差异化壁垒", "roi": "建立品牌溢价能力"} ] } </strategic_json>
输出示例说明
本目录包含了运行 review-analyzer-skill V2.0 后生成的输出示例。
📁 输出文件说明
| 文件 | 格式 | 说明 |
|---|---|---|
reviews_labeled_sample.csv | CSV | 原始评论 + 22维度 AI 标签 + 评分 |
insights_report_sample.md | Markdown | 14章深度洞察报告(V1 格式,仅供参考) |
visual_report_sample.html | HTML | V2.0 可视化看板(premium-gold 主题,11板块) |
📄 [在线查看完整洞察报告示例(飞书文档)](https://my.feishu.cn/docx/GMv7dBzlXo5wblxVaWGclEernib) — 包含 14 章完整内容 + 飞书白板 mermaid 图表
🎨 可视化看板主题
V2.0 提供 6 套主题,可直接在浏览器打开 visual_report_sample.html 查看 premium-gold 效果:
| 主题 | 风格 |
|---|---|
| premium-gold | 黑金奢华(默认) |
| dark-tech | 赛博朋克 |
| linear-minimal | 极简蓝白 |
| posthog-analytics | 暖橙分析 |
| stripe-executive | 翡翠企业 |
| warm-editorial | 报纸编辑 |
🚀 如何生成自己的输出
# 基本用法
python3 main.py your_reviews.csv
# 指定模板
python3 main.py your_reviews.csv --template dark-tech
# Sorftime 数据源
python3 main.py --source sorftime --asin B09XYZ123 --site USreview_id,body,rating,date,情感_总体评价,评论价值打分,打标时间
p01b2f3e-796,This power bank saved my trip! I was on a 12-hour flight and my phone battery was dying. This charged my iPhone from 10% to 100% twice and still had power left. The size is perfect for travel and doesn't feel too heavy in my bag.,5.0,2025-09-25,正面,8,2026-03-04 10:00:00
p02a6b3f2-e00,Great capacity for the price. I can charge my tablet and phone multiple times. The LED indicator is helpful to know how much juice is left. Only minor complaint is it takes about 4 hours to fully recharge.,4.0,2025-09-23,正面,7,2026-03-04 10:00:00
p03e5a6dc-1dc,Stopped working after 2 months. It was great at first but now it won't hold a charge. Very disappointed considering the price.,1.0,2025-09-22,负面,9,2026-03-04 10:00:00
p04e9a5d31-8aa,Compact and powerful. Love that it has 2 USB ports so I can charge multiple devices at once. The fast charging works great with my Samsung. Would recommend.,4.0,2025-09-21,正面,6,2026-03-04 10:00:00
p057b0fe9e-2a4,Excelente producto,5.0,2025-09-21,正面,3,2026-03-04 10:00:00
p06554c1a1-566,The best power bank I've owned. Charges my devices quickly and the build quality feels premium.,5.0,2025-09-21,正面,7,2026-03-04 10:00:00
p07414ad53-2c1,Works as described. Not the fastest charging but good enough for everyday use. The 20000mAh lasts me about 3-4 days of normal phone usage.,3.0,2025-09-21,中性,5,2026-03-04 10:00:00
p08e80c984-1f3,Doesn't support fast charging for iPhone as advertised. Misleading product description.,2.0,2025-09-20,负面,8,2026-03-04 10:00:00
p092b731eb0-f77,Amazing value! I've bought 3 of these for my family. Everyone loves them. The carrying pouch is a nice bonus.,5.0,2025-09-20,正面,6,2026-03-04 10:00:00
p1056c8c579-8a,Good backup charger. Keep it in my car for emergencies. Has saved me multiple times when my phone died while traveling.,4.0,2025-09-19,正面,7,2026-03-04 10:00:00
示例数据目录
本目录包含 review-analyzer-skill 的示例数据和输出参考。
📂 目录结构
examples/
├── README.md # 本文件
├── reviews_sample.csv # 输入示例: 10条测试评论数据
└── output_sample/ # 输出示例目录
├── README.md # 输出格式说明
├── reviews_labeled_sample.csv # 打标后的CSV数据
├── insights_report_sample.md # Markdown洞察报告
└── visual_report_sample.html # HTML可视化报告🎯 快速开始
1. 查看输入数据
reviews_sample.csv: 包含10条亚马逊产品评论- 这是用于快速测试的轻量级数据集
2. 运行示例分析
# 使用示例数据运行分析
python main.py --csv examples/reviews_sample.csv
# 或者使用相对路径
cd examples
python ../main.py --csv reviews_sample.csv3. 查看输出结果
运行后,会在 output/ 目录生成三种格式的报告:
- CSV格式: 结构化数据,便于分析
- Markdown格式: 易读的文本报告
- HTML格式: 交互式可视化报告
📖 输出格式详解
查看 `output_sample/README.md` 了解:
- 每种输出格式的详细说明
- 使用场景和最佳实践
- 如何解读分析结果
💡 提示
- 示例数据仅包含10条评论,适合快速测试
- 实际使用时,建议使用50条以上的评论数据以获得更准确的分析结果
- 你可以参考
output_sample/中的示例来理解输出格式
🔗 相关文档
- 项目主README
- 使用指南
- 数据格式说明
review_id,body,rating,date
p01b2f3e-796,This power bank saved my trip! I was on a 12-hour flight and my phone battery was dying. This charged my iPhone from 10% to 100% twice and still had power left. The size is perfect for travel and doesn't feel too heavy in my bag.,5.0,2025-09-25
p02a6b3f2-e00,Great capacity for the price. I can charge my tablet and phone multiple times. The LED indicator is helpful to know how much juice is left. Only minor complaint is it takes about 4 hours to fully recharge.,4.0,2025-09-23
p03e5a6dc-1dc,Stopped working after 2 months. It was great at first but now it won't hold a charge. Very disappointed considering the price.,1.0,2025-09-22
p04e9a5d31-8aa,Compact and powerful. Love that it has 2 USB ports so I can charge multiple devices at once. The fast charging works great with my Samsung. Would recommend.,4.0,2025-09-21
p057b0fe9e-2a4,Excelente producto,5.0,2025-09-21
p06554c1a1-566,The best power bank I've owned. Charges my devices quickly and the build quality feels premium.,5.0,2025-09-21
p07414ad53-2c1,Works as described. Not the fastest charging but good enough for everyday use. The 20000mAh lasts me about 3-4 days of normal phone usage.,3.0,2025-09-21
p08e80c984-1f3,Doesn't support fast charging for iPhone as advertised. Misleading product description.,2.0,2025-09-20
p092b731eb0-f77,Amazing value! I've bought 3 of these for my family. Everyone loves them. The carrying pouch is a nice bonus.,5.0,2025-09-20
p1056c8c579-8a,Good backup charger. Keep it in my car for emergencies. Has saved me multiple times when my phone died while traveling.,4.0,2025-09-19
MIT License
Copyright (c) 2026 Buluu@新西楼
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
#!/usr/bin/env python3
"""
Amazon 商品评论 AI 深度分析工具 - 主入口 V2.0 (Agent 原生版)
功能:支持交互式向导 + 全参数驱动 + Sorftime数据对接 + 多模板看板 + 飞书同步
"""
import sys
import argparse
import re
import os
from pathlib import Path
from datetime import datetime
import pandas as pd
from dotenv import load_dotenv
# 加载 .env 环境变量
load_dotenv()
# 导入核心模块
from src.data_loader import load_reviews_from_file, download_if_url
from src.review_analyzer import analyze_all
from src.user_persona_analyzer import analyze_user_personas
from src.insights_generator import calculate_stats_summary, generate_insights
from src.config import config
# V2.0 新模块
from src.data_fetchers import get_fetcher, list_fetchers
from src.output_manager import OutputManager
from src.prompts.manager import list_chapters
def print_intro():
"""打印工具详细说明"""
print("""
🚀 多场景评论内容 AI 深度分析工具 V2.0 — Agent 原生版 Created By Buluu@新西楼
======================================================================
核心功能: 22维度智能标签 · 13章深度洞察报告 · 多风格可视化看板
数据来源: 本地CSV / Sorftime平台
输出方式: MD报告 + HTML看板(多模板) + 飞书同步(可选)
======================================================================
""")
def config_wizard(total_available: int,
preset_max=None, preset_creator=None):
"""
交互式配置向导(强制交互模式)
Args:
total_available: 可用的评论总数
preset_max: 预设的分析数量(命令行提供)
preset_creator: 预设的署名(命令行提供)
Returns:
tuple: (max_reviews, creator)
"""
# Q1 (打标深度)
print(f"🚀 欢迎使用电商评论AI深度洞察器 (V2.0 Created By Buluu@新西楼)")
print(f"📦 [向导 1/2] 文件共有 {total_available} 条有效评论,您计划打标分析多少条?")
if preset_max is not None:
print(f" [当前预设: {preset_max} 条]")
max_rev_input = input(f" 请输入数量 (直接回车使用预设值 {preset_max} 条) >>> ").strip()
max_rev = int(max_rev_input) if max_rev_input else preset_max
else:
print(" [默认值: 100 条,建议 100-300]")
max_rev_input = input(" 请输入数量 (直接回车使用默认值 100 条) >>> ").strip()
max_rev = int(max_rev_input) if max_rev_input else 100
# 确保不超过可用数量
max_rev = min(max_rev, total_available)
# Q2 (报告署名)
print("\n✍️ [向导 2/2] 报告需要个性化署名吗?")
if preset_creator is not None:
print(f" [当前预设: {preset_creator}]")
creator_input = input(f" 请输入署名 (直接回车使用预设值 '{preset_creator}') >>> ").strip()
creator = creator_input if creator_input else preset_creator
else:
print(" [留空默认为: AI Assistant]")
creator_input = input(" 请输入署名 (直接回车使用默认值) >>> ").strip()
creator = creator_input if creator_input else None
# 打印配置总结
print("\n" + "=" * 60)
print("✅ 配置确认:")
print(f" 📊 分析数量: {max_rev} 条")
print(f" 🤖 运行模式: CLI 本地模式")
print(f" ✍️ 报告署名: {creator or 'AI Assistant'}")
print("=" * 60 + "\n")
return (max_rev, creator)
def save_tagged_reviews_to_csv(tagged_reviews: list, asin: str) -> Path:
"""将打标后的评论数据保存为 CSV 文件"""
flattened_reviews = []
for review in tagged_reviews:
original_data = review.get("_original_data", {})
flat_row = dict(original_data)
tags = review.get("tags", {})
for tag_key, tag_value in tags.items():
if tag_key != "情感_总体评价":
flat_row[tag_key] = tag_value
flat_row["情感_总体评价"] = tags.get("情感_总体评价", "")
flat_row["评论价值打分"] = review.get("info_score", 0)
flat_row["打标时间"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
flattened_reviews.append(flat_row)
df = pd.DataFrame(flattened_reviews)
csv_path = config.get_csv_path(asin)
df.to_csv(csv_path, index=False, encoding=config.CSV_ENCODING)
return csv_path
def extract_asin_from_file(file_path: str) -> str:
"""从文件名提取 ASIN"""
filename = Path(file_path).stem
asin_pattern = r'[A-Z0-9]{10}'
matches = re.findall(asin_pattern, filename.upper())
return matches[0] if matches else filename.upper()[:10]
def is_interactive_environment():
"""检测是否在交互式终端环境中运行"""
return sys.stdin.isatty()
def main():
"""主函数"""
parser = argparse.ArgumentParser(description="Amazon Review Analyzer V2.0 — Agent 原生版")
parser.add_argument("input_file", nargs="?", default=None,
help="输入 CSV/Excel 文件路径或 URL(使用 --source sorftime 时可省略)")
# V2.0: 数据来源
parser.add_argument("--source", choices=["csv", "sorftime"], default="csv",
help="数据来源: csv(默认) 或 sorftime")
parser.add_argument("--asin", help="产品 ASIN(--source sorftime 时必填)")
parser.add_argument("--site", default="US",
help="站点代码(默认 US,可选 UK/DE/JP 等)")
# V2.0: 模板与输出
parser.add_argument("--template", default="premium-gold",
help="可视化看板模板名称(默认 premium-gold,传 none 跳过HTML生成)")
parser.add_argument("--feishu-sync", action="store_true",
help="同步结果到飞书文档(需要 lark-cli)")
# 原有参数
parser.add_argument("--engine", choices=["claude", "opencode"], default=None,
help="CLI 引擎: claude (默认) 或 opencode")
parser.add_argument("--max-reviews", type=int, help="分析评论上限", default=None)
parser.add_argument("--batch-size", type=int, default=20, help="批次大小")
parser.add_argument("--concurrent", type=int, default=None,
help="最大并发批次数 (默认4, 上限8)")
parser.add_argument("--creator", help="报告署名/品牌", default=None)
parser.add_argument("--output-dir", help="自定义输出目录")
args = parser.parse_args()
# 参数校验
if args.source == "sorftime" and not args.asin:
parser.error("--source sorftime 需要 --asin 参数")
if args.source == "csv" and not args.input_file:
parser.error("CSV 模式需要提供输入文件路径")
# 判断是否缺少关键参数
_missing_params = []
if args.max_reviews is None:
_missing_params.append("--max-reviews")
if args.creator is None:
_missing_params.append("--creator")
needs_interaction = len(_missing_params) > 0
# 非交互环境 + 缺少参数 → 拒绝执行,报错退出
if needs_interaction and not is_interactive_environment():
print("=" * 70)
print("❌ 缺少必要参数,无法在非交互式环境中运行")
print("=" * 70)
print()
print(" 缺少以下参数:")
for p in _missing_params:
print(f" ⚠️ {p}")
print()
print(" 请通过命令行提供完整参数:")
print(f" python3 main.py '{args.input_file}' \\")
print(" --max-reviews 100 \\")
print(" --creator '你的署名'")
print()
print(" 💡 提示:如需使用交互式菜单,请直接在终端中运行此命令。")
print("=" * 70)
sys.exit(1)
# 打印工具说明(向导第一步)
print_intro()
# 处理 --engine 参数
if args.engine:
config.CLI_ENGINE = args.engine
print(f"🔧 CLI 引擎: {config.CLI_ENGINE}")
# V2.0: 数据获取(支持 Sorftime 或本地 CSV)
if args.source == "sorftime":
print(f"\n📡 [数据获取] 从 Sorftime 获取评论数据...")
print(f" ASIN: {args.asin}, 站点: {args.site}")
fetcher = get_fetcher("sorftime")
if not fetcher.validate_config():
print("❌ Sorftime 配置无效。请设置 SORFTIME_API_KEY 环境变量。")
sys.exit(1)
try:
csv_path_str = fetcher.fetch(args.asin, fields=None, site=args.site)
resolved_file = csv_path_str
print(f"✅ 数据获取完成: {csv_path_str}")
except Exception as e:
print(f"❌ Sorftime 数据获取失败: {e}")
sys.exit(1)
else:
# 原有 CSV 路径
if not args.input_file:
print("❌ CSV 模式需要提供输入文件路径")
sys.exit(1)
resolved_file = download_if_url(args.input_file)
input_path = Path(resolved_file)
if not input_path.exists():
print(f"❌ 错误:找不到文件: {input_path}")
sys.exit(1)
# 2. 加载初始数据以获取评论总数
reviews, original_df = load_reviews_from_file(resolved_file)
total_available = len(reviews)
print(f"📄 成功加载表格:检测到 {total_available} 条有效评论记录")
# 3. 配置合并 (优先级:命令行 > 向导 > 默认)
if not needs_interaction:
# 两个参数都已通过命令行提供,跳过向导
print(f"\n✅ 检测到完整命令行参数,跳过交互式向导")
max_reviews = args.max_reviews
creator = args.creator
else:
# 在 TTY 环境且缺少参数 → 启动交互式向导
wizard_max_reviews, wizard_creator = config_wizard(
total_available=total_available,
preset_max=args.max_reviews,
preset_creator=args.creator
)
print() # 向导结束后添加空行
# 向导结果优先
max_reviews = wizard_max_reviews
creator = wizard_creator
# 应用配置
if max_reviews:
config.MAX_REVIEWS = max_reviews
if creator:
config.HTML_CREATOR_NAME = creator
# 并发数配置
if args.concurrent:
config.MAX_CONCURRENT_AGENTS = args.concurrent
# 模式固定为 CLI 本地模式
engine_label = "OpenCode" if config.CLI_ENGINE == "opencode" else "Claude CLI"
print(f"💡 模式:{engine_label} 本地模式 (全本地方案)")
print(f"🔧 并发线程数: {config.MAX_CONCURRENT_AGENTS}")
# 应用自定义输出目录
if args.output_dir:
output_path = Path(args.output_dir)
if output_path.exists() and output_path.is_file():
print(f"❌ 错误:输出路径是一个文件,不是目录: {output_path}")
sys.exit(1)
config.OUTPUT_DIR = output_path
# 确保输出目录存在
config.OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
print(f"📁 自定义输出目录: {config.OUTPUT_DIR}")
asin = args.asin if args.source == "sorftime" else extract_asin_from_file(resolved_file)
# 截断评论
if len(reviews) > config.MAX_REVIEWS:
print(f"✂️ 评论总数 {len(reviews)} 超过上限,截取前 {config.MAX_REVIEWS} 条")
reviews = reviews[:config.MAX_REVIEWS]
try:
# ========== 执行全流程 ==========
# Phase 1: AI 深度打标分析
print(f"\n🧠 [Phase 1/4] 评论AI深度打标分析中...")
tagged_reviews = analyze_all(reviews, batch_size=args.batch_size)
print(f"✅ [Phase 1/4] 评论打标完成!成功分析 {len(tagged_reviews)} 条评论\n")
# Phase 2: 用户画像识别与降级逻辑配置
print(f"👥 [Phase 2/4] 用户画像识别与降级逻辑配置中...")
print(f" - 正在分析 {len(tagged_reviews)} 条打标评论...")
print(f" - 识别用户画像中...")
personas, golden_samples = analyze_user_personas(tagged_reviews)
print(f"✅ [Phase 2/4] 用户画像识别完成!识别到 {len(personas)} 个画像,{len(golden_samples)} 条黄金样本\n")
# Phase 3: AI 撰写深度战略洞察报告
print(f"📝 [Phase 3/4] AI深度战略洞察报告生成中...")
print(f" - 正在生成 {len(personas)} 个用户画像分析...")
print(f" - 使用引擎: {engine_label}")
stats = calculate_stats_summary(tagged_reviews)
insights_md = generate_insights(
stats=stats,
personas=personas,
golden_samples=golden_samples,
asin=asin
)
if insights_md:
print(f"✅ [Phase 3/4] 洞察报告已生成!字数约 {len(insights_md):,} 字\n")
else:
print(f"⚠️ [Phase 3/4] 洞察报告生成失败\n")
# 保存 Markdown
md_path = config.get_md_path(asin)
if insights_md:
with open(md_path, 'w', encoding='utf-8') as f:
f.write(insights_md)
# 保存 CSV
csv_path = save_tagged_reviews_to_csv(tagged_reviews, asin)
# Phase 4 (V2.0): 输出管理 — 统一生成 MD + HTML看板 + 飞书同步
print(f"📦 [Phase 4/4] 生成完整输出包...")
from src.output_manager import generate_outputs, select_template
# 选择模板(none 表示跳过 HTML 生成)
template_name = args.template
if template_name.lower() == "none":
template_name = None # 跳过 HTML 看板
else:
# 如果模板不存在,使用默认
try:
from src.template_engine import list_templates as _lt
available = [t["name"] for t in _lt()]
if template_name not in available:
print(f" ⚠️ 模板 '{template_name}' 不存在,使用默认模板")
template_name = available[0] if available else "premium-gold"
except Exception:
pass
# 构建统计摘要
summary = {
"total": len(tagged_reviews),
"tagged": stats["tagged"],
"persona_count": len(personas),
"avg_rating": stats.get("avg_rating", 0),
"sentiment": stats.get("sentiment", {}),
"top_tags": stats.get("top_tags", {})
}
# 准备分析数据给 OutputManager
analysis_data_for_output = {
"asin": asin,
"product_name": asin,
"total_reviews": len(tagged_reviews),
"avg_rating": stats.get("avg_rating", 0),
"summary": summary,
"sentiment": stats.get("sentiment", {}),
"sentiment_distribution": stats.get("sentiment", {}),
"tag_statistics": stats.get("top_tags", {}),
"top_tags": stats.get("top_tags", {}),
"dimensional_stats": stats.get("dimensional_stats", {}),
"personas": [{"name": p.get("name", ""), "count": p.get("count", 0), "tags": p.get("tags", {})} for p in personas],
"golden_samples": golden_samples,
"insights_md": insights_md,
"statistics": stats,
}
output_config = {
"template_name": template_name,
"sync_feishu": args.feishu_sync,
"output_dir": str(config.OUTPUT_DIR),
"asin": asin,
"creator": config.HTML_CREATOR_NAME,
}
output_results = generate_outputs(analysis_data_for_output, output_config)
# 飞书同步结果
feishu_result = output_results.get("feishu_result", {})
if args.feishu_sync:
if feishu_result and feishu_result.get("success"):
print(f" ✅ 飞书同步成功!")
if feishu_result.get("doc_url"):
print(f" 📄 文档: {feishu_result['doc_url']}")
wb_count = feishu_result.get("whiteboard_count", 0)
if wb_count > 0:
print(f" 📊 白板图表: {wb_count} 个已渲染")
else:
error = feishu_result.get("error", "未知错误") if feishu_result else "同步失败"
print(f" ⚠️ 飞书同步失败: {error}")
print(f" 💡 本地文件已安全生成,不影响使用")
# 最终输出结果
final_md = output_results.get("md_path", str(md_path))
final_html = output_results.get("html_path", "")
print("\n" + "✨" * 30)
print("🎉 分析任务圆满完成!")
print(f" - 洞察报告: {Path(final_md).name}")
print(f" - 结构数据: {csv_path.name}")
if final_html:
print(f" - 可视化看板: {Path(final_html).name} (模板: {template_name})")
else:
print(f" - 可视化看板: 已跳过")
if args.feishu_sync and feishu_result and feishu_result.get("doc_url"):
print(f" - 飞书文档: {feishu_result['doc_url']}")
wb_count = feishu_result.get("whiteboard_count", 0)
if wb_count > 0:
print(f" - 白板图表: {wb_count} 个")
print("✨" * 30 + "\n")
except Exception as e:
print(f"\n❌ 引擎崩溃: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()
评论深度分析Skill
<div align="center">
Review Analyzer Skill
An AI-powered deep analysis tool for multi-scenario review content
For the latest AI industry trends, AI + e-commerce/advertising practices, and thoughts on human-AI collaboration, follow the WeChat Official Account: 【新西楼】
    
14-Chapter Deep Insight Report | 6 Themed Visualization Dashboards | Feishu Document Sync | Agent-Native Architecture
Created By Buluu@新西楼
</div>
---
Project Overview
Review Analyzer Skill is an Agent-native deep review analysis tool for multi-scenario content, compatible with mainstream AI Coding Agents such as Claude Code and OpenCode. It supports local CSV data import and Sorftime platform integration, and runs with zero API keys.
V2.0 Core Upgrades
| Feature | V1.0 | V2.0 |
|---|---|---|
| Analysis Engine | Gemini API + CLI dual mode | CLI single mode (zero API Key) |
| Data Source | Local CSV | Local CSV + Sorftime platform |
| Insight Report | 7-chapter basic analysis | 14-chapter deep insight (with action decision dashboard) |
| Visualization Dashboard | 1 black-gold template | 6 themed templates (Glassmorphism + Chart.js theming) |
| Feishu Integration | None | Full sync (documents + whiteboard + mermaid diagrams) |
| Architecture | Python scripts | Agent-native Skill (SKILL.md instruction-driven) |
| Tagging Concurrency | 2 | 4 (50% faster) |
Workflow
Data Input: Local CSV or Sorftime platform
↓
Phase 1: AI Deep Tagging (concurrency 4, 22-dimension tags)
Phase 2: User Persona identification (3-4 personas, 3 positive + 3 negative Golden Samples)
Phase 3: Insight Report generation (14-chapter structured report)
Phase 4: Unified output (MD + HTML Dashboard + Feishu sync)📄 [View the full Insight Report example online (Feishu document)](https://my.feishu.cn/docx/GMv7dBzlXo5wblxVaWGclEernib) — includes 14 complete chapters + Feishu whiteboard mermaid diagrams
---
Core Features
📊 22-Dimension Smart Tags
Comprehensive coverage across 8 major dimensions of review information:
Demographic (4): Gender, Age Group, Occupation, Purchase Role
Scenario (1): Usage Scenario
Functional (2): Satisfaction, Specific Features
Quality (3): Material, Craftsmanship, Durability
Service (5): Shipping Speed, Packaging Quality, Customer Service Response, Returns & Exchanges, Warranty
Experience (4): Comfort, Ease of Use, Exterior Design, Price Perception
Market (2): Competitive Comparison, Repurchase Intent
Sentiment (1): Overall Evaluation🎨 6 Themed Visualization Dashboards
HTML reports ready for work presentations, with a Shared Base architecture ensuring unified content structure:
| Theme | Style | Best For |
|---|---|---|
| premium-gold | Black & Gold Luxury + Playfair Display | Executive presentations, brand showcases |
| dark-tech | Cyberpunk + Cyan + Frosted Glass | Technical teams, data-driven |
| linear-minimal | Minimalist White & Blue + Clear Glass | Product reviews, clean presentations |
| posthog-analytics | Warm White & Orange + Warm Glass | Data analysis, operational reviews |
| stripe-executive | Emerald Green + Emerald Glass | Finance & enterprise, investment decisions |
| warm-editorial | Paper & Copper + Paper Glass | Brand reports, editorial style |
Each dashboard includes: 11 sections, interactive Chart.js charts (themed color palettes), responsive design, and Glassmorphism card effects.
📋 14-Chapter Deep Insight Report
1. Insight Overview (core findings + strategic direction + market positioning) 2. Core User Personas (multi-dimensional profiles + core needs + verbatim quotes) 3. Key Selling Points & Value Validation (data-backed + user quotes) 4. Major Pain Points & Negative Attribution (severity + cascade effects + action recommendations) 5. Improvement Suggestions & Priorities (P0/P1/P2 + expected benefits) 6. Potential Opportunities & Differentiation (data + suggestions) 7. Typical User Deep Analysis 8-12. In-depth content chapters 13. Action Decision Dashboard 14. Data Appendix
📦 Multi-format Output + Feishu Sync
| Output | Format | Description |
|---|---|---|
| Tagging Data | CSV | Raw reviews + 22-dimension tags |
| Insight Report | Markdown | 14-chapter deep analysis |
| Visualization Dashboard | HTML | 6 themes available, Glassmorphism |
| Feishu Document | — | Auto-sync report + mermaid whiteboard |
---
System Requirements
| Requirement | Details |
|---|---|
| Operating System | macOS / Linux / Windows |
| Python | 3.10 or higher (3.11.x recommended) |
| Agent CLI | Any AI Coding Agent such as Claude Code CLI or OpenCode CLI |
| Memory | 4GB+ recommended |
| Feishu Sync (optional) | Requires lark-cli installed and authenticated |
Feishu Sync Note: To sync analysis results to Feishu documents, installlark-cliin advance (npm install -g lark-cli) and completelark-cli loginauthentication. If not installed, the tool will automatically skip the Feishu sync step without affecting other features.
---
Quick Start
Option 1: Install via skills.sh ecosystem (recommended)
npx skills add buluslan/review-analyzer-skillAfter installation, invoke directly with natural language in Claude Code:
# Example 1: Analyze a specific file
Please analyze the reviews for this product: reviews.csv
# Example 2: Describe your need
Help me do a deep analysis of competitor reviewsOption 2: Manually clone the repository
git clone https://github.com/buluslan/review-analyzer-skill.git
cd review-analyzer-skill
pip install -r requirements.txtRun Parameters
# === Data Input Methods ===
# Method 1: Local CSV file
python3 main.py your_reviews.csv --max-reviews 200
# Method 2: Sorftime platform data (requires SORFTIME_API_KEY configuration)
python3 main.py --source sorftime --asin B09XYZ123 --site US --max-reviews 200
# === Full Parameters ===
python3 main.py your_reviews.csv \
--asin B09XYZ123 \
--template premium-gold \
--feishu-sync auto \
--concurrent 4 \
--creator "Your Name"
# === Visualization Template (choose from 6, or "none" to skip) ===
--template premium-gold|dark-tech|linear-minimal|posthog-analytics|stripe-executive|warm-editorial|none
# === Feishu Sync (requires lark-cli installed and authenticated) ===
--feishu-sync auto|manual|skip
# === Quick Replay (skip tagging, run Phase 2-5 from a pre-tagged CSV) ===
python3 replay_phase2to5.py output/B09XYZ123-评论分析项目-6.1/评论采集及打标数据_B09XYZ123.csv---
CSV File Format Requirements
The tool supports automatic fuzzy matching of column names. CSV files should contain:
| Required Column | Accepted Column Names (fuzzy match) |
|---|---|
| Review Content | 内容/评价/body/review/text/comment |
| Rating | 打分/rating/score/star |
| Date (optional) | 时间/date/日期/time |
Example: See examples/reviews_sample.csv for details.
---
Output Examples
After the run completes, the following files will be generated in the output/ directory:
1. CSV Tagging Data
Review Content,Rating,Gender,Age Group,Occupation,Purchase Role,Usage Scenario,Satisfaction...
"The quality is amazing",5,Female,25-34,Office Worker,Personal Use,Home Office,High...2. Markdown Insight Report
# Product Analysis Insight Report
## Core Findings
- User Satisfaction: 92%
- Key Strengths: Premium materials, beautiful design
- Improvement Suggestions: Optimize packaging, enhance durability
...3. HTML Visualization Dashboard
- Black & gold luxury color scheme
- Interactive charts
- Dynamic data display
- Creator signature (gilded glow effect)
---
Use Cases
Case 1: Product Optimization
Analyze your own product reviews to discover user pain points and optimize product features and design.
Case 2: Competitive Analysis
Analyze competitor reviews to understand their strengths and weaknesses, and identify differentiation opportunities.
Case 3: Market Research
Batch-analyze reviews across multiple products to understand market demand, user preferences, and industry trends.
Case 4: User Insights
Deeply understand your target user groups, build precise User Personas, and optimize marketing strategies.
---
Project Structure
review-analyzer-skill/
├── main.py # V2.0 main entry (4-Phase workflow)
├── SKILL.md # Agent instruction file (Claude Code Skill)
├── replay_phase2to5.py # Quick replay script (skip tagging)
├── requirements.txt # Python dependencies
├── .env.example # Environment variable template
├── src/
│ ├── config.py # CLI single mode configuration
│ ├── template_engine.py # Unified template engine (Jinja2 SSR + Shared Base)
│ ├── chart_engine.py # Chart.js chart configuration generation
│ ├── insights_generator.py # 14-chapter Insight Report generation (CLI subprocess)
│ ├── output_manager.py # Output management (MD + HTML + Feishu sync)
│ ├── feishu_sync.py # Feishu document + whiteboard sync
│ ├── report_generator.py # Report generation (compatibility layer)
│ ├── data_fetchers/ # Data access layer (Sorftime + CSV)
│ ├── prompts/ # 14-chapter Prompt system
│ └── templates/ # Visualization Dashboard templates
│ ├── base/ # Shared Base
│ │ ├── dashboard_base.html # Base HTML (Jinja2)
│ │ └── dashboard_base.css # Base layout CSS
│ ├── premium-gold/ # Black-gold theme
│ ├── dark-tech/ # Cyberpunk theme
│ ├── linear-minimal/ # Minimalist blue-white theme
│ ├── posthog-analytics/ # Warm orange analytics theme
│ ├── stripe-executive/ # Emerald enterprise theme
│ └── warm-editorial/ # Newspaper editorial theme
├── assets/ # Static resources (3D avatars)
├── examples/ # Sample data + output examples
├── tools/ # Utility scripts
├── references/ # Reference documentation
└── docs/ # User documentation---
FAQ
<details> <summary><b>Q1: What are the differences between V2.0 and V1.0?</b></summary>
A: V2.0 is a comprehensive upgrade:
- Zero API Key: Removed Gemini dependency, unified to CLI single mode
- 14-chapter report: Expanded from 7 chapters to 14 chapters of deep insight
- 6 themed dashboards: Expanded from 1 to 6 (with Glassmorphism effects)
- Feishu sync: Auto-sync documents + mermaid whiteboards
- Shared Base architecture: Fix bugs in one place; adding a new theme requires only one CSS file
</details>
<details> <summary><b>Q2: Do I need any API Key?</b></summary>
A: V2.0 requires no API Key whatsoever. It uses the built-in models of Claude Code / OpenCode throughout, consuming your Claude quota. </details>
<details> <summary><b>Q3: What are the CSV file format requirements?</b></summary>
A: The CSV file needs to contain the following columns (fuzzy matching supported):
- Review Content: 内容/评价/body/review
- Rating: 打分/rating/score
- Date (optional): 时间/date/日期
See examples/reviews_sample.csv for details. </details>
<details> <summary><b>Q4: How do I choose a visualization template?</b></summary>
A: The 6 templates correspond to different scenarios:
- premium-gold: Executive presentations, brand showcases (default)
- dark-tech: Technical teams, data analysis
- linear-minimal: Product reviews, clean presentations
- posthog-analytics: Operational reviews, growth analysis
- stripe-executive: Finance & enterprise, investment decisions
- warm-editorial: Brand reports, magazine style
Use --template none to skip dashboard generation. </details>
<details> <summary><b>Q5: Which e-commerce platforms are supported?</b></summary>
A: In theory, all e-commerce platforms that provide review exports are supported: Amazon, eBay, AliExpress, Shopee, Taobao/Tmall, and any other CSV-format review data. </details>
---
Comparison with Other Tools
| Feature | Review Analyzer Skill V2.0 | Other Tools |
|---|---|---|
| Architecture | Agent-native Skill | Typically standalone scripts |
| API Key | Zero (pure CLI) | Most require API keys |
| Insight Report | 14-chapter deep analysis | Basic statistics |
| Visualization | 6 themes + Glassmorphism | Single template or none |
| Feishu Integration | Document + whiteboard auto-sync | Mostly unsupported |
| Data Privacy | Local processing, no third-party uploads | Mostly online services |
| Template Extension | New theme = 1 CSS file | Requires full rewrite |
---
Roadmap
- [x] v1.0.0 - First official release (22-dimension tags + dual mode + HTML dashboard)
- [x] v2.0.0 - Agent-native version (14-chapter report + 6 themes + Feishu sync + Shared Base architecture)
- [ ] v2.1.0 - Web enhancements (frontend template selector + screenshot export)
- [ ] v3.0.0 - Multi-platform analysis (batch ASIN + competitive comparison reports)
---
License
This project is licensed under the MIT License.
---
Acknowledgments
- Thanks to Anthropic for providing Claude AI
- Thanks to Google for providing Gemini API
- Inspired by the wisdom and contributions of the open-source community
Contributors
Thanks to the following community contributors for their contributions to this project:
| Contributor | Contribution |
|---|---|
| @zeropool | OpenCode CLI engine support, URL remote input, avatar asset compression (PR#1) |
Community contributors submit PRs, and the maintenance team conducts code reviews. To ensure code quality and stability, some PRs may be merged as improved versions rather than direct merges of the original submissions.
---
Technical Support
- Issues: GitHub Issues
- Contact the Builder (please note 【github】):
<img width="717" height="714" alt="wechat_2025-10-17_173400_583" src="https://github.com/user-attachments/assets/7c406098-dcd9-4684-84bd-f0ed4213e95f" />
---
<div align="center">
If this project helps you, please give it a ⭐️
Made with ❤️ by Buluu@新西楼
Built for cross-border e-commerce professionals ❤️
</div>
评论深度分析Skill
<div align="center">
!Review Analyzer
Review Analyzer Skill
一款适用于多场景评论内容的AI深度分析工具
想了解更多最新AI行业动态,AI+电商/广告的行业实践方法,人与AI如何协作共生的思考,请关注公众号:【新西楼】
    
14章深度洞察报告 | 6套主题可视化看板 | 飞书文档同步 | Agent原生架构
Created By Buluu@新西楼
</div>
---
项目简介
Review Analyzer Skill 是一款 Agent 原生 的多场景评论内容深度分析工具,适配 Claude Code、OpenCode 等主流 AI Coding Agent。支持本地 CSV 数据导入和 Sorftime 平台数据对接,零 API Key 即可运行。
V2.0 核心升级
| 特性 | V1.0 | V2.0 |
|---|---|---|
| 分析引擎 | Gemini API + CLI 双模式 | CLI 单一模式(零 API Key) |
| 数据源 | 本地 CSV | 本地 CSV + Sorftime 平台 |
| 洞察报告 | 7 章基础分析 | 14 章深度洞察(含行动决策仪表盘) |
| 可视化看板 | 1 套黑金模板 | 6 套主题模板(玻璃拟态 + Chart.js 主题化) |
| 飞书集成 | 无 | 完整同步(文档 + 白板 + mermaid 图表) |
| 架构 | Python 脚本 | Agent 原生 Skill(SKILL.md 指令驱动) |
| 打标并发 | 2 | 4(提速 50%) |
工作流程
数据输入: 本地 CSV 或 Sorftime 平台
↓
Phase 1: AI 深度打标(并发4,22维度标签)
Phase 2: 用户画像识别(3-4个画像,3正+3负黄金样本)
Phase 3: 洞察报告生成(14章结构化报告)
Phase 4: 统一输出(MD + HTML看板 + 飞书同步)📄 [在线查看完整洞察报告示例(飞书文档)](https://my.feishu.cn/docx/GMv7dBzlXo5wblxVaWGclEernib) — 包含 14 章完整内容 + 飞书白板 mermaid 图表
---
核心特性
📊 22维度智能标签
全面覆盖评论信息的8大维度:
人群维度 (4): 性别、年龄段、职业、购买角色
场景维度 (1): 使用场景
功能维度 (2): 满意度、具体功能
质量维度 (3): 材质、做工、耐用性
服务维度 (5): 发货速度、包装质量、客服响应、退换货、保修
体验维度 (4): 舒适度、易用性、外观设计、价格感知
市场维度 (2): 竞品对比、复购意愿
情感维度 (1): 总体评价🎨 6套主题可视化看板
可直接用于工作汇报的 HTML 报告,共享基座架构确保内容结构统一:
| 主题 | 风格 | 适用场景 |
|---|---|---|
| premium-gold | 黑金奢华 + Playfair Display | 高管汇报、品牌展示 |
| dark-tech | 赛博朋克 + Cyan + 毛玻璃 | 技术团队、数据驱动 |
| linear-minimal | 极简白蓝 + 清透玻璃 | 产品评审、简洁汇报 |
| posthog-analytics | 暖白橙色 + 暖色玻璃 | 数据分析、运营复盘 |
| stripe-executive | 翡翠绿 + 翡翠玻璃 | 金融企业、投资决策 |
| warm-editorial | 纸色铜色 + 纸感玻璃 | 品牌报告、编辑风格 |
每个看板包含:11个板块、交互式 Chart.js 图表(主题色板)、响应式设计、玻璃拟态卡片效果。
📋 14章深度洞察报告
1. 洞察总览(核心判断 + 战略方向 + 市场定位) 2. 核心用户画像(多维度画像 + 核心诉求 + 原声引用) 3. 核心卖点与价值验证(数据支撑 + 用户原话) 4. 主要痛点与负面归因(严重性 + 瀑布效应 + 行动建议) 5. 改进建议与优先级(P0/P1/P2 + 预期收益) 6. 潜在机会与差异化(数据 + 建议) 7. 典型用户深度解析 8-12. 深度内容章节 13. 行动决策仪表盘 14. 数据附录
📦 多格式输出 + 飞书同步
| 输出 | 格式 | 说明 |
|---|---|---|
| 打标数据 | CSV | 原始评论 + 22维度标签 |
| 洞察报告 | Markdown | 14章深度分析 |
| 可视化看板 | HTML | 6套主题可选,玻璃拟态 |
| 飞书文档 | — | 自动同步报告 + mermaid白板 |
---
系统要求
| 要求 | 详情 |
|---|---|
| 操作系统 | macOS / Linux / Windows |
| Python | 3.10 或更高版本(推荐 3.11.x) |
| Agent CLI | Claude Code CLI、OpenCode CLI 等任一 AI Coding Agent |
| 内存 | 建议 4GB+ |
| 飞书同步(可选) | 需安装 lark-cli 并完成认证登录 |
飞书同步说明:如需将分析结果同步到飞书文档,需提前安装lark-cli(npm install -g lark-cli)并完成lark-cli login认证。如果未安装,工具会自动跳过飞书同步步骤,不影响其他功能。
---
快速开始
方式1:使用 skills.sh 生态安装(推荐)
npx skills add buluslan/review-analyzer-skill安装后,在 Claude Code 中直接用自然语言调用:
# 示例1:指定文件分析
请分析这个产品的评论:reviews.csv
# 示例2:描述需求
帮我做一下竞品评论的深度分析方式2:手动克隆仓库
git clone https://github.com/buluslan/review-analyzer-skill.git
cd review-analyzer-skill
pip install -r requirements.txt运行参数
# === 数据输入方式 ===
# 方式1:本地 CSV 文件
python3 main.py your_reviews.csv --max-reviews 200
# 方式2:Sorftime 平台数据(需配置 SORFTIME_API_KEY)
python3 main.py --source sorftime --asin B09XYZ123 --site US --max-reviews 200
# === 完整参数 ===
python3 main.py your_reviews.csv \
--asin B09XYZ123 \
--template premium-gold \
--feishu-sync auto \
--concurrent 4 \
--creator "Your Name"
# === 可视化模板(6选1,或 none 跳过) ===
--template premium-gold|dark-tech|linear-minimal|posthog-analytics|stripe-executive|warm-editorial|none
# === 飞书同步(需提前安装 lark-cli 并认证) ===
--feishu-sync auto|manual|skip
# === 快速重放(跳过打标,从已打标CSV直接执行 Phase 2-5) ===
python3 replay_phase2to5.py output/B09XYZ123-评论分析项目-6.1/评论采集及打标数据_B09XYZ123.csv---
CSV文件格式要求
工具支持自动模糊匹配列名,CSV文件需包含:
| 必需列 | 可选列名(模糊匹配) |
|---|---|
| 评论内容 | 内容/评价/body/review/text/comment |
| 评分 | 打分/rating/score/star |
| 时间(可选) | 时间/date/日期/time |
示例:详见 examples/reviews_sample.csv
---
输出示例
运行完成后,将在 output/ 目录生成以下文件:
1. CSV标签数据
评论内容,评分,性别,年龄段,职业,购买角色,使用场景,满意度...
"The quality is amazing",5,女性,25-34岁,白领,自用,家用办公,高...2. Markdown洞察报告
# 产品分析洞察报告
## 核心发现
- 用户满意度:92%
- 主要优势:材质优良、设计美观
- 改进建议:优化包装、增强耐用性
...3. HTML可视化看板
- 黑金奢华配色
- 交互式图表
- 动态数据展示
- 创作者署名(鎏金发光效果)
---
使用场景
场景1:产品优化
分析自己产品的评论,发现用户痛点,优化产品功能和设计。
场景2:竞品分析
分析竞品评论,了解竞争对手的优势和劣势,寻找差异化机会。
场景3:市场调研
批量分析多个产品的评论,了解市场需求、用户偏好和行业趋势。
场景4:用户洞察
深度了解目标用户群体,构建精准用户画像,优化营销策略。
---
项目结构
review-analyzer-skill/
├── main.py # V2.0 主入口(4 Phase 流程)
├── SKILL.md # Agent 指令文件(Claude Code Skill)
├── replay_phase2to5.py # 快速重放脚本(跳过打标)
├── requirements.txt # Python 依赖
├── .env.example # 环境变量模板
├── src/
│ ├── config.py # CLI 单一模式配置
│ ├── template_engine.py # 统一模板引擎(Jinja2 SSR + 共享基座)
│ ├── chart_engine.py # Chart.js 图表配置生成
│ ├── insights_generator.py # 14章洞察报告生成(CLI subprocess)
│ ├── output_manager.py # 输出管理(MD + HTML + 飞书同步)
│ ├── feishu_sync.py # 飞书文档 + 白板同步
│ ├── report_generator.py # 报告生成(兼容层)
│ ├── data_fetchers/ # 数据接入层(Sorftime + CSV)
│ ├── prompts/ # 14章 Prompt 体系
│ └── templates/ # 可视化看板模板
│ ├── base/ # 共享基座
│ │ ├── dashboard_base.html # 基座 HTML(Jinja2)
│ │ └── dashboard_base.css # 基座布局 CSS
│ ├── premium-gold/ # 黑金主题
│ ├── dark-tech/ # 赛博朋克主题
│ ├── linear-minimal/ # 极简蓝白主题
│ ├── posthog-analytics/ # 暖橙分析主题
│ ├── stripe-executive/ # 翡翠企业主题
│ └── warm-editorial/ # 报纸编辑主题
├── assets/ # 静态资源(3D 头像)
├── examples/ # 示例数据 + 输出样例
├── tools/ # 工具脚本
├── references/ # 参考文档
└── docs/ # 用户文档---
常见问题
<details> <summary><b>Q1: V2.0 和 V1.0 有什么区别?</b></summary>
A: V2.0 是全面升级:
- 零 API Key:删除 Gemini 依赖,统一 CLI 单一模式
- 14章报告:从 7 章扩展到 14 章深度洞察
- 6套主题看板:从 1 套扩展到 6 套(含玻璃拟态质感)
- 飞书同步:自动同步文档 + mermaid 白板
- 共享基座架构:bug 只修一处,新增模板只需一个 CSS 文件
</details>
<details> <summary><b>Q2: 需要什么 API Key?</b></summary>
A: V2.0 无需任何 API Key。全程使用 Claude Code / OpenCode 内置模型,消耗你的 Claude 配额。 </details>
<details> <summary><b>Q3: CSV 文件格式有什么要求?</b></summary>
A: CSV 文件需要包含以下列(支持模糊匹配):
- 评论内容:内容/评价/body/review
- 评分:打分/rating/score
- 时间(可选):时间/date/日期
详见 examples/reviews_sample.csv </details>
<details> <summary><b>Q4: 如何选择可视化模板?</b></summary>
A: 6 套模板对应不同场景:
- premium-gold:高管汇报、品牌展示(默认)
- dark-tech:技术团队、数据分析
- linear-minimal:产品评审、简洁汇报
- posthog-analytics:运营复盘、增长分析
- stripe-executive:金融企业、投资决策
- warm-editorial:品牌报告、杂志风格
使用 --template none 可跳过看板生成。 </details>
<details> <summary><b>Q5: 支持哪些电商平台?</b></summary>
A: 理论上支持所有提供评论导出的电商平台:Amazon、eBay、AliExpress、Shopee、淘宝/天猫,以及其他 CSV 格式评论数据。 </details>
---
与其他工具对比
| 特性 | Review Analyzer Skill V2.0 | 其他工具 |
|---|---|---|
| 架构 | Agent 原生 Skill | 通常为独立脚本 |
| API Key | 零(纯 CLI) | 多数需要 API Key |
| 洞察报告 | 14章深度分析 | 基础统计 |
| 可视化 | 6套主题 + 玻璃拟态 | 单一模板或无 |
| 飞书集成 | 文档 + 白板自动同步 | 多不支持 |
| 数据隐私 | 本地处理,不上传第三方 | 多为在线服务 |
| 模板扩展 | 新增主题 = 1个 CSS 文件 | 需完整重写 |
---
路线图
- [x] v1.0.0 - 首个正式发布(22维度标签 + 双模式 + HTML看板)
- [x] v2.0.0 - Agent 原生版(14章报告 + 6套主题 + 飞书同步 + 共享基座架构)
- [ ] v2.1.0 - Web 端增强(前端模板选择器 + 截图导出)
- [ ] v3.0.0 - 多平台分析(批量 ASIN + 竞品对比报告)
---
许可证
本项目采用 MIT License 开源许可证。
---
致谢
- 感谢 Anthropic 提供 Claude AI
- 感谢 Google 提供 Gemini API
- 灵感源自开源社区的智慧贡献
贡献者
感谢以下社区贡献者对本项目的贡献:
| 贡献者 | 贡献内容 |
|---|---|
| @zeropool | OpenCode CLI 引擎支持、URL 远程输入、头像资源压缩(PR#1) |
社区贡献者在提交 PR 后,维护团队会进行代码审查。为确保代码质量与稳定性,部分 PR 可能会以改进版本合入,而非直接 merge 原始提交。
---
技术支持
- Issues: GitHub Issues
- 联系Builder,请备注【github】:
<img width="717" height="714" alt="wechat_2025-10-17_173400_583" src="https://github.com/user-attachments/assets/7c406098-dcd9-4684-84bd-f0ed4213e95f" />
---
<div align="center">
如果这个项目对您有帮助,请给一个 ⭐️
Made with ❤️ by Buluu@新西楼
专为跨境电商从业者打造 ❤️
</div>
CSV 文件格式要求
必需列(自动模糊匹配)
工具会自动识别列名,支持常见的列名变体。
评论内容列
支持的列名:
- 内容
- 评价
- body
- review
- comment
- text
评分列
支持的列名:
- 打分
- 评分
- rating
- score
- stars
- star_rating
可选列
时间列
- 时间
- date
- 日期
- created_at
- timestamp
标题列
- 标题
- title
- summary
- subject
用户名列
- 用户
- user
- username
- author
- reviewer_name
示例 CSV 格式
最简格式
内容,打分
这个产品质量很好,值得推荐!,5
物流很快,包装也很仔细,5完整格式
标题,内容,打分,时间,用户
超棒的产品,这个产品质量很好,值得推荐!,5,2024-01-15,user123
包装问题,物流很快,但包装有破损,4,2024-01-14,buyer456Amazon 导出格式(自动适配)
Id,ProductId,UserId,ProfileName,HelpfulnessNumerator,HelpfulnessDenominator,Score,Time,Summary,Text
1,B001E4KFG0,A3SGXH7AUHU8GW,delmartian,1,1,5,1303862400,Good Quality Dog Food,I have bought several of the...格式兼容性
支持的文件格式
- CSV (.csv)
- Excel (.xlsx, .xls)
- TSV (.tsv, .tab)
编码支持
- UTF-8(推荐)
- UTF-8 with BOM
- GBK/GB2312(中文)
- Latin-1
分隔符自动识别
- 逗号 (,)
- 分号 (;)
- 制表符 ( )
- 竖线 (|)
数据质量注意事项
评论内容
- 确保评论内容列不为空
- 空评论会被自动跳过
- HTML 标签会被自动清理
评分
- 支持 1-5 星评分
- 也支持 1-10、1-100 等其他评分范围(会自动归一化)
- 缺失评分默认为 3 星(中立)
特殊字符
- 支持中文、日文、韩文等多语言评论
- 支持表情符号 (Emoji)
- 支持引号、逗号等特殊字符(会自动转义)
数据格式问题排查
问题:读取失败
- 检查文件编码是否为 UTF-8
- 检查分隔符是否正确
- 确保第一行为列名
问题:评论数量不对
⚠️ 禁止使用 `wc -l` 统计评论数
CSV 文件中一条评论可能包含换行符,占据多个物理行。wc -l 统计的是物理行数,不是评论数。
正确方法:
import pandas as pd
df = pd.read_csv('reviews.csv')
print(f"评论数量: {len(df)}")问题:列名识别失败
- 工具支持模糊匹配,大多数常见列名都能识别
- 如果识别失败,手动重命名列为标准列名
- 参考"必需列"部分的支持列名列表
常见数据源导出指南
Amazon 评论导出
使用第三方工具导出后,直接上传即可。工具会自动适配 Amazon 的列名格式。
eBay 评论导出
导出为 CSV 格式,确保包含评论内容和评分列。
AliExpress 评论导出
使用浏览器扩展导出,工具会自动识别列名。
自定义数据源
确保至少包含两列:评论内容和评分。其他列为可选。
22维度标签系统
标签体系概览
工具提供22个维度的AI智能标签,全面覆盖电商评论分析的关键信息点。
标签维度分类
1. 人群维度 (4个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 人群_性别 | 用户性别识别 | 男性/女性/不明/未提及 |
| 人群_年龄段 | 用户年龄段 | 18-25岁/26-35岁/36-45岁/46-55岁/56+岁/不明/未提及 |
| 人群_职业 | 用户职业类型 | 学生/白领/家庭主妇/企业主/退休人员/不明/未提及 |
| 人群_购买角色 | 购买决策角色 | 自用/送礼/商业用途/不明/未提及 |
2. 场景维度 (1个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 场景_使用场景 | 产品使用场景 | 家用/办公/户外/出行/运动/学习/送礼/收藏/不明/未提及 |
3. 功能维度 (2个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 功能_满意度 | 整体满意度 | 超出预期/符合预期/低于预期/不明/未提及 |
| 功能_具体功能 | 用户提及的具体功能 | 根据产品类型动态提取(如:续航、屏幕、音质等) |
4. 质量维度 (3个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 质量_材质 | 材质相关评价 | 优质/一般/差/不明/未提及 |
| 质量_做工 | 做工相关评价 | 精细/一般/粗糙/不明/未提及 |
| 质量_耐用性 | 耐用性评价 | 耐用/一般/不耐用/不明/未提及 |
5. 服务维度 (5个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 服务_发货速度 | 发货速度评价 | 快/适中/慢/不明/未提及 |
| 服务_包装质量 | 包装质量评价 | 好/一般/差/破损/不明/未提及 |
| 服务_客服响应 | 客服响应评价 | 及时/一般/慢/无响应/不明/未提及 |
| 服务_退换货 | 退换货体验 | 顺畅/一般/困难/未提及 |
| 服务_保修 | 保修相关 | 有保修提及/无保修提及/未提及 |
6. 体验维度 (4个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 体验_舒适度 | 舒适度评价 | 舒适/一般/不舒适/不明/未提及 |
| 体验_易用性 | 易用性评价 | 易用/一般/难用/不明/未提及 |
| 体验_外观设计 | 外观设计评价 | 好看/一般/难看/不明/未提及 |
| 体验_价格感知 | 价格感知 | 便宜/适中/贵/性价比高/性价比低/不明/未提及 |
7. 市场维度 (2个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 市场_竞品对比 | 与竞品对比 | 优于竞品/相当/不如竞品/不明/未提及 |
| 市场_复购意愿 | 复购/推荐意愿 | 会复购/会推荐/不会复购/不会推荐/不明/未提及 |
8. 情感维度 (1个标签)
| 标签名 | 说明 | 可选值 |
|---|---|---|
| 情感_总体评价 | 总体情感倾向 | 强烈推荐/推荐/中立/不推荐/强烈不推荐 |
标签提取逻辑
自动识别
AI 模型会根据评论内容自动识别和提取标签:
1. 语义理解: 分析评论的语义和上下文 2. 模式匹配: 识别常见表达模式和关键词 3. 情感分析: 判断情感倾向和满意度 4. 多维度提取: 同时提取多个维度的标签
标签值规范化
- 标准化值: 使用预定义的标准值,确保一致性
- 未提及处理: 对于评论中未提及的维度,标记为"未提及"
- 模糊处理: 对于无法明确判断的情况,标记为"不明"
标签应用场景
用户画像分析
使用人群维度的4个标签构建用户画像:
- 性别分布
- 年龄段分布
- 职业分布
- 购买角色分布
产品改进分析
使用功能和质量维度标签:
- 功能满意度分析
- 质量问题识别
- 改进优先级排序
服务优化分析
使用服务维度标签:
- 发货速度优化
- 包装质量改进
- 客服响应提升
市场策略分析
使用市场维度标签:
- 竞争优势识别
- 复购率评估
- 推荐意愿分析
标签质量保证
准确性
- AI 模型经过大量电商评论训练
- 支持22个主流电商平台
- 覆盖多种品类和产品类型
一致性
- 使用标准化的标签值
- 统一的标签提取逻辑
- 可重复的分析结果
可追溯性
- 每个标签都基于原文内容
- 支持标签-原文对照查看
- 便于人工审核和验证
高级用法
自定义标签
如果需要自定义标签维度,可以编辑 tag_system.yaml 文件:
tags:
custom_dimension:
- name: "自定义标签名"
description: "标签说明"
options: ["选项1", "选项2", "选项3"]标签过滤
分析完成后,可以按标签维度过滤评论:
import pandas as pd
df = pd.read_csv('评论采集及打标数据_ASIN.csv')
# 只看女性的评论
female_reviews = df[df['人群_性别'] == '女性']
# 只看质量问题的评论
quality_issues = df[df['质量_做工'] == '粗糙']标签统计
快速统计各维度的分布:
# 性别分布
gender_dist = df['人群_性别'].value_counts()
# 满意度分布
satisfaction_dist = df['功能_满意度'].value_counts()标签定义文件
完整的标签定义和配置,请查看:tag_system.yaml
# 亚马逊商品评论标签体系配置
# Amazon Product Review Tag System Configuration
# 版本: V1
# 来源: 基于 n8n 工作流适配
# ==================== 标签维度定义 ====================
tag_dimensions:
# 人群维度 (4个标签)
人群:
- name: 人群_性别
options: [男性, 女性, 不明]
description: 用户性别
- name: 人群_年龄段
options: [18-25, 26-35, 36-45, 46-55, 55+, 不明]
description: 用户年龄段
- name: 人群_职业
options:
- 医疗工作者
- 体力劳动者
- 办公室职员
- 学生
- 退休人员
- 教师
- 司机
- 其他
- 不明
description: 根据评论内容推断的职业身份
- name: 人群_购买角色
options: [自用, 礼物, 商用, 不明]
description: 购买目的
# 场景维度 (1个标签)
场景:
- name: 场景_使用场景
options:
- 家用
- 办公
- 户外
- 运动
- 开车
- 旅行
- 其他
description: 根据评论内容推断的使用场景
# 功能维度 (2个标签)
功能:
- name: 功能_满意度
options: [超出预期, 符合预期, 低于预期, 未提及]
description: 整体功能满意度
- name: 功能_具体功能
type: text
description: 简述用户提到的具体功能点,如:续航能力/防水功能/保暖效果/降噪功能等
# 质量维度 (3个标签)
质量:
- name: 质量_材质
options: [优秀, 良好, 一般, 差, 未提及]
description: 材质质量评价
- name: 质量_做工
options: [精细, 一般, 粗糙, 未提及]
description: 做工精细度
- name: 质量_耐用性
options: [耐用, 一般, 易坏, 未提及]
description: 产品耐用性
# 服务维度 (5个标签)
服务:
- name: 服务_发货速度
options: [快, 正常, 慢, 未提及]
description: 发货速度评价
- name: 服务_包装质量
options: [完好, 一般, 破损, 未提及]
description: 包装质量
- name: 服务_客服响应
options: [及时, 一般, 迟缓, 未提及]
description: 客服响应速度
- name: 服务_退换货
options: [顺畅, 一般, 困难, 未提及]
description: 退换货体验
- name: 服务_保修
options: [有保修, 无保修, 未提及]
description: 是否有保修
# 体验维度 (4个标签)
体验:
- name: 体验_舒适度
options: [舒适, 一般, 不适, 未提及]
description: 使用舒适度
- name: 体验_易用性
options: [简单, 适中, 困难, 未提及]
description: 易用性评价
- name: 体验_外观设计
options: [满意, 一般, 不满意, 未提及]
description: 外观设计满意度
- name: 体验_价格感知
options: [超值, 合理, 偏贵, 未提及]
description: 价格感知
# 市场维度 (2个标签)
市场:
- name: 竞品_竞品对比
type: text
description: 用户提及的竞品品牌名称,如:品牌A/品牌B/品牌C等,如无则填'无'
examples:
- 品牌A
- 品牌B
- 品牌C
- 无
- name: 复购_复购意愿
options: [会复购, 可能, 不会, 未提及]
description: 复购意愿
# 情感维度 (1个标签)
情感:
- name: 情感_总体评价
options: [强烈推荐, 推荐, 中立, 不推荐, 强烈不推荐]
description: 总体情感评价
# ==================== 评分规则 ====================
scoring:
info_score:
range: [1, 20]
rules:
- name: 基础分_字数
condition: "评论字数 > 50"
score: 1
- name: 基础分_长评
condition: "评论字数 > 200"
score: 2
- name: 标签分
condition: "每个有效标签(非'未提及')"
score: 1
- name: 加分_竞品
condition: "提及竞品"
score: 5
- name: 加分_复购
condition: "明确复购意愿"
score: 3
- name: 加分_场景
condition: "描述使用场景"
score: 2
# ==================== 输出格式 ====================
output_format:
type: json
structure:
review_id: string
sentiment: enum[强烈推荐, 推荐, 中立, 不推荐, 强烈不推荐]
info_score: integer[1-20]
tags: object
# ==================== 注意事项 ====================
notes:
- 无依据的标签填"不明"或"未提及"
- 职业标签、使用场景均需从评论内容中推断
- info_score 反映评论的信息价值密度
- 只返回纯JSON,不要任何解释文字
{
"meta": {
"product_name": "输入你的产品名称",
"report_title": "评论深度分析洞察",
"signature": "Created By 输入你的名字",
"retail_price": "输入你的产品价格",
"sample_size": "输入评论数量",
"status": "Strategic Review"
},
"kpis": [
{
"title": "Surpass Expectation",
"value": "55",
"label": "超出预期",
"desc": "极高的初始体验"
},
{
"title": "Strong Recommend",
"value": "60",
"label": "强烈推荐",
"desc": "品牌护城河稳固"
},
{
"title": "Material Failure",
"value": "15",
"label": "致命缺陷",
"desc": "关键组件易损",
"is_danger": true
},
{
"title": "Brand Churn",
"value": "10",
"label": "客户流失",
"desc": "明确拒绝复购"
}
],
"market_insights": [
{
"icon": "fa-users-viewfinder",
"title": "核心受众画像",
"desc": "此处输入人群分析结论..."
},
{
"icon": "fa-wand-magic-sparkles",
"title": "易用性评估",
"desc": "此处输入易用性结论..."
},
{
"icon": "fa-gift",
"title": "购买场景特征",
"desc": "此处输入购买动机结论..."
},
{
"icon": "fa-chess-knight",
"title": "竞品威胁区隔",
"desc": "此处输入竞品分析结论..."
}
],
"charts_data": {
"sentiment": {
"labels": [
"超出预期",
"符合预期",
"低于预期"
],
"data": [
55,
30,
15
]
},
"features": {
"labels": [
"卖点1",
"卖点2",
"卖点3",
"卖点4",
"卖点5"
],
"data": [
30,
25,
20,
15,
10
]
},
"scenarios": {
"labels": [
"场景1",
"场景2",
"场景3",
"场景4",
"场景5"
],
"data": [
40,
20,
15,
15,
10
]
},
"price_perception": {
"labels": [
"物超所值",
"偏贵",
"合理"
],
"data": [
50,
30,
20
]
},
"design_usability": {
"labels": [
"正面评价1",
"正面评价2",
"负面1",
"负面2"
],
"data": [
40,
45,
10,
5
]
},
"durability": {
"labels": [
"严重易损",
"质量稳定",
"一般"
],
"data": [
15,
75,
10
]
}
},
"strategy": {
"moat_pros": [
{
"title": "护城河/优势 1",
"desc": "深度解析..."
},
{
"title": "护城河/优势 2",
"desc": "深度解析..."
}
],
"vulnerability_cons": [
{
"title": "致命弱点/风险 1",
"desc": "深度解析..."
},
{
"title": "致命弱点/风险 2",
"desc": "深度解析..."
}
]
},
"execution_matrix": [
{
"urgency": "Immediate",
"directive": "高管指令1",
"details": "执行细节...",
"roi": "预期ROI..."
},
{
"urgency": "Short-Term",
"directive": "高管指令2",
"details": "执行细节...",
"roi": "预期ROI..."
},
{
"urgency": "Long-Term",
"directive": "高管指令3",
"details": "执行细节...",
"roi": "预期ROI..."
}
],
"voc_quotes": [
{
"profile": "用户标签1 / Advocate",
"quote": "正面原声内容...",
"status": "High Satisfaction",
"is_danger": false
},
{
"profile": "用户标签2 / Detractor",
"quote": "负面原声内容...",
"status": "Severe Attrition",
"is_danger": true
},
{
"profile": "用户标签3 / Passive",
"quote": "中立原声内容...",
"status": "Premium Perception",
"is_danger": false
},
{
"profile": "用户标签4 / Detractor",
"quote": "负面原声内容...",
"status": "Trust Broken",
"is_danger": true
}
]
}Role: 高级数据分析师 & 顶级前端架构师
你拥有顶级的商业数据敏锐度和极客级别的前端工程能力。你的任务是将一份结构化的 [JSON 数据输入] 转化为一份具有“专业决策深度(Professional Insight View)”的单文件交互式 HTML 数据看板。
核心风格对标 (Premium Dark Luxury Style)
采用高端暗黑奢华风格,黑金配色方案: 1. 居中主义布局: 顶部 Icon、主标题、副标题、署名必须完全水平居中。 2. 黑色极简奢华: 背景纯黑 (#050505),配合微妙的玻璃拟态。 3. 金色点睛: 仅在数字、关键图标和强调文字处使用高对比度亮金。 4. 内容倍增: 确保每个分析模块的内容充实,不留大片空白。
Visual & Engineering Specs (严格遵循!)
1. 技术栈: 纯单文件 HTML。通过 CDN 引入 Tailwind CSS, Chart.js, FontAwesome 6, Google Fonts (Playfair Display, Inter)。 2. 防重叠布局 (Anti-Overlap Strategy):
- Header 必须有
pb-20(80px+) 的底部内边距。 - 图表卡片必须有
min-h-[400px],防止 Canvas 挤压。 - Chart.js legends 必须使用
position: 'bottom'并增加padding: 20px。 - 所有卡片使用
relative定位,确保文本z-index高于背景滤镜。
3. 视觉 DNA (注入 CSS/JS):
.text-premium-gold {
color: #D4AF37;
}
.gold-shine {
background: linear-gradient(to right, #BF953F, #FCF6BA, #B38728, #FBF5B7, #AA771C);
-webkit-background-clip: text; background-clip: text; color: transparent;
background-size: 200% auto; animation: shine 4s linear infinite;
}
@keyframes shine { to { background-position: 200% center; } }
.glass-card { background: rgba(22, 22, 22, 0.7); backdrop-filter: blur(10px); border: 1px solid rgba(230,194,93,0.1); }
.card-glow:hover { border-color: rgba(230,194,93,0.5); box-shadow: 0 0 40px rgba(230,194,93,0.1); transform: translateY(-4px); }
/* 市场洞察结构化排版 */
.insight-list { @apply space-y-2 mt-3; }
.insight-list li { @apply flex items-start text-sm text-gray-400; }
.insight-list li::before { content: "•"; @apply text-premium-gold mr-2 font-bold; }CSS类命名规范(向后兼容)
必须使用通用品牌类名:
- 文字高亮:
text-brand-gold,text-brand-danger - 边框:
border-brand-gold,border-brand-danger - 背景:
bg-brand-gold/10,bg-brand-gold/50 - 完整定义在 Tailwind 配置中
向后兼容说明: 为确保兼容性,CSS定义同时支持旧类名(anker-gold等),但新生成的HTML必须使用新的通用类名。
Layout Structure (像素级顺控)
1. Lightning Bolt Icon: 页面顶部最上方,居中放置一个金色闪电图标 (fa-bolt)。 2. Banner Header:
[品牌名] [产品名称] 消费者行为深度洞察分析(Playfair Display, 居中, 巨大字体).- "评论深度分析洞察" (副标题, 居中).
Created By {CREATOR_NAME}(鎏金动效, 居中).
3. KPI Meta Cards (4张, 居中分布).
- ⚠️ 绝对禁止使用 '0' 或其他假数据作为占位符!
- 必须从传入的
kpis数组中严格读取title,value,label,desc字段并渲染。
4. Market Demographics (4格栅格) [升级版]:
- 每个格子标题下方,严禁使用密集段落。
- 必须将 [报告原文] 中的长文内容提炼为 3-4条带加粗标题的短列表。
- 示例:核心痛点: 零件松动且伴有异响。
5. Data Telemetry 图表矩阵 (6张图). 6. Strategy Dual-Columns ( Moat vs Vulnerability ). 7. Strategic Allocation (决策矩阵). 8. Market Resonance (VOC) [全案级深度版]:
- 采用大尺寸卡片布局,赋予该模块顶级的视觉呼吸感。
- 6 套 3D 头像完全映射逻辑:
male_young->../../assets/avatars/avatar_tech.pngfemale_young->../../assets/avatars/avatar_business.pngmale_elderly->../../assets/avatars/avatar_elderly_male.pngfemale_elderly->../../assets/avatars/avatar_elderly_female.pngchild_boy->../../assets/avatars/avatar_child_boy.pngchild_girl->../../assets/avatars/avatar_child_girl.png- 卡片解构 (像素级要求):
- 头部: 左侧大尺寸 3D 圆形头像 (min 64px);右侧为“典型画像”标题及“用户状态标签”。
- 核心需求区: 使用金色渐变背景或金色边框的小标签,显著标注“核心需求:XXXX”。
- 评价原文: 使用双引号包裹的倾斜字体或引用块,展示 100 字以内最具杀伤力的原声。
- 专家解析: 在卡片底部增加深色半透明背景区域,以列表或段落展示“评论解析”,指出隐性商机。
- 布局:2x2 栅格,每个卡片高度一致,确保整体整洁大气。
Input Source
[JSON 数据输入]: ======此处替换 JSON======
[报告原文]: ======此处替换 Markdown 报告======
不要有多余解释,直接输出带样式、脚本和完整数据的 HTML 源码!
#!/usr/bin/env python3
"""
快速重放脚本:从已打标的 CSV 跳过 Phase 1,直接执行 Phase 2-5
用法:python3 replay_phase2to5.py <tagged_csv> [--template TEMPLATE]
"""
import sys
import os
import json
import argparse
from pathlib import Path
from datetime import datetime
from dotenv import load_dotenv
load_dotenv()
import pandas as pd
# 项目根目录
BASE_DIR = Path(__file__).parent
sys.path.insert(0, str(BASE_DIR))
from src.config import config
from src.user_persona_analyzer import analyze_user_personas
from src.insights_generator import calculate_stats_summary, generate_insights
from src.report_generator import generate_html_report
from src.output_manager import generate_outputs
def load_tagged_csv(csv_path: str) -> list:
"""从已打标 CSV 加载评论数据"""
df = pd.read_csv(csv_path)
reviews = []
for _, row in df.iterrows():
tags = {}
tag_columns = [c for c in df.columns if any(
prefix in c for prefix in
['人群_', '场景_', '功能_', '质量_', '服务_', '体验_', '竞品_', '复购_']
)]
for col in tag_columns:
val = row.get(col)
if pd.notna(val) and str(val).strip():
tags[col] = str(val).strip()
sentiment = str(row.get('情感_总体评价', '')).strip() if pd.notna(row.get('情感_总体评价')) else ''
review = {
'body': str(row.get('Content', row.get('content', ''))).strip(),
'rating': int(row.get('Rating', row.get('rating', 0))) if pd.notna(row.get('Rating', row.get('rating'))) else 0,
'sentiment': sentiment,
'tags': tags,
'date': str(row.get('Date', row.get('date', ''))).strip() if pd.notna(row.get('Date', row.get('date'))) else '',
'author': str(row.get('Author', row.get('author', ''))).strip() if pd.notna(row.get('Author', row.get('author'))) else '',
}
reviews.append(review)
return reviews
def extract_asin_from_path(csv_path: str) -> str:
"""从文件名或路径中提取 ASIN"""
name = Path(csv_path).stem
# 尝试从文件名中提取 ASIN (格式通常为 xxx_B0XXXXX)
import re
match = re.search(r'(B0[A-Z0-9]{7,})', name)
if match:
return match.group(1)
return 'UNKNOWN'
def main():
parser = argparse.ArgumentParser(description='重放 Phase 2-5(跳过打标)')
parser.add_argument('csv_file', help='已打标的 CSV 文件路径')
parser.add_argument('--template', default='stripe-executive', help='HTML 模板名称')
parser.add_argument('--creator', default='Buluu@新西楼', help='署名')
parser.add_argument('--output-dir', default=None, help='输出目录')
args = parser.parse_args()
csv_path = Path(args.csv_file)
if not csv_path.exists():
print(f"❌ 文件不存在: {csv_path}")
sys.exit(1)
asin = extract_asin_from_path(str(csv_path))
print(f"📋 ASIN: {asin}, 模板: {args.template}")
# 配置(统一 CLI 本地模式)
config.HTML_CREATOR_NAME = args.creator
if args.output_dir:
config.OUTPUT_DIR = Path(args.output_dir)
config.OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
# 加载已打标数据
print(f"\n📄 加载已打标数据: {csv_path.name}")
tagged_reviews = load_tagged_csv(str(csv_path))
print(f" ✅ 加载 {len(tagged_reviews)} 条已打标评论")
# Phase 2: 用户画像
print(f"\n👥 [Phase 2/4] 用户画像识别...")
personas, golden_samples = analyze_user_personas(tagged_reviews)
print(f" ✅ {len(personas)} 个画像, {len(golden_samples)} 条黄金样本")
# Phase 3: 洞察报告
print(f"\n📝 [Phase 3/4] AI 深度洞察报告生成中...")
stats = calculate_stats_summary(tagged_reviews)
insights_md = generate_insights(
stats=stats, personas=personas, golden_samples=golden_samples, asin=asin
)
if insights_md:
print(f" ✅ 报告已生成 ({len(insights_md):,} 字)")
else:
print(f" ⚠️ 报告生成失败")
insights_md = ""
# 保存 MD
md_path = config.get_md_path(asin)
with open(md_path, 'w', encoding='utf-8') as f:
f.write(insights_md)
# Phase 4: HTML 看板 (V1 report_generator)
print(f"\n🎨 [Phase 4a] V1 HTML 看板生成...")
summary = {
"total": len(tagged_reviews),
"tagged": stats["tagged"],
"persona_count": len(personas),
"avg_rating": stats.get("avg_rating", 0),
"sentiment": stats.get("sentiment", {}),
"top_tags": stats.get("top_tags", {})
}
html_path = generate_html_report(
asin=asin, summary=summary, personas=personas,
sentiment_distribution=stats["sentiment"],
tag_statistics=stats["top_tags"],
golden_samples=golden_samples,
insights_md=insights_md,
creator_name=config.HTML_CREATOR_NAME
)
print(f" ✅ V1 看板: {html_path.name if html_path else '失败'}")
# Phase 5: OutputManager (V2 模板看板)
print(f"\n📦 [Phase 4b] V2 模板看板生成 ({args.template})...")
analysis_data = {
"asin": asin, "product_name": asin,
"total_reviews": len(tagged_reviews),
"avg_rating": stats.get("avg_rating", 0),
"summary": summary,
"sentiment": stats.get("sentiment", {}),
"sentiment_distribution": stats.get("sentiment", {}),
"tag_statistics": stats.get("top_tags", {}),
"top_tags": stats.get("top_tags", {}),
"personas": [{"name": p.get("name",""), "count": p.get("count",0), "tags": p.get("tags",{})} for p in personas],
"golden_samples": golden_samples,
"insights_md": insights_md,
"statistics": stats,
}
output_config = {
"template_name": args.template,
"sync_feishu": False,
"output_dir": str(config.OUTPUT_DIR),
"asin": asin,
"creator": config.HTML_CREATOR_NAME,
}
output_results = generate_outputs(analysis_data, output_config)
v2_html = output_results.get("html_path", "")
print(f" ✅ V2 看板: {v2_html}")
print("\n" + "✨" * 30)
print("🎉 重放完成!")
print(f" - 洞察报告: {md_path.name}")
print(f" - V1 看板: {html_path.name if html_path else 'N/A'}")
print(f" - V2 看板: {Path(v2_html).name if v2_html else 'N/A'}")
print("✨" * 30)
if __name__ == "__main__":
main()
# ==================== 核心依赖 ====================
# HTTP 客户端(数据获取 + API 调用)
requests==2.32.3
# HTML 解析库
beautifulsoup4==4.12.3
# ==================== 数据处理 ====================
# 数据处理和分析
pandas==2.2.3
# ==================== 模板引擎 ====================
# Jinja2 模板引擎 (用于 HTML 报告生成)
jinja2==3.1.4
# ==================== 配置管理 ====================
# 环境变量管理
python-dotenv==1.0.1
# ==================== 可选依赖 ====================
# 进度条显示
tqdm==4.66.4
# ==================== V2.0 新增依赖 ====================
# 以上依赖已足够,无需新增额外包
# - chart_engine: 纯 Python 实现
# - template_engine: 基于 Jinja2
# - feishu_sync: 通过 subprocess 调用 lark-cli
# - sorftime_fetcher: 通过 requests 调用 API
"""
评论分析 Skill - 核心包初始化
Amazon 商品评论 AI 深度分析工具 V1.0
"""
"""
配置管理模块 V2.0 — Agent 原生版
重大变更:
- 打标阶段改为 Prompt Router,宿主 Agent 直接执行,不再依赖 subprocess CLI
- 新增数据接入层配置(Sorftime 平台)
- 新增可视化模板系统配置
- 新增飞书同步配置
- 新增图表引擎配置
- 统一使用 CLI 引擎,不再支持 Gemini API
"""
import os
from dataclasses import dataclass, field
from pathlib import Path
from datetime import datetime
@dataclass
class Config:
"""全局配置类 V2.0 - Agent 原生版"""
# ==================== 项目路径配置 ====================
PROJECT_ROOT: Path = field(default_factory=lambda: Path(__file__).parent.parent)
# 输出目录: 支持环境变量 OUTPUT_DIR 或命令行参数 --output-dir
OUTPUT_DIR: Path = field(default_factory=lambda: Path(os.getenv("OUTPUT_DIR", "./output")))
REFERENCES_DIR: Path = field(default_factory=lambda: Path(__file__).parent.parent / "references")
ASSETS_DIR: Path = field(default_factory=lambda: Path(__file__).parent.parent / "assets")
DATA_DIR: Path = field(default_factory=lambda: Path(__file__).parent.parent / "data")
# ==================== CLI 引擎配置 ====================
# 支持 claude / opencode 两种 CLI 引擎
# claude → subprocess: claude --print --dangerously-skip-permissions <prompt>
# opencode → subprocess: opencode run <prompt>
# 未指定时自动探测: 优先 claude,其次 opencode
# V2.0 备注:打标阶段不再使用 CLI,由宿主 Agent 直接执行
# CLI 引擎仅用于洞察报告和 HTML 看板的生成
CLI_ENGINE: str = "" # 可选: claude / opencode / 留空自动探测
CLAUDE_CLI_CMD: str = "claude"
OPENCODE_CLI_CMD: str = "opencode"
# CLI 调用超时时间(秒)- 从环境变量读取,默认 600 秒
CLI_TIMEOUT: int = int(os.getenv("CLI_TIMEOUT", "600"))
# ==================== V2.0: 数据接入配置 ====================
DATA_SOURCE: str = "csv" # 可选: csv / sorftime
SORFTIME_API_KEY: str = os.getenv("SORFTIME_API_KEY", "")
SORFTIME_MODE: str = "mcp" # 可选: mcp / api / cli
SORFTIME_BASE_URL: str = "https://mcp.sorftime.com"
SORFTIME_MAX_REVIEWS: int = 100 # Sorftime 单次最多返回 100 条
# ==================== V2.0: 可视化模板配置 ====================
TEMPLATE_DIR: Path = field(default_factory=lambda: Path(__file__).parent / "templates")
DEFAULT_TEMPLATE: str = "premium-gold" # 默认模板名称
# ==================== V2.0: 飞书同步配置 ====================
FEISHU_SYNC: bool = False # 是否同步到飞书(用户选择)
LARK_CLI_CMD: str = "lark-cli" # 飞书 CLI 命令名
# ==================== V2.0: 图表引擎配置 ====================
CHART_ENGINE: str = "chartjs" # 可选: chartjs / echarts
CHART_COLOR_PALETTE: str = "premium-gold" # 颜色主题
# ==================== V2.0: Prompt 模板配置 ====================
PROMPTS_DIR: Path = field(default_factory=lambda: Path(__file__).parent / "prompts")
INSIGHTS_CHAPTERS: str = "all" # 可选: all / 自定义章节编号列表(如 "1,2,3,9,10")
# ==================== 分析配置 ====================
MAX_REVIEWS: int = 500 # 最大获取评论数
BATCH_SIZE: int = 30 # 每批处理数量 (30-50条)
TAG_SYSTEM_PATH: str = "tag_system.yaml"
# ==================== 用户画像配置 ====================
PERSONA_MIN_COUNT: int = 3 # 成为画像的最小样本数
MAX_PERSONAS: int = 4 # 最多识别的用户画像数
SAMPLES_PER_PERSONA: int = 6 # 每个画像的样本数 (3正+3负)
# ==================== 输出配置 ====================
GENERATE_HTML: bool = True # 是否生成 HTML 报告
CSV_ENCODING: str = "utf-8-sig" # CSV 文件编码
PROJECT_NAME: str = "评论分析项目" # 项目名称
# ==================== 并发配置 ====================
# 最大并发子进程数(调用 claude -p)- 从环境变量读取,默认 4
MAX_CONCURRENT_AGENTS: int = int(os.getenv("MAX_CONCURRENT", "4"))
# ==================== 快速模式配置 ====================
QUICK_MODE_MAX_REVIEWS: int = 30 # 快速模式默认获取评论数
# ==================== 报告生成配置 ====================
INSIGHTS_FORMAT: str = "txt" # 可选: md / txt
HTML_CREATOR_NAME: str = os.getenv("HTML_CREATOR_NAME", "Buluu@新西楼")
def __post_init__(self):
"""初始化后验证"""
# 确保输出目录存在
self.OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
self.DATA_DIR.mkdir(parents=True, exist_ok=True)
# 并发上限保护:超过 8 可能导致系统资源不足或 CLI rate limit
MAX_CONCURRENT_CAP = 8
if self.MAX_CONCURRENT_AGENTS > MAX_CONCURRENT_CAP:
print(f"⚠️ 并发数 {self.MAX_CONCURRENT_AGENTS} 超过上限 {MAX_CONCURRENT_CAP},已自动调整为 {MAX_CONCURRENT_CAP}")
self.MAX_CONCURRENT_AGENTS = MAX_CONCURRENT_CAP
# V2.0: CLI 引擎不再是必须的(打标由宿主 Agent 执行)
# 仅在洞察报告和 HTML 看板生成时才需要 CLI
import shutil
env_engine = os.getenv("CLI_ENGINE", "").lower()
if env_engine in ("claude", "opencode"):
self.CLI_ENGINE = env_engine
if not self.CLI_ENGINE:
# 自动探测: 优先 claude,其次 opencode,找不到也不报错
if shutil.which(self.CLAUDE_CLI_CMD):
self.CLI_ENGINE = "claude"
elif shutil.which(self.OPENCODE_CLI_CMD):
self.CLI_ENGINE = "opencode"
else:
# V2.0: 不再强制要求 CLI,但记录警告
self.CLI_ENGINE = "none"
@property
def cli_cmd(self) -> str:
"""获取当前 CLI 引擎的命令名"""
return self.OPENCODE_CLI_CMD if self.CLI_ENGINE == "opencode" else self.CLAUDE_CLI_CMD
def build_cli_cmd(self, prompt: str) -> list:
"""构建 CLI 调用命令(统一入口)
自动解析绝对路径并根据当前引擎类型构建正确的命令参数。
V2.0: 当引擎为 "none" 时抛出 RuntimeError(仅洞察报告/看板生成需要 CLI)
Args:
prompt: 要传递给 CLI 的提示词
Returns:
命令列表,可直接传递给 subprocess.run()
Raises:
RuntimeError: 当 CLI 不可用时
"""
import shutil
if self.CLI_ENGINE == "none":
raise RuntimeError(
"❌ 当前无可用的 CLI 引擎。洞察报告和 HTML 看板生成需要 CLI。\n"
"请安装 Claude Code 或 OpenCode 并加入 PATH"
)
cli_path = shutil.which(self.cli_cmd)
if not cli_path:
raise RuntimeError(
f"❌ 找不到 CLI 引擎: {self.cli_cmd}\n"
f"请确保已安装并加入 PATH"
)
if self.CLI_ENGINE == "opencode":
return [cli_path, "run", prompt]
else:
return [cli_path, "--print", "--dangerously-skip-permissions", prompt]
# ==================== V2.0: 新增方法 ====================
def check_lark_cli(self) -> bool:
"""检查飞书 CLI 是否可用"""
import shutil
return shutil.which(self.LARK_CLI_CMD) is not None
def check_sorftime_config(self) -> bool:
"""检查 Sorftime 配置是否可用"""
return bool(self.SORFTIME_API_KEY)
def list_templates(self) -> list:
"""列出可用的可视化模板"""
if not self.TEMPLATE_DIR.exists():
return []
templates = []
for d in sorted(self.TEMPLATE_DIR.iterdir()):
if d.is_dir() and (d / "dashboard.html").exists():
templates.append({
"name": d.name,
"path": str(d / "dashboard.html")
})
return templates
def _get_project_dir(self, asin: str) -> Path:
"""获取项目输出目录: {ASIN}-{PROJECT_NAME}-{月.日}"""
date_str = datetime.now().strftime("%-m.%-d") # 格式: 2.13 (macOS)
# 兼容不同系统的日期格式
try:
date_str = datetime.now().strftime("%-m.%-d")
except ValueError:
try:
date_str = datetime.now().strftime("%#m.%#d")
except ValueError:
date_str = datetime.now().strftime("%m.%d").lstrip("0").replace(".0", ".")
project_dir = self.OUTPUT_DIR / f"{asin}-{self.PROJECT_NAME}-{date_str}"
project_dir.mkdir(parents=True, exist_ok=True)
return project_dir
@property
def tag_system_path(self) -> Path:
"""获取标签体系配置文件路径"""
return self.REFERENCES_DIR / self.TAG_SYSTEM_PATH
def get_csv_path(self, asin: str) -> Path:
"""获取 CSV 输出路径: 评论采集及打标数据_{ASIN}.csv"""
project_dir = self._get_project_dir(asin)
return project_dir / f"评论采集及打标数据_{asin}.csv"
def get_html_path(self, asin: str) -> Path:
"""获取 HTML 报告输出路径: 可视化洞察报告_{ASIN}.html"""
project_dir = self._get_project_dir(asin)
return project_dir / f"可视化洞察报告_{asin}.html"
def get_md_path(self, asin: str) -> Path:
"""获取 Markdown 洞察输出路径: 分析洞察报告_{ASIN}.md"""
project_dir = self._get_project_dir(asin)
return project_dir / f"分析洞察报告_{asin}.md"
# 全局配置实例
config = Config()
"""
数据采集模块 - 多源评论数据统一接入层
支持多种数据源:
- CSV/Excel 本地文件 (CsvFetcher)
- Sorftime 平台 (SorftimeFetcher) - 支持 MCP / API / CLI 三种连接模式
所有数据采集器继承自 DataFetcher 基类,提供统一的 fetch / list_fields / validate_config 接口。
"""
from typing import Dict, List
from src.data_fetchers.base import DataFetcher
from src.data_fetchers.csv_fetcher import CsvFetcher
from src.data_fetchers.sorftime_fetcher import SorftimeFetcher
# 可用数据采集器注册表: 名称 -> 实现类
FETCHER_REGISTRY: Dict[str, type] = {
"csv": CsvFetcher,
"sorftime": SorftimeFetcher,
}
def get_fetcher(name: str, **kwargs) -> DataFetcher:
"""根据名称获取数据采集器实例
Args:
name: 采集器名称,支持 "csv" 和 "sorftime"
**kwargs: 传递给采集器构造函数的额外参数
Returns:
DataFetcher 实例
Raises:
ValueError: 当 name 不在注册表中时
"""
name = name.lower().strip()
if name not in FETCHER_REGISTRY:
available = ", ".join(FETCHER_REGISTRY.keys())
raise ValueError(
f"未知的采集器: '{name}',可选项: [{available}]"
)
return FETCHER_REGISTRY[name](**kwargs)
def list_fetchers() -> List[dict]:
"""列出所有已注册的采集器及其描述
Returns:
包含 name, description, fields 的字典列表
"""
result = []
for name, cls in FETCHER_REGISTRY.items():
instance = cls()
result.append({
"name": name,
"display_name": instance.get_name(),
"fields": instance.list_fields(),
})
return result
__all__ = [
"DataFetcher",
"CsvFetcher",
"SorftimeFetcher",
"FETCHER_REGISTRY",
"get_fetcher",
"list_fetchers",
]
"""
数据采集器抽象基类
所有数据采集器(CSV、Sorftime 等)必须继承此基类并实现其抽象方法。
提供统一的数据获取接口,使上层业务代码无需关心具体数据来源。
"""
import logging
from abc import ABC, abstractmethod
from typing import Dict, List, Optional
logger = logging.getLogger(__name__)
class DataFetcher(ABC):
"""数据采集器抽象基类
子类必须实现:
- fetch(): 根据 ASIN 获取评论数据并输出为标准化 CSV
- list_fields(): 声明该采集器支持的标准字段
- validate_config(): 验证连接/配置是否可用
- get_name(): 返回采集器的显示名称
设计约定:
- fetch() 返回一个 CSV 文件路径,文件使用 utf-8-sig 编码
- CSV 文件的列名必须与 list_fields() 中的 name 一一对应
- 所有子类构造函数接受可选的 config 字典,用于传递连接参数
"""
def __init__(self, config: Optional[Dict] = None):
"""初始化采集器
Args:
config: 可选的配置字典,可能包含 API Key、文件路径等信息
"""
self._config = config or {}
@abstractmethod
def fetch(self, asin: str, fields: List[str], site: str = "US") -> str:
"""获取评论数据并保存为标准化 CSV 文件
Args:
asin: Amazon Standard Identification Number(或通用商品标识)
fields: 需要获取的标准字段列表(来自 list_fields 返回的 name)
site: 站点代码,默认 "US",可选 "UK"/"DE"/"JP" 等
Returns:
生成的 CSV 文件的绝对路径
Raises:
FileNotFoundError: 当数据源不可达时
ValueError: 当 ASIN 无效或参数不合法时
RuntimeError: 当数据获取过程中出现不可恢复错误时
"""
...
@abstractmethod
def list_fields(self) -> List[dict]:
"""列出此采集器支持的标准字段
Returns:
字段描述列表,每个元素为包含以下键的字典:
- name (str): 标准字段名,如 "review_body", "rating"
- description (str): 字段的中文描述
- required (bool): 此字段是否为采集器必须输出的字段
"""
...
@abstractmethod
def validate_config(self) -> bool:
"""验证采集器配置/连接是否可用
用于在执行 fetch 前预先检查:
- 文件路径是否存在 (CsvFetcher)
- API Key 是否有效 (SorftimeFetcher)
- 网络连通性等
Returns:
True 表示配置有效,可以执行 fetch;False 表示不可用
"""
...
@abstractmethod
def get_name(self) -> str:
"""返回采集器的显示名称
Returns:
如 "CSV本地文件", "Sorftime" 等
"""
...
def get_config(self) -> Dict:
"""获取当前配置(只读副本)
Returns:
配置字典的浅拷贝
"""
return dict(self._config)
def update_config(self, updates: Dict) -> None:
"""更新配置参数
Args:
updates: 要合并到现有配置中的键值对
"""
self._config.update(updates)
logger.debug("配置已更新: %s", list(updates.keys()))
"""
Prompts 模块初始化
V2.0: 支持从 .md 文件加载 prompt 模板,保留对旧版 templates.py 的兼容。
"""
# 保留旧版导出(向后兼容)
from .templates import (
TAGGING_PROMPT_SINGLE,
TAGGING_PROMPT_BATCH,
TAG_SYSTEM_TEXT,
INSIGHTS_PROMPT_MD,
get_tagging_prompt_batch,
get_insights_prompt_md,
)
# V2.0 新增导出
from .manager import (
PromptLoadError,
build_insights_prompt,
build_persona_prompt,
build_tagging_prompt,
get_active_chapters,
get_chapter_info,
list_chapters,
load_chapter,
load_prompt,
)
__all__ = [
# 旧版兼容
"TAGGING_PROMPT_SINGLE",
"TAGGING_PROMPT_BATCH",
"TAG_SYSTEM_TEXT",
"INSIGHTS_PROMPT_MD",
"get_tagging_prompt_batch",
"get_insights_prompt_md",
# V2.0 新增
"PromptLoadError",
"load_prompt",
"load_chapter",
"list_chapters",
"get_active_chapters",
"get_chapter_info",
"build_tagging_prompt",
"build_persona_prompt",
"build_insights_prompt",
]
一、洞察总览
定位
本章节是整份报告的"执行摘要",供决策者 30 秒内掌握核心结论。控制在 1 页以内,总字数 300-400 字。
必须包含的内容
1. 开篇一句话:产品在品类赛道中的定位判断(新星/成熟/衰退) 2. 5 条核心洞察:按影响力排序,每条 = 1 句结论 + 数据百分比 3. 产品定位判断:1 句话概括产品当前市场位置 4. 战略方向建议:2-3 句话指明行动方向
格式参考
[产品名称] 在 [品类] 赛道中处于 [定位判断]。基于 {{TOTAL}} 条评论(有效打标 {{TAGGED}} 条),整体情感以 [正面/中性/负面] 为主。
**核心洞察:**
1. [洞察1] —— XX% 的用户... (N=XX)
2. [洞察2] —— XX% 的用户... (N=XX)
3. [洞察3] —— XX% 的用户... (N=XX)
4. [洞察4] —— XX% 的用户... (N=XX)
5. [洞察5] —— XX% 的用户... (N=XX)
**产品定位:** [一句话定位]
**战略方向:**
[2-3 句话给出明确方向建议]写作规范
- 语气:客观、专业、克制,不使用夸张修辞
- 每条洞察必须有具体数据百分比支撑
- 不展开论述,详细分析在后续章节
- 禁止重复罗列统计表数据
二、关键数据概览
核心要求
从全维度标签分布中提炼有效数据,展示核心统计概况。本章不再是完整数据表的复刻,而是"读者最该关注的数据摘要"。
数据筛选规则
1. 有效维度筛选:只展示信度 > 40% 的维度(即"不明/未提及"占比 < 60%) 2. 过滤无效行:不展示"不明/未提及"行,这些数据在附录中呈现 3. 精简展示:每个维度只保留占比最高的 2-3 个类别
严禁事项
1. 禁止完整复刻:不得将全维度统计表原样输出 2. 禁止数据堆砌:不要逐行列举每个维度的每个类别 3. 禁止跨维串扰:A 维度的百分比不得写入 B 维度
格式要求
使用紧凑表格格式:
### 有效维度统计
| 维度 | 关键类别 | 占比 | 样本量 |
|------|---------|------|--------|
| 总体评价 | 正面 | XX% | N=XX |
| 总体评价 | 中性 | XX% | N=XX |
| 满意度 | 超出预期 | XX% | N=XX |
| ... | ... | ... | ... |
> 完整维度统计数据(含所有类别及信度等级)见报告附录。处理原则
1. 每个维度用 1 句话概括核心发现(如"正面评价占主导(XX%)") 2. 信度 < 40% 的维度在本章标注"数据不足,详见附录"即可,不展开 3. 情感分布用一句话概括,不重复列表 4. 篇幅控制在 200-300 字
三、核心用户画像
强制声明
本章节开头必须输出以下声明:
说明:以下画像基于评论语义线索进行的 AI 侧写推断(Persona Inference),非精确人口统计。特征可识别样本约占整体 XX%,其余客群特征不显著。
(用实际比例替换 XX%)
核心要求
聚焦画像描述而非标签罗列。用"关键特征"替代完整的标签展开,让读者快速理解"谁在用这个产品"。
必须包含的内容
1. 画像数量:2-4 个核心画像(基于数据可支撑的样本量) 2. 每个画像包含:
- 一句话定位:如"忙碌的上班族猫主"
- 关键特征:3-5 条列表(非完整标签展开)
- 核心诉求:一句话概括最关注什么
- 典型原话:至少 1 条用户评论引用
- 样本量标注:约占有效样本的 XX%
3. 数据诚实:人口属性大部分为"不明"时,从使用场景和痛点反向刻画,并标注推断性质
格式参考
### 画像 1:[一句话定位,如"忙碌的上班族猫主"]
- **关键特征**:
- [特征1,如"多猫家庭,2-3只猫"]
- [特征2,如"工作繁忙,无暇频繁铲屎"]
- [特征3,如"注重清洁除臭,对气味敏感"]
- **核心诉求**:[一句话,如"解放双手的同时保持家中无异味"]
- **样本占比**:约占可识别样本的 XX%
- **典型原话**:
> "[用户评论原文]" — [情感标签:正面/负面]写作规范
- 若人口属性(性别/年龄/职业)大部分为"不明",一笔带过,不强行推断
- 画像之间必须有明确区分边界
- 每个画像控制在 5-8 行以内
- 画像描述从使用场景和核心诉求出发,而非罗列标签
- 购买决策路径仅在数据充分时简要提及,不做强制要求