old_main.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. # 导入 MySQL 系统组件
  2. from mysql_qa import MySQLClient, RedisClient, BM25Search
  3. # 导入 RAG 系统组件
  4. from rag_qa import VectorStore, RAGSystem
  5. # 导入配置和日志
  6. from base import logger, Config
  7. # 导入 OpenAI
  8. from openai import OpenAI
  9. # 导入时间库
  10. import time
  11. class IntegratedQASystem:
  12. def __init__(self):
  13. # 初始化日志
  14. self.logger = logger
  15. # 初始化配置
  16. self.config = Config()
  17. # 初始化 MySQL 客户端
  18. self.mysql_client = MySQLClient()
  19. # 初始化 Redis 客户端
  20. self.redis_client = RedisClient()
  21. # 初始化 BM25 搜索
  22. self.bm25_search = BM25Search(self.redis_client, self.mysql_client)
  23. try:
  24. # 初始化 OpenAI 客户端
  25. self.client = OpenAI(api_key=self.config.DASHSCOPE_API_KEY, base_url=self.config.DASHSCOPE_BASE_URL)
  26. except Exception as e:
  27. # 记录 OpenAI 初始化失败
  28. self.logger.error(f"OpenAI 客户端初始化失败: {e}")
  29. raise
  30. # 初始化向量存储
  31. self.vector_store = VectorStore()
  32. # 初始化 RAG 系统
  33. self.rag_system = RAGSystem(self.vector_store, self.call_dashscope)
  34. def call_dashscope(self, prompt):
  35. # 调用 DashScope API
  36. try:
  37. # 创建聊天完成请求
  38. completion = self.client.chat.completions.create(
  39. model=self.config.LLM_MODEL,
  40. messages=[
  41. {"role": "system", "content": "你是一个有用的助手。"},
  42. {"role": "user", "content": prompt},
  43. ]
  44. )
  45. # 返回完成结果
  46. return completion.choices[0].message.content if completion.choices else "错误:无效的 LLM 响应"
  47. except Exception as e:
  48. # 记录 LLM 调用失败
  49. self.logger.error(f"LLM 调用失败: {e}")
  50. # 返回错误信息
  51. return f"错误:LLM 调用失败 - {e}"
  52. def query(self, query, source_filter=None):
  53. # 查询集成系统
  54. start_time = time.time()
  55. # 记录查询信息
  56. self.logger.info(f"处理查询: '{query}'")
  57. # 首先尝试 MySQL 搜索
  58. answer, need_rag = self.bm25_search.search(query, threshold=0.85)
  59. if answer:
  60. # 记录 MySQL 答案
  61. self.logger.info(f"MySQL 答案: {answer}")
  62. # 计算处理时间
  63. processing_time = time.time() - start_time
  64. # 记录处理时间
  65. self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
  66. # 返回答案
  67. return answer
  68. elif need_rag:
  69. # 记录需要 RAG
  70. self.logger.info("无可靠 MySQL 答案,回退到 RAG")
  71. # 调用 RAG 系统
  72. answer = self.rag_system.generate_answer(query, source_filter=source_filter)
  73. # 记录 RAG 答案
  74. self.logger.info(f"RAG 答案: {answer}")
  75. # 计算处理时间
  76. processing_time = time.time() - start_time
  77. # 记录处理时间
  78. self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
  79. # 返回答案
  80. return answer
  81. else:
  82. # 记录无答案
  83. self.logger.info("未找到答案")
  84. # 计算处理时间
  85. processing_time = time.time() - start_time
  86. # 记录处理时间
  87. self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
  88. # 返回默认答案
  89. return "未找到答案"
  90. def main():
  91. # 初始化集成系统
  92. qa_system = IntegratedQASystem()
  93. try:
  94. # 打印欢迎信息
  95. print("\n欢迎使用集成问答系统!")
  96. print(f"支持的来源: {qa_system.config.VALID_SOURCES}")
  97. print("输入查询进行问答,输入 'exit' 退出。")
  98. while True:
  99. # 获取用户输入
  100. query = input("\n输入查询: ").strip()
  101. if query.lower() == "exit":
  102. # 记录退出日志
  103. logger.info("退出系统")
  104. # 打印退出信息
  105. print("再见!")
  106. break
  107. # 获取来源过滤
  108. source_filter = input(
  109. f"输入来源过滤 ({'/'.join(qa_system.config.VALID_SOURCES)}) (按 Enter 跳过): ").strip()
  110. if source_filter and source_filter not in qa_system.config.VALID_SOURCES:
  111. # 记录无效来源
  112. logger.warning(f"无效来源 '{source_filter}',忽略过滤")
  113. # 打印无效来源信息
  114. print(f"无效来源 '{source_filter}',继续无过滤。")
  115. source_filter = None
  116. # 执行查询
  117. answer = qa_system.query(query, source_filter)
  118. # 打印答案
  119. answer = "".join(answer)
  120. print(f"\n答案: {answer}")
  121. except Exception as e:
  122. # 记录系统错误
  123. logger.error(f"系统错误: {e}")
  124. # 打印错误信息
  125. print(f"发生错误: {e}")
  126. finally:
  127. # 关闭 MySQL 连接
  128. qa_system.mysql_client.close()
  129. if __name__ == "__main__":
  130. # 运行主程序
  131. main()