# 导入 MySQL 系统组件
from mysql_qa import MySQLClient, RedisClient, BM25Search
# 导入 RAG 系统组件
from rag_qa import VectorStore, RAGSystem
# 导入配置和日志
from base import logger, Config
# 导入 OpenAI
from openai import OpenAI
# 导入时间库
import time
class IntegratedQASystem:
def __init__(self):
# 初始化日志
self.logger = logger
# 初始化配置
self.config = Config()
# 初始化 MySQL 客户端
self.mysql_client = MySQLClient()
# 初始化 Redis 客户端
self.redis_client = RedisClient()
# 初始化 BM25 搜索
self.bm25_search = BM25Search(self.redis_client, self.mysql_client)
try:
# 初始化 OpenAI 客户端
self.client = OpenAI(api_key=self.config.DASHSCOPE_API_KEY, base_url=self.config.DASHSCOPE_BASE_URL)
except Exception as e:
# 记录 OpenAI 初始化失败
self.logger.error(f"OpenAI 客户端初始化失败: {e}")
raise
# 初始化向量存储
self.vector_store = VectorStore()
# 初始化 RAG 系统
self.rag_system = RAGSystem(self.vector_store, self.call_dashscope)
def call_dashscope(self, prompt):
# 调用 DashScope API
try:
# 创建聊天完成请求
completion = self.client.chat.completions.create(
model=self.config.LLM_MODEL,
messages=[
{"role": "system", "content": "你是一个有用的助手。"},
{"role": "user", "content": prompt},
]
)
# 返回完成结果
return completion.choices[0].message.content if completion.choices else "错误:无效的 LLM 响应"
except Exception as e:
# 记录 LLM 调用失败
self.logger.error(f"LLM 调用失败: {e}")
# 返回错误信息
return f"错误:LLM 调用失败 - {e}"
def query(self, query, source_filter=None):
# 查询集成系统
start_time = time.time()
# 记录查询信息
self.logger.info(f"处理查询: '{query}'")
# 首先尝试 MySQL 搜索
answer, need_rag = self.bm25_search.search(query, threshold=0.85)
if answer:
# 记录 MySQL 答案
self.logger.info(f"MySQL 答案: {answer}")
# 计算处理时间
processing_time = time.time() - start_time
# 记录处理时间
self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
# 返回答案
return answer
elif need_rag:
# 记录需要 RAG
self.logger.info("无可靠 MySQL 答案,回退到 RAG")
# 调用 RAG 系统
answer = self.rag_system.generate_answer(query, source_filter=source_filter)
# 记录 RAG 答案
self.logger.info(f"RAG 答案: {answer}")
# 计算处理时间
processing_time = time.time() - start_time
# 记录处理时间
self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
# 返回答案
return answer
else:
# 记录无答案
self.logger.info("未找到答案")
# 计算处理时间
processing_time = time.time() - start_time
# 记录处理时间
self.logger.info(f"查询处理耗时 {processing_time:.2f}秒")
# 返回默认答案
return "未找到答案"
def main():
# 初始化集成系统
qa_system = IntegratedQASystem()
try:
# 打印欢迎信息
print("\n欢迎使用集成问答系统!")
print(f"支持的来源: {qa_system.config.VALID_SOURCES}")
print("输入查询进行问答,输入 'exit' 退出。")
while True:
# 获取用户输入
query = input("\n输入查询: ").strip()
if query.lower() == "exit":
# 记录退出日志
logger.info("退出系统")
# 打印退出信息
print("再见!")
break
# 获取来源过滤
source_filter = input(f"输入来源过滤 ({'/'.join(qa_system.config.VALID_SOURCES)}) (按 Enter 跳过): ").strip()
if source_filter and source_filter not in qa_system.config.VALID_SOURCES:
# 记录无效来源
logger.warning(f"无效来源 '{source_filter}',忽略过滤")
# 打印无效来源信息
print(f"无效来源 '{source_filter}',继续无过滤。")
source_filter = None
# 执行查询
answer = qa_system.query(query, source_filter)
# 打印答案
answer = "".join(answer)
print(f"\n答案: {answer}")
except Exception as e:
# 记录系统错误
logger.error(f"系统错误: {e}")
# 打印错误信息
print(f"发生错误: {e}")
finally:
# 关闭 MySQL 连接
qa_system.mysql_client.close()
if __name__ == "__main__":
# 运行主程序
main()