项目源起
这学期选修了数据挖掘实践,第一次作业是爬取某点方圆 10-15km 的二手房信息并做数据分析。题目本身不复杂:写爬虫、洗数据、建模型、出报告。后来经过自己的拓展,这个项目从一个普通的 Jupyter Notebook,逐渐长成了一个三层架构的工具集。最终交付了三个几乎独立但层层递进的子项目:
res-value-miner/
├── homework/ # 原始作业:爬虫 + Notebook 分析
├── ai_agent/ # DeepSeek 对话式智能体
└── skills/ # Claude Code 通用数据挖掘 Skill
第一层:基础流水线
最初的实现很直接------用 DrissionPage 控制浏览器爬安居客,得到 1141 条房源数据,存为 CSV。然后用 pandas 清洗,接入高德地图 API 计算各小区到目标点的距离,统计周边 POI,最后在 Jupyter Notebook 里跑随机森林和 K-Means。
这部分的关键在于数据质量把控。原始 CSV 里经纬度是字符串,数值列混了中文字符,"房屋户型"是一个字段("2室1厅1卫")需要拆成三列。每一步不仔细都会影响后续建模。
经验 1 :爬虫脚本从第一天起就应该做到参数化 。我的 spider_dynamic.py 最开始就设计成 crawl(city, district, max_pages) 的形式,而不是把城市和区域写死在代码里。这为后来交给 Agent 自动调用埋下了伏笔。
经验 2:Notebook 和 .py 模块各司其职。Notebook 负责展示分析流程和可视化,py 模块负责可复用的核心逻辑。不要把 500 行代码全塞在一个 ipynb 里。
第二层:对话式智能体
做完基础分析后,我开始思考"包装成智能体"这件事。
最初的想法是做一个 Gradio 多 Tab 界面------Tab 1 手动采集、Tab 2 手动训练、Tab 3 手动估值、Tab 4 是 AI 对话。看起来很完整,实际上很割裂。用户在 Tab 1 填了表单,跑到 Tab 2 还要重新选城市、输经纬度。而且用户根本不知道安居客的区域命名规则------"曹路"是填 caolu 还是 曹路?
折腾了好几轮之后我意识到:Agent 的意义就是用户一句话搞定一切。四个 Tab 本身就是反模式。
于是我把前三个 Tab 全删了,整个应用缩减为一个聊天窗口。用户说"上海曹路附近 10km 的二手房行情分析",Agent 自己调 geocode → crawl → enrich → train → query,全程零手动。
技术选型上,我最终选择了原生 OpenAI SDK 做 function calling,而不是 LangChain 或 MCP。理由很简单:依赖越少,出问题时排查越快。整个 Agent 核心(agent.py)只有 200 行,ReAct 循环的每一步发生了什么一目了然。
另一个值得说的点是 DeepSeek-R1 的思考过程展示 。它的 reasoning_content 字段暴露了模型在调用每个工具之前的推理链。我把它单独流式输出到 UI 的折叠面板里------这不仅是个技术彩蛋,也方便了调试。
经验 3:不要过早优化。我最初设计了 8 个工具(geocode/crawl/enrich/train/predict/query/report/chart),每个都有完整的 JSON Schema。后来发现真正高频使用的只有 4-5 个,其余可以在需要时动态添加。
经验 4:爬虫的验证码不是 bug,是正常流程。Agent 遇到验证码应该循环等待用户手动通过,而不是自己换网站重写一个爬虫。
第三层:单文件 Skill
做完 Gradio Agent 之后,我又想:能不能再精简一层?
Gradio + DeepSeek 的方案还是需要启动一个 Web 服务、配 API Key、管理依赖。但如果把分析逻辑抽象成一段指令,让 Claude Code 直接运行呢?
这就是 skills/data-mining-agent/SKILL.md 的由来------一个 200 行的 Markdown 文件。它告诉 Claude:
- 进目录先
ls,看有没有 CSV 和 py 模块 - 用
python -c跑短代码,长逻辑写 .py 文件 - 爬虫优先复用现有 CSV,遇到验证码等用户
- 分析完主动问要不要导出报告
没有 API Key、没有 function calling、没有工具注册表。Claude 自己写代码、自己执行、自己看结果、自己迭代。
经验 5:Skill 和 MCP 是两种完全不同的范式。Skill 是"教 Claude 怎么思考",MCP 是"给 Claude 现成工具"。前者更通用但每次都要写代码,后者更快但绑定特定场景。对于数据挖掘这种开放任务,Skill 更合适。
架构演进回顾
| 阶段 | 形态 | 用户操作 | 核心依赖 |
|---|---|---|---|
| 第一层 | Jupyter Notebook | 手动改参数跑 cell | pandas/sklearn |
| 第二层 | Gradio + DeepSeek | 自然语言一句话 | 8 个工具 + ReAct |
| 第三层 | Claude Code Skill | 自然语言一句话 | 零------只靠 Claude 自身 |
每一层都比上一层更轻、更通用、更像"智能体"。
代码开源在 https://gitee.com/aiden61/res-value-miner
发表于 www.aiden.org.cn,同步至 CSDN