Skip to content

Commit a8a2223

Browse files
committed
fix(ChatQualityAnalyzer): 手动 apply_persona_reinforcement
1 parent a75776f commit a8a2223

6 files changed

Lines changed: 20 additions & 15 deletions

File tree

_conf_schema.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@
452452
"type": "text",
453453
"editor_mode": true,
454454
"editor_language": "markdown",
455-
"default": "你是一个帮我进行群聊信息总结的助手,生成总结内容时,你需要严格遵守下面的几个准则:\n\n请分析接下来提供的群聊记录,提取出最多 **${max_topics}** 个主要话题。根据实际聊天内容提取所有最有意义的话题。\n\n## 对于每个话题,请提供:\n\n1. **话题名称**(突出主题内容,尽量简明扼要,控制在 10 字以内)\n2. **主要参与者的用户ID**(最多 5 人,按参与度排序)\n3. **话题详细描述**(包含关键信息和结论)\n\n## 注意事项:\n\n- 对于比较有价值的点,稍微用一两句话详细讲讲,让读者能了解讨论的深度\n- 对于其中的部分信息,你需要特意提到主题施加的主体是谁,即明确指出\"谁做了什么\"\n- **用户引用**:在话题详情描述中,如果提到了具体用户,请使用 `[用户ID]` 的格式来指代(例如 `[123456]`)。不要只写昵称。我们会自动渲染头像。\n- 对于每一条总结,尽量讲清楚前因后果,不要只列出结论\n- 如果某个话题有明确的结论或共识,请在描述中体现\n- 忽略无意义的闲聊、灌水、单纯的表情回复等\n- 优先选择讨论深度较深、参与人数较多的话题\n- 如果消息太少或没有明确话题,可以返回空数组 []\n\n群聊记录格式: [HH:MM] [用户ID]: 消息内容\n\n群聊记录:\n${messages_text}\n\n---\n\n## 重要:必须返回标准 JSON 格式\n\n严格遵守以下规则:\n\n1. 只使用英文双引号 `\"` ,不要使用中文引号 `“` `”`\n2. 字符串内容中的引号必须转义为 `\\\"`\n3. 多个对象之间用逗号分隔\n4. 数组元素之间用逗号分隔\n5. 不要在 JSON 外添加任何文字说明\n6. 描述内容避免使用特殊符号,用普通文字表达\n\n### 返回格式示例:\n\n```json\n[\n {{\n \"topic\": \"话题名称\",\n \"contributors\": [\"123456789\", \"987654321\"],\n \"detail\": \"话题的详细描述,包含讨论内容、关键信息和结论。注意:在描述中提及用户时,使用 [用户ID] 格式,例如 [123456789]。\"\n }},\n {{\n \"topic\": \"另一个话题\",\n \"contributors\": [\"111222333\", \"444555666\"],\n \"detail\": \"另一个话题的详细描述...\"\n }}\n]\n```\n\n**注意**:返回的内容必须是纯 JSON,不要包含 markdown 代码块标记或其他格式。"
455+
"default": "请分析接下来提供的群聊记录,提取出最多 **${max_topics}** 个主要话题。根据实际聊天内容提取所有最有意义的话题。\n\n## 对于每个话题,请提供:\n\n1. **话题名称**(突出主题内容,尽量简明扼要,控制在 10 字以内)\n2. **主要参与者的用户ID**(最多 5 人,按参与度排序)\n3. **话题详细描述**(包含关键信息和结论)\n\n## 注意事项:\n\n- 在生成描述内容时,请务必从你当前人格设定的视角和口吻出发。\n- 对于比较有价值的点,稍微用一两句话详细讲讲,让读者能了解讨论的深度\n- 对于其中的部分信息,你需要特意提到主题施加的主体是谁,即明确指出\"谁做了什么\"\n- **用户引用**:在话题详情描述中,如果提到了具体用户,请使用 `[用户ID]` 的格式来指代(例如 `[123456]`)。不要只写昵称。我们会自动渲染头像。\n- 对于每一条总结,尽量讲清楚前因后果,不要只列出结论\n- 如果某个话题有明确的结论或共识,请在描述中体现\n- 忽略无意义的闲聊、灌水、单纯的表情回复等\n- 优先选择讨论深度较深、参与人数较多的话题\n- 如果消息太少或没有明确话题,可以返回空数组 []\n\n群聊记录格式: [HH:MM] [用户ID]: 消息内容\n\n群聊记录:\n${messages_text}\n\n---\n\n## 重要:必须返回标准 JSON 格式\n\n严格遵守以下规则:\n\n1. 只使用英文双引号 `\"` ,不要使用中文引号 `“` `”`\n2. 字符串内容中的引号必须转义为 `\\\"`\n3. 多个对象之间用逗号分隔\n4. 数组元素之间用逗号分隔\n5. 不要在 JSON 外添加任何文字说明\n6. 描述内容避免使用特殊符号,用普通文字表达\n\n### 返回格式示例:\n\n```json\n[\n {{\n \"topic\": \"话题名称\",\n \"contributors\": [\"123456789\", \"987654321\"],\n \"detail\": \"话题的详细描述,包含讨论内容、关键信息和结论。注意:在描述中提及用户时,使用 [用户ID] 格式,例如 [123456789]。\"\n }},\n {{\n \"topic\": \"另一个话题\",\n \"contributors\": [\"111222333\", \"444555666\"],\n \"detail\": \"另一个话题的详细描述...\"\n }}\n]\n```\n\n**注意**:返回的内容必须是纯 JSON,不要包含 markdown 代码块标记或其他格式。"
456456
}
457457
}
458458
},
@@ -494,14 +494,14 @@
494494
"type": "text",
495495
"editor_mode": true,
496496
"editor_language": "markdown",
497-
"default": "你是一个毒舌且幽默的群聊质量分析师。\n请分析以下群聊记录,输出一份\"聊天质量锐评\"。\n\n## 任务目标:\n1. **维度划分**:将聊天内容划分为 3-6 个【高层级、抽象、泛化】的维度(例如:就业焦虑、生涯规划、技术方案研究、情感树洞、无意义水群等)。\n2. **严禁在维度名称(name)中出现任何具体的群聊人物名、项目名、具体的报错内容或细碎的事件点。标题必须保持高度抽象且字数简练(2-6个字)。**\n3. 为每个维度计算一个大致的百分比占位(总和小于等于 100%)。\n4. **点评内容**:为每个维度写一句犀利、幽默、毒舌或温情的点评。具体的吐槽内容、具体的细节事件描述请放在这里。\n5. **全群表现**:给出一句总结性的评价,作为总结标题对应的“金句”。\n6. **主题设定**:设定一个本次报告的主题标题和副标题。\n\n## 点评风格指南:\n- 语言要接地气,多用互联网黑话。吐槽要精准,避重就轻。\n- **只有维度名称(name)需要抽象,点评(comment)和总结(summary)可以非常具体和生动。**\n\n## 返回格式要求:\n必须以纯 JSON 格式返回,不得包含任何 Markdown 格式。\n\n```json\n{{\n \"title\": \"今日群聊主题\",\n \"subtitle\": \"副标题\",\n \"dimensions\": [\n {{\n \"name\": \"抽象维度名\",\n \"percentage\": 比例,\n \"comment\": \"维度的毒舌点评\"\n }}\n ],\n \"summary\": \"一句总结性的金句\"\n}}\n```\n\n群聊记录:\n${messages_text}"
497+
"default": "请分析以下群聊记录,输出一份\"聊天质量锐评\"。\n\n## 任务目标:\n1. **维度划分**:将聊天内容划分为 3-6 个【高层级、抽象、泛化】的维度(例如:就业焦虑、生涯规划、技术方案研究、情感树洞、无意义水群等)。\n2. **严禁在维度名称(name)中出现任何具体的群聊人物名、项目名、具体的报错内容或细碎的事件点。标题必须保持高度抽象且字数简练(2-6个字)。**\n3. 为每个维度计算一个大致的百分比占位(总和小于等于 100%)。\n4. **点评内容**:为每个维度写一句符合你当前人格设定的犀利、幽默或温情的点评。具体的吐槽内容、具体的细节事件描述请放在这里。\n5. **全群表现**:给出一句总结性的评价,作为总结标题对应的“金句”。\n6. **主题设定**:设定一个本次报告的主题标题和副标题。\n\n## 点评风格指南:\n- 语言要接地气,多用互联网黑话。吐槽要精准,避重就轻。\n- **只有维度名称(name)需要抽象,点评(comment)和总结(summary)可以非常具体和生动。**\n\n## 返回格式要求:\n必须以纯 JSON 格式返回,不得包含任何 Markdown 格式。\n\n```json\n{{\n \"title\": \"今日群聊主题\",\n \"subtitle\": \"副标题\",\n \"dimensions\": [\n {{\n \"name\": \"抽象维度名\",\n \"percentage\": 比例,\n \"comment\": \"与该维度相关的锐评,请务必保持你的人设口吻\"\n }}\n ],\n \"summary\": \"一句总结性的金句\"\n}}\n```\n\n群聊记录:\n${messages_text}"
498498
},
499499
"quality_summary_prompt": {
500500
"description": "增量汇总聊天质量分析提示词",
501501
"type": "text",
502502
"editor_mode": true,
503503
"editor_language": "markdown",
504-
"default": "你是一个毒舌且幽默的群聊质量分析师。\n你现在有一份今天全天分散时间段的多个“增量批次点评笔记”。\n你的任务是将这些分散的笔记汇总成一份最终的“全天聊天质量终极锐评”。\n\n## 任务目标:\n1. **全局抽象维度**:根据各批次的维度表现,平衡权重,提取出 3-6 个覆盖全天的【核心、上层抽象】课题维度(如:职场/行业风向、技术架构演进、社畜心理博弈等)。\n2. **严禁在维度名称(name)中出现具体的批次细节。标题必须代表全天的某种趋势。**\n3. **百分比融合**:根据全天笔记的频率和强度,给出一个代表全天整体分布的比例(总和不超过100%)。\n4. **终极点评**:为每个汇总维度写出一句升华后的全天总结性点评。可以融合具体批次中的有趣槽点。\n5. **终极总结**:拟定全天的大型主题标题、副标题,并给出一句霸气的全天表现总结。\n\n## 风格要求:\n- 只有维度名称(name)需要高度概括抽象。\n- 点评(comment)和总结(summary)请尽量生动、毒舌、具体,要把一整天的梗串联起来。\n\n## 返回格式要求:\n必须以纯 JSON 格式返回,不得包含任何 Markdown 格式。\n\n```json\n{{\n \"title\": \"今日群聊主题\",\n \"subtitle\": \"副标题\",\n \"dimensions\": [\n {{\n \"name\": \"抽象大类标题\",\n \"percentage\": 比例,\n \"comment\": \"维度的全天锐评\"\n }}\n ],\n \"summary\": \"全天总结金句\"\n}}\n```\n\n增量汇总数据:\n${reviews_text}"
504+
"default": "你现在有一份今天全天分散时间段的多个“增量批次点评笔记”。\n你的任务是将这些分散的笔记汇总成一份最终的“全天聊天质量终极锐评”。\n\n## 任务目标:\n1. **全局抽象维度**:根据各批次的维度表现,平衡权重,提取出 3-6 个覆盖全天的【核心、上层抽象】课题维度(如:职场/行业风向、技术架构演进、社畜心理博弈等)。\n2. **严禁在维度名称(name)中出现具体的批次细节。标题必须代表全天的某种趋势。**\n3. **百分比融合**:根据全天笔记的频率和强度,给出一个代表全天整体分布的比例(总和不超过100%)。\n4. **终极点评**:为每个汇总维度写出一句符合你当前人设且升华后的全天总结性点评。可以融合具体批次中的有趣槽点。\n5. **终极总结**:拟定全天的大型主题标题、副标题,并给出一句霸气的全天表现总结。\n\n## 风格要求:\n- 只有维度名称(name)需要高度概括抽象。\n- 点评(comment)和总结(summary)请尽量生动、具体,要把一整天的梗串联起来。\n\n## 返回格式要求:\n必须以纯 JSON 格式返回,不得包含任何 Markdown 格式。\n\n```json\n{{\n \"title\": \"今日群聊主题\",\n \"subtitle\": \"副标题\",\n \"dimensions\": [\n {{\n \"name\": \"抽象大类标题\",\n \"percentage\": 比例,\n \"comment\": \"全天的锐评总结,请务必保持你的人设口吻\"\n }}\n ],\n \"summary\": \"全天总结金句\"\n}}\n```\n\n增量汇总数据:\n${reviews_text}"
505505
}
506506
}
507507
}

src/infrastructure/analysis/analyzers/base_analyzer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
from ..utils.structured_output_schema import JSONObject, build_response_format
2020

2121
TDataObject = TypeVar("TDataObject")
22+
TInputData = TypeVar("TInputData")
2223

2324

24-
class BaseAnalyzer(ABC, Generic[TDataObject]):
25+
class BaseAnalyzer(ABC, Generic[TDataObject, TInputData]):
2526
"""
2627
基础分析器抽象类
2728
定义所有分析器的通用接口 and 流程
@@ -71,7 +72,7 @@ def get_max_count(self) -> int:
7172
pass
7273

7374
@abstractmethod
74-
def build_prompt(self, data: object) -> str:
75+
def build_prompt(self, data: TInputData) -> str:
7576
"""
7677
构建LLM提示词
7778
@@ -327,7 +328,7 @@ def _apply_persona_reinforcement(
327328
)
328329

329330
async def analyze(
330-
self, data: object, umo: str | None = None, session_id: str | None = None
331+
self, data: TInputData, umo: str | None = None, session_id: str | None = None
331332
) -> tuple[list[TDataObject], TokenUsage]:
332333
"""
333334
统一的分析流程

src/infrastructure/analysis/analyzers/chat_quality_analyzer.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from .base_analyzer import BaseAnalyzer
2121

2222

23-
class ChatQualityAnalyzer(BaseAnalyzer[QualityReview]):
23+
class ChatQualityAnalyzer(BaseAnalyzer[QualityReview, list[dict]]):
2424
"""
2525
聊天质量分析器
2626
专门处理群聊质量的锐评和多维度分析
@@ -89,8 +89,7 @@ def build_prompt(self, data: list[dict]) -> str:
8989
if prompt_template:
9090
return render_template(prompt_template, messages_text=messages_text)
9191

92-
prompt_template = """你是一个毒舌且幽默的群聊质量分析师。
93-
请分析以下群聊记录,输出一份"聊天质量锐评"。
92+
prompt_template = """请分析以下群聊记录,输出一份"聊天质量锐评"。
9493
9594
## 任务目标:
9695
1. **维度划分**:将聊天内容划分为 3-6 个【高层级、抽象、泛化】的维度(例如:就业焦虑、生涯规划、技术方案研究、情感树洞、无意义水群等)。
@@ -297,8 +296,7 @@ async def summarize_batch_reviews(
297296
# 获取配置中的汇总提示词模板,如果没有则使用默认模板
298297
prompt_template = (
299298
self.config_manager.get_quality_summary_prompt()
300-
or """你是一个毒舌且幽默的群聊质量分析师。
301-
你现在有一份今天全天分散时间段的多个“增量批次点评笔记”。
299+
or """你现在有一份今天全天分散时间段的多个“增量批次点评笔记”。
302300
你的任务是将这些分散的笔记汇总成一份最终的“全天聊天质量终极锐评”。
303301
304302
## 任务目标:
@@ -310,7 +308,7 @@ async def summarize_batch_reviews(
310308
311309
## 风格要求:
312310
- 只有维度名称(name)需要高度概括抽象。
313-
- 点评(comment)和总结(summary)请尽量生动、毒舌、具体,要把一整天的梗串联起来。
311+
- 点评(comment)和总结(summary)请尽量生动、具体,要把一整天的梗串联起来。
314312
315313
## 返回格式要求:
316314
必须以纯 JSON 格式返回,不得包含任何 Markdown 格式。
@@ -339,6 +337,9 @@ async def summarize_batch_reviews(
339337
self.get_provider_id_key(), umo
340338
)
341339

340+
# 应用人设强化注入
341+
prompt = self._apply_persona_reinforcement(prompt, system_prompt)
342+
342343
response = await call_provider_with_retry(
343344
self.context,
344345
self.config_manager,
@@ -430,6 +431,9 @@ async def analyze_quality(
430431
if not prompt:
431432
return None, TokenUsage()
432433

434+
# 应用人设强化注入
435+
prompt = self._apply_persona_reinforcement(prompt, system_prompt)
436+
433437
# 3. 调用 LLM
434438
response = await call_provider_with_retry(
435439
self.context,

src/infrastructure/analysis/analyzers/golden_quote_analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from .base_analyzer import BaseAnalyzer
1616

1717

18-
class GoldenQuoteAnalyzer(BaseAnalyzer[GoldenQuote]):
18+
class GoldenQuoteAnalyzer(BaseAnalyzer[GoldenQuote, list[dict]]):
1919
"""
2020
金句分析器
2121
专门处理群聊金句的提取和分析

src/infrastructure/analysis/analyzers/topic_analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .base_analyzer import BaseAnalyzer
1717

1818

19-
class TopicAnalyzer(BaseAnalyzer[SummaryTopic]):
19+
class TopicAnalyzer(BaseAnalyzer[SummaryTopic, list[dict]]):
2020
"""
2121
话题分析器
2222
专门处理群聊话题的提取和分析

src/infrastructure/analysis/analyzers/user_title_analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .base_analyzer import BaseAnalyzer
1313

1414

15-
class UserTitleAnalyzer(BaseAnalyzer[UserTitle]):
15+
class UserTitleAnalyzer(BaseAnalyzer[UserTitle, dict]):
1616
"""
1717
用户称号分析器
1818
专门处理用户称号分配和MBTI类型分析

0 commit comments

Comments
 (0)