更新.gitignore文件以忽略日志文件,新增api_key.txt文件以管理API密钥,并在对话转工单和查询完整性判断模块中添加日志记录和堆栈跟踪功能,提升错误处理和调试能力。

This commit is contained in:
2025-06-20 09:43:37 +08:00
parent e0e893eb09
commit 450a632ad2
6 changed files with 196 additions and 127 deletions
+24 -10
View File
@@ -11,10 +11,23 @@ from langchain.output_parsers import PydanticOutputParser
from rag2_0.tool.ModelTool import OpenAiLLM
from dotenv import load_dotenv
import httpx
import traceback
import re
import logging
load_dotenv()
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(),
logging.FileHandler('dialogue_to_workorder.log', encoding='utf-8')
]
)
logger = logging.getLogger("dialogue_to_workorder")
# ================ 模型定义 ================
class UserQuestionAndSolution(BaseModel):
user_question: str = Field(description="用户的核心问题")
@@ -60,12 +73,13 @@ def retry_llm_call(max_retries=3, delay=2):
except Exception as e:
last_exception = e
retries += 1
print(f"LLM调用失败,正在进行第{retries}次重试: {str(e)}")
logger.warning(f"LLM调用失败,正在进行第{retries}次重试: {str(e)}")
if retries < max_retries:
time.sleep(delay*retries)
stack_trace = traceback.format_exc()
logger.error(f"LLM调用失败,堆栈跟踪信息:\n{stack_trace}")
# 所有重试都失败后,抛出最后一次的异常
print(f"LLM调用失败,已达到最大重试次数{max_retries}")
logger.error(f"LLM调用失败,已达到最大重试次数{max_retries}")
raise last_exception
return wrapper
@@ -472,8 +486,8 @@ class DialogueToWorkorder:
df = pd.read_excel(conversation_excel_path)
# 检查数据框的列
print(f"Excel文件列名: {df.columns.tolist()}")
print(f"数据总行数: {len(df)}")
logger.info(f"Excel文件列名: {df.columns.tolist()}")
logger.info(f"数据总行数: {len(df)}")
# 解析产品详情
product_detail_dict = self.parse_product_detail_excel(product_detail_excel_path)
@@ -482,7 +496,7 @@ class DialogueToWorkorder:
conversation_dict = self.group_conversations_by_id(df)
# 限制处理的会话数量为前2000个
if len(conversation_dict) > 2000:
print(f"会话总数为 {len(conversation_dict)},限制处理前2000个会话")
logger.info(f"会话总数为 {len(conversation_dict)},限制处理前2000个会话")
# 获取所有会话ID
conversation_ids = list(conversation_dict.keys())
# 只保留前2000个会话
@@ -492,7 +506,7 @@ class DialogueToWorkorder:
}
conversation_dict = limited_conversation_dict
else:
print(f"会话总数为 {len(conversation_dict)},处理全部会话")
logger.info(f"会话总数为 {len(conversation_dict)},处理全部会话")
# 使用线程池处理每个会话
workorder_dict_list = []
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
@@ -509,9 +523,9 @@ class DialogueToWorkorder:
result_workorders = future.result()
# 将每个会话的所有工单添加到总列表中
workorder_dict_list.extend(result_workorders)
print(f"完成处理会话ID: {conversation_id},生成工单数量: {len(result_workorders)}")
logger.info(f"完成处理会话ID: {conversation_id},生成工单数量: {len(result_workorders)}")
except Exception as exc:
print(f"处理会话ID: {conversation_id} 时发生错误: {exc}")
logger.error(f"处理会话ID: {conversation_id} 时发生错误: {exc}")
return workorder_dict_list
@@ -581,7 +595,7 @@ class DialogueToWorkorder:
col_letter = chr(64 + i // 26) + chr(65 + i % 26)
worksheet.column_dimensions[col_letter].width = column_widths[column]
print(f"结果已保存到 {output_file}")
logger.info(f"结果已保存到 {output_file}")
return output_file
+4 -1
View File
@@ -22,6 +22,7 @@ import os
import time
import re
import argparse
import traceback
from pathlib import Path
from rag2_0.tool.ModelTool import OpenAiLLM
from rag2_0.tool.APIKeyManager import APIKeyManager
@@ -194,8 +195,10 @@ class QueryCompletenessJudge:
retry_delay *= 2
else:
# 已达到最大重试次数,返回错误
stack_trace = traceback.format_exc()
print(f"错误: 经过 {max_retries} 次重试后仍然失败: {str(e)}")
return False, f"错误: 经过 {max_retries} 次重试后仍然失败: {str(e)}"
print(f"堆栈跟踪信息:\n{stack_trace}")
return False, f"错误: 经过 {max_retries} 次重试后仍然失败: {str(e)}\n堆栈摘要: {str(e).__class__.__name__}"
# 不应该到达这里,但为了代码完整性添加
return False, "未知错误:重试机制逻辑错误"