<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects | 董昊</title><link>https://donghao.ac/projects/</link><atom:link href="https://donghao.ac/projects/index.xml" rel="self" type="application/rss+xml"/><description>Projects</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-Hans</language><lastBuildDate>Sun, 19 May 2024 00:00:00 +0000</lastBuildDate><image><url>https://donghao.ac/media/icon_hu_eee4a95885829ab2.png</url><title>Projects</title><link>https://donghao.ac/projects/</link></image><item><title>mcp-dbutils（数读）</title><link>https://donghao.ac/projects/mcp-dbutils/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><guid>https://donghao.ac/projects/mcp-dbutils/</guid><description>&lt;h2 id="解决了什么问题"&gt;解决了什么问题&lt;/h2&gt;
&lt;p&gt;工业企业的数据库里躺着大量有价值的数据——生产日志、设备状态、质检记录。但让大模型直接访问数据库是危险的。mcp-dbutils 作为 MCP 协议的安全中间层，让 AI 能&lt;strong&gt;读&lt;/strong&gt;数据、&lt;strong&gt;分析&lt;/strong&gt;数据，但&lt;strong&gt;绝不修改&lt;/strong&gt;数据。&lt;/p&gt;
&lt;h2 id="怎么用"&gt;怎么用&lt;/h2&gt;
&lt;p&gt;11 个 MCP 工具，覆盖数据库分析全流程：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;做什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list-connections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列出所有可用数据库连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list-tables&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浏览所有表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;describe-table&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看表结构（列、类型、约束）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get-ddl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取建表 DDL 语句&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run-query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;执行只读 SQL（SELECT、JOIN、GROUP BY）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;explain-query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取查询执行计划&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;analyze-query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;分析查询性能并给出优化建议&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list-indexes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看表上的索引&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list-constraints&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看主键、外键、唯一约束&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get-stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取表的统计信息（行数、大小等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get-performance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取连接性能指标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="安全架构"&gt;安全架构&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只读强制&lt;/strong&gt;：所有 SQL 在发送到数据库前经过语法分析，只允许 SELECT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接隔离&lt;/strong&gt;：每个数据库连接独立管理，按需连接，自动超时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;凭证保护&lt;/strong&gt;：密码等敏感信息在日志和输出中自动屏蔽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地处理&lt;/strong&gt;：数据在本地流转，不上传到任何云端服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈&lt;/h2&gt;
&lt;p&gt;Python 3.10+ · MCP Protocol · SQLAlchemy · asyncio&lt;/p&gt;
&lt;p&gt;支持数据库：SQLite · MySQL · PostgreSQL&lt;/p&gt;
&lt;h2 id="分布与采用"&gt;分布与采用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PyPI 发布：
（&lt;code&gt;pip install mcp-dbutils&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Smithery 一键部署：
&lt;/li&gt;
&lt;li&gt;Docker 镜像支持&lt;/li&gt;
&lt;li&gt;多语言文档：中 / 英 / 法 / 西 / 阿 / 俄&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工业场景方向规划中"&gt;工业场景方向（规划中）&lt;/h2&gt;
&lt;p&gt;mcp-dbutils 正在向工业 AI Agent 方向演进。目标场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生产数据库问答&lt;/strong&gt;：工厂车间主任用自然语言问&amp;quot;上周哪条产线良率最低&amp;quot;，Agent 直接查数据库给出答案，不需要等 IT 部门写 SQL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备状态巡检&lt;/strong&gt;：Agent 定时扫描设备运行日志表，发现异常自动告警，附带历史趋势分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;供应链库存洞察&lt;/strong&gt;：多表 JOIN 分析——库存水位、交付周期、供应商历史履约率——一个提问，Agent 完成查询 + 可视化 + 建议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你来自工业企业，对以上场景有需求或想法，
。&lt;/p&gt;</description></item><item><title>NLP 预测模型 Demo</title><link>https://donghao.ac/projects/shiny-nlp/</link><pubDate>Sat, 16 Apr 2016 00:00:00 +0000</pubDate><guid>https://donghao.ac/projects/shiny-nlp/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;2016 年，Coursera 上与 Johns Hopkins 大学合作的 Data Science 专项课程的 Capstone 项目。课程以 SwiftKey 输入法为例，提供一个来自推特的英文语料库，要求我们独立完成从数据清洗到预测建模的完整流程，最终交付一个可交互的 Shiny 应用。&lt;/p&gt;
&lt;p&gt;当时读了吴军老师的《数学之美》，对自然语言处理的统计方法产生了深刻的兴趣——书中讲马尔可夫链、n-gram 模型、信息熵的那几章，直接指导了我接下来的工作。&lt;/p&gt;
&lt;h2 id="做了什么"&gt;做了什么&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据清洗与探索&lt;/strong&gt;：从原始 Twitter 语料中抽样、分词、去停用词、构建 n-gram 频率矩阵。写了一份 R Markdown 数据探索报告，分析了词频分布、Zipf 定律的实证表现、以及 blog/news/twitter 三种文本的句式差异。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;n-gram 语言模型&lt;/strong&gt;：基于马尔可夫假设构建 unigram/bigram/trigram 模型。核心挑战是处理未见过的 n-gram——模型在训练集中没见过的词组合，不能直接给零概率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Good-Turing 平滑&lt;/strong&gt;：用 $r+1$ 次出现的 n-gram 数量来重新估计 $r$ 次出现的概率，使得训练集中从未出现的 n-gram 也能获得非零概率——&amp;ldquo;从未见过&amp;quot;不等于&amp;quot;不可能出现&amp;rdquo;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shiny 交互式部署&lt;/strong&gt;：将训练好的模型打包成 R Shiny 应用，部署在 shinyapps.io 上。输入文本，实时返回下一个词的预测。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="技术栈"&gt;技术栈&lt;/h2&gt;
&lt;p&gt;R · quanteda · data.table · ggplot2 · Shiny · Good-Turing Estimation · shinyapps.io&lt;/p&gt;
&lt;h2 id="为什么值得看"&gt;为什么值得看&lt;/h2&gt;
&lt;p&gt;这是 2016 年自学完成的。没有导师、没有实验室、没有 GPU——就用一台自己组装的 PC 和 Coursera 上的课程视频。从数据清洗到数学模型到交互式部署，一条完整的独立生产线。十年后回头看，这也是我后来做 mcp-dbutils、做 AI Agent 的底层工作流原型：&lt;strong&gt;拿到数据 → 理解本质 → 建模 → 部署给人用&lt;/strong&gt;。&lt;/p&gt;</description></item></channel></rss>