MaiBot/src/plugins/group_nickname/nickname_mapper.py

78 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# src/plugins/group_nickname/nickname_mapper.py
from typing import Dict
from src.common.logger_manager import get_logger
# 这个文件现在只负责构建 PromptLLM 的初始化和调用移至 NicknameManager
logger = get_logger("nickname_mapper")
# LLMRequest 实例和 analyze_chat_for_nicknames 函数已被移除
def _build_mapping_prompt(chat_history_str: str, bot_reply: str, user_name_map: Dict[str, str]) -> str:
"""
构建用于 LLM 进行绰号映射分析的 Prompt。
Args:
chat_history_str: 格式化后的聊天历史记录字符串。
bot_reply: Bot 的最新回复字符串。
user_name_map: 用户 ID 到已知名称person_name 或 fallback nickname的映射。
Returns:
str: 构建好的 Prompt 字符串。
"""
# 将 user_name_map 格式化为列表字符串
user_list_str = "\n".join([f"- {uid}: {name}" for uid, name in user_name_map.items() if uid and name])
if not user_list_str:
user_list_str = "" # 如果映射为空,明确告知
# 核心 Prompt 内容
prompt = f"""
任务:仔细分析以下聊天记录和“你的最新回复”,判断其中是否明确提到了某个用户的绰号,并且这个绰号可以清晰地与一个特定的用户 ID 对应起来。
已知用户信息ID: 名称):
{user_list_str}
聊天记录:
---
{chat_history_str}
---
你的最新回复:
{bot_reply}
分析要求与输出格式:
1. 找出聊天记录和“你的最新回复”中可能是用户绰号的词语。
2. 判断这些绰号是否在上下文中**清晰、无歧义**地指向了“已知用户信息”列表中的**某一个特定用户 ID**。必须是强关联,避免猜测。
3. **不要**输出你自己(名称后带"(你)"的用户)的绰号映射。
**不要**输出与用户已知名称完全相同的词语作为绰号。
**不要**将在“你的最新回复”中你对他人使用的称呼或绰号进行映射(只分析聊天记录中他人对用户的称呼)。
**不要**输出指代不明或过于通用的词语(如“大佬”、“兄弟”、“那个谁”等,除非上下文能非常明确地指向特定用户)。
4. 如果找到了**至少一个**满足上述所有条件的**明确**的用户 ID 到绰号的映射关系,请输出 JSON 对象:
```json
{{
"is_exist": true,
"data": {{
"用户A数字id": "绰号_A",
"用户B数字id": "绰号_B"
}}
}}
```
- `"data"` 字段的键必须是用户的**数字 ID (字符串形式)**,值是对应的**绰号 (字符串形式)**。
- 只包含你能**百分百确认**映射关系的条目。宁缺毋滥。
如果**无法找到任何一个**满足条件的明确映射关系,请输出 JSON 对象:
```json
{{
"is_exist": false
}}
```
5. 请**仅**输出 JSON 对象,不要包含任何额外的解释、注释或代码块标记之外的文本。
输出:
"""
# logger.debug(f"构建的绰号映射 Prompt (部分):\n{prompt[:500]}...") # 可以在 NicknameManager 中记录
return prompt
# analyze_chat_for_nicknames 函数已被移除,其逻辑移至 NicknameManager._call_llm_for_analysis