Flask集成OpenAI API遇阻:CV评分功能无法获取结果及密钥错误
问题排查与修复方案
1. 核心API Key配置错误
你的代码存在API Key配置矛盾:手动设置了openai.api_key,但创建OpenAI客户端时却尝试读取未设置的环境变量OPENAI_API_KEY,导致客户端拿到的API Key为空,触发报错。
修复二选一:
- 方案一:直接使用已设置的Key创建客户端
修改客户端初始化代码:
或者直接传入完整API Key(快速测试可用,注意不要泄露):client = OpenAI(api_key=openai.api_key)client = OpenAI(api_key='你的完整API Key') - 方案二:设置系统环境变量
启动Flask前先配置环境变量:- Windows命令行:
set OPENAI_API_KEY=你的完整API Key - Linux/macOS终端:
export OPENAI_API_KEY=你的完整API Key
再启动Flask应用,确保os.environ.get能正确读取到Key。
- Windows命令行:
2. 额外潜在问题(会导致后续功能异常)
(1)文件读取错误:无法解析PDF/Word文档
直接读取二进制文件后解码成文本会导致PDF、docx内容乱码,OpenAI无法正确分析。需要用专门库提取文本:
- 安装依赖:
pip install PyPDF2 python-docx - 替换原文件读取逻辑:
注:from PyPDF2 import PdfReader from docx import Document def extract_text(file): filename = file.filename if filename.endswith('.pdf'): reader = PdfReader(file) return '\n'.join([page.extract_text() for page in reader.pages]) elif filename.endswith('.docx'): doc = Document(file) return '\n'.join([para.text for para in doc.paragraphs]) elif filename.endswith('.txt'): try: return file.read().decode('utf-8') except UnicodeDecodeError: return file.read().decode('latin-1') else: raise ValueError("不支持的文件格式") # 在analyze_cv函数中替换原读取代码 cv_text = extract_text(request.files['cv']) job_desc_text = extract_text(request.files['job_description']).doc格式需额外依赖(如textract),可根据需求添加。
(2)OpenAI API调用问题
- 删除无用代码
openai.Completion.create; - 修正SDK调用的大小写错误,且推荐使用新版模型:
response = client.completions.create( model="gpt-3.5-turbo-instruct", # 替换为推荐的新版模型 prompt=prompt, temperature=0.7, max_tokens=1024 )
(3)结果解析逻辑脆弱
原代码依赖固定格式拆分结果,易因OpenAI返回内容变化出错。修改prompt要求结构化输出:
prompt = f"""给定以下职位描述:\n{job_desc_text}\n\n基于简历评估候选人匹配度:\n{cv_text}\n\n仅返回JSON格式结果,包含两个键:'score'(1-10的整数)和'explanation'(详细评估文本),不要添加其他内容。"""
然后解析结果:
import json result = json.loads(response.choices[0].text.strip()) score = result['score'] explanation = result['explanation']
3. 前端优化:增加用户可见的错误提示
当前前端仅在控制台打印错误,可修改catch逻辑让用户看到提示:
.catch(error => { document.getElementById('result').innerHTML = `<p style="color:red;">错误:文件分析失败,请查看后端日志。</p>`; console.error('Error:', error); });
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

