87 lines
2.1 KiB
Markdown
87 lines
2.1 KiB
Markdown
# AI意图识别JSON解析失败修复
|
||
|
||
## 问题现象
|
||
|
||
用户输入:"想看张三数据"
|
||
错误:`JSON解析失败: Unexpected end of JSON input`
|
||
|
||
## 根本原因
|
||
|
||
原代码使用的正则表达式有问题:
|
||
|
||
```javascript
|
||
const jsonMatch = jsonStr.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/)
|
||
```
|
||
|
||
这个正则使用了**非贪婪匹配** `*?`,会在遇到第一个 `}` 时就停止,导致嵌套的JSON对象被截断。
|
||
|
||
例如,对于这样的JSON:
|
||
```json
|
||
{"action":"analyzeProfile","params":{"keyword":"张三"},"confidence":0.95}
|
||
```
|
||
|
||
非贪婪匹配会在第一个 `}` (params后面的) 就停止,得到:
|
||
```json
|
||
{"action":"analyzeProfile","params":{"keyword":"张三"}
|
||
```
|
||
|
||
这是一个不完整的JSON,导致解析失败。
|
||
|
||
## 解决方案
|
||
|
||
使用更简单可靠的方法:
|
||
|
||
```javascript
|
||
// 1. 移除markdown代码块标记
|
||
jsonStr = jsonStr.replace(/```(?:json)?/g, '').replace(/```/g, '').trim()
|
||
|
||
// 2. 找到第一个{和最后一个}
|
||
const firstBrace = jsonStr.indexOf('{')
|
||
const lastBrace = jsonStr.lastIndexOf('}')
|
||
|
||
// 3. 提取完整的JSON对象
|
||
if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {
|
||
jsonStr = jsonStr.substring(firstBrace, lastBrace + 1)
|
||
}
|
||
|
||
// 4. 使用try-catch保护解析
|
||
try {
|
||
intent = JSON.parse(jsonStr)
|
||
} catch(e) {
|
||
console.error('JSON解析失败:', e.message)
|
||
console.log('失败的JSON字符串:', jsonStr)
|
||
return null
|
||
}
|
||
```
|
||
|
||
## 已应用的修复
|
||
|
||
✅ 改进了JSON提取逻辑
|
||
✅ 添加了try-catch保护
|
||
✅ 添加了详细的调试日志
|
||
✅ 添加了空值检查
|
||
|
||
## 测试建议
|
||
|
||
现在再次测试时,控制台会显示:
|
||
1. AI意图识别:原始响应
|
||
2. AI意图识别:响应类型
|
||
3. AI意图识别:提取的JSON
|
||
4. 如果失败:JSON解析失败的具体错误和完整的JSON字符串
|
||
|
||
这样可以准确定位问题所在。
|
||
|
||
## 预期结果
|
||
|
||
用户输入:"想看张三数据"
|
||
AI识别:
|
||
```json
|
||
{
|
||
"action": "analyzeProfile",
|
||
"params": {"keyword": "张三"},
|
||
"confidence": 0.95,
|
||
"reasoning": "用户想分析张三的个体画像数据"
|
||
}
|
||
```
|
||
系统执行:打开张三的个体画像页面
|