ValueError: invalid literal for int() with base 10: ‘5m’

当 RAGFlow 源码运行环境中把 OLLAMA_KEEP_ALIVE 设成 Ollama 官方的时长字符串(如 5m 、 24h )时,构造 OllamaEmbed 或 OllamaCV 会因 int() 转换失败而崩溃;优先检查该环境变量是否为非整数字符串,或升级到包含修复的版本。

快速结论:当 RAGFlow 源码运行环境中把 OLLAMA_KEEP_ALIVE 设成 Ollama 官方的时长字符串(如 5m、24h)时,构造 OllamaEmbed 或 OllamaCV 会因 int() 转换失败而崩溃;优先检查该环境变量是否为非整数字符串,或升级到包含修复的版本。

适用环境:RAGFlow 源码运行(main @ 313ca90f6);macOS arm64;Python 3.13(uv sync --frozen);Ollama 0.34.3;模型 bge-m3。

最快修复方案:升级到 0.27.x 中包含 #20224(commit d030cc9)的修复版本;若暂时无法升级,可将 OLLAMA_KEEP_ALIVE 设为纯数字秒数(如 300)作为临时规避。

注意事项:该修复由社区 PR 引入并通过真实 Ollama 实例验证,但 Issue 中未列出升级后所有依赖组合的回归测试结论;临时改为数字秒数会失去 Ollama 原生时长字符串语义,仅作为过渡手段。

问题场景

用户在 macOS arm64 上以源码方式运行 RAGFlow,使用 Ollama 0.34.3 提供 embedding/vision 模型(如 bge-m3)。当按照 Ollama 文档把 OLLAMA_KEEP_ALIVE 设为时长字符串(5m 或 24h)以控制模型驻留时间时,构造 OllamaEmbed 或 OllamaCV 直接抛出单元格转换错误,导致 embedding 和 vision 模型无法初始化。即便同时显式传入 ollama_keep_alive="5m" kwarg,只要环境变量仍是时长字符串,依然会失败。

报错原文

ValueError: invalid literal for int() with base 10: '5m'

原因分析

RAGFlow 在 rag/llm/embedding_model.py 的 OllamaEmbed.__init__ 和 rag/llm/cv_model.py 的 OllamaCV.__init__ 中按如下方式读取 keep-alive:

self.keep_alive = kwargs.get("ollama_keep_alive", int(os.environ.get("OLLAMA_KEEP_ALIVE", -1)))

问题有两层:一是 Ollama 官方把 OLLAMA_KEEP_ALIVE 定义为时长字符串("5m"、"24h"),其 API 也接受同样格式,但这里直接做了 int() 转换;二是 int(os.environ.get(...)) 作为 kwargs.get 的默认值参数会被提前求值,因此即使显式传入 ollama_keep_alive="5m",只要环境变量是时长字符串,仍会在求默认值时先崩溃。该变量由 #9039 引入,目的是避免 Ollama 模型被永久固定在内存中(keep_alive=-1,参见 #8122 的 CPU 相关报告),而用户自然会填入 Ollama 文档推荐的值,结果触发此错误。

环境排查

  • 确认 OLLAMA_KEEP_ALIVE 当前取值:unset、-1、300 可正常工作;5m、24h 会触发 ValueError。
  • 确认 RAGFlow 运行方式与提交版本(Issue 为源码运行 main @ 313ca90f6)。
  • 确认 Python 版本(Issue 为 Python 3.13)及依赖安装方式(uv sync --frozen)。
  • 确认 Ollama 版本(Issue 为 0.34.3)及目标模型(bge-m3)。
  • 确认是否同时传入了 ollama_keep_alive kwarg:即使显式传入,只要环境变量为非数字字符串仍会失败。

解决步骤

  1. 优先升级到包含 #20224(commit d030cc9)的 0.27.x 修复版本;该 PR 新增 rag/llm/ollama_utils.py 辅助模块,由 OllamaEmbed 与 OllamaCV 共用:显式 kwarg 优先,否则环境变量为数字时按 int 解析、非数字时按字符串透传给 Ollama,默认值仍为 -1,并附带单元测试(在 main 上失败、打补丁后通过)。
  2. 如果暂时无法升级,可先临时规避:把 OLLAMA_KEEP_ALIVE 设为纯数字秒数(例如 Issue 验证过的 300,表示约 5 分钟),不要设成 5m 或 24h。
  3. 注意 main 分支自 #20289 起已移除该代码路径,因此 main 不受此问题影响;若你运行的是较旧的源码或 0.27.x 之前的版本,需按上述方式处理。
  4. 如果使用的是自定义部署方式而非官方镜像,确认代码中 rag/llm/embedding_model.py 与 rag/llm/cv_model.py 是否已包含 ollama_utils 的修复逻辑,避免只升级部分文件。

验证方法

修复后,在设置 OLLAMA_KEEP_ALIVE=5m 或 24h 的情况下,构造 OllamaEmbed 并执行 encode_queries('hello') 应能正常返回 embedding,不再抛出 ValueError。Issue 作者在真实 Ollama 上验证:设置 OLLAMA_KEEP_ALIVE=300 时,ollama ps 显示模型约 5 分钟后卸载,而不是一直驻留。你也可以用官方 Ollama 客户端对照确认同样参数可正常调用:Client(host=...).embed(model='bge-m3', input=['x'], keep_alive='5m'),应返回 1024 维向量。

参考来源

infiniflow/ragflow #20223

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 28372

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注