workflow app logs search chinese failed

用户在执行 Dify 工作流(Workflow)时,创建了工作流运行日志。之后在日志搜索功能中输入中文关键词(如“中文”)进行检索,但无法返回匹配的结果。该场景下 Dify 版本为 1.14.2,使用 Docker 方式自托管部署。

workflow app logs search chinese failed

workflow app logs search chinese failed

快速结论:该错误发生在 Dify 工作流日志搜索中,当用户输入中文关键词时无法匹配到已存储的记录。优先排查是否使用了 Dify v1.11.0 及以上版本,并检查数据库记录中中文字符是否以 \uXXXX 格式存储。

问题场景

用户在执行 Dify 工作流(Workflow)时,创建了工作流运行日志。之后在日志搜索功能中输入中文关键词(如“中文”)进行检索,但无法返回匹配的结果。该场景下 Dify 版本为 1.14.2,使用 Docker 方式自托管部署。

报错原文

workflow_run.inputs = json.dumps(json_converter.to_json_encodable(execution.inputs))
# 中文 store as \u4e2d\u6587

# search with LIKE pattern
keyword_like_val = f"%{escaped_keyword}%"
WorkflowRun.inputs.ilike(keyword_like_val, escape="\\")
# keyword match failed

原因分析

该问题由 PR #30450 引入(合并到 v1.11.0 版本)。该 PR 重构了 LIKE 模式转义逻辑用于安全防护,但移除了之前用于匹配存储在数据库中的 \uXXXX 格式中文字符的 unicode_escape 编码转换。

核心机制:json.dumps() 默认参数 ensure_ascii=True,导致中文字符(如“中文”)被存储为 \u4e2d\u6587 等 Unicode 转义序列。旧代码在搜索前会将关键词也转换为相同的转义格式后再执行查询,而新的 escape_like_pattern() 函数只处理 LIKE 通配符(%_\)的转义,但未执行 unicode-escape 转换,导致原始中文字符关键词无法匹配存储的 \uXXXX 序列。

环境排查

  • Dify 版本:检查是否 >= v1.11.0(问题由此版本引入)
  • 数据库内容:检查 workflow_run 表中 inputsoutputs 字段,确认中文字符是否以 \uXXXX 格式存储
  • 部署方式:Docker 或源码部署均可复现

解决步骤

  1. 方案一(可优先尝试):在搜索路径中恢复 unicode-escape 转换。在构建 LIKE 模式之前,将关键词执行 .encode('unicode_escape').decode('utf-8') 转换(即恢复到 v1.11.0 之前的行为)。
  2. 方案二(长期推荐):修复序列化存储方式。在 json.dumps() 调用时添加参数 ensure_ascii=False,使中文字符直接以原始字符形式存储到数据库中。注意此方案需要对已有记录执行数据迁移。
  3. 具体修改位置:参考 Issue #37367 中的根因分析,定位到 libs/helper.py 中的 escape_like_pattern 函数以及存储 inputs/outputs 的相关代码。

验证方法

在修复后,重新发起工作流日志搜索:

  • 输入中文关键词(如“中文”),确认搜索结果能匹配到对应记录。
  • 检查 SQL 查询日志,确认 LIKE 子句中的关键词已被正确编码。
  • 对于方案二,检查新创建的记录中 inputs/outputs 字段是否直接存储原始中文字符而非 \uXXXX 序列。

参考来源

langgenius/dify #37445

根因分析详见:langgenius/dify #37367

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 7940

发表回复

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