180 lines
6.9 KiB
Markdown
180 lines
6.9 KiB
Markdown
# AI服务错误修复说明
|
||
|
||
## 修改概述
|
||
|
||
基于错误分析报告,对AI服务进行了三项关键修复,以提高JSON生成的稳定性和准确性。
|
||
|
||
## 修改详情
|
||
|
||
### 1. 关闭思考模式 ✅
|
||
|
||
**文件**: `services/ai_service.py`
|
||
**位置**: 第254行
|
||
|
||
**修改前**:
|
||
```python
|
||
"enable_thinking": True
|
||
```
|
||
|
||
**修改后**:
|
||
```python
|
||
"enable_thinking": False # 关闭思考模式以提高JSON生成稳定性
|
||
```
|
||
|
||
**原因**:
|
||
- 思考模式可能导致模型在生成JSON时出现不稳定
|
||
- 从日志分析看,思考过程可能影响后续JSON生成的准确性
|
||
- 关闭思考模式可以提高JSON格式的稳定性
|
||
|
||
### 2. 优化提示词 ✅
|
||
|
||
**文件**: `services/ai_service.py`
|
||
**位置**: 第237行
|
||
|
||
**修改前**:
|
||
```python
|
||
"content": "你是一个专业的数据提取助手。请仔细分析用户提供的输入文本,提取所有相关信息,并严格按照指定的JSON格式返回结果。\n\n重要要求:\n1. 必须仔细阅读输入文本的每一个字,不要遗漏任何信息\n2. 对于每个字段,请从多个角度思考:直接提及、同义词、隐含信息、可推断信息\n3. 如果文本中明确提到某个信息(如性别、年龄、职务、职级、线索来源等),必须提取出来,不能设为空\n4. 特别关注性别字段:如果文本中出现\"男\"、\"女\"、\"男性\"、\"女性\"、\"先生\"、\"女士\"等任何表示性别的词汇,必须提取并转换为\"男\"或\"女\"\n5. 如果可以通过已有信息合理推断(如根据出生年月推算年龄,从单位及职务中拆分单位和职务),请进行推断并填写\n6. 只返回JSON对象,不要包含任何其他文字说明、思考过程或markdown代码块标记\n7. 字段名必须严格按照JSON示例中的字段编码,不能使用下划线前缀(如不能使用\"_professional_rank\",应使用\"target_professional_rank\";不能使用\"_source\",应使用\"clue_source\")"
|
||
```
|
||
|
||
**修改后**:
|
||
```python
|
||
"content": "你是一个专业的数据提取助手。请从输入文本中提取结构化信息,并严格按照JSON格式返回结果。\n\n核心要求:\n1. 仔细阅读输入文本,提取所有相关信息\n2. 如果文本中明确提到信息(如性别、年龄、职务、职级等),必须提取,不能设为空\n3. 性别字段:识别\"男\"、\"女\"、\"男性\"、\"女性\"等词汇,统一转换为\"男\"或\"女\"\n4. 只返回JSON对象,不要包含任何其他文字、思考过程或markdown标记\n5. 字段名必须严格按照示例格式,使用正确的字段编码:\n - 使用\"target_professional_rank\",不要使用\"_professional_rank\"\n - 使用\"clue_source\",不要使用\"_source\"或\"source\"\n - 使用\"target_organization\",不要使用\"target_organisation\"\n6. JSON格式必须完整且有效,所有字段名使用双引号"
|
||
```
|
||
|
||
**改进点**:
|
||
- 简化了提示词,使其更清晰、更直接
|
||
- 明确列出了常见的字段名错误,帮助模型避免这些错误
|
||
- 强调了JSON格式的完整性要求
|
||
- 减少了冗余说明,提高可读性
|
||
|
||
### 3. 增强JSON修复机制 ✅
|
||
|
||
#### 3.1 增强 `_fix_json_string` 方法
|
||
|
||
**文件**: `services/ai_service.py`
|
||
**位置**: 第730-790行
|
||
|
||
**新增修复规则**:
|
||
|
||
1. **修复字段名前后的转义字符和空格**
|
||
```python
|
||
# 修复 \\\" target_position \\\": 这种情况
|
||
json_str = re.sub(r'\\+["\']\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\\+["\']\s*:', r'"\1":', json_str)
|
||
```
|
||
|
||
2. **修复常见字段名错误**
|
||
```python
|
||
# 修复 _source -> clue_source
|
||
json_str = re.sub(r'"_source"\s*:', '"clue_source":', json_str)
|
||
|
||
# 修复 target_organisation -> target_organization
|
||
json_str = re.sub(r'"target_organisation"\s*:', '"target_organization":', json_str)
|
||
```
|
||
|
||
3. **修复字段名中的下划线前缀错误**
|
||
```python
|
||
# 修复 _professional_rank -> target_professional_rank
|
||
json_str = re.sub(r'"_([a-z_]+_rank)"\s*:', r'"target_\1":', json_str)
|
||
```
|
||
|
||
4. **修复值中的转义字符问题**
|
||
```python
|
||
# 修复 \"total_manager, -> "总经理",
|
||
json_str = re.sub(r':\s*\\"([^"]+?),', r': "\1",', json_str)
|
||
```
|
||
|
||
5. **修复不完整的JSON结尾**
|
||
```python
|
||
# 修复 \"\n} -> ""\n}
|
||
json_str = re.sub(r':\s*\\"\s*\n\s*}', ': ""\n}', json_str)
|
||
```
|
||
|
||
#### 3.2 增强字段名规范化映射
|
||
|
||
**文件**: `services/ai_service.py`
|
||
**位置**: 第900-930行
|
||
|
||
**新增映射**:
|
||
```python
|
||
typo_mapping = {
|
||
# ... 原有映射 ...
|
||
# 新增基于日志错误的映射
|
||
'_source': 'clue_source', # 修复 _source -> clue_source
|
||
'_professional_rank': 'target_professional_rank', # 修复 _professional_rank
|
||
'_status': 'target_political_status', # 修复 _status
|
||
'target_organisation': 'target_organization', # 修复英式拼写
|
||
'targetOrganisation': 'target_organization', # 修复英式拼写(驼峰)
|
||
}
|
||
```
|
||
|
||
#### 3.3 增强部分JSON提取
|
||
|
||
**文件**: `services/ai_service.py`
|
||
**位置**: 第650-706行
|
||
|
||
**改进点**:
|
||
- 在三个提取模式中都增加了对 `_source` -> `clue_source` 的特殊处理
|
||
- 增加了对 `target_organisation` -> `target_organization` 的拼写错误修复
|
||
- 改进了字段名清理逻辑,更好地处理转义字符
|
||
|
||
## 预期效果
|
||
|
||
1. **提高JSON生成稳定性**
|
||
- 关闭思考模式后,模型生成JSON时更加稳定
|
||
- 减少了格式错误的可能性
|
||
|
||
2. **提高字段名准确性**
|
||
- 优化后的提示词明确列出了常见错误,帮助模型避免这些错误
|
||
- 增强了字段名规范化映射,即使出现错误也能自动修复
|
||
|
||
3. **增强容错能力**
|
||
- 多层JSON修复机制可以处理各种格式错误
|
||
- 即使模型返回了格式错误的JSON,也能通过修复机制恢复
|
||
|
||
## 测试建议
|
||
|
||
1. **功能测试**
|
||
- 使用相同的输入数据测试修复后的代码
|
||
- 验证JSON生成是否稳定
|
||
- 检查字段名是否正确
|
||
|
||
2. **错误处理测试**
|
||
- 模拟各种JSON格式错误
|
||
- 验证修复机制是否能正确处理这些错误
|
||
|
||
3. **性能测试**
|
||
- 对比修复前后的响应时间
|
||
- 验证关闭思考模式后的性能提升
|
||
|
||
## 回滚方案
|
||
|
||
如果修复后出现问题,可以通过以下方式回滚:
|
||
|
||
1. **恢复思考模式**:
|
||
```python
|
||
"enable_thinking": True
|
||
```
|
||
|
||
2. **恢复原提示词**: 使用git恢复原始system prompt
|
||
|
||
3. **禁用新增的修复规则**: 注释掉新增的JSON修复代码
|
||
|
||
## 注意事项
|
||
|
||
1. 关闭思考模式可能会影响模型的推理能力,但可以提高JSON生成的稳定性
|
||
2. 如果必须使用思考模式,可以考虑调整相关参数(如限制思考过程的token数量)
|
||
3. JSON修复机制是容错措施,最佳实践是让模型生成正确的JSON,而不是依赖修复
|
||
|
||
## 后续优化建议
|
||
|
||
1. 如果问题持续存在,可以考虑:
|
||
- 进一步优化提示词
|
||
- 调整temperature等参数
|
||
- 联系模型服务提供商寻求支持
|
||
|
||
2. 监控和日志:
|
||
- 记录修复前后的错误率
|
||
- 分析仍然存在的错误模式
|
||
- 持续优化修复机制
|
||
|