Azure Web App中Python集成Semantic-Kernel遇应用错误求助
在VS Code中将集成Semantic-Kernel的Python Flask应用部署到Azure Web App时,只要代码中包含import semantic_kernel或from semantic_kernel import Kernel这类语句,部署后访问Web App就会显示“:( Application Error”。
已确认信息:
- requirements.txt包含完整依赖(含
semantic-kernel==1.12.1) - 本地与Azure环境均使用Python 3.10
- 本地运行完全正常,移除Semantic-Kernel相关代码后,Azure Web App可正常访问
- 问题仅出现在
pdf_comparison.py引入Semantic-Kernel之后
1. 先获取Azure Web App的详细错误日志
“应用错误”是通用提示,必须查看具体日志才能定位问题:
- 登录Azure门户进入目标Web App,选择监控 > 日志流,实时查看启动/运行时错误
- 或者进入高级工具 > Kudu,查看
LogFiles/application目录下的日志文件,提取异常栈信息
常见触发场景:依赖安装失败、环境变量缺失、异步代码冲突。
2. 检查Semantic-Kernel依赖的系统库
Semantic-Kernel的部分底层依赖需要Azure Linux环境的系统包支持,可通过启动脚本补充安装:
创建项目根目录下的startup.sh:
apt-get update && apt-get install -y libgomp1 libssl-dev pip install -r requirements.txt gunicorn --bind=0.0.0.0 --timeout 600 app:app
然后在Azure Web App的配置 > 常规设置中,将启动命令设置为./startup.sh。
3. 修复异步代码兼容性问题
Flask默认同步运行,Semantic-Kernel的异步初始化可能导致启动阻塞:
修改pdf_comparison.py,延迟Semantic-Kernel导入并封装异步逻辑:
import fitz import asyncio import ast import os import nest_asyncio nest_asyncio.apply() # 延迟导入,避免模块加载时触发初始化错误 def get_kernel(): from semantic_kernel import Kernel # 此处添加Kernel初始化逻辑,确保环境变量已配置 kernel = Kernel() # 配置LLM等相关参数 return kernel async def main_pdf_comparison(prior_year_path, current_year_path): kernel = get_kernel() # 后续业务逻辑 print("Hello World") return prior_year_path
然后在Flask路由中调用异步函数:
# 在pdf_comparison_upload路由中修改 import asyncio ... annotated_pdf_path = asyncio.run(main_pdf_comparison(prior_year_path, current_year_path))
4. 配置Semantic-Kernel所需的环境变量
Semantic-Kernel依赖OpenAI/Azure OpenAI的密钥与端点,必须在Azure Web App中配置:
- 进入Web App的配置 > 应用程序设置
- 添加对应环境变量(根据使用场景):
AZURE_OPENAI_API_KEYAZURE_OPENAI_ENDPOINTAZURE_OPENAI_API_VERSION
缺失这些配置会导致Semantic-Kernel初始化失败,直接触发应用启动错误。
5. 排查依赖冲突
临时简化requirements.txt,只保留Flask、semantic-kernel、nest-asyncio,部署测试是否正常;若正常,再逐个添加其他依赖,定位冲突包。例如urllib3版本可能与Semantic-Kernel的底层依赖存在兼容问题,可尝试调整版本号。
内容的提问来源于stack exchange,提问作者Matt W.

