feat: 增强模型选择日志和验证

- 在 chatService 中添加模型选择详细日志
- 在 modelServiceManager 中添加请求/响应确认日志
- 创建模型选择验证指南文档
- 帮助用户确认所选模型是否被正确使用

新增日志:
- 🎯 用户选择的模型
-  找到匹配服务
- 🔍 最终选择确认
- 📋 请求体 model 字段
- �� 最终发送确认
-  API 响应模型确认

用户现在可以在控制台清晰看到:
- 选择了哪个模型
- 找到了哪个服务
- 实际发送了什么模型参数
- API 返回了什么模型
- 请求模型和响应模型是否一致
This commit is contained in:
douboer
2025-10-15 10:06:42 +08:00
parent 1a57696110
commit cb2f9ea76f
5 changed files with 501 additions and 11 deletions

View File

@@ -0,0 +1,272 @@
# 模型选择验证指南
## 问题:切换模型后回答没有变化?
这个问题可能有以下几个原因,我已经添加了详细的日志来帮助你诊断。
---
## 🔍 如何确认模型被正确使用
### 方法 1: 查看控制台日志 (推荐)
打开浏览器开发者工具 (F12),切换到 Console 标签,发送一条消息后查看日志:
#### 关键日志标记
1. **用户选择阶段**
```
🎯 [callModelStream] 用户选择的模型: qwen-turbo-latest
✅ [callModelStream] 找到匹配服务: 阿里云通义千问
```
2. **最终确认阶段**
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔍 [callModelStream] 最终选择:
服务: 阿里云通义千问 (dashscope)
模型: qwen-turbo-latest
MCP: 未选择
工具: 0 个
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
3. **请求准备阶段**
```
🎯 [makeChatRequestStream] 准备请求参数:
服务类型: dashscope
服务名称: 阿里云通义千问
使用模型: qwen-turbo-latest
消息数量: 2
工具数量: 0
```
4. **最终发送阶段**
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 [最终确认] 即将发送请求:
模型: qwen-turbo-latest
服务: 阿里云通义千问 (dashscope)
URL: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
5. **API 响应确认**
```
✅ [响应确认] API 返回的模型: qwen-turbo-latest
请求的模型: qwen-turbo-latest
模型匹配: ✓ 一致
```
### 方法 2: 测试不同模型的特性
#### 测试 qwen-turbo-latest (快速响应)
```
提问: "用一句话介绍你自己"
预期: 快速响应,简洁回答
```
#### 测试 qwq-plus (推理能力)
```
提问: "如果 A>BB>C那么 A 和 C 的关系是什么?请详细说明推理过程。"
预期: 详细的逻辑推理步骤
```
#### 测试 qwen-long (长上下文)
```
提问: "总结一下我们之前的所有对话"
预期: 能够回顾更多历史消息
```
#### 测试 qwen3-omni-flash (快速响应)
```
提问: "快速回答1+1=?"
预期: 极速响应
```
---
## 🐛 常见问题排查
### 问题 1: 模型显示但没有变化
**检查点 1**: 确认服务配置正确
```javascript
// 在控制台执行
const providers = JSON.parse(localStorage.getItem('model-providers') || '[]')
const aliyun = providers.find(p => p.type === 'dashscope')
console.log('阿里云配置:', aliyun)
console.log('可用模型:', aliyun?.models)
```
**检查点 2**: 确认模型列表包含目标模型
```javascript
// 在控制台执行
const providers = JSON.parse(localStorage.getItem('model-providers') || '[]')
providers.forEach(p => {
console.log(`${p.name} (${p.type}):`, p.models)
})
```
**检查点 3**: 查看控制台是否有错误
- 红色错误信息
- 黄色警告信息
- 404/401/403 等 HTTP 错误
### 问题 2: 所有模型回答都一样
**可能原因**:
1. **服务类型配置错误**: 检查服务类型是否为 `dashscope`
2. **Base URL 错误**: 应该是 `https://dashscope.aliyuncs.com/compatible-mode/v1`
3. **模型参数未传递**: 查看日志中的 `📋 [makeChatRequestStream] 请求体 model 字段`
4. **API 不支持该模型**: 某些 API Key 可能没有权限使用特定模型
### 问题 3: API 返回模型不一致
如果看到这样的日志:
```
✅ [响应确认] API 返回的模型: gpt-3.5-turbo
请求的模型: qwen-turbo-latest
模型匹配: ✗ 不一致!
```
**可能原因**:
1. **服务配置错误**: 可能连接到了错误的服务
2. **模型映射问题**: API 可能自动映射到了其他模型
3. **API Key 权限**: 该 API Key 可能无权使用指定模型
---
## 🔧 修复步骤
### 步骤 1: 验证服务配置
```javascript
// 在浏览器控制台执行
const providers = JSON.parse(localStorage.getItem('model-providers') || '[]')
const aliyun = providers.find(p => p.type === 'dashscope')
console.log('配置检查:')
console.log('✓ 服务类型:', aliyun.type)
console.log('✓ Base URL:', aliyun.baseUrl)
console.log('✓ API Key:', aliyun.apiKey?.substring(0, 10) + '...')
console.log('✓ 模型列表:', aliyun.models)
console.log('✓ 默认模型:', aliyun.defaultModel)
console.log('✓ 启用状态:', aliyun.enabled)
```
### 步骤 2: 重新配置模型列表
如果模型列表不正确:
```javascript
// 在浏览器控制台执行
const providers = JSON.parse(localStorage.getItem('model-providers') || '[]')
const aliyunIndex = providers.findIndex(p => p.type === 'dashscope')
if (aliyunIndex >= 0) {
// 更新模型列表
providers[aliyunIndex].models = [
'qwen-turbo-latest',
'qwq-plus',
'qwen-long',
'qwen3-omni-flash'
]
// 保存
localStorage.setItem('model-providers', JSON.stringify(providers))
console.log('✅ 模型列表已更新,请刷新页面')
setTimeout(() => location.reload(), 2000)
}
```
### 步骤 3: 测试连接
1. 进入"模型服务"设置
2. 找到阿里云服务
3. 点击"测试连接"
4. 查看是否成功
### 步骤 4: 清空缓存重试
```javascript
// 清空对话历史
localStorage.removeItem('chat-conversations')
localStorage.removeItem('chat-topics')
// 刷新页面
location.reload()
```
---
## 📊 预期日志输出示例
### 正常情况 (切换模型成功)
```
🎯 [callModelStream] 用户选择的模型: qwq-plus
✅ [callModelStream] 找到匹配服务: 阿里云通义千问
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔍 [callModelStream] 最终选择:
服务: 阿里云通义千问 (dashscope)
模型: qwq-plus
MCP: 未选择
工具: 0 个
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 [makeChatRequestStream] 准备请求参数:
服务类型: dashscope
服务名称: 阿里云通义千问
使用模型: qwq-plus
消息数量: 2
工具数量: 0
📋 [makeChatRequestStream] 请求体 model 字段: qwq-plus
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 [最终确认] 即将发送请求:
模型: qwq-plus
服务: 阿里云通义千问 (dashscope)
URL: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ [响应确认] API 返回的模型: qwq-plus
请求的模型: qwq-plus
模型匹配: ✓ 一致
```
### 异常情况 (服务未找到)
```
🎯 [callModelStream] 用户选择的模型: unknown-model
⚠️ [callModelStream] 未找到包含该模型的服务,使用默认服务
```
---
## 💡 使用建议
1. **首次使用**: 先用日志确认模型是否正确传递
2. **测试对比**: 用不同模型测试相同问题,对比回答差异
3. **性能对比**: 观察不同模型的响应速度
4. **功能测试**: 用特定模型测试其特长(如 qwq-plus 测试推理)
---
## 🆘 仍然有问题?
如果以上方法都无法解决问题,请:
1. 截图控制台完整日志
2. 记录以下信息:
- 选择的模型名称
- 服务配置(隐藏 API Key
- 完整的控制台输出
- 问题描述
3. 检查以下文件:
- `/web/src/services/chatService.ts`
- `/web/src/services/modelServiceManager.ts`
- localStorage 中的 `model-providers`
---
**现在刷新页面,选择不同的模型,查看控制台日志,你应该能看到完整的模型选择和使用流程!** 🔍✨