unsupported operand type(s) for +: 'NoneType' and 'NoneType'

2026年01月02日 15:50 状态: processing

🚨 错误信息

Traceback (most recent call last): File "D:\.workspace\zzz\python\hello_langchain\5_streaming\1_streaming.py", line 12, in <module> for chunk in llm.stream("what color is the sky?"): File "D:\programs\anaconda3\envs\hello_langchain\Lib\site-packages\langchain_core\language_models\chat_models.py", line 522, in stream for chunk in self._stream(input_messages, stop=stop, **kwargs): File "D:\programs\anaconda3\envs\hello_langchain\Lib\site-packages\langchain_openai\chat_models\base.py", line 883, in _stream generation_chunk = self._convert_chunk_to_generation_chunk( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\programs\anaconda3\envs\hello_langchain\Lib\site-packages\langchain_openai\chat_models\base.py", line 715, in _convert_chunk_to_generation_chunk _create_usage_metadata(token_usage) if token_usage else None ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\programs\anaconda3\envs\hello_langchain\Lib\site-packages\langchain_openai\chat_models\base.py", line 2929, in _create_usage_metadata total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens) ~~~~~~~~~~~~~^~~~~~~~~~~~~~~ TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

🤖 AI解决方案

代码报错分析报告

1. 错误翻译


原文:TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'
译文:类型错误:不支持 'NoneType' 和 'NoneType' 之间的加法运算

2. 原因分析

这是一个 TypeError 类型错误,发生在 LangChain 与 OpenAI 集成的代码中:

  • 根本原因:尝试将两个 None 值相加,Python 无法对 None 类型执行加法运算

  • 错误位置

  • - 文件:langchain_openai\chat_models\base.py 第 2929 行
    - 函数:_create_usage_metadata()
  • 上下文分析

  • - oai_token_usage.get("total_tokens", input_tokens + output_tokens) 这行代码有问题
    - 当 input_tokensoutput_tokens 都是 None 时,input_tokens + output_tokens 会引发错误
    - get() 方法的第二个参数应该是默认值,但这里的默认值计算本身会报错

    3. 解决方案

    临时修复方案(修改依赖库):


    python

    找到文件:langchain_openai/chat_models/base.py 第2929行


    修改前:


    total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens)

    修改后:


    total_tokens = oai_token_usage.get("total_tokens")
    if total_tokens is None and input_tokens is not None and output_tokens is not None:
    total_tokens = input_tokens + output_tokens
    elif total_tokens is None:
    total_tokens = 0 # 或者其他合适的默认值

    推荐解决方案(升级库版本):


    bash

    升级 LangChain-OpenAI 到最新版本


    pip install --upgrade langchain-openai

    或重新安装完整环境


    pip uninstall langchain-openai langchain
    pip install langchain-openai

    备用解决方案(检查API密钥和配置):


    python
    from langchain_openai import ChatOpenAI

    确保正确配置API密钥


    import os
    os.environ["OPENAI_API_KEY"] = "your-api-key-here"

    创建模型实例时指定正确的模型名称


    llm = ChatOpenAI(
    model="gpt-3.5-turbo", # 或 "gpt-4"
    temperature=0
    )

    4. ️ 预防措施

    ️ 最佳实践:


  • 版本管理:保持依赖库最新,使用固定版本号避免不兼容问题

  • bash
    # 在 requirements.txt 中固定版本
    langchain-openai==0.1.0

  • 防御性编程:处理可能为 None 的值时,先进行类型检查

  • python
    # 正确做法
    if value1 is not None and value2 is not None:
    result = value1 + value2
    else:
    result = default_value

    调试建议:


  • 使用 try-except 包装可能出错的部分

  • 打印中间变量值,确认 token_usage 数据的结构

  • 检查 OpenAI API 响应格式是否符合预期
  • 版本兼容性:


  • 这个问题常见于 LangChain-OpenAI 库的某些版本

  • 查看 GitHub Issues 是否有类似问题的修复方案

  • 考虑降级到更稳定的版本:

  • bash
    pip install langchain-openai==0.0.5

    ---
    总结:这是一个 LangChain-OpenAI 库的内部 bug,需要升级库版本或修改源码临时修复。建议优先升级到最新版本。