1. 这个项目到底在做什么先说说最原始的场景。朋友把孩子的一道几何题拍成照片发给我说“帮看看怎么解”。我盯着图片里的辅助线看了半天最后还是得先把题目文字敲进搜索引擎。这个动作重复几次之后我就琢磨能不能让 DeepSeek 这种大模型直接“看懂”照片里的题目然后把解题过程给出来于是就有了这套基于 DeepSeek 和 Dify 的智能拍照解题应用。整个项目的核心就是三件事拍照、识题、解题。拍照交给手机或网页端摄像头识题交给 OCR 文字识别解题交给 DeepSeek。而 Dify 在这里扮演的角色相当于把这三件事串联起来的流水线车间它提供可视化工作流、模型接入、接口发布这些现成能力让一个不擅长后端代码的人也能把 AI 应用做出来并跑起来。这个应用适合三类人一是家长拍下孩子作业里的难题直接拿到分步解答二是老师批量整理题目、生成讲解思路三是想入门大模型应用开发的工程师用这个轻量需求走一遍 Dify 工作流和 DeepSeek 的完整对接流程后面换成别的业务场景也只是换 Prompt 和节点的问题。1.1 传统拍照搜题为什么不够用市面上的拍照搜题 App 已经很多但它们的思路通常是“以图搜题”也就是拿图片去题库里比对找到一模一样的题再返回答案。这套逻辑在题库覆盖不到的新题、改编题、手写题面前就很吃力而且很多产品只给答案不给推导过程孩子看完还是不会做。大模型路线不存在题库的概念。DeepSeek 对数学、物理这类逻辑推理题的处理能力很强尤其是 deepseek-reasoner 这种带推理链的模型能输出完整的“先分析已知条件、再列式、最后验证”的思考过程。配合 OCR 把照片里的题目结构化提取出来就等于让模型直接读懂原题而不是依赖历史题库。这里有个容易被忽略的细节拍照解题的成败一半以上取决于题目文本的质量。图片拍摄角度倾斜、手写凌乱、数学符号识别成乱码都会直接拖垮后续推理。所以在架构设计上我没把 OCR 和 DeepSeek 当成两个独立环节而是在中间加了一层“文本清洗”节点专门处理识别结果。1.2 为什么选 DeepSeek 和 Dify 的组合DeepSeek 胜在效果和成本的平衡。它提供 OpenAI 兼容的 API调用方式和主流大模型一致但价格便宜不少而且 deepseek-chat 和 deepseek-reasoner 两个模型分工明确前者适合日常问答后者适合需要逐步推理的解题场景。如果在意数据隐私它同样支持本地部署模型权重可以完全掌握在自己手里这套方案在学校、机构这类场景里很加分。Dify 的价值在于把“模型能力”变成“可交付的应用”。如果没有 Dify我得自己写 API 封装、维护对话状态、做变量管理、再搭一个前端界面这套工程工作量比想象中大得多。Dify 社区版完全开源支持本地部署近几个版本加入了多租户能力一个实例就能给整个年级的老师划分独立空间这在教育场景里非常实用。我强调一下这不是一个“炫技”项目。它的价值在于把 AI 能力落到一个高频、具体的需求上而且整条链路的所有组件都是可替换的OCR 可以换服务商模型可以换成别的推理模型前端也可以单独对接。Dify 只是中间的胶水层这恰恰是它最可贵的特性。2. 整体架构与关键选型先别急着写代码把架构想清楚能省掉后面大量返工。这套拍照解题应用本质上是一条数据流水线图片进、文字过、答案出中间每个环节都要有清晰的输入输出。2.1 三条链路先想清楚再动手第一条链路是图片输入。用户在浏览器里拍照或上传照片Dify 工作流的开始节点接收 image 字段把它传给后续的 OCR 节点。这个环节的关键是图片不能太大否则请求会超时。我在工作流里加了压缩逻辑超过 2MB 的图先压到长边 1280 像素以内再上传识别速度和成功率都稳定很多。第二条链路是文本识别。OCR 节点是整个项目最容易出问题的环节。Dify 本身没有内置通用 OCR 能力但它的工作流支持两种做法一种是用 HTTP 请求节点直接调用云 OCR 服务另一种是用代码节点跑本地的 PaddleOCR。我最后选了前者因为部署简单、识别率高后者更适合离线环境而且需要额外准备 Python 环境和推理资源。第三条链路是模型推理。OCR 出来的文本经过清洗后进入 LLM 节点由 DeepSeek 生成解答。这里要注意DeepSeek 目前以文本处理为主图片理解能力有限所以“看题”这件事必须靠 OCR 完成模型只负责读文字和推理。这反而让架构更清晰OCR 负责知觉模型负责思考各管一段。2.2 技术选型背后的取舍部署方式上我选择了 Docker Compose 而不是单文件安装。Dify 的组件很多包括 API 服务、Worker、PostgreSQL、Redis、向量数据库等用 Compose 可以把它们一次性编排起来升级时也只要替换镜像即可。官方仓库提供了现成的 docker-compose.yaml拉下来就能跑这也是社区里最主流的部署方式网上大量 Dify 本地部署教程都是以它为底子。模型接入上我对比了三种方案直接调用 DeepSeek 官方 API、通过聚合平台调用、本地部署模型。最终我选了官方 API 作为默认方案理由很实际省心。官方 API 的稳定性最好价格也不贵足够支撑家庭和班级级别使用。本地部署作为备选方案写在文档里当数据不能出内网时切换过去部署思路和 Dify 类似权重文件加载起来并不复杂但至少得准备一块像样的显卡。还有个容易被忽略的选型Dify 版本。我强烈建议直接用最新的社区版不要照着网上的旧版教程操作——旧版的工作流节点、变量系统、模型管理界面差异很大按老教程做会出现界面都对不上的情况。Dify 的更新很频繁升级动作其实就是拉新镜像再启动数据存在 Docker 卷里不会丢没必要排斥升级。3. 实操环境部署与模型接入下面进入动手环节。我会从零开始把整套环境搭起来每一步都贴出实际操作和值得注意的坑。3.1 Dify 社区版的部署方式先准备一台 Linux 服务器或者一个长期开机的 Windows 机器装上 Docker 和 Docker Compose。Dify 官方仓库里的 docker 目录放着完整的编排文件部署最简单的路径是这样git clone https://github.com/langgenius/dify.git cd dify/docker cp .env.example .env docker compose up -d第一次启动会拉取十几个镜像时间取决于网络环境我实测在普通家庭宽带上大约 15 到 25 分钟。启动完成后浏览器访问 http://localhost/install设置管理员账号就进入 Dify 控制台了。官方默认暴露 80 和 443 端口如果服务器上已经有 Web 服务记得在 .env 里改掉端口映射再启动否则会冲突。这里有个高频问题如果访问页面出现 SSL 相关报错十有八九是你自己加了 HTTPS 反向代理但证书没配对。Dify 默认就是 HTTP 访问不需要额外配置证书。我在实际部署中见过太多次“自己给自己找麻烦”的情况先把 plain HTTP 跑通再考虑上证书。如果要把 Dify 升级到新版本操作同样简单cd dify/docker docker compose pull docker compose up -d升级前建议先备份 PostgreSQL 的数据卷。Dify 升级本身不会清数据但为了稳妥可以先docker compose down再操作避免新旧镜像交替时出现端口冲突。长期用下来我觉得 Dify 的升级体验算是开源项目里比较省心的社区也一直在修问题。3.2 在 Dify 里接入 DeepSeek进入 Dify 控制台后点击右上角头像进入“设置”找到“模型供应商”页面。DeepSeek 在官方供应商列表里可以直接添加填入你在 DeepSeek 开放平台申请的 API Key 即可。这个 Key 去 DeepSeek 官网的 API 页面注册创建按量付费充值几块钱就够测试很久。如果供应商列表里找不到 DeepSeek也可以走 OpenAI 兼容通道供应商类型选 OpenAIBase URL 填https://api.deepseek.com/v1模型名填deepseek-chat一样能连通。这种方式在 Dify 老版本上很常用也适合那些只开放了 OpenAI 兼容接口的聚合平台比如硅基流动这类服务它们也提供 DeepSeek 系列模型。接入之后记得在系统模型设置里把默认的推理模型指定为 deepseek-reasoner把聊天模型指定为 deepseek-chat。两个模型的分工我在前面提过解题这类需要逻辑推导的任务用 reasoner日常对话和文本清洗用 chat避免所有请求都走推理模型既慢又贵。3.3 工作流核心节点的搭建在 Dify 里新建一个应用类型选择 Chatflow。Dify 的 Workflow 类型适合一次处理完成后返回结果的场景Chatflow 则带对话记忆适合多轮交互。拍照解题这个场景用户一般是拍一道题问一次偶尔追问所以我选择 Chatflow既保留了多轮能力又不牺牲单次执行的效率。工作流最基础的节点编排是这样的开始节点定义输入参数 image类型为文件接收前端上传的图片。工具或代码节点接收 image调用 OCR 服务识别文字输出 raw_text。代码节点对 raw_text 做清洗去掉乱码、合并换行输出 clean_text。LLM 节点把 clean_text 和用户的问题拼接成完整 Prompt调用 deepseek-reasoner 生成解答。变量赋值节点把结果写入会话级变量方便用户后续追问时引用。结束节点将解答输出到对话界面。在 Dify 里“变量赋值”是个容易被忽略但很有用的节点。它可以把 LLM 的中间输出保存到会话级变量里这样用户下一轮追问“这一步为什么这样化简”时模型还能记得上一题的上下文。如果没有这一步Chatflow 的记忆只停留在“用户说了什么”而不是“系统解出了什么”追问的效果会差很多。4. 工作流、Prompt 与前端落地节点搭好了但真正决定体验的是节点之间的数据流和 Prompt。这一节我把关键配置逐项拆开讲。4.1 工作流编排细节以数学题为例以一道初中数学应用题为例用户上传照片OCR 识别出文字后可能还带着“图1”“第12题”这类干扰信息。我在清洗节点里用正则把它们过滤掉import re def clean_text(raw_text: str) - str: text raw_text.replace(\n\n, \n) text re.sub(r图\s*\d\s*[:], , text) text re.sub(r第\s*\d\s*题, , text) return text.strip()这个清洗步骤很不起眼但效果显著。不清洗的话模型可能把“第12题”当成题目条件或者被 OCR 的乱码符号带偏。清洗完的文本会作为消息的一部分送入 DeepSeek。LLM 节点里我配置了两条消息system 消息固定说明“你是耐心细致的中学理科教师请分步解答每一步注明公式和依据”user 消息把清洗后的题目文本和用户针对性的问题拼接起来。这里有个技巧如果只是“解题”把题目放 user 即可如果涉及多轮追问要把历史解答摘要也放进去否则模型会忘记自己上一轮算到哪。4.2 Prompt 模板设计直接给出一份可复制的 Prompt 模板。它经过多轮调试对数学、物理题型都比较稳你是一名中学理科教师擅长把复杂问题拆解成清晰的步骤。 题目 {clean_text} 用户要求 {question} 请按以下结构输出 1. 题目分析提取关键条件指出隐藏信息。 2. 解题思路说明为什么选择这个方法不直接给答案。 3. 分步求解每一步写出公式、代入过程和计算结果。 4. 答案与检查给出最终答案并说明如何反向验证。 5. 易错点提醒可选指出这类题学生常见的错误。 如果题目信息不完整或 OCR 文本有疑似错误请先提出你的疑问不要强行编造题目条件。这个模板的重点是“先分析、再思路、后步骤”的顺序。模型如果一上来就写算式很容易在第一步就出错而且读者看不懂为什么这么做强制它先写思路会让它在输出过程中保持逻辑一致。我测试过二十多道题这个结构的正确率和可读性都明显优于自由发挥。还有一个小细节最后一句“不要强行编造题目条件”很重要。OCR 识别不干净时模型倾向于脑补缺失的数字加了这句之后它会主动要求确认配合多轮对话的追问机制就能把一道识别有瑕疵的题修正过来。4.3 把能力开放出去Dify 发布 API 的方式很简单在应用的“访问 API”页面生成一个 API Key然后按 OpenAPI 文档调用。这样你可以不用 Dify 自带的聊天界面而是把能力嵌到自己的小程序、网页或者飞书机器人里。一个常见现象接口返回 403。这种情况绝大多数是因为 API Key 权限没有配置在正确的“应用”下或者请求头里没带 Authorization。Dify 的 API 是按应用维度授权的生成 Key 时要确认选对了应用调用时 Header 里必须写Authorization: Bearer KEY不能漏。如果你接的是一个独立前端建议在代理层把 Dify API 包一层不要直接把 Key 暴露给浏览器。这个 Key 等同于你应用的管理权限泄露出去任何人都能调用你的工作流消耗额度。我在本地测试时图省事直接放前端结果被爬虫扫到一天跑了几百次调用血泪教训。5. 常见问题与排查实录这一节把我踩过的坑按类别整理成速查表方便你直接对照。5.1 部署与运行期问题速查表现象可能原因解决办法浏览器访问 Dify 页面极慢首次启动在初始化数据库或镜像未拉全查看docker compose logs等待初始化完成页面报 SSL 错误反向代理配置了 HTTPS 但证书无效先去掉反代用 HTTP 直连测试docker compose up 后服务反复重启端口被占用或 .env 配置冲突检查 80/443 端口占用修改端口映射升级后旧数据“消失”卷挂载路径变化升级前记录 volumes用相同卷名启动多租户功能找不到旧版本没有需要 1.10 以上更新到最新社区版Dify 社区版 1.10 之后原生支持多租户这个功能在教育机构里很有用。管理员可以给不同老师开独立的 Workspace每个空间有自己的知识库和 API Key彼此数据隔离。如果你要部署给一个小团队共用强烈建议用最新版不要自己拼权限管理。5.2 模型层问题我在配置 DeepSeek 时遇到过几个典型报错。第一个是 “An error occurred during credentials validation”凭证验证失败。发生这个报错时先确认 API Key 是否有效可以在本地用 curl 测试curl https://api.deepseek.com/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的KEY \ -d {model:deepseek-chat,messages:[{role:user,content:hello}]}如果 curl 返回正常但 Dify 验证失败多半是模型名填错了。Dify 的模型名称必须与供应商返回的完全一致大小写、连字符都不能差把 deepseek-chat 写成 DeepSeek-Chat 都会验证失败。第二个是接口返回 403。这个问题我在 4.3 提过大多出在调用环节而非模型本身关键检查请求头和应用权限。第三个是在 Agent 节点运行时出现 “Messages tool calls need immediate results”。这个报错说明当前的模型供应商与 Agent 节点的工具调用机制不兼容DeepSeek 的 API 对 tool call 的处理要求和 OpenAI 不完全一致。解决办法有两个一是把应用改成工作流模式用 LLM 节点显式处理绕开自动 tool call二是升级 Dify 到较新版本新版本对多家模型供应商的 tool call 兼容性明显改善。5.3 工作流调试技巧Dify 工作流的调试面板非常实用可以单节点运行并查看每一步的输入输出。我调 OCR 节点时频繁出现识别文本为空最后发现是图片格式问题——PNG 截图没问题但某些手机拍的 HEIC 格式图片HTTP 请求节点解析不了。解决办法是在前端上传前做格式转换统一转为 JPEG。另一个技巧是给每个节点设置合理的超时时间。OCR 服务和 DeepSeek 推理都可能比较慢默认 60 秒超时在大题目上不够用我一般把 LLM 节点超时调到 120 秒OCR 调到 30 秒。太长的超时会让用户等待焦虑太短又会频繁失败这个数值需要根据你的实际服务响应时间调整。建议在工作流里保留一份“调试模式”用一个变量标记当前是否调试调试时在输出里附带 OCR 原始文本方便对照。上线跑了一段时间后我发现很多解答不准确不是模型问题而是 OCR 识别错了数字比如把 6 识别成 8。有了调试模式就能快速定位问题到底出在哪个环节。6. 经验心得与下一步延伸最后分享几点个人体会和扩展方向。这套基于 DeepSeek 和 Dify 的拍照解题应用从构思到跑通大概花了一个周末真正的难点不是技术而是把“识题”这个环节打磨稳定。6.1 踩坑后的选择我在实际使用中发现工作流比 Agent 模式更适合这个场景。Agent 模式虽然灵活但工具调用链条长出错排查困难工作流的每个节点都是确定的输入输出一目了然出了问题看日志就知道卡在哪。对于面向普通用户的工具型应用确定性比灵活性重要得多。另外模型选择上不要一味追求“最强推理”。deepseek-chat 在大部分常规题目上已经足够只有遇到竞赛题、综合大题时才需要切到 deepseek-reasoner。我在工作流里设计了一个判断节点当题目包含“证明”“综上”“解析”等强推理关键词时才走 reasoner 分支否则走 chat 分支这样能把成本和延迟降下来一个量级。6.2 可以继续做的方向这套架构的扩展空间很大。第一个方向是接入 Dify 知识库把教材知识点、常见模型公式、历年真题放进知识库解题前先检索相关知识点让 DeepSeek 的回答更加贴合课标而不是泛泛而谈。Dify 的知识库流水线支持文档导入、分块、向量化搭起来很快我也在准备把这一块补上。第二个方向是批量化处理。老师手里往往是一整张卷子而不是单道题。可以做一个批量上传入口OCR 识别整卷后按题号切分再由工作流循环调用 DeepSeek 逐题解答最后生成一份带解析的文档。这个需求在教辅机构里很刚性。第三个方向是多端接入。Dify 已经提供了完整的 API 和网页嵌入脚本理论上可以快速接到微信小程序、公众号、钉钉或飞书机器人里也能让第三方客户端直接连接 Dify 知识库甚至把 DeepSeek 的能力接到各种 AI 编程工具里统一使用。我目前把接口预留了但没有正式上线后续最想做的还是小程序端毕竟“掏出手机拍一下”才是拍照解题最自然的姿势。最后说一句实在话用 DeepSeek 和 Dify 搭智能拍照解题最难的不是模型调用而是把每一个环节的“脏数据”处理干净。OCR 的乱码、图片的格式、题目的歧义这些细节才是决定应用能不能真正被人用起来的生死线。希望这篇记录能帮你少走一点弯路如果你也搭过类似的应用欢迎交流你在识题环节的处理办法。
企业数字化 ERP 产品动态
相关推荐
AI-Infra-Guard:技能扫描与漏报复盘实战 周五下午三点,我在线上例会开到一半,群里突然弹出一张截图:data-service 技能三分钟前挂掉,调用端超时率直接飘红。这已经不是第一次了,我维护的内部AI技能平台已经塞了几十个技能组件——有接业务库的,有调… · 2026/9/26 8:16:05
企业级AI Agent落地实战:从Demo到生产全路径 1. 这不是“又一个AI课程”,而是企业级Agent落地的完整作战地图你有没有遇到过这样的场景:技术团队兴奋地拉出一版基于LangChain的Agent Demo,演示时能自动查天气、写周报、调API,老板点头说“不错”,但三个月后项目悄… · 2026/9/26 8:16:05
Baserow 完整指南:如何 3 条命令搭出团队能用的无代码数据库 Baserow 完整指南:如何 3 条命令搭出团队能用的无代码数据库 【免费下载链接】baserow Build databases, automations, apps & agents with AI — no code. Open source platform available on cloud and self-hosted. GDPR, HIPAA, SOC 2 compliant. Best Airt… · 2026/9/26 8:15:59
智慧文旅沉浸式体验:AI漫剧制作与AI电影后期渲染全流程实战 1. 从一条政策看智慧文旅的落地切口黑龙江推动智慧文旅沉浸式体验新空间这件事,落到技术执行层面,最值得关注的其实是两个具体方向:AI漫剧制作和AI电影后期渲染。前者解决的是文旅内容“怎么快速生产、怎么低成本试错”的问题,后者… · 2026/9/26 9:59:53
华为Atlas 300V 24G部署YOLOv5/v8:NPU推理加速卡实战全流程 大家搜“atlas部署yolo”、“atlas 300v 24g 是运算加速卡吗”的时候,大概率不是冲着地图软件去的,而是想搞明白华为昇腾(Ascend)这套AI硬件到底能不能用来跑自己的YOLO模型。我先给个明确结论:Atlas 300V 24G确实是运… · 2026/9/26 9:59:53
Python展示正态分布 正态分布在统计学中具有重要地位,被广泛用于描述现实世界中的许多随机现象。通过不同形式的正态分布模型,可以处理各种数据特征和应用场景。标准正态分布作为基础分布形式,常用于数据的标准化和统计推断;对数正态分布则用于描述对数呈正态分布的变量,如金融市场中的资产价… · 2026/9/26 9:59:47
2010 INFORMS探索60分钟内股价预测挑战 金融市场中股价波动瞬息万变,对其进行短期趋势预测一直是数据科学与金融工程领域的重要研究课题。随着高频交易与量化策略的兴起,构建精确的预测模型正逐步成为核心竞争力之一。
本文聚焦于Kaggle平台的INFORMS数据挖掘竞赛任务,围绕其背景数据、建模目标、方法实现与扩展流… · 2026/9/26 9:59:47
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46