mirror of https://github.com/Mai-with-u/MaiBot.git
78 lines
3.3 KiB
Python
78 lines
3.3 KiB
Python
# src/plugins/group_nickname/nickname_mapper.py
|
||
from typing import Dict
|
||
from src.common.logger_manager import get_logger
|
||
|
||
# 这个文件现在只负责构建 Prompt,LLM 的初始化和调用移至 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
|