amz_review_analyse/README.md
OnesvmWhoops 91e6c47fc0 迁移 DeepSeek Chat API,并支持本地 Qwen3 Embedding 向量化。
统一 voc_llm 密钥解析与默认模型;向量化改为本地 mlx 模型;更新 README、gitignore 与流水线文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:15:03 +08:00

257 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# VOC LLM 结构化分析 (VOC_LLM结构化)
> 基于大语言模型([DeepSeek](https://api.deepseek.com) OpenAI 兼容 API)与本地 MLX 向量的亚马逊 VOC(Voice of Customer)评论分析流水线:合并 CSV → 清洗 → LLM 结构化 → 向量化 → 聚类与词频 → 生成 HTML 分析报告。
## 📖 目录
- [核心特性](#-核心特性)
- [环境要求](#-环境要求)
- [安装指南](#-安装指南)
- [使用说明](#-使用说明)
- [示例与输出](#-示例与输出)
- [项目结构](#-项目结构)
- [常见问题](#-常见问题)
- [参与贡献](#-参与贡献)
- [开源协议](#-开源协议)
- [联系方式与鸣谢](#-联系方式与鸣谢)
## ✨ 核心特性
- **七步全流程编排** — `main_voc分析.py` 一键串联:合并、清洗、结构化、向量化、聚类、词频、HTML 报告
- **断点续跑** — 支持 `--from-step` / `--only-step`,从任意步骤恢复,调试时节省 API 成本
- **LLM 结构化提取** — 从评论中抽取受众、痛点、方面、观点、情感等字段(`prompts/schema.yaml` 可配置)
- **本地向量化** — Apple Silicon 上运行 `Qwen3-Embedding-4B-mxfp8`(MLX),无需云端 Embedding API
- **语义聚类** — UMAP + HDBSCAN 多阶段聚类,辅以 LLM 评估簇质量自动调参
- **词频分析** — LLM 归纳专有名词 + spaCy 全量词频统计,报告内嵌词云与六类归类
- **可编辑 Prompt** — `prompts/` 目录下 Markdown / YAML 热加载,产品运营可直接改话术(见 `prompts/README.md`)
- **并行加速** — 聚类与词频在步骤 5–6 由线程池并行执行;结构化批间并行(默认 8 路)
## 🛠 环境要求
| 依赖 | 说明 |
|------|------|
| Python | >= 3.10(推荐 3.12,项目内 `310py`) |
| pip / uv | 安装 `requirements.txt` 中的包 |
| spaCy 英文模型 | 经 `uv pip` 安装 `en-core-web-sm`(见安装指南,词频步骤必需) |
| DeepSeek API Key | 结构化、聚类评估、词频、报告等 Chat 步骤 |
| 本地 Embedding 模型 | 目录 `Qwen3-Embedding-4B-mxfp8/`(约 4GB,已 gitignore,需自行下载) |
| Apple Silicon | 本地向量化依赖 MLX(M 系列芯片) |
**Chat API Key**(任选其一,勿提交到 Git):
1. 环境变量 `DEEPSEEK_API_KEY`
2. 环境变量 `DEEPSEEK_API_KEY_FILE` 指向单行密钥文件
3. 项目根目录 `.deepseek_key`(单行,无引号)
可选:`DEEPSEEK_MODEL`(默认 `deepseek-v4-pro`)、`DEEPSEEK_BASE_URL`(默认 `https://api.deepseek.com`)。
## 📦 安装指南
1. 克隆项目到本地:
```bash
git clone https://git.onesvm.com/whoops/amz_review_analyse.git
cd amz_review_analyse # 或你的本地目录名
```
2. 创建虚拟环境并安装依赖(推荐):
```bash
uv venv 310py --python 3.12
uv pip install --python 310py/bin/python -r requirements.txt
uv pip install --python 310py/bin/python \
"en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl"
```
3. 配置 DeepSeek API Key:
```bash
export DEEPSEEK_API_KEY="sk-xxx"
# 或在项目根创建 .deepseek_key(已被 .gitignore 忽略)
```
4. 准备本地 Embedding 模型(首次向量化前):
将 `Qwen3-Embedding-4B-mxfp8` 放到项目根,或设置 `VOC_EMBED_MODEL_PATH` 指向模型目录。可从 [Hugging Face](https://huggingface.co/mlx-community/Qwen3-Embedding-4B-mxfp8) 下载。
5. 准备原始评论 CSV 目录(目录内所有 `*.csv` 表头须一致),例如亚马逊导出的 `*_realtime.csv`。
## 🚀 使用说明
### 全流程分析
```bash
./310py/bin/python main_voc分析.py \
--input-dir "reviews_export" \
--product "cat deterrent indoor" \
--industry "Pet Supplies"
```
- `--input-dir`:原始 CSV 目录
- `--product`:产品名(写入结构化任务与报告路径)
- `--industry`:行业名,默认 `-`(可在步骤 3 写入库)
- `--keep-db`:保留已有结构化 `voc_*.sqlite`,不覆盖删除
### 加速(批间并行,默认已开启)
步骤 3 结构化默认多批并行 Chat 请求;步骤 4 向量为本地 MLX 串行批处理(勿对同一模型多线程):
```bash
# 全流程
./310py/bin/python main_voc分析.py --input-dir "reviews_export" --product "产品名"
# 调低结构化并发(遇 429 时)
./310py/bin/python main_voc分析.py --input-dir "reviews_export" --product "产品名" \
--struct-workers 4
# 环境变量:export VOC_STRUCT_WORKERS=8 VOC_EMBED_BATCH_SIZE=16
```
### 断点续跑
```bash
# 从向量化起续跑(步骤 4 起可省略 --product,自动读结构化库)
./310py/bin/python main_voc分析.py --from-step 4 --keep-db
# 仅重跑词频(复用已有 voc_terms.json)
./310py/bin/python main_voc分析.py --from-step 6 --skip-wordfreq-llm
# 仅重新生成 HTML 报告
./310py/bin/python main_voc分析.py --only-step 7
```
### 其他常用参数
| 参数 | 说明 |
|------|------|
| `--clean-intermediates` | 报告成功后删除中间 csv/sqlite,减少磁盘占用 |
| `--filter-small-clusters` | 报告仅保留簇内评论占比 ≥ 10% 的簇 |
| `--save-llm-raw` | 将报告 LLM 原文保存为 `report_llm_raw.txt`,调试时使用 |
### 程序式调用
```python
from pathlib import Path
from main_voc分析 import run_voc_analysis
result = run_voc_analysis(
input_dir=Path("reviews_export"),
industry="Pet Supplies",
product_name="cat deterrent indoor",
from_step=1,
clean_databases=True,
)
print(result["report_html"])
```
### Prompt 验收(无需 API Key)
```bash
./310py/bin/python prompts/smoke.py # 检查 prompt 能否加载
./310py/bin/python prompts/smoke.py --live # 联调模型(需 DEEPSEEK_API_KEY)
```
### 可选变体:jieba 词频
中文或需 jieba 分词时,可使用 `main_voc分析_jieba.py`(词频走 `词频_jieba.py`,其余步骤与主流程一致)。
---
更详细的步骤说明、算法与 SQLite 约定见 **[main_voc分析.md](main_voc分析.md)**。
## 📸 示例与输出
流程结束后,主要产物如下:
| 路径 | 说明 |
|------|------|
| `merged_reviews.csv` | 多文件合并结果 |
| `merged_reviews_cleaned.csv` | 清洗、去重后的评论 |
| `voc_structured.sqlite` | LLM 结构化结果 |
| `voc_embeddings.sqlite` | 本地 Qwen3 向量(维度见库内 `dimensions` 字段) |
| `voc_clustering.sqlite` | 多阶段聚类标签 |
| `output/voc_terms.json` | 专有名词 / 停用词 |
| `output/word_freq.csv` | 全量词频表 |
| `output/{product}/{product}_voc_report.html` | **最终 VOC 分析报告**(词云、词频、分簇、AI 正文) |
stdout 会打印 JSON 摘要(含 `report_html` 等键)。
## 📂 项目结构
```text
VOC_LLM结构化/
├── main_voc分析.py # 主流程编排入口(七步)
├── main_voc分析_jieba.py # 词频使用 jieba 的变体入口
├── main_voc分析.md # 流程与算法详细说明
├── voc_llm.py # DeepSeek Chat 密钥与客户端
├── local_embedding.py # 本地 MLX Qwen3 向量化
├── 合并评论数据.py # 步骤 1:多 CSV 合并
├── content清洗.py # 步骤 2:评论清洗与去重
├── 结构化_server.py # 步骤 3:LLM 结构化入库
├── 结构化_Prompt.py # 结构化 prompt 组装
├── 向量化.py # 步骤 4:本地 Embedding 入库
├── 聚类.py # 步骤 5:UMAP + HDBSCAN
├── 词频.py / 词频_jieba.py # 步骤 6:术语提取 + 词频
├── voc_report.py # 步骤 7:HTML 报告生成
├── prompts/ # 可编辑 prompt、schema、配置
├── Qwen3-Embedding-4B-mxfp8/ # 本地模型(gitignore,需自行放置)
├── requirements.txt
├── output/ # 报告与词频输出(gitignore)
└── README.md # 本文件
```
## ❓ 常见问题
**Q:提示缺少 `DEEPSEEK_API_KEY`?**
A:按上文配置环境变量或 `.deepseek_key`,并确认密钥未提交到仓库。
**Q:只有 `.dashscope_key` 报错?**
A:Chat 已切换为 DeepSeek,DashScope 密钥不能用于 `api.deepseek.com`,请改用 `.deepseek_key`。
**Q:步骤 4 向量化失败 / 找不到模型?**
A:确认 `Qwen3-Embedding-4B-mxfp8/` 在项目根,或设置 `VOC_EMBED_MODEL_PATH`;需在 Apple Silicon + Python 3.10+ 环境。
**Q:步骤 4 报错找不到 `product`?**
A:从步骤 1–3 完整跑过,或确保 `voc_structured.sqlite` 中已有最新 job;步骤 4 起可省略 `--product`。
**Q:词频步骤报 spaCy 模型缺失?**
A:执行 `uv pip install --python 310py/bin/python "en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl"`。
**Q:合并 CSV 失败?**
A:确保 `--input-dir` 下所有 CSV 表头完全一致。
**Q:修改 LLM 话术后报告解析失败?**
A:勿修改 `prompts/schema.yaml` 中 `report.markers` 四段标记名;改完运行 `./310py/bin/python prompts/smoke.py` 验收。
## 🤝 参与贡献
欢迎提交 Issue 与 Pull Request。建议流程:
1. Fork 本仓库
2. 创建特性分支:`git checkout -b feature/your-feature`
3. 提交更改:`git commit -m '简要说明变更'`
4. 推送并发起 Pull Request
修改主流程或 CLI 时,请同步更新 `main_voc分析.md`;修改 `prompts/` 时请遵循 `prompts/README.md` 中的占位符与 schema 约定。
**安全提醒**:勿提交 `.deepseek_key`、`.dashscope_key`、`.env`、真实评论 CSV、`*.sqlite`、`output/` 及本地模型目录(见 `.gitignore`)。
## 📄 开源协议
本项目尚未在仓库中附带 `LICENSE` 文件。若为内部项目,请按组织规范使用;若计划开源,请补充协议文件(如 MIT)并更新本节链接。
## ✉️ 联系方式与鸣谢
- **详细技术文档**:[main_voc分析.md](main_voc分析.md)、[prompts/README.md](prompts/README.md)
- **项目仓库**:https://git.onesvm.com/whoops/amz_review_analyse
### 鸣谢
- [DeepSeek API](https://api.deepseek.com) — Chat 结构化、聚类评估、词频与报告
- [mlx-community/Qwen3-Embedding-4B-mxfp8](https://huggingface.co/mlx-community/Qwen3-Embedding-4B-mxfp8) — 本地向量化
- [UMAP](https://umap-learn.readthedocs.io/)、[HDBSCAN](https://hdbscan.readthedocs.io/) — 聚类管线
- [spaCy](https://spacy.io/) — 英文词频与 NLP
---
*README 与 `main_voc分析.py` 七步流程保持一致;深度说明请参阅 `main_voc分析.md`。*