test_rag.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. """
  2. RAG系统测试脚本
  3. 用于验证系统各个组件是否正常工作
  4. """
  5. import os
  6. import sys
  7. from dotenv import load_dotenv
  8. # 加载环境变量
  9. load_dotenv()
  10. def test_api_key():
  11. """测试API Key配置"""
  12. print("\n=== 测试1: API Key配置 ===")
  13. # 检查DeepSeek API Key
  14. openai_api_key = os.getenv("OPENAI_API_KEY")
  15. dashscope_api_key = os.getenv("DASHSCOPE_API_KEY")
  16. openai_ok = True
  17. dashscope_ok = True
  18. if not openai_api_key:
  19. print("❌ 未配置 OPENAI_API_KEY (DeepSeek)")
  20. print(" 请在 .env 文件中添加: OPENAI_API_KEY=your-deepseek-api-key")
  21. openai_ok = False
  22. else:
  23. print(f"✅ OPENAI_API_KEY 已配置 (长度: {len(openai_api_key)})")
  24. if not dashscope_api_key:
  25. print("❌ 未配置 DASHSCOPE_API_KEY (用于Embedding)")
  26. print(" 请在 .env 文件中添加: DASHSCOPE_API_KEY=your-dashscope-api-key")
  27. dashscope_ok = False
  28. else:
  29. print(f"✅ DASHSCOPE_API_KEY 已配置 (长度: {len(dashscope_api_key)})")
  30. # 打印模型配置
  31. model_name = os.getenv("MODEL_NAME", "deepseek-chat")
  32. api_base = os.getenv("OPENAI_API_BASE", "https://api.deepseek.com/v1")
  33. embedding_model = os.getenv("EMBEDDING_MODEL", "text-embedding-v3")
  34. print(f"\n模型配置:")
  35. print(f" LLM模型: {model_name}")
  36. print(f" API地址: {api_base}")
  37. print(f" Embedding模型: {embedding_model}")
  38. return openai_ok and dashscope_ok
  39. def test_pdf_file():
  40. """测试PDF文件是否存在"""
  41. print("\n=== 测试2: PDF文件检查 ===")
  42. pdf_path = r"D:\investment\疯狂的里海 · 投资方法论 — 基于 367 篇投资周记提炼.pdf"
  43. if os.path.exists(pdf_path):
  44. file_size = os.path.getsize(pdf_path) / (1024 * 1024) # MB
  45. print(f"✅ PDF文件存在")
  46. print(f" 路径: {pdf_path}")
  47. print(f" 大小: {file_size:.2f} MB")
  48. return True
  49. else:
  50. print(f"❌ PDF文件不存在")
  51. print(f" 路径: {pdf_path}")
  52. print(" 请检查文件路径是否正确")
  53. return False
  54. def test_dependencies():
  55. """测试依赖包是否安装"""
  56. print("\n=== 测试3: 依赖包检查 ===")
  57. required_packages = {
  58. 'langchain': 'langchain',
  59. 'langchain_community': 'langchain-community',
  60. 'langchain_core': 'langchain-core',
  61. 'langchain_text_splitters': 'langchain-text-splitters',
  62. 'fitz': 'pymupdf', # PyMuPDF
  63. 'chromadb': 'chromadb',
  64. 'dashscope': 'dashscope',
  65. }
  66. all_installed = True
  67. for module_name, package_name in required_packages.items():
  68. try:
  69. __import__(module_name)
  70. print(f"✅ {package_name} 已安装")
  71. except ImportError:
  72. print(f"❌ {package_name} 未安装")
  73. print(f" 安装命令: pip install {package_name}")
  74. all_installed = False
  75. return all_installed
  76. def test_embedding_model():
  77. """测试Embedding模型"""
  78. print("\n=== 测试4: Embedding模型 ===")
  79. try:
  80. from langchain_community.embeddings import DashScopeEmbeddings
  81. api_key = os.getenv("DASHSCOPE_API_KEY")
  82. if not api_key:
  83. print("⚠️ 跳过测试(API Key未配置)")
  84. return None
  85. # 创建Embedding模型
  86. embedding_model = DashScopeEmbeddings(
  87. model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
  88. dashscope_api_key=api_key
  89. )
  90. # 测试向量化
  91. test_text = "这是一个测试文本"
  92. embedding = embedding_model.embed_query(test_text)
  93. print(f"✅ Embedding模型正常工作")
  94. print(f" 使用模型: {os.getenv('EMBEDDING_MODEL', 'text-embedding-v3')}")
  95. print(f" 向量维度: {len(embedding)}")
  96. print(f" 前5个值: {embedding[:5]}")
  97. return True
  98. except Exception as e:
  99. print(f"❌ Embedding模型测试失败")
  100. print(f" 错误: {str(e)}")
  101. return False
  102. def test_llm_model():
  103. """测试大语言模型"""
  104. print("\n=== 测试5: 大语言模型 ===")
  105. try:
  106. from langchain_openai import ChatOpenAI
  107. api_key = os.getenv("OPENAI_API_KEY")
  108. api_base = os.getenv("OPENAI_API_BASE", "https://api.deepseek.com/v1")
  109. model_name = os.getenv("MODEL_NAME", "deepseek-chat")
  110. if not api_key:
  111. print("⚠️ 跳过测试(API Key未配置)")
  112. return None
  113. # 创建LLM(使用DeepSeek)
  114. llm = ChatOpenAI(
  115. model=model_name,
  116. openai_api_key=api_key,
  117. openai_api_base=api_base,
  118. temperature=0.7
  119. )
  120. # 测试调用
  121. test_message = "你好,请回复'测试成功'"
  122. response = llm.invoke(test_message)
  123. print(f"✅ 大语言模型正常工作")
  124. print(f" 使用模型: {model_name}")
  125. print(f" API地址: {api_base}")
  126. print(f" 测试问题: {test_message}")
  127. print(f" 模型回复: {response.content}")
  128. return True
  129. except Exception as e:
  130. print(f"❌ 大语言模型测试失败")
  131. print(f" 错误: {str(e)}")
  132. return False
  133. def test_rag_system():
  134. """测试完整的RAG系统"""
  135. print("\n=== 测试6: RAG系统完整性 ===")
  136. try:
  137. # 添加路径
  138. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  139. # 导入RAG系统
  140. import importlib.util
  141. spec = importlib.util.spec_from_file_location("rag_task", "./02_RAG_task.py")
  142. rag_module = importlib.util.module_from_spec(spec)
  143. spec.loader.exec_module(rag_module)
  144. RAGSystem = rag_module.RAGSystem
  145. print("✅ RAG系统模块加载成功")
  146. return True
  147. except Exception as e:
  148. print(f"❌ RAG系统测试失败")
  149. print(f" 错误: {str(e)}")
  150. return False
  151. def main():
  152. """运行所有测试"""
  153. print("=" * 60)
  154. print("RAG系统诊断测试")
  155. print("=" * 60)
  156. # 运行测试
  157. results = {
  158. "API Key配置": test_api_key(),
  159. "PDF文件检查": test_pdf_file(),
  160. "依赖包检查": test_dependencies(),
  161. }
  162. # 如果API Key配置正确,运行额外测试
  163. if results["API Key配置"]:
  164. results["Embedding模型"] = test_embedding_model()
  165. results["大语言模型"] = test_llm_model()
  166. else:
  167. results["Embedding模型"] = None
  168. results["大语言模型"] = None
  169. results["RAG系统"] = test_rag_system()
  170. # 总结
  171. print("\n" + "=" * 60)
  172. print("测试总结")
  173. print("=" * 60)
  174. passed = sum(1 for v in results.values() if v is True)
  175. failed = sum(1 for v in results.values() if v is False)
  176. skipped = sum(1 for v in results.values() if v is None)
  177. for test_name, result in results.items():
  178. if result is True:
  179. status = "✅ 通过"
  180. elif result is False:
  181. status = "❌ 失败"
  182. else:
  183. status = "⚠️ 跳过"
  184. print(f"{test_name}: {status}")
  185. print(f"\n总计: {passed} 通过, {failed} 失败, {skipped} 跳过")
  186. if failed == 0 and passed > 0:
  187. print("\n🎉 所有测试通过!系统准备就绪。")
  188. print("\n运行以下命令启动系统:")
  189. print(" python 02_RAG_task.py")
  190. elif failed > 0:
  191. print("\n⚠️ 部分测试失败,请检查上述错误信息。")
  192. else:
  193. print("\n⚠️ 请先配置 API Key 和安装依赖包。")
  194. if __name__ == "__main__":
  195. main()