基于 FastAPI+LangChain+LangGraph+Agent+Vue3+MySQL 的房产数据采集与房价预测分析平台
做了一个「房产数据采集 + AI 房价预测」全栈项目,从爬虫到 LangGraph Agent 一条龙
毕设 / 简历项目收割机来了:FastAPI + LangChain + LangGraph + Agent + Vue3 + MySQL, 数据采集、后台管理、数据分析、机器学习预测、AI 智能问答,一个项目全部覆盖。 这篇带你过一遍它的技术栈、功能,以及——最重要的是——你能从它身上学到什么、该刷哪些面试题。
很多同学找项目有个痛点:要么是纯 CRUD 管理系统,写进简历撑不起亮点;要么是纯算法项目,部署不了、演示不了。
这个「房产数据采集与房价预测分析平台」就是为了解决这个痛点而生——它是一条完整的业务闭环:
数据采集 → 数据管理 → 数据分析 → 房价预测 → AI 智能问答
以长沙六大片区(岳麓、雨花、天心、芙蓉、开福、望城)的真实房源结构为样本, 前台是仿安居客/贝壳的用户门户,后台是 17 个模块的管理系统, 中间还嵌了一个基于 LangGraph 的房产智能体「房小智」。
下面分四部分讲清楚。
一、项目技术栈
后端(全异步)
-
FastAPI + Uvicorn:异步 Web 框架,自动生成 Swagger 文档
-
Tortoise ORM + aiomysql:异步 MySQL ORM,连接池
-
PyJWT:登录态签发与角色鉴权(管理员 / 普通用户双端隔离)
爬虫
-
Aiohttp + BeautifulSoup4:异步采集引擎,支持限流、重试、代理,目标站不可用时自动降级为「模拟采集」,保证全流程任何环境都能演示
机器学习
-
scikit-learn + pandas / numpy + joblib:线性回归 vs 随机森林双模型对比训练,RMSE / MAE / R² 指标入库,模型持久化
AI 编排(项目最大的差异化亮点)
-
LangChain 1.x + LangGraph 1.x + langchain-openai:三节点状态机 Agent(意图分析 → 工具执行 → 回答生成),SSE 流式输出,未配置 API Key 时自动降级为规则引擎
前端
-
Vue 3 组合式 API + Vite:前台门户 + 后台管理双端单页应用
-
Element Plus:17 个管理模块的组件体系
-
ECharts 5:片区均价柱状图、分类饼图、模型指标趋势线
-
markdown-it + highlight.js:AI 回答的 Markdown 渲染与代码高亮
数据库
-
MySQL 8(utf8mb4):16 张业务表,从房源主表到大模型配置表
二、项目功能描述
前台门户(普通用户)
-
首页:轮播图 + 图内悬浮搜索条 + 热门词一键搜索 + 房源分类宫格 + 片区房价参考卡(点卡片直达筛选后的列表页)
-
房源列表:分类 Tab 切换(二手房/新房/租房/商铺),片区、价格区间、面积、户型、装修、朝向、近地铁、学区多维筛选,五种排序,筛选状态与 URL 同步,一键重置
-
房源详情:图片画廊(左右切换 + 计数徽章)、核心卖点宫格、首付与月供参考(等额本息估算)、一键收藏、同片区相似房源推荐
-
AI 智能助手「房小智」:自然语言找房("雨花区 100 万以内的近地铁二手房")、房价预估、片区走势查询、购房政策问答;回答流式输出,推荐房源渲染成可点击卡片直达详情页;支持多会话管理,历史会话的房源卡片可完整还原
-
个人中心:头像上传即时生效、资料修改、修改密码、我的收藏
后台管理(管理员)
-
数据管理:房源 / 片区 / 分类(带图标选择器)/ 轮播图
-
采集管理:采集任务(目标站、页数、限流、代理)+ 采集日志实时查看
-
模型管理:一键触发双模型对比训练,指标趋势曲线可视化,在线输入房源参数即可估价
-
AI 智能体配置:多厂商大模型配置热切换(DeepSeek / 通义 / Kimi 等 OpenAI 兼容接口)、系统 Prompt 在线调整、购房知识库管理、用户对话记录审计
-
用户管理:管理员信息、普通用户
三、拿到这个项目能学到什么
1. 后端工程化(不只是会写接口)
-
全异步技术栈怎么组织:async 接口、异步 ORM、连接池、SSE 流式响应
-
统一返回体 + 全局异常处理怎么设计,让前后端联调不扯皮
-
JWT 鉴权与路由守卫的双重角色校验怎么落地
-
一个出口治理一类问题:比如在统一返回体里递归把 ISO 时间规范化,全站时间格式一处修好
2. LangGraph Agent 的正确打开方式
-
不做"套壳聊天"——而是意图识别 → 工具调用 → 上下文生成的状态机编排
-
降级思维:没配 Key 用规则引擎兜底,LLM 挂了不白屏——生产环境最看重的容错设计
-
工具函数怎么把自然语言解析成查询条件("雨花区" → districtId,"100 万以内" → maxPrice)
-
结构化结果怎么和流式文本一起走 SSE 推给前端
3. 机器学习从训练到上线
-
特征工程:片区、户型、朝向这些类别特征怎么编码进模型
-
双模型对比实验、评估指标(RMSE/MAE/R²)入库与可视化
-
joblib 模型持久化 + FastAPI 在线推理服务,输出点估计和置信区间
4. 爬虫工程实践
-
异步并发、请求限流、失败重试、代理配置
-
通用选择器解析 + 数据清洗入库
-
"降级采样"思路:真实站点不可用时如何生成接近真实分布的数据保住全流程
5. 前端体验细节(演示最加分的部分)
-
流式聊天页的粘底跟随 + 防抖:用户上翻历史不被自动滚动拽回去
-
多维筛选状态与 URL 双向同步,刷新、分享链接都不丢状态
-
仿安居客的画廊、排序条、面包屑、图标选择器等组件化封装
-
ECharts 在 Vue3 里的初始化时机、响应式与销毁
6. 数据库设计
-
16 张表怎么支撑双端业务:房源主表、会话表、采集任务/日志、模型指标、大模型配置
-
一对多、多对多关系与冗余字段的取舍
四、可以去刷什么对应的面试题
FastAPI / Python 异步
-
async/await 的原理?事件循环是什么?
-
FastAPI 为什么快?和 Flask / Django 的本质区别?
-
什么是 SSE?和 WebSocket 的区别,各自适用什么场景?
-
uvicorn 和 gunicorn 是什么关系?多 worker 部署要注意什么?
-
Pydantic 的作用?接口校验失败怎么统一处理?
-
FastAPI 的依赖注入(Depends)用过吗?鉴权怎么基于它实现?
MySQL / ORM
-
索引的底层数据结构?为什么用 B+ 树而不是 B 树 / 哈希表?
-
联合索引的最左前缀原则?范围查询为什么会让后面的索引失效?
-
结合项目:房源表的 districtId / categoryId / status 该怎么建组合索引?
-
慢查询怎么排查?EXPLAIN 的关键字段有哪些?
-
事务的隔离级别?默认级别下会出现什么问题?
-
为什么选异步 ORM?Tortoise ORM 和 SQLAlchemy 的区别?
-
数据库连接池的作用?连接数怎么评估?
爬虫
-
异步爬虫比同步快在哪?aiohttp 和 requests 的本质区别?
-
怎么控制爬取频率不被封?说一个限流算法(令牌桶 / 漏桶)?
-
失败重试策略怎么设计?怎么保证重试的幂等?
-
常见反爬手段有哪些?分别怎么应对?
-
动态渲染页面(JS 加载)怎么爬?Selenium / Playwright 什么时候用?
-
数据清洗一般做哪些事?缺失值和异常值怎么处理?
-
robots 协议是什么?爬虫的法律边界在哪?
机器学习
-
线性回归的基本假设有哪些?怎么判断拟合好坏?
-
随机森林为什么比单棵决策树稳?Bagging 的原理?
-
RMSE 和 MAE 的区别?R² 是什么含义?
-
过拟合怎么发现、怎么解决?(结合项目答:限制 max_depth、控制 n_estimators)
-
训练集 / 测试集怎么切?为什么要固定 random_state?
-
类别特征编码方式有哪些?One-Hot 和 Label Encoding 怎么选?
-
特征重要性怎么看?随机森林能输出吗?
-
模型怎么上线部署?(结合项目:joblib 持久化 + FastAPI 推理接口 + 置信区间输出)
LangChain / LangGraph / Agent(AI 方向高频区)
-
什么是 Agent?ReAct 模式(思考-行动-观察)的循环是怎样的?
-
LangGraph 的状态机和 LangChain 的 Chain 有什么区别?什么场景必须用图编排?
-
意图识别有哪些实现方案?大模型分类和规则引擎各有什么优劣?怎么结合?
-
Function Calling / Tool Use 的原理?工具的 docstring 和参数描述为什么要写清楚?
-
大模型输出不稳定,工程上怎么兜底?(结合项目:规则引擎降级 + 模板回答 + 异常捕获)
-
多厂商模型怎么统一接入?(OpenAI 兼容协议、base_url 热切换)
-
RAG 的原理?向量检索和关键词检索各有什么优劣?知识库问答怎么做?
-
什么是流式输出?Token 流怎么一步步推给前端?
-
大模型的 Temperature 参数是什么?什么场景调高、什么场景调低?
-
怎么评估一个 AI 对话系统的回答质量?
Vue 3 前端
-
组合式 API 相比选项式 API解决了什么问题?setup 语法糖的本质?
-
ref 和 reactive 的区别?为什么解构 reactive 会失去响应式?
-
computed 和 watch 的区别与使用场景?
-
Vue3 的响应式为什么从 Object.defineProperty 换成 Proxy?
-
v-if 和 v-show 的区别?key 的作用?
-
组件间通信有哪些方式?provide/inject 什么场景用?
-
路由守卫怎么实现登录拦截和角色隔离?
-
长列表性能优化有哪些手段?虚拟滚动原理?
-
首屏加载慢怎么优化?(路由懒加载、分包、图片懒加载)
-
ECharts 在 SPA 里怎么正确初始化和销毁?resize 怎么监听?
项目场景题(用这个项目直接回答)
-
"讲一下你这个项目最难的地方?"——LangGraph Agent 的意图识别 + 工具调用 + SSE 流式输出整条链路
-
"如果 QPS 涨 100 倍你的系统会先在哪里挂?"——MySQL 连接池 / 同步的模型推理,引出缓存与异步任务队列
-
"爬虫数据不准确怎么办?"——结合项目答:通用选择器 + 模拟采集降级 + 后台人工修正
-
"AI 回答不可控怎么办?"——降级模板、知识库约束、意图白名单、对话记录审计
-
"为什么用两套前端?"——角色隔离、安全边界与交互形态差异
五、可以去刷什么对应的面试题
登录

后台首页

房源管理

分类信息

Prompt 配置

采集任务

采集日志

前台首页


房源列表

地图找房

ai智能回答

我的收藏

写在最后
这个项目的价值不在于"房产"这个业务本身,而在于它把爬虫、后端、数据库、机器学习、AI Agent、前端工程串成了一条真实的流水线——
面试官问任何一个环节,你都有东西可讲;答辩演示时,从采集到 AI 找房全程不冷场。
项目里所有的降级设计(无 Key 也能聊、目标站挂了也能采)保证了它在任何机器上都能跑起来,这也是它和网上大多数"跑不起来"的项目最大的区别。
觉得有用的话,点赞、在看、转发三连,下期见。
更多推荐

所有评论(0)