180 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 监控和日志:
- 记录修复前后的错误率
- 分析仍然存在的错误模式
- 持续优化修复机制