test_qwen_api.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. """
  2. Qwen API 连通性测试脚本
  3. 验证 API Key 和模型名称是否可用
  4. """
  5. import os
  6. import sys
  7. # 手动读取 .env(避免引入项目依赖)
  8. # .env 位于项目根目录(tools/ 的上一级)
  9. _tools_dir = os.path.dirname(os.path.abspath(__file__))
  10. _project_root = os.path.dirname(_tools_dir)
  11. env_file = os.path.join(_project_root, ".env")
  12. # 兼容:若项目根目录无 .env,回退到 tools/ 目录
  13. if not os.path.exists(env_file):
  14. env_file = os.path.join(_tools_dir, ".env")
  15. if os.path.exists(env_file):
  16. for line in open(env_file):
  17. line = line.strip()
  18. if line and not line.startswith("#") and "=" in line:
  19. key, _, val = line.partition("=")
  20. os.environ.setdefault(key.strip(), val.strip())
  21. API_KEY = os.environ.get("QWEN_API_KEY", "")
  22. BASE_URL = os.environ.get("QWEN_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1")
  23. MODEL = os.environ.get("QWEN_MODEL", "qwen-plus")
  24. MAX_TOKENS = int(os.environ.get("QWEN_MAX_TOKENS", "4096"))
  25. TEMPERATURE = float(os.environ.get("QWEN_TEMPERATURE", "0.1"))
  26. BLUE = "\033[34m"
  27. GREEN = "\033[32m"
  28. RED = "\033[31m"
  29. YELLOW = "\033[33m"
  30. RESET = "\033[0m"
  31. print(f"\n{BLUE}╔══════════════════════════════════════╗{RESET}")
  32. print(f"{BLUE}║ Qwen API 连通性测试 ║{RESET}")
  33. print(f"{BLUE}╚══════════════════════════════════════╝{RESET}\n")
  34. # 检查配置
  35. print(f"{YELLOW}[配置]{RESET}")
  36. print(f" API Key: {API_KEY[:16]}...{API_KEY[-4:]}" if len(API_KEY) > 20 else f" API Key: {API_KEY or '(空)'}")
  37. print(f" Base URL: {BASE_URL}")
  38. print(f" Model: {MODEL}")
  39. print(f" MaxTokens:{MAX_TOKENS}")
  40. print(f" Temp: {TEMPERATURE}\n")
  41. if not API_KEY:
  42. print(f"{RED}[错误] QWEN_API_KEY 为空,请先填入 .env 文件{RESET}")
  43. sys.exit(1)
  44. # 引入 openai
  45. try:
  46. from openai import OpenAI
  47. except ImportError:
  48. print(f"{RED}[错误] 缺少 openai 包,请先安装: pip install openai{RESET}")
  49. sys.exit(1)
  50. print(f"{YELLOW}[测试1] 基础连通性 — 发送简单问候...{RESET}")
  51. client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
  52. messages = [
  53. {"role": "system", "content": "你是一个药典助手,用中文简短回答。"},
  54. {"role": "user", "content": "你好,请用一句话介绍自己。"},
  55. ]
  56. try:
  57. resp = client.chat.completions.create(
  58. model=MODEL,
  59. messages=messages,
  60. max_tokens=256,
  61. temperature=TEMPERATURE,
  62. )
  63. answer = resp.choices[0].message.content or ""
  64. usage = resp.usage
  65. print(f"{GREEN} ✓ 调用成功!{RESET}")
  66. print(f" 回答: {answer[:200]}")
  67. print(f" Token用量: 输入={usage.prompt_tokens}, 输出={usage.completion_tokens}")
  68. print(f" Model: {resp.model}\n")
  69. except Exception as e:
  70. print(f"{RED} ✗ 失败: {e}{RESET}\n")
  71. sys.exit(1)
  72. # 测试2:模拟药典查询场景(测试长回答能力)
  73. print(f"{YELLOW}[测试2] 药典场景 — 查询药品信息...{RESET}")
  74. messages2 = [
  75. {
  76. "role": "system",
  77. "content": (
  78. "你是中华药典AI助手,知识来源为《中华人民共和国药典》。"
  79. "回答须基于药典原文,不得编造。回答格式:结论 → 原文引用 → 来源标注。"
  80. ),
  81. },
  82. {
  83. "role": "user",
  84. "content": "请模拟回答:阿莫西林的贮藏条件是什么?(即使没有检索到原文,也要模拟格式示范)",
  85. },
  86. ]
  87. try:
  88. resp2 = client.chat.completions.create(
  89. model=MODEL,
  90. messages=messages2,
  91. max_tokens=MAX_TOKENS,
  92. temperature=TEMPERATURE,
  93. )
  94. answer2 = resp2.choices[0].message.content or ""
  95. usage2 = resp2.usage
  96. print(f"{GREEN} ✓ 调用成功!{RESET}")
  97. print(f" 回答: {answer2[:300]}...")
  98. print(f" Token用量: 输入={usage2.prompt_tokens}, 输出={usage2.completion_tokens}")
  99. print(f" Model: {resp2.model}\n")
  100. except Exception as e:
  101. print(f"{RED} ✗ 失败: {e}{RESET}\n")
  102. # 总结
  103. print(f"{BLUE}══════════════════════════════════════{RESET}")
  104. print(f"{GREEN} API Key 验证通过,Qwen API 可用!{RESET}")
  105. print(f"{GREEN} 下一步:docker compose up -d 启动全栈环境{RESET}")
  106. print(f"{BLUE}══════════════════════════════════════{RESET}\n")