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": "用户想分析张三的个体画像数据"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
系统执行:打开张三的个体画像页面
|