- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
3.0 KiB
3.0 KiB
知识拆解 (Dify):管理员上传课程文件(如 PDF、Word)后,Dify 工作流会自动启动,对文档进行深度分析、拆解、提炼,形成结构化的知识点,写入数据库,为后续的动态考试和课程问答提供数据基础。当然也可手动在课程编辑页面的学习资料与知识点管理中,点击重新分析。 注意是每上传一个文件就启动一次
要启动的是一个 dify 工作流 api 服务器:http://dify.ireborn.com.cn/v1 api 密钥:app-LZhZcMO6CiriLMOLB2PwUGHx workflow_id:80cc2d27-f028-4bf1-9ac0-59742ae1cdab api 文档地址(可用 mcp 工具查看):https://dify.ireborn.com.cn/app/6713de7f-d98d-4f0a-8e1d-5ad8b4496211/develop
需要提交的必填参数(全部必填):
- file(管理员上传的课程文件,单个文件,需上传)
- course_name(即课程主题)
- course_id(即课程 id)
- material_id(资料ID)
该工作流会拆解知识点后直接写入数据库
实现经验(2025-09-23)
核心实现
- 后端:
app/services/ai/knowledge_analysis.py- 知识点分析服务 - API:
POST /api/v1/courses/{id}/reanalyze- 重新分析接口 - 前端:课程编辑页面添加"重新分析"按钮,上传资料后自动触发
关键技术点
- 文件处理:先上传文件到Dify获取file_id,再调用工作流
- 调用格式:
# 1. 上传文件
POST /files/upload (multipart/form-data)
# 2. 调用工作流
POST /workflows/run (JSON格式,使用upload_file_id)
- 工作流参数(修正:file 为单对象):
{
"inputs": {
"file": {"type": "document", "transfer_method": "local_file", "upload_file_id": "file_id"},
"course_name": "课程标题",
"course_id": 课程ID,
"material_id": 资料ID
},
"response_mode": "blocking",
"user": "system_user_{course_id}"
}
- 异步处理:使用BackgroundTasks避免阻塞用户操作
- 日志规范:使用f-string格式,避免关键字参数
- 网络配置:将dify.ireborn.com.cn加入no proxy列表
验证完成
- ✅ 前端按钮正常工作,API调用成功返回200
- ✅ 后台任务正常执行,文件上传到Dify成功
- ✅ Dify工作流成功触发(workflow_run_id已生成)
- ❌ Dify工作流回调失败:尝试调用
https://aiedu.ireborn.com.cn/dev-api/system/knowledge
关键发现(2025-09-23)
问题: Dify工作流成功启动但执行失败
- 工作流ID:
80cc2d27-f028-4bf1-9ac0-59742ae1cdab - 错误:
Reached maximum retries (0) for URL http://localhost:8000/api/v1/system/knowledge(示例)
原因: Dify工作流配置的回调URL需与当前环境一致;在本地联调时应使用本地地址
解决方案:
- 修改Dify工作流配置,将回调URL改为本地地址:
http://localhost:8000/api/v1/system/knowledge - 或者在公网环境部署API端点供Dify回调
已创建回调API: POST /api/v1/system/knowledge - 接收Dify工作流的知识点数据
workflow_id: 80cc2d27-f028-4bf1-9ac0-59742ae1cdab