# AI模型接入完整指南

## 概述

本系统提供了完整的AI模型接入能力，包括：

- ✅ **多模型支持**：OpenAI、Anthropic Claude、DeepSeek、Qwen等
- ✅ **人格系统**：可自定义AI性格特征和说话风格
- ✅ **记忆系统**：短期记忆（滑动窗口）+ 长期记忆（RAG检索）
- ✅ **长任务处理**：支持多步骤复杂任务的执行和管理
- ✅ **Skills插件**：可扩展的技能插件系统
- ✅ **MCP支持**：Model Context Protocol标准支持

## 快速开始

### 1. 安装依赖

```bash
pip install openai anthropic numpy
```

### 2. 配置环境变量

在 `.env` 文件中添加：

```env
# AI模型配置
AI_PROVIDER=openai  # openai, anthropic, deepseek, qwen
AI_MODEL=gpt-4
AI_API_KEY=your_api_key_here
AI_API_BASE=https://api.openai.com/v1  # 可选，自定义API地址
```

### 3. 基础使用

```python
from pathlib import Path
from src.ai import AIClient
from src.ai.base import ModelConfig, ModelProvider

# 创建模型配置
config = ModelConfig(
    provider=ModelProvider.OPENAI,
    model_name="gpt-4",
    api_key="your_api_key",
    temperature=0.7
)

# 初始化AI客户端
client = AIClient(config, data_dir=Path("data/ai"))

# 对话
response = await client.chat(
    user_id="user123",
    user_message="你好，介绍一下你自己",
    use_memory=True,
    use_tools=True
)

print(response)
```

## 核心功能详解

### 1. 人格系统

人格系统允许你为AI定义独特的性格特征和说话风格。

#### 使用预设人格

```python
# 列出所有人格
personalities = client.list_personalities()
print(personalities)  # ['default', 'tech_expert', 'creative']

# 切换人格
client.set_personality('tech_expert')
```

#### 自定义人格

```python
from src.ai.personality import PersonalityProfile, PersonalityTrait

# 创建自定义人格
custom_personality = PersonalityProfile(
    name="游戏助手",
    description="专业的游戏顾问和陪玩伙伴",
    traits=[
        PersonalityTrait.FRIENDLY,
        PersonalityTrait.HUMOROUS,
        PersonalityTrait.CREATIVE
    ],
    speaking_style="活泼、热情、善用游戏术语和梗",
    example_responses=[
        "哇！这个操作太秀了！",
        "让我们一起冲冲冲！",
        "别慌，稳住我们能赢！"
    ],
    custom_instructions="始终保持积极乐观的态度，鼓励玩家"
)

# 添加到系统
client.personality.add_personality('gamer', custom_personality)
client.set_personality('gamer')
```

### 2. 记忆系统

记忆系统分为短期记忆和长期记忆两部分。

#### 短期记忆

- 自动保存最近的对话（默认20条）
- 使用滑动窗口，自动清理过期记忆（默认30分钟）
- 无需手动管理

#### 长期记忆

- 自动评估重要性，重要对话会被保存
- 支持向量检索（RAG）
- 可手动查询历史记忆

```python
# 获取用户的记忆上下文
short_term, long_term = await client.memory.get_context(
    user_id="user123",
    query="我们之前讨论过什么？",
    max_short_term=10,
    max_long_term=5
)

# 格式化为文本
context = client.memory.format_context(short_term, long_term)
print(context)

# 清除短期记忆
client.clear_memory("user123")
```

#### 记忆重要性评估

系统会自动评估对话的重要性：

- 内容长度（>100字符 +0.1分）
- 关键词（"重要"、"记住"、"别忘了" +0.2分）
- 元数据（问题 +0.1分，代码 +0.15分）
- 阈值：≥0.6分会被保存到长期记忆

### 3. 长任务处理

支持将复杂任务分解为多个步骤执行。

```python
# 创建长任务
task_id = await client.create_long_task(
    user_id="user123",
    title="数据分析任务",
    description="分析用户行为数据并生成报告",
    steps=[
        {
            "description": "加载数据",
            "action": "load_data",
            "params": {"file_path": "data.csv"}
        },
        {
            "description": "数据清洗",
            "action": "clean_data",
            "params": {}
        },
        {
            "description": "统计分析",
            "action": "analyze",
            "params": {"metrics": ["avg", "max", "min"]}
        },
        {
            "description": "生成报告",
            "action": "generate_report",
            "params": {"format": "pdf"}
        }
    ]
)

# 定义进度回调
async def on_progress(task_id, progress, message):
    print(f"任务 {task_id}: {progress*100:.1f}% - {message}")

# 启动任务
await client.start_task(task_id, progress_callback=on_progress)

# 查询任务状态
status = client.get_task_status(task_id)
print(status)
```

#### 注册任务动作处理器

```python
# 注册动作处理器
async def load_data_handler(file_path: str):
    # 实现数据加载逻辑
    return {"rows": 1000, "columns": 10}

client.task_manager.register_action("load_data", load_data_handler)
```

### 4. Skills插件系统

Skills系统允许你扩展AI的能力。

#### 加载技能

```python
from pathlib import Path
from src.ai.skills import SkillsManager

# 创建技能管理器
skills_manager = SkillsManager(skills_dir=Path("skills"))

# 加载单个技能
await skills_manager.load_skill("weather")

# 加载所有技能
await skills_manager.load_all_skills()

# 获取所有工具
tools = skills_manager.get_all_tools()
```

#### 创建自定义技能

```python
from src.ai.skills import create_skill_template

# 创建技能模板
create_skill_template("my_skill", Path("skills"))
```

技能目录结构：

```
skills/
└── my_skill/
    ├── skill.json      # 元数据
    ├── main.py         # 主要实现
    ├── __init__.py
    └── README.md
```

`main.py` 示例：

```python
from src.ai.skills.base import Skill

class MySkill(Skill):
    async def initialize(self):
        # 注册工具
        self.register_tool("my_tool", self.my_tool)
    
    async def my_tool(self, param: str) -> str:
        return f"处理: {param}"
    
    async def cleanup(self):
        pass
```

### 5. MCP支持

MCP (Model Context Protocol) 提供标准化的上下文访问接口。

#### 使用内置MCP服务器

```python
from pathlib import Path
from src.ai.mcp import MCPManager
from src.ai.mcp.servers import FileSystemMCPServer

# 创建MCP管理器
mcp_manager = MCPManager(config_path=Path("config/mcp.json"))

# 注册文件系统服务器
fs_server = FileSystemMCPServer(root_path=Path("data"))
await mcp_manager.register_server(fs_server)

# 获取所有工具
tools = await mcp_manager.get_all_tools_for_ai()

# 执行工具
result = await mcp_manager.execute_tool(
    "filesystem.read_file",
    {"path": "test.txt"}
)
```

#### 创建自定义MCP服务器

```python
from src.ai.mcp.base import MCPServer

class MyMCPServer(MCPServer):
    def __init__(self):
        super().__init__(name="my_server", version="1.0.0")
    
    async def initialize(self):
        self.register_tool(
            name="my_tool",
            description="我的工具",
            input_schema={
                "type": "object",
                "properties": {
                    "param": {"type": "string"}
                },
                "required": ["param"]
            },
            handler=self.my_tool_handler
        )
    
    async def my_tool_handler(self, param: str):
        return f"处理: {param}"
```

## 集成到QQ机器人

### 修改消息处理器

```python
# src/handlers/message_handler.py
from src.ai import AIClient
from src.ai.base import ModelConfig, ModelProvider
from pathlib import Path

class MessageHandler:
    def __init__(self, bot):
        self.bot = bot
        
        # 初始化AI客户端
        config = ModelConfig(
            provider=ModelProvider.OPENAI,
            model_name="gpt-4",
            api_key=Config.AI_API_KEY,
            api_base=Config.AI_API_BASE
        )
        self.ai_client = AIClient(config, data_dir=Path("data/ai"))
        
        # 加载技能
        from src.ai.skills import SkillsManager
        self.skills = SkillsManager(Path("skills"))
        asyncio.create_task(self.skills.load_all_skills())
    
    async def handle_at_message(self, message: Message):
        try:
            # 提取用户消息
            user_message = message.content.strip()
            user_id = message.author.id
            
            # 调用AI
            response = await self.ai_client.chat(
                user_id=user_id,
                user_message=user_message,
                use_memory=True,
                use_tools=True
            )
            
            # 发送回复
            await message.reply(content=response)
            
        except Exception as e:
            logger.error(f"处理消息失败: {e}")
            await message.reply(content="抱歉，处理消息时出错了")
```

## 配置文件

### config/personalities.json

```json
{
  "default": {
    "name": "小助手",
    "description": "友好的AI助手",
    "traits": ["FRIENDLY", "PROFESSIONAL", "EMPATHETIC"],
    "speaking_style": "温和、清晰、有条理",
    "example_responses": [
      "我明白你的意思了，让我来帮你解决这个问题。",
      "这是个很好的问题！我来详细解释一下。"
    ],
    "custom_instructions": ""
  }
}
```

### config/mcp.json

```json
{
  "filesystem": {
    "enabled": true,
    "root_path": "data"
  }
}
```

## 高级用法

### 1. 流式响应

```python
async for chunk in client.chat(
    user_id="user123",
    user_message="讲个故事",
    stream=True
):
    print(chunk, end='', flush=True)
```

### 2. 自定义工具

```python
# 定义工具函数
async def search_web(query: str) -> str:
    # 实现搜索逻辑
    return f"搜索结果: {query}"

# 注册工具
client.register_tool(
    name="search_web",
    description="搜索网络信息",
    parameters={
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "搜索关键词"
            }
        },
        "required": ["query"]
    },
    function=search_web
)
```

### 3. 多模型切换

```python
# 切换到Claude
claude_config = ModelConfig(
    provider=ModelProvider.ANTHROPIC,
    model_name="claude-3-5-sonnet-20241022",
    api_key="your_anthropic_key"
)
client.model = client._create_model(claude_config)

# 切换到DeepSeek
deepseek_config = ModelConfig(
    provider=ModelProvider.DEEPSEEK,
    model_name="deepseek-chat",
    api_key="your_deepseek_key",
    api_base="https://api.deepseek.com/v1"
)
client.model = client._create_model(deepseek_config)
```

## 性能优化

### 1. 记忆系统优化

```python
# 调整短期记忆大小
client.memory.short_term.max_size = 30  # 默认20

# 调整记忆过期时间
from datetime import timedelta
client.memory.short_term.max_age = timedelta(hours=1)  # 默认30分钟

# 调整重要性阈值
client.memory.importance_threshold = 0.7  # 默认0.6
```

### 2. 并发任务处理

```python
# 同时启动多个任务
tasks = []
for i in range(5):
    task_id = await client.create_long_task(...)
    tasks.append(client.start_task(task_id))

# 等待所有任务完成
await asyncio.gather(*tasks)
```

## 故障排查

### 常见问题

1. **API调用失败**
   - 检查API密钥是否正确
   - 检查网络连接
   - 检查API地址是否正确

2. **记忆系统不工作**
   - 确保 `use_memory=True`
   - 检查数据目录权限
   - 查看日志文件

3. **技能加载失败**
   - 检查 `skill.json` 格式
   - 确保 `main.py` 中有Skill子类
   - 查看错误日志

## 最佳实践

1. **合理使用记忆系统**
   - 不要在每次对话都查询长期记忆
   - 定期清理不重要的记忆
   - 为重要对话添加元数据标记

2. **技能开发**
   - 保持技能功能单一
   - 提供清晰的工具描述
   - 处理异常情况

3. **长任务设计**
   - 将任务分解为合理的步骤
   - 提供进度反馈
   - 支持任务暂停和恢复

## 更新日志

### v1.0.0 (2024-03-02)
- ✅ 初始版本发布
- ✅ 支持OpenAI、Anthropic、DeepSeek、Qwen
- ✅ 人格系统
- ✅ 记忆系统（短期+长期+RAG）
- ✅ 长任务处理
- ✅ Skills插件系统
- ✅ MCP支持

## 贡献

欢迎提交Issue和Pull Request！

## 许可证

MIT License
