一个基于 Dify Chatflow 的错题学习应用。项目通过两个共享 MySQL 错题库的工作流,完成“图片/PDF 错题采集 → 结构化入库 → 历史错题查询 → 同类型练习题生成”的完整链路。
当前仓库提供可导入的 DSL、数据库脚本、示例图片和实际运行截图。项目在本地 Dify 环境完成验证,仓库不包含任何模型密钥或数据库凭据。
- 接收试卷图片或 PDF 文件;
- 使用多模态模型识别题目、学生答案和正确答案;
- 提取学科、题型、难度、答案及解析等结构化字段;
- 通过迭代节点逐题写入 MySQL;
- 在对话界面生成可阅读的错题整理报告。
- 按时间、学科、题型和难度查询历史错题;
- 将数据库查询结果转换为对话可读内容;
- 根据历史错题生成指定数量的同类型练习题;
- 输出练习题、参考答案与解析,并支持 Markdown/PDF 结果处理。
flowchart LR
A["错题图片 / PDF"] --> B["多模态识别"]
B --> C["结构化错题提取"]
C --> D["迭代写入 MySQL"]
D --> E[("error_questions")]
E --> F["条件查询历史错题"]
F --> G["生成同类型练习题"]
G --> H["题目、答案与解析"]
两个 Chatflow 通过同一张 dify_database.error_questions 表协作,彼此不需要直接调用。
| 模块 | 使用方式 |
|---|---|
| Dify Chatflow | 工作流编排、条件分支、迭代和变量管理 |
| 通义千问 | 图片理解、错题结构化与同类型题生成 |
| MySQL | 错题持久化、条件检索 |
| Database 插件 | 在 Chatflow 内执行查询与写入 SQL |
| PDF Process 插件 | 将 PDF 试卷转换为可识别的图片 |
| Markdown Exporter | 处理练习结果的 Markdown/PDF 导出 |
本项目在 Dify 1.16.0-rc1 上完成验证,两个 DSL 的导出格式版本均为 0.6.0。
dify-error-question-assistant/
├── dsl/
│ ├── error-question-collector.yml
│ └── error-question-learning-assistant.yml
├── sql/
│ └── schema.sql
├── docs/
│ ├── collector-workflow.png
│ ├── collector-run-result.png
│ ├── learning-workflow.png
│ ├── query-result.png
│ ├── similar-question-result.png
│ ├── database-records.png
│ └── troubleshooting.md
├── examples/
│ └── sample-error-sheet.png
├── .env.example
├── .gitignore
└── README.md
- 已部署并能够访问 Dify;
- 已准备 MySQL 8.x;
- 已在 Dify 中配置可用的通义千问模型凭据;
- Dify 能够访问 MySQL 的主机地址和端口。
导入 DSL 时,Dify 会提示安装或确认下列插件依赖:
langgenius/tongyi:0.2.4hjlarry/database:0.0.6kalochin/pdf_process:1.0.0(错题收集助手)bowenliang123/md_exporter:3.6.9(错题智能学习助手)
在 MySQL 中执行:
mysql -u <username> -p < sql/schema.sql也可以登录 MySQL 后复制执行 sql/schema.sql 中的语句。
在 Dify 工作室中选择“导入 DSL 文件”,依次导入:
导入后检查模型节点,确保所选模型支持对应能力。错题收集工作流的图片识别节点必须使用支持视觉输入的模型。
分别打开两个应用中的 SQL Execute 节点,在 Database 插件中配置 MySQL 连接。目标数据库为:
dify_database
连接信息应在 Dify 凭据界面中配置,不要直接写进 DSL 或提交到 GitHub。
- 打开“错题收集助手”;
- 上传 示例错题图片;
- 等待图片识别、结构化解析和迭代写库完成;
- 使用以下 SQL 检查记录:
SELECT *
FROM dify_database.error_questions
ORDER BY created_at DESC
LIMIT 10;- 打开“错题智能学习助手”;
- 选择覆盖已入库记录的时间范围;
- 使用与数据库记录一致的学科、题型和难度进行查询;
- 查询成功后选择“生成同类型错题”。
例如,示例数据中的数学选择题难度为 3。如果查询难度选择 2,SQL 正常执行但会返回空结果。
error_questions 表保存以下核心字段:
| 字段 | 说明 |
|---|---|
question_text |
题目内容 |
subject |
学科 |
question_type |
题型 |
difficulty |
难度等级 1~5 |
answer |
正确答案 |
user_answer |
学生答案 |
explanation |
错题解析 |
created_at |
入库时间 |
- 多模态输入分流:根据图片或 PDF 类型进入不同处理分支,再统一聚合识别结果。
- 结构化输出校验:将模型文本整理为固定字段,降低后续 SQL 写入的不确定性。
- 批量数据处理:通过迭代节点逐条处理错题,避免把多条记录拼成一次不稳定的数据库操作。
- 工作流解耦:采集和学习两个 Chatflow 独立运行,通过共享数据库形成完整业务闭环。
- 可观察的运行结果:在 Dify 预览中保留节点状态、Token、耗时、SQL 执行和最终回复,便于排障与演示。
- 仓库不包含模型 API Key、数据库密码或 Dify API Key;
.env.example仅展示需要准备的配置项,不包含真实值;- 提交新版本 DSL 前,建议再次搜索
api_key、password、secret、token和数据库 URI; - 不建议将本地 MySQL 端口直接暴露到公网。
- 当前 Web App 地址基于本地 Dify,
localhost链接只能在部署机器上访问; - OCR 与题目结构化结果受图片清晰度和模型能力影响;
- 查询采用精确条件组合,没有匹配记录时会返回空结果;
- 导入到不同 Dify 版本后,可能需要重新选择模型或升级插件依赖。
常见问题及处理记录见 docs/troubleshooting.md。





