在 本地大模型如何 “问数” Excel(计划篇)中讲了构思,这篇是实现。如果阁下看过前篇文章就知道我们以前为某企业已经用 Dify + 本地大模型搞了一个数据库问数平台。但这次 Excel 问数不打算走这个路线,而是开发一个 Excel MCP,用于搭配任何 AI 形式,无论是流程编排型还是 Agent 型。文章里我们还说了更倾向 Agent 形式。也就是:本地大模型 + MCP + 上下文管理 + 工具权限管理 + 约束规则 + 指标库 + ...
Excel MCP 搞完后,我们在 OpenCode 中测试发现效果其实很好。随后我们试着用社区数据库 MCP 测试效果,其实也非常好,甚至比以前我们那个更好。也就是说 Agent 模式是能很好实现问数的。
但难点是约束大模型的行为。于是我们花费不少时间改良 Harness 。最终就成了我们称之为 AgentDesk 的智能应用。它能问数也能处理一些日常问答。
Excel MCP
前篇文章解释过为什么要用 Excel MCP 而不是大模型直接分析。但查询 Excel 如何实现呢?可以用 Pandas 库。我们最终选择在 DuckDB MCP 基础上增加对 Excel 的支持。实现过程如下:
必要工作
MCP 在每次需要建立连接时自动 INSTALL/LOAD excel.duckdb_extension,通过扩展模块拿到 read_xlsx 的能力,否则 DuckDB 不认识 Excel。这个动作在读表结构和查询时都会执行。
读表结构
开发了 describe_excel 工具。并通过 Prompt 告诉大模型在调用其他工具前先调用该工具。因为如果大模型不知道 Excel 表结构就只能通过用户的提问乱猜,这非常容易出现幻觉。
分析表结构前需要先 zipfile 解析工作薄,因为 DuckDB 没有 list_sheets 只有针对 sheet 的 API。
最终 describe_excel 会把表结构以及少许行列样例给大模型,大模型阅读后就会知道表头位置、多少行、多少列、每列是什么等等。
执行查询
复用已有的 execute_query。SQL 由大模型根据表结构和用户提问现场生成。数据源由 read_xlsx 工具读取 Excel 提供。
各种坑
Excel 作为非标准数据结构,Excel MCP 和大模型需要诸多合作才能处理合并单元格、数据质量(比如金额带 ¥)、表头不在第一行、不带计算缓存的公式单元等等情况。填这些坑其实还挺繁琐的,就此不再细述。
AgentDesk
AgentDesk[注释1] 是一个 Agentic System。目前主要用于问数。但我们规划他能逐渐进化成企业的需求入口 + Command Center + 成果出口。中央指挥调度台(Command Center)是指他应当充当分析大脑与调度中枢:
数据科学:生成 SQL 给数据湖仓执行算力聚合和分析 业务操作:对单业务系统直连源系统 API;对跨系统调度通过 Frappe 胶水层实现
总之就是要实现“需求承接、弹性路由与成果反馈”的全域闭环。

当然目前 AgentDesk 离上面的架构还有距离:
AgentDesk 目前仅仅实现了数据库和 Excel 的查询和分析。还没有接入大数据计算和分析能力。不过湖仓建设和数据治理是我们的业务范围,只不过还没和 AgentDesk 打通。 操作业务系统和跨业务系统我们也有能力搭建,特别是 Frappe 作为业务和数据的胶水层,我们的经验非常丰富。但同样的,离把这套部署在 AgentDesk 管控下还有距离。
主要是因为 AgentDesk 本身还需要完善很多功能,包括知识库、业务规则库以及大模型的完善;其二是大数据、业务系统、低代码平台接入 Agent 也需要时间。这里面有很多业务上的难点而非技术上的问题。
但今天不是要讲这个未来架构而是问数。所以让我们回到当下 AgentDesk 的实现上。AgentDesk 当然会比 Excel MCP 复杂很多:AgentDesk = 前端 + 后端 + Agent Runtime。
接下来展开讲讲。
前端
由 Vue 3 + Vite + shadcn-vue + Tailwind 构建的一个单页应用。承担用户的需求入口和成果出口。
员工在这里输入问题、上传 Excel、选择文件,然后实时看到大模型的回答。如果返回的是 Markdown 会由 marked 解析,再由 DOMPurify 做安全过滤,最后通过 Tailwind Typography 负责显示效果。
如果员工要求可视化效果,大模型会返回与前端约定好的格式。前端会解析该格式转成 Echarts 认识的 option 渲染成柱状图、折线图或饼图等。整个聊天过程通过 SSE 流式传输,效果等同于阁下熟悉的 ChatGPT、DeepSeek 等。
另外员工自定义头像、昵称这些常规 UI 功能也支持。AgentDesk 还提供了管理后台 UI 方便管理员管理员工权限等。
后端
位于 AgentDesk 中间层。技术栈是 Python + FastAPI 。后端本身不负责思考,也不直接调用大模型,只是负责把前端和 Agent Runtime 连接起来。
员工登录后,后端负责鉴权和会话管理。如果是 Excel 分析,上传的 Excel 文件统一交给后端保存,并把文件的真实路径和员工需求告诉 Agent Runtime。
后端还会监听 Runtime 返回的事件,再把 Agent Runtime + 大模型的思考过程、回答、工具调用等内容以流式方式传回前端。
后端还要负责安全控制,例如隐藏服务器真实路径、处理错误,以及确保用户只能访问自己的文件和会话。没有后端这一层控制,仅仅依靠再下面的 Agent Runtime 就很不安全了。
至于持久化,目前后端使用轻量 SQLite,主要用于保存用户身份标识、会话关系和消息记录。后端不负责维护 AI 推理上下文和工具执行过程,这些由 Agent Runtime 管理。未来如果接入企业 SSO/OIDC 后,员工身份信息可由企业统一身份系统提供,AgentDesk 只需保存必要的身份标识及会话数据。会话数据结构大体如下:
用户:user001会话关系:session001属于 user001对应 Agent session:abc123具体会话(session001):用户:帮我分析这个 ExcelAI:销售额最高的是…… Agent Runtime
Runtime 才是 AgentDesk 真正负责“思考和执行”的部分。包括一个本地大模型,和一套能调用大模型 API 、上下文管理、工具调用等方面的能力。后面这部分目前我们偷了个懒:直接用 OpenCode Serve 作为一个 Agent Runtime 承担这些能力。注意这不是一个固定方案,但目前看来效果非常不错。
Runtime 被 AgentDesk 后端独立管理 :后端启动时会检查 Runtime 是否存在,不存在就安装、启动 OpenCode Serve 并作为 Runtime 在后台持续运行。
我们给 Runtime 配置了最小工作权限。该权限会禁止 Runtime 使用 Bash、读写文件、遍历目录等高风险动作,仅开放 Excel 和 MySQL 等必要的 MCP 工具。
Runtime 负责上下文管理以及和大模型交互,真正执行 Excel 和数据库查询分析的,是 Runtime 后面的 MCP:Excel MCP 使用 DuckDB 读取 Excel。MySQL MCP 负责访问业务数据库。
整个过程是:
Runtime 把 MCP 元信息 + 员工问题交给大模型; 大模型根据员工问题通知 Runtime 什么时候调用什么工具。这会重复多次; 工具把得到的数据通过 Runtime 交给大模型进行分析 大模型生成最终答案; 最终答案 → Runtime → 后端 → 前端展示。
成果展现
实现过程已经讲完。我们相信随着企业的需求变化,AgentDesk 技术还会迭代,包括 Runtime 是否需要重写,以及给后端增加更多业务管理能力。AgentDesk 目前已经是一个可用于 Excel 和数据库的查询、分析的企业级产品。我们录制了一个视频请阁下审阅。
请关注、转发、点赞。谢谢!
往期回顾
利用 WireGuard 为远程 AI 开发环境搭建基础网络:CentOS 7、macOS、Windows 三端互联实践 成为被数据驱动的企业 机器学习中的极简数学(六) 机器学习中的极简数学(七) 机器学习中的极简数学(八)
文章注释
1. 暂名↩︎
夜雨聆风