改进 AI 回复模式

1. generate_reply: 改为优先关键词匹配,不匹配则调用 AI
2. _ai_generate_reply: 改进 prompt,加入对话上下文、微信风格要求
3. 要求回复简洁(50字以内),符合聊天风格
This commit is contained in:
2026-04-13 12:20:17 +08:00
parent 838f13998c
commit 42a8dc3fd7
3 changed files with 48 additions and 20 deletions

View File

@@ -42,7 +42,7 @@ wechat:
# 回复规则 # 回复规则
rules: rules:
# 关键词回复示例 # 关键词回复示例(优先匹配)
- keywords: - keywords:
- 你好 - 你好
- hi - hi
@@ -51,7 +51,8 @@ rules:
reply_content: "您好,有什么可以帮您的?" reply_content: "您好,有什么可以帮您的?"
enabled: true enabled: true
# AI 回复示例(无匹配关键词时,使用 LLM 生成回复) # AI 回复模式(无匹配关键词时,使用 LLM 生成回复)
# 这是默认模式,会根据对话上下文生成自然回复
- keywords: [] - keywords: []
reply_type: AI reply_type: AI
reply_content: "" reply_content: ""

View File

@@ -79,24 +79,34 @@ class MessageProcessor:
return True return True
def generate_reply(self, chat_snapshot: ChatSnapshot) -> str: def generate_reply(self, chat_snapshot: ChatSnapshot) -> str:
"""生成回复内容""" """生成回复内容
策略:优先关键词匹配,如果没有匹配则使用 AI 生成回复
"""
# 先检查关键词规则(取最新消息) # 先检查关键词规则(取最新消息)
latest_content = chat_snapshot.messages[0].get("content", "") if chat_snapshot.messages else "" latest_content = chat_snapshot.messages[0].get("content", "") if chat_snapshot.messages else ""
# 先检查关键词匹配
for rule in self._rules: for rule in self._rules:
if not rule.enabled: if not rule.enabled or rule.reply_type != "keyword":
continue continue
if rule.reply_type == "keyword": for keyword in rule.keywords:
# 关键词匹配 if keyword in latest_content:
for keyword in rule.keywords: logger.info(f"关键词匹配: {keyword}")
if keyword in latest_content: return rule.reply_content
logger.info(f"关键词匹配: {keyword}")
return rule.reply_content
elif rule.reply_type == "AI": # 没有关键词匹配,使用 AI 生成回复
# AI 生成回复 for rule in self._rules:
return self._ai_generate_reply(chat_snapshot) if not rule.enabled or rule.reply_type != "AI":
continue
logger.info("使用 AI 生成回复")
return self._ai_generate_reply(chat_snapshot)
# 如果没有配置 AI 回复规则,也尝试调用 AI
if not self._rules:
logger.info("无规则配置,使用 AI 生成回复")
return self._ai_generate_reply(chat_snapshot)
return "" return ""
@@ -104,22 +114,39 @@ class MessageProcessor:
"""AI 生成回复""" """AI 生成回复"""
try: try:
# 构造 prompt # 构造 prompt
prompt = f"""当前聊天: {chat_snapshot.chat_name} chat_name = chat_snapshot.chat_name
历史消息(按时间倒序): messages = chat_snapshot.messages[:10] # 取最新10条VLM返回的是倒序
prompt = f"""你是微信聊天助手,正在和「{chat_name}」对话。
对话历史(最新在前):
""" """
for msg in chat_snapshot.messages[:10]: # 取最新10条VLM返回的是倒序 for msg in messages:
sender = "" if msg.get("is_self") else "对方" sender = "" if msg.get("is_self") else "对方"
prompt += f"- [{sender}] {msg.get('content', '')}\n" content = msg.get("content", "")
time = msg.get("time", "")
prompt += f"[{time}] {sender}{content}\n"
prompt += """ prompt += """
请生成一条合适的回复,只返回回复内容,不要其他文字。""" 根据对话上下文,生成一条自然的回复
要求:
1. 回复要符合微信聊天风格,轻松友好
2. 简洁明了不要太长50字以内
3. 如果对方提问,尽量回答问题
4. 如果对方分享事情,给予适当回应
5. 只返回回复内容,不要其他文字"""
logger.debug(f"AI 回复 prompt:\n{prompt[:300]}...")
# 调用 LLM # 调用 LLM
response = self.llm_client.chat([ response = self.llm_client.chat([
{"role": "user", "content": prompt} {"role": "user", "content": prompt}
]) ])
return response.get("text", "") text = response.get("text", "").strip()
logger.info(f"AI 生成回复: {text[:50]}...")
return text
except Exception as e: except Exception as e:
logger.error(f"AI 生成回复失败: {e}") logger.error(f"AI 生成回复失败: {e}")
return "" return ""