diff --git a/prompts/extraction/examples.yaml b/prompts/extraction/examples.yaml index 5933340..09edce8 100644 --- a/prompts/extraction/examples.yaml +++ b/prompts/extraction/examples.yaml @@ -52,7 +52,7 @@ sentiment: Positive category: Price -- instruction: "示例 4 教学:非英语评论(例如西班牙语)输出必须全英文。禁止保留原文非英文片段,先理解语义再用英文短语表达。" +- instruction: "示例 4 教学:1) 非英语评论(例如西班牙语)输出必须全英文,禁止保留原文非英文片段,先理解语义再用英文短语表达;2) 「随附配件」不属于 8 个标准类别,演示如何补充一个简洁的英文新类别 'Accessories'。" review: "El producto en sí está muy bien, viene con 2 cristales templados y 2 grips para los joycon. Pero es lo que he leido en algunos comentarios, la funda huele como a tabaco jajaja es raro pero es así" output: audience: "self" @@ -65,7 +65,7 @@ - aspect: "included accessories" opinion: "comes with 2 tempered glass and 2 grips" sentiment: Positive - category: Function + category: Accessories - aspect: "case smell" opinion: "smells like tobacco, strange" sentiment: Negative diff --git a/prompts/extraction/field_rules.md b/prompts/extraction/field_rules.md index 7492212..f1471ae 100644 --- a/prompts/extraction/field_rules.md +++ b/prompts/extraction/field_rules.md @@ -21,6 +21,8 @@ - **禁止** Mixed、Ambiguous、Both、Balanced 等自创词。 - 同一条反馈褒贬交织时:选**最主要**倾向;或拆成多条 product_feedback 分别标注。 - 无法判断倾向时用 Neutral。 - - category (类别): 仅限 {categories_literal}(禁止 Value、Cost 等自创词;性价比高/物有所值 归入 Price)。 + - category (类别): 优先归入以下 8 个标准类别之一:{categories_literal}。 + - 归类提示:性价比/物有所值→'Price';成分/材质/配方→'Ingredient';效果/作用/功能/是否好用→'Function';品牌/正品/可靠性/信任→'Trust'。禁止 Value、Cost 等同义自创词。 + - 仅当某条反馈确实**无法**归入以上 8 类时,才可补充一个简洁的英文新类别(1-2 个英文单词、首字母大写,如 'Scent'、'Accessories'),不要硬塞或滥造。 - 每条 product_feedback 必须同时包含 aspect、opinion、sentiment、category 四个子字段。 - 若无提及 product_feedback,输出空列表 [] diff --git a/prompts/schema.yaml b/prompts/schema.yaml index cbe593a..0fa8bd6 100644 --- a/prompts/schema.yaml +++ b/prompts/schema.yaml @@ -11,7 +11,11 @@ extraction: - opinion - sentiment - category + # 8 个标准类别(信任/原料/质量/功效/功能/外观/物流/客服/价格); + # 若评论反馈确实不属于这 8 类,允许模型自行补充简洁的英文新类别 product_feedback_categories: + - Trust + - Ingredient - Quality - Function - Appearance diff --git a/业务说明.html b/业务说明.html new file mode 100644 index 0000000..e84f493 --- /dev/null +++ b/业务说明.html @@ -0,0 +1,343 @@ + + + + + + VOC 评论分析系统 · 业务说明 + + + + + +
+

VOC 评论分析系统 · 业务说明

+

它就像一条“评论加工流水线”,把成千上万条买家评论,一步步加工成老板能看懂、能拍板的经营情报。

+
+ +
+ + +
+

使用前需要准备什么

+

使用时只需要提供以下内容,系统会自动完成后续全部分析,无需任何技术操作。

+
+
+ 必填 +

产品名

+

本次要分析的产品名称,用于报告标题与结果归档。

+
+
+ 必填 +

评论数据目录

+

存放该产品评论表格的文件夹,系统会自动读取并合并里面的所有评论。

+
+
+ 可选 +

行业名称

+

填写后能让分析更贴合行业语境;不填也能正常运行。

+
+
+
+ 一句话总结:使用时只需输入“产品名”和“评论数据目录”,可选填“行业名称”,其余全部由系统自动完成。 +
+
+ + +
整体流程一览
+

从原始评论到经营报告,一共九个环节,环环相扣。

+
+
+
+ + +
每个环节详解
+

每个环节都用“是什么 / 为什么 / 输入内容 / 输出内容 / 怎么做 / 业务作用”六点说明。

+
+ + +
+

一句话记住整条流水线

+
    +
  1. 合并:确定分析哪批评论
  2. +
  3. 清洗:确定哪些评论算数
  4. +
  5. 规则化提取:把评论拆成“人群、需求、反馈”
  6. +
  7. 文本语义向量化:让机器能比较意思像不像
  8. +
  9. 自动聚类:归并成主题,并细分人群
  10. +
  11. 高频词:补充直观语言证据
  12. +
  13. 中间过程可视化:让 AI 的结论可核对、可信任
  14. +
  15. 数据总览:一眼看清全局数据盘面
  16. +
  17. 生成报告:翻译成能拍板的经营结论
  18. +
+
最终目的只有一个:把海量买家评论,变成老板看得懂、能据此做决策的经营情报。
+
+ +
+ + + + + diff --git a/结构化_server.py b/结构化_server.py index 9a93e88..b7c30dd 100644 --- a/结构化_server.py +++ b/结构化_server.py @@ -68,8 +68,8 @@ def _get_valid_categories() -> frozenset[str]: return product_feedback_categories() # 模型上下文上限;动态分批受 DEFAULT_MAX_BATCH_INPUT_TOKENS 与 DEFAULT_MAX_BATCH_REVIEWS 约束 -MODEL_MAX_INPUT_TOKENS = 991_800 -MODEL_MAX_OUTPUT_TOKENS = 65_530 +MODEL_MAX_INPUT_TOKENS = 1000_800 +MODEL_MAX_OUTPUT_TOKENS = 200_530 CHARS_PER_TOKEN_EST = 3.2 DEFAULT_MAX_BATCH_INPUT_TOKENS = 200_000 # 仅用于 batch_plan 日志中的输出 token 粗估,不参与分批与 API max_tokens @@ -492,25 +492,43 @@ _SENTIMENT_ALIASES: Dict[str, str] = { "mildly negative": "negative", } -# 模型常见误写 -> 合法 category(校验前自动映射,减少无效重试) +# 模型常见误写 -> 8 个标准 category(校验前自动映射,减少无效重试) _CATEGORY_ALIASES: Dict[str, str] = { + # Price(价格) "value": "Price", "values": "Price", "cost": "Price", "pricing": "Price", "value for money": "Price", "worth": "Price", + # Logistics(物流) "packaging": "Logistics", "shipping": "Logistics", "delivery": "Logistics", + # Customer Service(客服) "service": "Customer Service", "customer support": "Customer Service", "support": "Customer Service", + # Appearance(外观) "design": "Appearance", "look": "Appearance", - "performance": "Function", + # Function(功效/功能) "efficacy": "Function", + "performance": "Function", "effectiveness": "Function", + "effect": "Function", + # Ingredient(原料) + "ingredients": "Ingredient", + "material": "Ingredient", + "materials": "Ingredient", + "formula": "Ingredient", + # Trust(信任) + "reliability": "Trust", + "reliable": "Trust", + "brand": "Trust", + "authenticity": "Trust", + "genuine": "Trust", + "trustworthy": "Trust", } @@ -544,7 +562,8 @@ def _normalize_category(raw: Any) -> str | None: for v in valid: if v.lower() == lower: return v - return None + # 不属于 8 个标准类别:允许模型自行补充新类别,规范为首字母大写后保留 + return key.title() def _normalize_product_feedback(items: Any) -> List[Dict[str, str]]: diff --git a/词频.py b/词频.py index abd3642..220a4e0 100644 --- a/词频.py +++ b/词频.py @@ -150,7 +150,7 @@ def _call_llm(system: str, user: str, api_key: str) -> str: {"role": "system", "content": system}, {"role": "user", "content": user}, ], - temperature=0.3, + temperature=0.6, extra_body=extra_body, ) msg = resp.choices[0].message