在Azure部署Streamlit+LangChain应用时遇issubclass类型错误
问题分析与解决方案
问题根源
从错误栈可以看出,核心问题是旧版Pydantic与Python 3.11的兼容性冲突:旧版Pydantic在处理TypedDict类型时,无法适配Python 3.11中typing模块的底层逻辑变化,导致issubclass()调用时传入非类对象触发错误。同时你的CI/CD配置存在依赖重复安装、虚拟环境与Azure Oryx构建流程冲突的问题,加剧了环境不一致性。
解决方案
1. 修复依赖版本,兼容Python 3.11
修改requirements.txt,明确指定兼容Python 3.11的Pydantic版本,确保LangChain依赖匹配:
langchain==0.0.225 streamlit openai python-dotenv pinecone-client streamlit-chat chromadb tiktoken pymssql typing-inspect==0.8.0 typing_extensions==4.5.0 # 添加兼容Python3.11的Pydantic版本 pydantic>=1.10.12
2. 调整CI/CD配置,消除环境冲突
修改Azure Pipeline的YAML配置,移除冗余的虚拟环境操作,适配Oryx自动构建流程:
stages: - stage: Build displayName: Build stage jobs: - job: BuildJob pool: vmImage: $(vmImageName) steps: - task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)' - script: | python -m pip install --upgrade pip # 直接安装到目标目录,无需虚拟环境 pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements to target directory" - task: ArchiveFiles@2 displayName: 'Archive files' inputs: rootFolderOrFile: '$(projectRoot)' includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip replaceExistingArchive: true - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip displayName: 'Upload package' artifact: drop - stage: Deploy displayName: 'Deploy Web App' dependsOn: Build condition: succeeded() jobs: - deployment: DeploymentJob pool: vmImage: $(vmImageName) environment: $(environmentName) strategy: runOnce: deploy: steps: - task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version' - task: AzureAppServiceSettings@1 displayName: 'Set App Settings' inputs: azureSubscription: 'AzureAIPocPrincipal' appName: 'test' resourceGroupName: 'AzureAIPoc' appSettings: | [ { "name": "ENABLE_ORYX_BUILD", "value": 1 }, { "name": "SCM_DO_BUILD_DURING_DEPLOYMENT", "value": 1 } # 移除POST_BUILD_COMMAND,Oryx会自动处理requirements.txt ] - task: AzureWebApp@1 displayName: 'Deploy Azure Web App : test' inputs: azureSubscription: 'AzureAIPocPrincipal' appType: 'webAppLinux' deployToSlotOrASE: true resourceGroupName: 'AzureAIPoc' slotName: 'production' appName: 'test' package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' startUpCommand: 'python -m streamlit run app/home.py --server.port 8000 --server.address 0.0.0.0'
3. 关键调整说明
- 移除虚拟环境操作:Azure App Service的Oryx构建流程会自动管理依赖环境,本地构建时的
venv会导致部署后环境路径混乱; - 删除POST_BUILD_COMMAND:Oryx会自动检测
requirements.txt并安装依赖,重复安装会引发版本冲突; - 锁定Pydantic版本:确保使用修复了Python3.11兼容性问题的Pydantic版本,避免类型处理错误。
4. 验证步骤
- 本地使用与Azure配置一致的Python版本运行应用,确认依赖安装正常;
- 重新触发CI/CD流水线,观察部署日志是否无依赖安装错误;
- 访问部署后的Web App,验证LangChain模块导入正常。
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

