目标:高薪面试,每一题都扎中面试官的点
一、基础篇(初级 · 简历筛选关)
Q1:Dify 的核心定位是什么?它跟 LangChain 的区别在哪?
核心定位: Dify 是一个 LLMOps 平台,提供可视化工作流编排、RAG 知识库、Agent 管理、模型网关的一站式 AI 应用开发平台。
跟 LangChain 的区别:
| 维度 | Dify | LangChain |
|---|---|---|
| 定位 | 开箱即用的平台产品 | 开发框架 / 工具库 |
| 用户 | 非技术人员也能用 | 开发者 |
| 部署 | docker-compose 一键部署 | 需要自己搭基础设施 |
| 界面 | 可视化拖拽工作流 | 纯代码 |
| 开源协议 | Apache 2.0 | MIT |
| 插件生态 | 官方市场 + 自定义 | 社区集成丰富 |
面试官问这个是想看什么: 你有没有搞清楚平台产品和框架的区别,别张口就说"都是做 LLM 应用的"。
Q2:Dify 的技术栈是什么?
- 后端:Python Flask(API)+ Celery(异步任务)
- 前端:React + TypeScript + Next.js
- 数据库:PostgreSQL + Redis
- 向量库:Weaviate(默认)/ Qdrant / Milvus
- 消息队列:Redis(默认)/ RabbitMQ
- 文件存储:本地(开发)/ S3 / OSS / Azure Blob(生产)
- 部署:Docker Compose / K8s
潜在追问:为什么用 Flask 不用 FastAPI?(参考第6课答案)
二、进阶篇(中级 · 技术面核心关)
Q3:Dify 的工作流引擎如何实现节点之间的数据传递?
答: 每个节点执行后,输出写入一个全局上下文对象(Workflow Context),下游节点通过上下文变量名引用。
工作流上下文是一个 Dict,结构如下:
{
"nodes": {
"node_id_1": { "output": "...", "status": "succeeded" },
"node_id_2": { "output": "...", "status": "succeeded" }
},
"variables": {
"user_query": "...",
"intermediate_result": "..."
}
}
关键设计:
- 每个节点执行完才写上下文,保证依赖顺序
- DAG 引擎检测到入度为 0 的节点就可以并行跑(async gather)
- 上下文用 深拷贝 隔离,防止节点污染共享数据
扩展问:如果同时跑的两个节点都写同一个变量名怎么办?
→ DAG 图不允许两个节点输出同名变量,有依赖冲突会报错。
Q4:Dify 的 RAG 知识库支持哪几种检索模式?它们的适用场景?
| 模式 | 原理 | 适用场景 |
|---|---|---|
| 向量检索 | Embedding 相似度搜索 | 语义匹配,适合需要"理解意思"的场景 |
| 全文检索 | 关键词 BM25 | 精确匹配,适合规范文档、法规条文 |
| 混合检索 | 向量 + 全文,RRF 融合 | 大部分场景的默认推荐 |
| N 选 1 检索 | 检索后让 LLM 选择最合适的 | 高精度要求的场景,但消耗更多 tokens |
追问:RRF 的 k 参数怎么调?
k 越大,排名靠后的文档权重相对提升。经验值:小数据集 k=60,大数据集 k=100。面试官通常期待你说"看召回率曲线来调"而不是"用默认值"。
Q5:Agent 模式下,Dify 怎么让 LLM 调用工具的?
标准 ReAct 循环:
用户输入
↓
LLM 思考(Thought):我需要查天气
↓
决定行动(Action):调用 get_weather(location="北京")
↓
执行函数(Observation):返回"晴天,25°C"
↓
LLM 继续思考(Thought):天气信息已拿到,回答用户
↓
输出最终答案(Final Answer)
Dify 的实现细节:
- 工具描述被注入到 system message 中,格式遵循 OpenAI function calling 协议
- 不支持 function calling 的模型以
ReAct prompt template注入 - 工具的执行结果塞回
observation交给 LLM 继续推理 - 最大迭代轮次默认 5,可配
追问:自定义工具怎么加?
Dify 支持 OpenAPI/Swagger 规范导入、API 工具(直接填 URL + 参数)、代码工具(写 Python 函数)。
Q6:Dify 的变量类型有哪些?什么时候用 String 什么时候用 Secret?
| 类型 | 用途 | 特点 |
|---|---|---|
| String | 普通文本 | 明文存储,工作流中可读 |
| Secret | API Key、密码 | 加密存储,日志脱敏,不可在界面查看明文 |
| Number | 数值 | 可参与计算 |
| Boolean | 开关 | true/false |
| File | 上传文件 | 多模态输入 |
Secret 的实现: 存库前用 Fernet 对称加密(带轮转 key),输出时自动屏蔽为 ******。
三、高级篇(高级 · 架构面决胜关)
Q7:Dify 在多租户(Multi-Tenant)场景下怎么做资源隔离?
三层隔离模型:
租户 A ──┐ ┌── Tenant DB Schema(PG Schema 隔离)
├── API Server ──┼── 独立的向量库 Collection 前缀
租户 B ──┘ └── Redis Key 前缀隔离
- 数据层:PostgreSQL 用 tenant_id 字段做行级隔离,或用 PG Schema 做物理隔离
- 模型层:每个租户可以配自己的 Provider 和 API Key
- 文件层 :S3 上用
{tenant_id}/前缀做目录隔离 - 速率层:按租户 ID 做限流配额
扩展问:如果没有企业版,怎么用社区版做多租户?
→ 社区版通过环境变量 TENANT_ID 区分,或者部署多套实例,用不同域名/Nginx 路由。
Q8:Dify 的 Provider 降级策略,如果三个 key 都不可用了怎么办?
完整链路:
请求 → 主 Provider (Key A)
↓ 失败 (AuthError)
备用 Provider (Key B)
↓ 失败 (RateLimit)
最坏情况 Provider (Key C)
↓ 失败
返回错误给用户 + 打告警日志
但还有一层兜底: 在模型网关层,还可以配置强降级模型:
dashscope/qwen-plus (主)
→ dashscope/qwen-turbo (备,便宜但够用)
→ openai/gpt-4o-mini (最后防线,贵但可靠)
面试官深层想问: 你有没有考虑过"全挂了怎么办"------答案是有损降级:
- 用缓存结果(如果有相似的历史查询)
- 直接返回兜底回复("服务繁忙,请稍后重试")
- 后台报警给运维介入
Q9:大规模生产环境下,Dify 的痛点有哪些?
真实踩坑经验(不要说"没遇到过"):
| 痛点 | 根因 | 解决方案 |
|---|---|---|
| 记忆越跑越慢 | 累积的对话记录过多 | 设置 max_token_limit + summarize 策略 |
| RAG 检索不准 | 分块策略不合理 | 换分块(Markdown 分块 / 语义分块),调 chunk_size |
| Worker 内存暴涨 | LLM 推理结果累积 | 限制同时运行的工作流数量 |
| API 响应越来越慢 | DB 没有索引 | 对 conversation_id、user_id 加索引 |
| 向量库写入压力大 | 文档导入频繁 | 批量导入 + 异步写入 + 写入队列 |
| 日志太多磁盘满 | 默认日志级别 DEBUG | 生产环境 INFO,滚动保留 7 天 |
Q10:说说 Dify 未来可能的架构演进方向?
这题考你的行业视野:
- Plugin Market 生态化 --- 像 WordPress 一样的第三方插件市场
- 实时协作 --- 多人同时编辑工作流(类似 Figma)
- Edge 部署 --- 把轻量推理推到边缘节点
- GPU 推理集成 --- 自建推理引擎,不再依赖外部 Provider
- 多模态原生 --- 视频理解、图像生成的深度集成
- AGI 编排 --- 工作流节点可以自己创建子任务并调度执行
- FastAPI 迁移 --- 社区呼声很高,但体量太大短期不会动
四、面试话术技巧
| 面试官问法 | 心里翻译 | 答题策略 |
|---|---|---|
| "你介绍一下 Dify?" | 确认你用过 | 30 秒定位 → 3 个亮点 → 1 个改进点 |
| "跟 LangChain 比呢?" | 看你会不会"站队" | 中立客观,说适用场景不同 |
| "这个 bug 怎么修?" | 看你的排查思路 | 先说"我会先看日志" → 定位 → 复现 → 修 |
| "你遇到过什么问题?" | 看你有无实战 | 1 个具体例子 + 分析过程 + 解决方案 |
| "Dify 的缺点是什么?" | 看你思考深度 | 别只说"界面不够好看" |
面试话术技巧 --- 逐题拆解
1️⃣ "介绍一下你做过的一个 Dify 项目"
❌ 低分答案:
"我用 Dify 搭了一个客服机器人,接入了飞书巴拉巴拉......"
✅ 高分框架(STAR 法则):
| 环节 | 内容 | 话术示例 |
|---|---|---|
| S - Situation | 背景 | "我们 SaaS 平台的客服每天处理 2000+ 重复咨询,决定用 AI 替代人工" |
| T - Task | 目标 | "目标是首轮解决率 ≥ 70%,人机协作模式下把人工回复量降 60%" |
| A - Action | 做了什么 | "用 Dify 搭了知识库 RAG + 工作流,知识库 5000+ 文档做了语义分块,工作流分了三级:第一步 FAQ 精确匹配,第二步 RAG 检索+LLM 生成,第三步转人工" |
| R - Result | 结果 | "上线后首轮解决率 73%,人工干预量下降 65%,用户满意度从 82% 升到 91%" |
要点: 数字!数字!数字!一个项目没有量化结果等于没做过。
2️⃣ "Dify 和 Coze/扣子 的区别"
面试官心理: 考察你能不能客观选型,而不是无脑吹开源。
正确话术结构(对比表风格,不要偏激):
"如果按维度拆的话:
产品定位上: Dify 是开源 LLMOps 平台,核心是开发者可自建、可定制、可私有化部署。Coze 是字节的 SaaS 平台,主打快速搭建和插件市场。
适用场景上: 对数据安全敏感、需要私有化部署的场景 → Dify。追求快速出原型、用字节生态(抖音、飞书)→ Coze。
灵活性上: Dify 开源你可以魔改源码,Coze 更受限于平台能力。但 Coze 的插件生态、体验细节确实比 Dify 好。
简单说: 想要自己掌控 → Dify;想要省心省力 → Coze。二选一其实要看业务需求。"
⭐ 点睛句:
"我之前选 Dify 是因为客户要求数据不出境,私有化部署是硬需求,这个前提下 Coze 完全不可选。"
3️⃣ "Dify 的缺点是什么?"
面试官心理: 你是不是只会说好话?看你的批判性思维。
❌ 错误回答:
"没什么缺点吧,挺好的......"
✅ 正确话术(1+2+1 结构):
"我很认可 Dify 这个产品,但客观讲有几个值得改进的地方:
第一, 源码质量参差不齐。早期代码有不少硬编码,比如模型参数直接写死在视图层,应该走配置层抽象。这个在新版本有改善,但历史代码还很多。
第二, 大规模部署下的运维文档不够。官方文档侧重功能使用,但对生产环境的扩缩容、备份恢复、性能调优讲得很少,需要自己踩坑。
第三, 工作流引擎的调试体验一般。节点出错了,错误信息有时不够具体,需要翻 Celery 日志才能定位。对比 n8n 的调试体验明显有差距。
当然这些不影响它在 LLMOps 领域的地位,只是希望产品更好。 ------ 这句话是保命用的 😄"
关键技巧: 先说"认可",再提缺点,最后收回来。显得你既有观点又不偏激。
4️⃣ "Dify 怎么实现 X 功能?"
面试官心理: 考察你重不重视源码,有没有真的用过。
三种情况对应三个话术:
情况A:你知道源码怎么实现
"我翻过源码,
core/model_runtime/这个目录下实现了 Provider 的注册和调用,关键文件是xxx.py......"
情况B:你知道原理但没看过代码
"我没有具体看过那块的源码,但从设计上推断,应该是通过 X 机制实现的,因为 Y 原因必须这么设计......"
情况C:你不知道
"这个我确实没有深入了解过,不过按 Dify 的整体架构思路,我猜可能是通过 X 方式实现的------当然这是推测,面试结束后我可以查证一下告诉你。"
千万不要: 不懂装懂瞎编。面试官追问两句就露馅了。
5️⃣ "遇到线上故障怎么排查?"
这是最经典的场景题。
话术模板(故障排查标准流程):
"我会按这个顺序排查:
第一步,确认故障范围。 是单个用户还是大面积用户?是新功能上线后出现的还是突然发生的?这决定了是回滚还是排查。
第二步,查日志。 先看 Dify 的
logs/app.log,再看 Celery 的 worker 日志,最后看 Nginx 的访问日志。第三步,定位类型:
现象 可能原因 API 返回 503 后端挂掉 / 数据库连接池满 LLM 回复超时 Provider 降级 / 网络问题 RAG 检索为空 向量库连接异常 / 索引丢失 工作流卡住 Worker 队列积压 / 死锁 第四步,快速止血。 如果是 Provider 挂了 → 临时切备选 key;如果是 DB 挂了 → 切只读副本保服务;如果是代码问题 → 回滚上一个版本。
第五步,事后复盘。 出完整的事故报告:根因、影响范围、修复方案、预防措施。"
⭐ 加分项:
"事后我会建一个 Playbook 文档,把这次故障的排查过程和命令都记下来,下次类似问题直接按步骤走。"
6️⃣ "你对 Dify 未来怎么看?有什么非主流观点?"
面试官心理: 考察你有没有行业思考,不是只会用工具。
"主流观点我不重复了,说几个我自己的观察:
第一,Dify 会从平台变成基础设施。 现在它像个独立产品,但未来会嵌入到大厂的 PaaS 平台里(有点像当年的 Kubernetes),变成一个 AI 编排层。阿里云、华为云都可能把它作为默认的 AI 应用底座。
第二,低代码工作流的价值被低估了。 很多人觉得工作流比代码开发效率低,但我观察到:在非技术团队(运营、产品、销售)手里,Dify 的拖拽式工作流让 AI 应用的开发民主化了。这个趋势不可逆。
第三,Dify 最大的护城河不是代码,是它的数据模型。 等你用 Dify 跑了几万条对话记录、几百个知识库、几十个工作流之后,迁移成本极高。这才是 Dify 真正的商业价值。
不过挑战也明显: 字节的 Coze 在体验上追得很紧,如果 Dify 在交互细节上不持续投入,用户可能被抢走。"
7️⃣ 面试官反问环节(你问我答)
面试官问:"你有什么想问我的?"
❌ 别问:
- "公司有零食吗?"(太水)
- "薪资范围多少?"(问 HR,不问技术面)
- "你们用 Dify 吗?"(显得你功课都没做)
✅ 好问题(分场景):
| 场景 | 问题 |
|---|---|
| 对方是技术Leader | "你们现在 LLM 应用的规模化瓶颈在哪?是推理成本、延迟、还是效果?" |
| 对方是产品负责人 | "你们是怎么权衡 AI 应用的自动化率和用户控制感的?" |
| 对方是HR | "这个岗位期待候选人加入后,前三个月的短期交付目标是什么?" |
| 通用 | "如果我有幸入职,您希望我带来什么改变?" |
8️⃣ 面试气场技巧
三不要:
- 不要背课文 --- 面试官一眼就能看出来你在背答案。用你自己的话讲。
- 不要过度包装 --- "我精通 Dify" → 追问两句源码就露馅。"我有项目经验" → 更实在。
- 不要贬低同行 --- "LangChain 太烂了" → 显得你狭隘。"LangChain 在某些场景更适合" → 显得你客观。
三要:
- 要带数据和事实 --- 永远给数字,不给形容词。"性能提升了" → "响应时间从 8s 降到 2s"
- 要说"我们"不说"我" --- 显得你有团队协作意识。如果确实是你独立完成的,再说"我"
- 要留话口 --- 回答完加一句"这是我的理解,您看还有补充吗?" 把对话变成交流
⭐ 压轴:如果你的项目经验不够,怎么回答?
"坦白说,我 Dify 的实战项目经验不算特别多,但我花了大量时间研究它的源码和架构设计。刚才聊到的 X、Y、Z 这些机制我都深入看过。如果入职,我有信心在一周内上手接手现有项目。"
------诚意 + 学习能力,比假装有经验强一万倍。