实验室招新QQ机器人设计方案，结合Napcat框架和DeepSeek API实现，包含上下文记忆、招新问答和趣味交互功能：

### 一、系统架构设计
```mermaid
graph TD
    A[Napcat 机器人框架] --> B[消息处理层]
    B --> C[上下文管理器]
    B --> D[指令路由器]
    C --> E[DeepSeek API]
    D --> F[招新问答模块]
    D --> G[趣味交互模块]
    D --> H[表情包管理]
    E --> C[记忆存储]
```

### 二、核心模块设计

1. **上下文管理器 (ContextManager)**
```python
class ContextManager:
    def __init__(self, max_context=5):
        self.contexts = {}  # {group_id: deque(maxlen=max_context)}
        self.recruitment_info = ""  # 存储招新要求
    
    def add_context(self, group_id, role, content):
        if group_id not in self.contexts:
            self.contexts[group_id] = deque(maxlen=5)
        self.contexts[group_id].append({"role": role, "content": content})
    
    def get_context(self, group_id):
        return list(self.contexts.get(group_id, deque()))
    
    def set_recruitment(self, info):
        # 精简招新信息并存储
        self.recruitment_info = self._summarize_info(info)
    
    def _summarize_info(self, text):
        # 使用DeepSeek生成精简版招新要求
        prompt = "请用不超过100字总结以下招新要求的核心信息:"
        return call_deepseek(prompt + text)
```

2. **DeepSeek API 交互模块**
```python
def call_deepseek(messages, temp=0.7, max_tokens=500):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    payload = {
        "model": "deepseek-chat",
        "messages": messages,
        "temperature": temp,
        "max_tokens": max_tokens
    }
    response = requests.post(API_ENDPOINT, json=payload, headers=headers)
    return response.json()["choices"][0]["message"]["content"]
```

### 三、优化提示词设计

**系统级提示词 (固定注入)：**
```
你是一个学科竞赛实验室的招新助手，具有以下特征：
1. 专业解答招新相关问题，回答需基于[实验室招新要求]
2. 当问题无关招新时，用幽默风趣的方式闲聊（可加入表情包描述）
3. 回答简洁（<100字），复杂问题建议线下咨询
4. 使用表情符号和网络流行语增加亲和力

当前招新要求摘要：
{recruitment_summary}
```

**动态上下文构建示例：**
```python
def build_messages(group_id):
    base_prompt = get_system_prompt()  # 获取系统提示词
    context = context_manager.get_context(group_id)
    return [{"role": "system", "content": base_prompt}] + context
```

### 四、消息处理流程
```python
@bot.on_group_at_message
async def handle_message(event: GroupAtMessage):
    group_id = event.group_openid
    user_msg = event.content.replace("@机器人", "").strip()
    
    # 判断消息类型
    if is_recruitment_question(user_msg):
        response = process_recruitment(user_msg, group_id)
    else:
        response = process_chat(user_msg, group_id)
    
    # 添加表情包
    if should_add_sticker():
        response += generate_sticker()
    
    # 更新上下文
    context_manager.add_context(group_id, "user", user_msg)
    context_manager.add_context(group_id, "assistant", response)
    
    await bot.send_text(event.group_openid, response)
```

### 五、Token优化策略

1. **分层记忆系统**
   - 短期记忆：最近3轮对话（存储在内存）
   - 长期记忆：招新要求（使用向量数据库存储）
   - 当上下文超过阈值时，调用摘要函数：
     ```python
     def summarize_context(context):
         prompt = "请用一句话概括以下对话的核心内容:"
         return call_deepseek(prompt + str(context), max_tokens=100)
     ```

2. **关键词触发机制**
```python
RECRUITMENT_KEYWORDS = ["招新", "报名", "要求", "面试", "加入", "招人"]

def is_recruitment_question(text):
    return any(keyword in text for keyword in RECRUITMENT_KEYWORDS)
```

### 六、表情包系统设计
```python
class StickerManager:
    def __init__(self):
        self.stickers = {
            "welcome": ["👋", "🎉", "🤗"],
            "answer": ["📚", "💡", "🧠"],
            "funny": ["😂", "🐶", "🎮"]
        }
    
    def get_sticker(self, category):
        return random.choice(self.stickers.get(category, ["✨"]))
    
    def generate_sticker_response(self, text):
        if "哈哈" in text or "笑" in text:
            return self.get_sticker("funny")
        if "谢谢" in text or "你好" in text:
            return self.get_sticker("welcome")
        return self.get_sticker("answer")
```

### 七、部署与维护方案

1. **配置文件结构**
   ```
   config/
     ├── prompts.yaml       # 提示词模板
     ├── recruitment.md     # 招新要求文档
     ├── keywords.txt       # 关键词列表
     └── stickers.json      # 表情包映射
   ```

2. **扩展点设计**
   - 添加新功能：在`extensions/`目录创建模块
   - 修改交互风格：编辑`prompts.yaml`
   - 增加问答知识：更新`knowledge/`目录文档

3. **监控与日志**
   ```python
   class APIMonitor:
       def __init__(self):
           self.token_count = 0
       
       def log_usage(self, response):
           self.token_count += response.usage["total_tokens"]
           if self.token_count > DAILY_LIMIT:
               disable_chat_mode()
   ```

### 八、防滥用机制

1. **频率限制**
```python
from ratelimit import limits, sleep_and_retry

@sleep_and_retry
@limits(calls=30, period=60)  # 每分钟30次
def call_api_safely():
    return call_deepseek(...)
```

2. **敏感词过滤**
```python
with open("blocked_words.txt") as f:
    BLOCKED_WORDS = [line.strip() for line in f]

def contains_blocked_word(text):
    return any(word in text for word in BLOCKED_WORDS)
```

### 九、预设互动示例

**用户**: @机器人 招新有什么要求吗？  
**机器人**: 咱们实验室招新要求来啦！🎯  
1. 面向大二大三同学  
2. 熟悉Python/C++基础  
3. 每周能投入10+小时  
详细要求戳：bit.ly/recruit-2024  
有问题随时问我~ 😊

**用户**: @机器人 讲个笑话吧  
**机器人**: 为什么程序员分不清万圣节和圣诞节？  
因为 Oct 31 == Dec 25！😂  
（二进制冷笑话送给大家~）

### 十、性能优化建议

1. **缓存常用回答**
```python
from functools import lru_cache

@lru_cache(maxsize=50)
def get_cached_answer(question):
    return call_deepseek(...)
```

2. **异步处理**
```python
async def async_api_call(messages):
    loop = asyncio.get_event_loop()
    return await loop.run_in_executor(None, call_deepseek, messages)
```

3. **轻量上下文模式**
```python
def light_context_mode(text):
    return "简单回答" if len(text) < 20 else "详细回答"
```

这个设计实现了：
- 动态上下文管理
- 精准招新问答
- 趣味互动能力
- 高效Token利用
- 易扩展架构

维护建议：
1. 定期更新`recruitment.md`招新信息
2. 每月审查对话日志优化关键词
3. 使用`APIMonitor`控制成本
4. 通过`sticker_feedback.csv`收集表情包反馈持续优化

