乐于分享
好东西不私藏

本地大模型如何 “问数” Excel

本地大模型如何 “问数” Excel

文章标题实际涉及三个环节:“搭建企业级本地大模型”、“AI 问数”、“Excel 数据源”。至于第一个我们已有成熟方案并付诸实践。今天只谈后两个,也就是如何用 AI 向 Excel 问数。

“问数”这个概念被不少 BI 产品用到他们的拳头产品里。但我们不太认可“数字化转型就是采购软件做个数据大屏”这类观点。所有异构系统的引入都会阻碍贵公司的数字化转型道路。而我们要做的是给贵公司一套工具和方法论,可以嵌入阁下公司现有信息化平台上来做数字化转型和 AI 落地。

缘起

半年前我们帮一家小型企业搭建了一套低成本的本地 AI 大脑。限于硬件,本地模型选择的是一个 Q4_K_M 量化的混合专家模型。在应用上,我们帮他们搞了一个向 Oracle 问数的应用。但不是直接用的 Oracle 的 MCP 而是用 Dify 搭建一个工作流。用工作流而非 Agent 的目的是可控,担心大模型的幻觉有损数据安全。

应用场景就是财务可以问:“某客户有多少超期 2 年的应收款”,该 AI 应用就会和大模型配合给出数据。跨表聚合、可视化图表这些当然也没有问题。

这个 AI 问数他们一直在用。上周他们找到我们说还需要一个可以分析和查询 Excel 的 AI 应用。其实需求就跟问数据库一样,只不过数据源变成了 Excel。

当时说要实现 Excel 问数时我老板虎躯一震的。我知道为什么,他对 Excel 的厌恶由来已久。

如果企业还不能从 Excel 中解放出来,就别想着数字化转型

我认为他激进了。我知道他厌恶非模块化的捆绑应用。Excel 就把数据的存储、查询、展示都捆绑在了一个文件里。一点都不敏捷且制造了一个又一个数据孤岛。

但企业需求是真实的。Excel 仍然在帮助众多企业管理和处理数据。于是我们就开始计划这项工作。

实现思路

首先要明白大模型是直接读不了 Excel 的。大模型只能理解 token 化后的上下文。如果此时有人反驳说某大模型就能直接传一个 Excel 让他做分析。

真实情况是很多人把大模型这个概念滥用了。还有其他功能站在大模型前面把上传的表格进行文本解析并 token 化后再喂给大模型。只不过大家看不到而已。

有人估计又会说那就用能解析 Excel 成 Json 或者其他文本格式的库,然后再喂给大模型不就好了?但现实是大模型特别是本地大模型限于硬件资源读不了那么大的上下文。

还有如果形而上一点,什么东西都塞给大模型去处理是一件非常浪费的事情。这很像不应该把所有东西都塞进大脑记住一样,大脑只负责在思考和推理时去调用这些知识就好。也像 Agent 中 Harness 和大模型的关系。大模型像大脑负责理解、推理、决策,而 Harness 则负责执行和反馈。

Agent

所以我们这次不打算用 Dify 搭建工作流来实现这个问数功能。不用工作流是因为用 SQL 模板去构建最终 SQL 非常不灵活,大模型的能力发挥也受限。不过好处就是安全。但我个人认为随着 Harness 业界已经达成共识,最终 Agent 会取代工作流。只要大模型能更好遵从 Harness。

总之,Excel 问数应该通过大模型 +  Harness 进行开发。用 Skills 编排规范和工作流、用 MCP 访问 Excel ,用 Hooks 提高安全防范,再配以各种指标文档构成的领域知识。这就能实现一个能充分发挥大模型主观能力性的问数 Agent。

至于 Agent 本体是 Dify 搭建还是 LongChain 开发,甚至直接用 Claude Code 都不重要。重要的是 Harness 的那些插件:其中领域知识是业务知识不用我们操心,Skills 在用户侧来说也是一个业务知识,Hooks 和 MCP 是我们要做的,而难点在 MCP。

MCP

MCP 难在我们希望独立于 Agent。也就是说它可以搭配任何 Agent 甚至工作流使用。因此有两个方面需要考虑:MCP Instructions 和 MCP Tools

MCP Instructions

不少人认为 MCP 是没有 Skills 的。其实不是,MCP 也可以通过返回 Instructions 给 Agent 以限制其行为。举几个例子:

  • 数据量与性能保护
  • 安全与权限硬约束
  • 工具链强制调用顺序
  • 脏数据处理规范
  • 生命周期与持久化指引

MCP Tools

前面已经说了 Harness 不能把整个表解析后直接塞给大模型。正确做法是把用户的查询和计算放在 Harness 端的 MCP 做,然后把结果给到大模型。这就是 MCP Tools 要实现的。

那怎么读和计算呢?如果用 Pandas 读 Excel 是没有问题。但查询就麻烦了。因为很难知道客户究竟要查什么和怎么查。一万种查询就有一万个函数。当然可以用模板拼接。但前面数据库问数就是用的模板拼接,虽然安全但很不灵活。

更好的方式是 SQL。这玩意大模型最懂并且在数据端执行。但如何通过 SQL 方式查询 Excel 呢?我第一个想到的是以前项目接触到的一个 DuckDB MCP [链接1]。首先它已经是一个 MCP,其次 DuckDB 本身是可以读取和查询 Excel。所以我只需要在它基础上完善 Excel 相关 Tools 就好。我考虑至少应该有 3 个 Tools 如下:

  1. 获取 Excel 的表结构。因为要让大模型知道有哪些列和行,它才好去生成 SQL。否则大模型只能靠猜来生成 SQL
  2. 用 DuckDB 读取 Excel
  3. 用大模型提供的 SQL 查询 Excel

Build is coming up soon

这是一篇 Plan。我们会尽快实现这个 MCP。至于 Harness 的 Skills、领域知识这些大多是业务知识,所以在 Build 篇我们不会介绍。但会具体讲讲 MCP 的实现过程。有了该 MCP 阁下也可以用自己的 Agent 去问数 Excel 了。


关于我们:我们提供中小企业数字化转型咨询服务。包括数据湖仓建设、数据治理、低代码平台搭建、数据科学、AI 落地等。我们基于一套成熟的开源解决方案,帮助企业低成本实现数字化转型。🤗


引用链接

[1] DuckDB MCP : https://github.com/motherduckdb/mcp-server-motherduck