学伴(KnowAI)项目开发实战:从零构建一个AI驱动的在线教育平台

发布时间:2026/7/7 18:17:32

学伴(KnowAI)项目开发实战:从零构建一个AI驱动的在线教育平台 学伴KnowAI项目开发实战从零构建一个AI驱动的在线教育平台前言我为什么要做这个项目作为一名开发者我一直对“AI如何改变教育”这个话题感兴趣。市面上不缺课程——B站有海量免费视频、慕课有几千门名校课程。但有两个问题始终没解决用户看完视频不知道学没学会。没有反馈没有验证。用户不知道下一步学什么。碎片化学习东一榔头西一棒子。所以我想做一个平台让AI像学伴一样全程陪伴学习、验证效果、规划路径。这就是“学伴KnowAI”的由来。学伴的核心价值不是“提供内容”而是“提供学会的保障”。经过2个星期的开发项目已经基本完成部署在阿里云ECS上。这篇文章将完整记录开发过程、技术选型、踩坑经验和最终成果。当前进度项目已完整开发完成目前正在部署上线阶段服务器已购买待完成Docker部署和域名配置即可公网访问。一、项目全景学伴是什么1.1 一句话定位学伴是一个AI驱动的个性化学习平台——让每个学习者拥有专属的AI学伴。1.2 解决的三个核心问题问题学伴的解决方案学而不练AI智能出题学完章节自动生成测验学而不伴24小时AI对话助手随时解答疑问学而不精基于学习历史的个性化课程推荐1.3 用户角色学员购买课程、看视频、做测验、问AI、记笔记讲师发布课程、管理章节、上传知识库、看销售数据管理员审核课程、管理用户、配置秒杀1.4 一个完整的学习流程注册 → 浏览课程 → 加入购物车 → 下单支付 → 学习课程 → AI出题验证 → 获得反馈 → 推荐下一门课二、技术栈全览这个项目最大的特点就是全栈——从最前端的Vue界面到最底层的向量数据库都是我自己写的。2.1 技术栈表格层级技术用途前端框架Vue 3.4 TypeScript Vite响应式UIUI组件Element Plus Vant ECharts后台管理移动端图表后端框架FastAPI SQLAlchemy 2.0(异步)RESTful API ORM主数据库MySQL 8.0用户、课程、订单、库存文档数据库MongoDB 6聊天记录、学习笔记缓存Redis 7会话、购物车、秒杀、首页缓存搜索引擎Elasticsearch 8.10课程全文搜索消息队列RabbitMQ秒杀订单异步处理AI框架LangChain LangGraph ChromaDBRAG知识库、多Agent工作流AI模型DeepSeek API SiliconFlow BGE大语言模型 向量嵌入容器化Docker Compose一键部署所有服务2.2 为什么这样选型为什么用FastAPI而不是Django原生支持异步在调用AI API、操作Redis/ES时性能更好自动生成OpenAPI文档前后端联调省时间类型提示友好Pydantic校验让代码更健壮为什么用LangGraph而不是直接调LLM多Agent协作一个Agent负责理解用户意图一个负责检索知识库一个负责生成回答状态管理LangGraph的状态图让每个Agent能看到之前的处理结果可观测性每一步都有记录方便调试为什么用MongoDB存聊天记录对话数据是非结构化的MongoDB的文档模型很自然支持嵌套结构一条聊天记录包含多轮对话TTL索引可以自动清理过期数据三、架构设计3.1 系统架构图3.2 数据流向用户请求→ Nginx → FastAPI读操作→ 优先Redis缓存 → 缓存未命中则查MySQL/ES写操作→ MySQL → 异步同步到ES/Redis/MongoDBAI请求→ FastAPI → LangGraph工作流 → 检索ChromaDB → 调用DeepSeek → 返回结果秒杀请求→ Redis预扣库存 → RabbitMQ排队 → 异步Worker下单四、核心功能实现4.1 用户认证JWT Redis黑名单认证系统的核心逻辑用户登录成功后后端生成JWT并存入Rediskey:token:{user_id}:{jti}每次请求验证JWT签名 检查Redis中是否存在该token用户退出时从Redis删除该token实现黑名单注销# auth.py 核心逻辑asyncdefget_current_user(token:strDepends(oauth2_scheme),db:AsyncSessionDepends(get_db),redis:RedisDepends(get_redis),)-User:token_datadecode_token(token)# 检查Redis黑名单ifawaitredis.exists(ftoken:{token_data.user_id}:{token_data.jti})0:raiseHTTPException(status_code401,detailToken已失效)# 查数据库获取用户userawaitdb.get(User,token_data.user_id)returnuser设计要点Token本身不存数据库减少DB查询注销只需删除Redis keyO(1)复杂度Token有效期7天可配置4.2 秒杀系统防止超卖的完整方案秒杀是电商的经典场景也是这个项目最复杂的功能之一。我设计了一套“四层防护”方案第一层限流令牌桶每分钟只允许3000个请求进入超过的直接返回“活动太火爆”第二层Redis预扣库存活动开始前5分钟将库存加载到Redis (String类型) 抢购时执行原子DECR操作库存为0则直接返回“已抢光”第三层异步排队RabbitMQ抢到名额的用户ID写入RabbitMQ队列立即返回“排队中” 不阻塞用户提升体验第四层异步Worker下单消费者从队列读取消息真正扣减MySQL库存、生成订单 保证最终一致性恢复机制如果订单超时未支付或被取消会自动恢复Redis库存和MySQL库存让名额回到池中。代码结构# seckill.py - 抢购入口router.post(/{activity_id})asyncdefsubmit_seckill(activity_id:int,current_user:User):# 1. 限流检查ifnotawaitallow_token_bucket(redis,key,3000,3000):raiseHTTPException(429,请求过于频繁)# 2. Redis原子扣库存stockawaitredis.decr(fseckill:stock:{activity_id})ifstock0:raiseHTTPException(400,已抢光)# 3. 写入队列queue_iduuid.uuid4().hexawaitredis.rpush(seckill:queue,json.dumps({queue_id:queue_id,activity_id:activity_id,user_id:current_user.id}))return{queue_id:queue_id,status:queued}4.3 AI学伴LangGraph RAG这是项目最核心、最亮眼的功能。下面详细展开。4.3.1 知识库构建讲师上传课件PDF/DOCX/TXT后系统自动构建向量知识库文档加载使用LangChain的文档加载器读取各类格式文本分块按500 token分块重叠50 token保持语义完整性向量化使用BGE嵌入模型将文本转为向量存储存入ChromaDB持久化# 核心流程defbuild_knowledge_base(course_id:int,file_paths:list[str]):documents[]forpathinfile_paths:docsload_document(path)# 支持PDF/DOCX/TXTdocuments.extend(docs)text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)chunkstext_splitter.split_documents(documents)vectorstoreChroma.from_documents(documentschunks,embeddingembeddings,persist_directoryf./chroma_db/course_{course_id})4.3.2 智能出题工作流学员学完章节后点击“生成练习题”触发LangGraph工作流用户请求 → 意图解析 → 检索知识库 → 生成题目 → 校验题目 → 返回用LangGraph实现的多Agent协作# 状态定义classWorkflowState(TypedDict):messages:list[BaseMessage]retrieved_docs:list[Document]generated_questions:list[dict]validation_result:dict# 构建工作流图workflowStateGraph(WorkflowState)workflow.add_node(retrieve,retrieve_relevant_docs)workflow.add_node(generate,generate_questions)workflow.add_node(validate,validate_questions)workflow.add_edge(retrieve,generate)workflow.add_edge(generate,validate)效果用户点击出题后5-10秒内得到5道选择题每题包含4个选项和正确答案。前端渲染后学员可以直接作答系统自动评分。4.3.3 智能推荐工作流用户输入学习目标如“我想成为一名数据科学家需要学Python和机器学习”系统通过多Agent工作流分析意图解析Agent提取关键词Python、机器学习、数据科学家课程检索Agent从MySQL搜索匹配课程 从知识库检索相关内容推荐排序Agent综合课程销量、评分、匹配度排序生成推荐理由输出示例根据你的目标“成为数据科学家”推荐以下课程Python基础入门匹配度92%- 数据科学必备语言机器学习实战匹配度88%- 核心技能数据分析与可视化匹配度85%- 日常工作必备4.3.4 AI对话助手用户在任何页面都可以打开AI助手对话框用自然语言提问。系统按以下顺序处理知识库检索从课程知识库中搜索相关内容RAG联网搜索如果知识库找不到使用DuckDuckGo联网搜索大模型兜底以上都没有用DeepSeek生成回答特点是回答会标注来源知识库/联网/大模型让用户知道信息的可靠性。用户真实使用场景用户在学习《Python基础》时问AI“列表和元组有什么区别”AI从课程知识库中找到对应内容回答“根据课程第二章第3节的讲解列表是可变的可变序列元组是不可变的不可变序列…”4.4 秒杀崩溃恢复机制这是系统稳定性的关键设计。线上环境可能因各种原因导致秒杀处理失败需要一套保障机制问题场景Worker进程崩溃正在处理的秒杀消息丢失网络抖动导致消息处理超时数据库连接断开导致事务回滚解决方案每个秒杀消息处理时设置Redis锁TTL 30秒独立的Recovery Worker每60秒扫描一次检查是否有消息被遗忘如果发现消息的锁已过期自动将其重新入队# 崩溃恢复逻辑asyncdefrecovery_worker():whileTrue:awaitasyncio.sleep(60)forworker_idinrange(WORKER_COUNT):keyfseckill:processing:{worker_id}itemsawaitredis.lrange(key,0,-1)forrawinitems:payloadjson.loads(raw)lock_keyfseckill:lock:{payload[queue_id]}ifnotawaitredis.exists(lock_key):# 锁已过期重新入队awaitredis.rpush(seckill:queue,raw)awaitredis.lrem(key,1,raw)print(f恢复: 重新入队{payload[queue_id]})4.5 课程搜索Elasticsearch使用ES实现课程的全文检索索引设计包含titletext、descriptiontext、categorykeyword、price_minfloat、salesinteger中文分词使用IK分词器搜索更精准同步机制课程数据变更时通过RabbitMQ异步同步到ES支持的搜索方式关键词搜索支持分词分类筛选价格区间筛选排序销量/价格/最新前端体验输入关键词 → 1秒内返回匹配课程列表高亮显示匹配片段。4.6 订单超时自动取消用户下单后30分钟未支付系统自动取消并恢复库存实现方式后台独立协程每30秒扫描一次数据库查找statuspending且expire_time now()的订单逐个取消并恢复库存asyncdefscan_expired_orders():whileTrue:awaitasyncio.sleep(30)asyncwithAsyncSessionLocal()asdb:# 查找过期订单resultawaitdb.execute(select(Order).where(Order.statusOrderStatus.pending,Order.expire_timedatetime.now()))fororderinresult.scalars():# 恢复库存、更新状态awaitcancel_order(db,order)awaitdb.commit()五、踩坑与解决5.1 Dify迁移到LangGraph初期使用Dify工作流但遇到定制化困难问题Dify的节点编排灵活但无法精细控制每一步的输入输出格式解决迁移到LangGraph LangChain完全代码可控可以自定义每个Agent的逻辑5.2 Windows上调用SSL证书错误开发环境是Windows调用Dify API时遇到SSL证书验证失败问题httpx在Windows上对Cloudflare的SSL验证失败解决检测到Windows平台时自动降级为curl命令调用dify_client.py中实现了fallback5.3 DeepSeek API连接超时偶尔出现连接超时问题DeepSeek API不稳定解决实现重试机制最多3次并配置超时时间30秒降级如果DeepSeek完全不可用返回模拟数据保证功能不中断六、部署实战正在进行中6.1 为什么选择阿里云国内访问速度快学生优惠一年100多块支持Docker部署6.2 部署架构使用Docker Compose编排7个服务服务镜像端口MySQLmysql:8.03306MongoDBmongo:627017Redisredis:7-alpine6379Elasticsearchelasticsearch:8.109200RabbitMQrabbitmq:3-management5672/15672Backend自定义FastAPI镜像8000FrontendNginx托管Vue静态文件80/4436.3 部署步骤1. 购买阿里云ECS2核4G以上 2. 安装Docker和Docker Compose 3. 将项目代码推送到服务器 4. 配置.env环境变量 5. 执行 docker-compose up -d 6. 配置Nginx反向代理和SSL证书6.4 一键部署脚本# 项目根目录下执行docker-composeup-d# 查看服务状态docker-composeps# 查看日志docker-composelogs-fbackend6.5 遇到的问题内存不足ES和MySQL同时启动占用内存较大需要调整JVM参数域名解析需要配置域名解析到服务器IP等待DNS生效10-30分钟七、成果展示7.1 功能清单用户注册登录手机号密码JWT认证 Redis黑名单注销课程列表、搜索、详情ES学习计划购物车下单支付支付宝模拟秒杀活动RedisRabbitMQ订单管理学习进度追踪AI对话助手LangGraphRAGAI智能出题AI作业批改AI课程推荐讲师后台课程管理管理员后台首页缓存RedisDocker一键部署7.2 代码量后端Python代码约8000行前端Vue代码约6000行配置文件约500行八、未来优化方向8.1 短期优化视频直接上传目前视频上传依赖讲师提供外部链接后续可支持直接上传MP4并转码学习路径自动规划用户输入目标AI自动生成完整学习计划课程证书系统学完课程生成NFT证书8.2 长期扩展直播教学集成实时音视频支持直播互动移动端APP用Flutter或React Native开发独立APP学习成就系统通过ECharts生成学习数据看板九、一些思考9.1 关于AI辅助编程这个项目大量使用了AI辅助编程Copilot、ChatGPT、Cursor等。我的感受是AI能帮你写80%的模板代码但设计决策需要你自己做AI生成的代码必须逐行review否则会有隐藏bug真正有价值的是你对项目的整体理解9.2 关于全栈开发全栈开发不是“什么都会一点”而是能独立设计数据库表结构能写干净的后端API能做出能用的前端界面能把项目部署到服务器上学伴项目让我真正理解了“全栈”的含义。9.3 技术选型的思考能用的技术 ≠ 适合的技术。比如Dify虽然用起来简单但定制化困难最后迁移到了LangGraph。先跑通再优化。很多功能我是先用简单实现跑通再逐步优化。文档是最好的朋友。LangChain、FastAPI、Vue的官方文档帮了大忙。9.4 关于AI原生应用这个项目让我深刻体会到AI不是加一个聊天窗口就叫AI应用。真正的AI原生应用是把AI能力嵌入到产品的核心流程中学完自动出题 → AI学完推荐下一门 → AI有疑问立即解答 → AIAI不是外挂而是产品的一部分。十、常见问题Q部署需要什么配置的服务器A最低2核4G建议4核8GMySQL和ES比较吃内存。QDeepSeek API免费吗A注册送500万tokens正常使用够用很久。Q项目做完了可以商用吗A代码是个人项目如果商用建议替换掉ES使用费和DeepSeek API调用费。Q我想自己做一个类似的从哪里开始A建议先看一遍需求文档然后按以下顺序搭建先跑通后端FastAPI 注册登录再加课程管理再加购物车和订单再加搜索ES最后加AI功能先简单接API再考虑LangGraph写在最后从零开始做一个完整的全栈项目确实不容易。中间踩过无数坑但也学到了很多。如果你也在做类似的项目希望这篇文章能给你一些参考。几个建议代码要能跑功能再多跑不起来都是零AI是工具不是答案能用AI提高效率但别让它替你思考坚持到底做到最后你会发现最难的其实是“坚持做下去”项目还在不断完善中欢迎交流讨论。如果对部署有兴趣可以关注后续的部署实战文章。项目地址https://github.com/lcm-git/zhixue-ai 私有仓库可联系获取访问权限在线演示https://knowai.你的域名.com 部署中如果你在开发过程中遇到类似的问题欢迎在评论区交流。

相关新闻