更新提示配置和AI服务内容,简化信息提取助手的描述,明确提取要求,增强对API返回内容的处理逻辑,添加调试信息以便于问题排查。
This commit is contained in:
parent
14ff607b52
commit
c7a7780e71
@ -1,9 +1,9 @@
|
||||
{
|
||||
"prompt_template": {
|
||||
"intro": "你是一个专业的信息提取助手。请仔细阅读以下输入文本,全面分析其中的所有信息,包括显式信息和可以合理推断的信息。对于每个需要提取的字段,请仔细查找文本中的相关信息,包括但不限于:直接提及的信息、隐含的信息、可以通过上下文推断的信息。",
|
||||
"intro": "请从以下输入文本中提取结构化信息。仔细分析文本内容,准确提取每个字段的值。",
|
||||
"input_text_label": "输入文本:",
|
||||
"output_fields_label": "需要提取的字段(请仔细分析每个字段,确保提取完整):",
|
||||
"json_format_label": "请严格按照以下JSON格式返回结果,只返回JSON对象,不要包含任何其他文字说明、思考过程或markdown代码块标记:",
|
||||
"json_format_label": "请严格按照以下JSON格式返回结果,只返回JSON对象,不要包含任何其他文字说明或markdown代码块标记:",
|
||||
"requirements_label": "重要要求(请严格遵守):",
|
||||
"requirements": [
|
||||
"逐字逐句仔细分析输入文本,不要遗漏任何信息",
|
||||
|
||||
@ -194,7 +194,7 @@ class AIService:
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "你是一个专业的数据提取助手,擅长从非结构化文本中准确提取结构化信息。你需要仔细分析输入文本,识别所有相关信息,并按照指定的JSON格式返回结果。请确保提取的信息准确、完整,对于能够从文本中推断出的信息也要尽量提取。"
|
||||
"content": "你是一个专业的数据提取助手。请仔细分析用户提供的输入文本,提取所有相关信息,并严格按照指定的JSON格式返回结果。只返回JSON对象,不要包含任何其他文字说明、思考过程或markdown代码块标记。"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
@ -233,21 +233,56 @@ class AIService:
|
||||
|
||||
# 提取AI返回的内容
|
||||
if 'choices' in result and len(result['choices']) > 0:
|
||||
content = result['choices'][0]['message']['content']
|
||||
raw_content = result['choices'][0]['message']['content']
|
||||
|
||||
# 处理思考过程标签(华为大模型可能返回思考过程)
|
||||
# 移除思考过程标签之前的内容,只保留实际回答
|
||||
# 根据用户提供的示例,华为大模型使用 </think> 标签
|
||||
# 调试:打印原始返回内容(前500字符)
|
||||
print(f"[AI服务] API返回的原始内容(前500字符): {raw_content[:500]}")
|
||||
|
||||
# 处理思考过程标签(支持多种可能的标签格式)
|
||||
content = raw_content
|
||||
|
||||
# 处理 </think> 标签(DeepSeek-R1常用格式)
|
||||
if '</think>' in content:
|
||||
content = content.split('</think>')[-1].strip()
|
||||
parts = content.split('</think>')
|
||||
if len(parts) > 1:
|
||||
content = parts[-1].strip()
|
||||
print(f"[AI服务] 检测到 </think> 标签,提取标签后的内容")
|
||||
|
||||
# 处理 </think> 标签
|
||||
elif '</think>' in content:
|
||||
parts = content.split('</think>')
|
||||
if len(parts) > 1:
|
||||
content = parts[-1].strip()
|
||||
print(f"[AI服务] 检测到 </think> 标签,提取标签后的内容")
|
||||
|
||||
# 处理 <reasoning>...</reasoning> 标签
|
||||
elif '<reasoning>' in content and '</reasoning>' in content:
|
||||
reasoning_start = content.find('</reasoning>')
|
||||
if reasoning_start != -1:
|
||||
content = content[reasoning_start + 11:].strip()
|
||||
print(f"[AI服务] 检测到 <reasoning> 标签,提取标签后的内容")
|
||||
|
||||
# 清理后的内容(前500字符)
|
||||
print(f"[AI服务] 清理后的内容(前500字符): {content[:500]}")
|
||||
|
||||
# 尝试解析JSON
|
||||
extracted_data = self._extract_json_from_text(content)
|
||||
if extracted_data:
|
||||
print(f"[AI服务] JSON解析成功,提取到 {len(extracted_data)} 个字段")
|
||||
return extracted_data
|
||||
|
||||
# 如果无法提取JSON,尝试从文本中提取
|
||||
return self._parse_text_response(content, output_fields)
|
||||
# 如果无法提取JSON,记录错误
|
||||
print(f"[AI服务] 警告:无法从内容中提取JSON,尝试备用解析方法")
|
||||
print(f"[AI服务] 完整内容: {content}")
|
||||
|
||||
# 尝试从文本中提取
|
||||
parsed_data = self._parse_text_response(content, output_fields)
|
||||
if parsed_data and any(v for v in parsed_data.values() if v): # 至少有一个非空字段
|
||||
print(f"[AI服务] 使用备用方法解析成功,提取到 {len(parsed_data)} 个字段")
|
||||
return parsed_data
|
||||
|
||||
# 如果所有方法都失败,抛出异常
|
||||
raise Exception(f"无法从API返回内容中提取JSON数据。原始内容长度: {len(raw_content)}, 清理后内容长度: {len(content)}。请检查API返回的内容格式是否正确。")
|
||||
else:
|
||||
raise Exception("API返回格式异常:未找到choices字段或choices为空")
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user