mcpField
G
glin

glin

本地服务
github.com/AkashChatterjee数据与分析01 周前更新

关于 glin

glin 是本地 MCP 服务,可让 AI Agent 在 CSV 或 Excel 数据上训练并使用可解释分类器。它基于 Explainable Boosting Machine 给出预测,并提供由模型加性结构得出的精确特征原因,而非 SHAP 或 LIME 近似值。

主要功能

  1. 01在 CSV 或 Excel 上训练分类器
  2. 02预测单个或多个案例
  3. 03提供精确的加性特征解释
  4. 04用留出数据评估模型
  5. 05调整模型超参数
  6. 06保存并管理本地模型

适用场景

  1. 01分类销售线索或客户流失
  2. 02依据模型预测确定案例优先级
  3. 03查看影响模型结果的因素

MCP 相关

glin 通过 stdio 运行,向 MCP 客户端提供模型训练、预测、解释、调优和管理工具。数据与保存的模型均保留在本地。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"akashchatterjee-glin": {
"command": "uvx",
"args": [
"glin-ml"
]
}
}
}
启动命令uvx glin-ml

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiglin-ml0.1.5

工具

6

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

glin

☕ 如果 glin 对你有用,并且你想帮助维护它,可以请我喝杯咖啡。

glin 可以让你的 AI Agent 在你的数据上训练分类器并使用它。你可以将 glin 安装到 Claude Code、Claude Desktop 或 Cursor 等 Agent 中,然后用自然语言与 Agent 对话。Agent 会训练模型、进行预测并解释预测结果。你无需编写代码。

glin 会在 CSV 或 Excel 文件上训练可解释提升机(EBM)。每个预测都会附带导致该预测的各项特征的精确分解。这个分解来自模型的加性结构,并非 SHAP 或 LIME 的近似结果。

glin 是一个 MCP 服务。它在你的机器上运行,并通过 stdio 与 Agent 通信。你的数据和模型都保存在本地。

更新日志: CHANGELOG.md 列出了每个版本的更改。

案例研究:10 万条销售线索的细分。Claude 搭配 glin,正确划分了 71% 的新线索。仅使用 Claude 时,正确率为 33%。在提示词中提供 1,000 条已标注线索时,Claude 的正确率为 60%,并且使用的 token 多出 6.7 倍。

glin 的工作原理

  1. 你向 Agent 提供数据文件和要预测的列。
  2. Agent 调用 glin。glin 会检查数据、训练模型,并将其保存在 ~/.glin/models/<name>/。
  3. glin 会在未用于训练的行上测试模型。Agent 会告诉你模型的效果如何。
  4. 你询问新的案例。Agent 会将每个案例发送给模型,并获取预测结果及其精确原因。
  5. 你询问哪些因素影响结果。Agent 会从模型中读取相关信息。

保存的模型会一直可用。你可以在新的对话中再次使用它。

你可以向 Agent 提出的问题

  • “在 ~/data/leads.csv 上训练一个预测 converted 的分类器,并将其命名为 leads_v1。”
  • “这 3 笔交易中,我应该优先处理哪一笔?”Agent 会将每笔交易发送给模型,并给出原因。
  • “这个模型中的哪些因素会影响客户流失?”
  • “调整模型,并告诉我它的实际效果如何。”
  • “我有哪些模型?”
  • “删除模型 leads_v1。”

目录

安装

你的 MCP 客户端会使用 uvx 启动 glin。uvx 会下载 PyPI 软件包 glin-ml 并将其保存在缓存中。请勿使用 pip 安装 glin。(PyPI 上的名称 glin 属于一个无关项目。)

所有客户端都请执行步骤 1,然后为你的客户端执行步骤 2。

步骤 1:安装 uv 并下载 glin
  1. 安装 uv。使用以下命令之一:

    # macOS and Linux
    curl -LsSf https://astral.sh/uv/install.sh | sh
    
    # macOS with Homebrew
    brew install uv
    
    # Windows (PowerShell)
    powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
    
  2. 打开一个新终端。

  3. 运行此命令:

    uvx --from 'glin-ml[excel]>=0.1.5' glin --version
    

    命令会显示 glin-ml 0.1.5 或更高版本。首次运行时,会将 glin 及其库下载到缓存中。这可能需要约一分钟。

不要跳过步骤 1.3。 某些客户端会停止未能在 30 秒内启动的服务。Claude Code 就是其中之一。缓存填充后,glin 只需几秒即可启动。

步骤 2:将 glin 添加到客户端

为以下客户端之一执行相应步骤:

Claude Code,使用插件(推荐)

该插件会添加 glin MCP 服务和一项技能。此技能会告知 Agent 何时以及如何构建、调优、使用模型进行预测和解释模型。该插件支持 Excel。

  1. 启动 Claude Code。

  2. 添加 glin marketplace:

    /plugin marketplace add AkashChatterjee/glin
    
  3. 安装插件:

    /plugin install glin@glin-marketplace
    
  4. 如果 Claude Code 提示你重启,请重启。

  5. 运行 /mcp。确认列表中显示 glin 服务已连接。

该插件会启动 uvx --from 'glin-ml[excel]>=0.1.5' glin serve。插件文件位于 .claude-plugin/marketplace.json 和 plugins/glin/。

Claude Code,不使用插件

如果只想添加 MCP 服务而不添加技能,请使用此选项。

  1. 在终端中运行此命令:

    claude mcp add --scope user glin -- uvx --from 'glin-ml[excel]>=0.1.5' glin serve
    

    --scope user 会使 glin 在你的所有项目中可用。若只想将 glin 添加到当前项目,请移除 --scope user。

  2. 启动 Claude Code。

  3. 运行 /mcp。确认列表中显示 glin 服务已连接。

Claude Desktop
  1. 打开 Claude Desktop。

  2. 打开 设置 > 开发者,然后点击 编辑配置。这会打开文件 claude_desktop_config.json:

    • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows:%APPDATA%\Claude\claude_desktop_config.json
  3. 将 glin 条目添加到 mcpServers 中。如果文件中还有其他服务,请保留它们:

    {
      "mcpServers": {
        "glin": {
          "command": "uvx",
          "args": ["--from", "glin-ml[excel]>=0.1.5", "glin", "serve"]
        }
      }
    }
    
  4. 保存文件。

  5. 完全退出 Claude Desktop,然后重新启动。在 macOS 上,仅关闭窗口是不够的。

  6. 确认新聊天的工具菜单中显示 glin 工具。

如果 Claude Desktop 找不到 uvx(例如出现 spawn uvx ENOENT),请使用完整路径。运行 which uvx(macOS 和 Linux)或 where uvx(Windows),并将结果填入 "command"。

Cursor 和其他 MCP 客户端
  1. 打开客户端的 MCP 配置文件:

    • Cursor:适用于所有项目的 ~/.cursor/mcp.json,或某个项目中的 .cursor/mcp.json。
    • 其他客户端:请参阅客户端文档。
  2. 添加与 Claude Desktop 中相同的 glin 条目:

    {
      "mcpServers": {
        "glin": {
          "command": "uvx",
          "args": ["--from", "glin-ml[excel]>=0.1.5", "glin", "serve"]
        }
      }
    }
    
  3. 保存文件并重启客户端。

  4. 确认客户端显示 glin 是已启用的 MCP 服务。

如果客户端找不到 uvx,请像 Claude Desktop 一样,在 "command" 中填写 uvx 的完整路径。

带注册表搜索功能的客户端

glin 已列入官方 MCP 注册表,条目为 io.github.AkashChatterjee/glin。注册表是元数据目录,不是安装程序。MCP 市场和一些客户端会读取它,并在服务列表中显示 glin。例如,VS Code 会从 GitHub MCP Registry 安装服务。

  1. 在客户端中搜索服务列表,查找 glin。
  2. 安装条目 io.github.AkashChatterjee/glin。
  3. 确认客户端显示 glin 是已启用的 MCP 服务。

注册表条目以 uvx glin-ml serve 启动,不包含 excel extra。注册表格式没有用于填写 extras 的字段。要读取 Excel 文件,请改用Cursor 和其他 MCP 客户端中的步骤。如果你的客户端不支持注册表搜索,也请使用这些步骤。

安装选项
  • 仅 CSV: 如果你不使用 Excel 文件,可以从参数中移除 [excel]。
  • 服务标志: 将 --allow-dir 等标志放在参数中的 serve 之后。请参阅服务标志。
  • 更新 glin: 运行 uvx --refresh --from 'glin-ml[excel]>=0.1.5' glin --version。然后重启客户端。
  • 已安装的副本: 若要使用通过 uv tool install 'glin-ml[excel]' 或 pipx install 'glin-ml[excel]' 安装的副本,请将 "command" 设置为 glin,并将 "args" 设置为 ["serve"]。你必须自行更新此副本,例如运行 uv tool upgrade glin-ml。

在 Agent 中使用 glin

安装 glin 后,用日常语言与 Agent 对话。Agent 会选择 glin 工具。你不需要知道工具名称。本节介绍你可以提出哪些要求,以及会得到什么结果。有关确切的工具参数,请参阅 MCP 工具。

训练模型

向 Agent 提供一个数据文件和要预测的列:

“在 ~/data/churn.csv 上训练一个预测 churn 的分类器。将其命名为 churn_v1。”

Agent 会调用 train_model。glin 会检查数据、准备各列并训练模型。然后,glin 会返回:

  • 保留和删除的特征,以及每项对应的原因;
  • 警告,例如可能泄漏目标值的列;
  • 留出集上的测试结果:模型未参与训练的 20% 行。

测试结果包括 log_loss、baseline_log_loss(仅根据类别占比做出的猜测)、train_log_loss、accuracy、balanced_accuracy 和 roc_auc。有用的模型,其 log_loss 会明显低于 baseline_log_loss。

如果要谨慎构建模型,请让 Agent 使用 build_classifier 提示词。此提示词会指导 Agent 清理数据、移除泄漏、调优模型并报告真实性能。请参阅 MCP 提示词。

如果已存在同名模型,训练将失败。若要替换模型(例如使用新数据),请让 Agent 使用 overwrite=True 重新训练。

获取预测

针对一个或多个案例提问。提供你已知的值:

“季度末前我有 3 笔商机需要确定优先级:Northwind Systems($42k,Opportunity 阶段,来源为推荐,联系人是 VP,负责人是 Carla Nguyen,记录了 8 次联系)、Summit Retail Group($8k,仍处于 Lead 阶段,来源为付费社交媒体,负责人是 Brian Kessler),以及 Anchor Nonprofit($3k,仍处于 Lead 阶段,负责人是 Frank Suarez,尚未记录任何活动)。用 deal_predictor_v1 处理它们,告诉我应该优先处理哪一笔。”

Agent 会为每笔商机调用一次 predict。它会给出带有原因的排序结果:

商机赢单概率原因
Northwind Systems69%Opportunity 阶段、推荐来源和 VP 联系人都有利于它。$42k 的商机金额是唯一的不利因素。
Summit Retail Group35%它仍处于 Lead 阶段,且来源是付费社交媒体。这两点都是明显的不利因素,没有任何有利因素抵消。
Anchor Nonprofit34%尚未记录任何活动,且仍处于 Lead 阶段。记录中没有任何有利因素。

每项预测都有一份审计。审计会给出每个特征的得分,所有得分相加恰好等于概率。glin 会在每项预测中检查这个总和(additivity_verified)。

一些重要说明:

  • 未提供的值对模型来说是缺失值,而不是平均值。
  • 使用训练数据中的类别,例如 Lead、Opportunity 和 Customer。其他拼写对模型来说都是新类别。
  • 如果模型在训练中未见过某些值,例如新类别或超出训练范围的数字,glin 会发出警告。此类预测的可靠性较低。
解释模型

询问哪些因素会影响结果:

“是什么因素导致 churn_v1 中的客户流失?”

Agent 会调用 explain_model。glin 会直接从模型中读取答案,不会抽样生成预测。结果会提供:

  • 按影响程度排序的每个特征,以及其中来自交互作用的部分;
  • 重要术语,包括特征对,以及它们在总量中的占比;
  • 对于二元目标,会列出每个特征中推动预测趋向各类别的值或类别。
调优模型

让 Agent 调优模型:

“调优 churn_v1,并告诉我它的实际效果如何。”

tune_model_hyperparameters 提示词会为 Agent 提供一套安全流程:

  1. 训练基线模型。
  2. 每次试验更改一到两个设置。所有试验使用相同的留出行。
  3. 使用其他随机种子检查噪声。
  4. 试验约 10 次后停止,或在收益较小时停止。优先选择更简单的设置。
  5. 使用所有行训练最终模型。

Agent 可以通过 list_hyperparameters 获取所有设置及其默认值和取值范围。glin 会拒绝未知设置和超出范围的值。

分组留出

来自同一州、地区、客户、站点或用户的行往往很相似。随机留出会导致指标过于乐观。在一个实际案例中,模型在随机留出数据上的准确率为 82%,AUC 为 0.89;而在模型未见过的州上,准确率为 63%,AUC 为 0.77。

如果数据中有这样的列,请让 Agent 按该列进行留出:

“在 ~/data/districts.csv 上训练,预测 high_stunting,并按 state 留出。”

Agent 会传入 holdout_group_column="state"。然后,glin 会将整个组放入留出集。测试结果因此会显示模型在未见过的组上的表现。当存在这样的列时,提示词会告诉 Agent 使用此选项。

  • glin 会将大约 20% 的行(holdout_fraction)放入留出集。它会尝试 25 种组顺序,并保留类别占比最接近完整数据的那一种。
  • 文本值会忽略大小写和首尾空格进行分组。因此,"S06" 和 "s06 " 属于同一组。空白文本、nan 和 none 都是缺失值。缺失值属于同一组。
  • 该列仍会作为特征。留出集中的组在预测时属于未见过的类别。
  • 如果该列不存在或是目标列、组数少于 5、某个组的行数超过一半、所有组都太大而无法留出,或者划分后有类别缺失,glin 就会报错停止。
管理模型
  • **列出模型:**询问“我有哪些模型?”Agent 会调用 list_models。
  • **查看模型:**询问“churn_v1 需要什么输入?”Agent 会调用 inspect_model。结果会按类型列出特征(数值型、类别型和日期型)、已删除的列、目标类别、设置和测试结果。
  • **删除模型:**询问“删除模型 churn_v1。”Agent 会调用 delete_model。删除操作不可撤销。你也可以自行删除 ~/.glin/models/ 中的文件夹。

**模型名称:**新模型名称长度为 1 到 64 个字符。只能使用字母、数字、-、_ 和 .。名称不能以 . 开头。若要使用或删除模型,其名称必须是 ~/.glin/models/ 中的一个文件夹名称。glin 会确保模型名称无法读取、写入或删除此文件夹之外的文件。

你的数据

glin 可以读取的文件

Agent 会向 glin 提供文件路径(csv_path)。glin 会自行读取文件,因此 Agent 不会将数据复制到聊天中。csv_path 支持 .csv、.xlsx 和 .xls 文件。

glin 只会读取位于允许文件夹中的文件。默认情况下,允许的文件夹包括:

  • 你的主文件夹;
  • 客户端启动服务的文件夹,但该文件夹不能是 /,也不能是你的主文件夹的父文件夹。

Claude Desktop 在 macOS 上会从 / 启动服务。此时只有你的主文件夹是允许的。Claude Code 会从项目文件夹启动服务,因此该文件夹也会被允许。若要使用其他位置的数据,例如 /Volumes/data,请使用 --allow-dir。请参阅服务端标志。

其他规则:

  • 文件不得超过 200 MB。若要更改此限制,请使用 --max-file-mb。
  • glin 会跟随路径中的符号链接和 ..。实际路径必须位于允许的文件夹中。
  • glin 不会读取文件夹、设备或扩展名不同的文件。错误消息不会显示文件内容。
  • 对于聊天中的小型表格,Agent 可以发送 CSV 文本(csv_content)。仅对小型数据使用此方式,因为数据会经过聊天。

文件夹规则有两项已知限制:允许文件夹中的硬链接会指向并读取该文件夹之外的文件。如果路径在检查和读取之间发生变化,glin 会读取新文件。因此,不要允许其他用户或进程可以写入的文件夹。

Excel 文件

glin 可直接在 Excel 工作表上训练,包括含有标题行、合并表头和脚注的工作表。Excel 支持需要安装 excel 扩展。上面的安装步骤已包含该扩展。

如果知道工作表名称和表头行,请告诉 Agent:

“在 ~/data/report.xlsx 的 Data 2023 工作表上训练一个分类器,表头行为 3-4,预测 outcome。”

Agent 会将 sheet 和 header_rows 传给 train_model。适用以下规则:

  • **工作表:**可以指定名称或位置(1 表示第一个工作表)。如果工作簿只有一个工作表,则无需指定 sheet。如果工作簿有多个工作表,glin 会报错并列出这些工作表。如果只有一个名称匹配,glin 会忽略名称的大小写和首尾空格。
  • **表头行:**使用 Excel 中的行号,例如 4、"3-4"、"3,4" 或 [3, 4]。如果未指定,glin 会查找表头行,并跳过其上方的标题行。如果表头不明确,glin 会停止并要求提供 header_rows。glin 不会猜测。
  • **多行表头:**glin 会将多行合并为每列的一个名称,例如 2023 - sales。合并标签下方的空白单元格会沿用左侧的标签。重名会依次加上 _2、_3 等后缀。表头中的日期会转换为 ISO 日期,例如 2024-01-01。
  • **脚注:**glin 会移除工作表末尾的脚注行,并发出警告,列出这些行的行号。脚注行不含数字,且以 Source、Note、Footnote、*、†、‡ 或 © 开头,或者是由 6 个或更多单词组成的句子。
  • **公式:**glin 使用公式已保存的结果。请先在电子表格应用中计算并保存文件。
  • **空行和空列:**glin 会将其移除。

结果会显示工作表、表头行以及 glin 读取的行数。对于 CSV 文件,sheet 和 header_rows 会导致错误。

数据检查

训练前,glin 会检查数据。严重问题会导致训练停止并显示明确的错误。轻微问题会显示警告,但训练会继续。

  • 数据至少需要 20 行。
  • 目标至少需要 2 个类别。glin 会移除目标值为空的行,并发出警告。
  • glin 训练的是分类器,而非回归模型。数值目标的取值超过 20 个时会发出警告:每个取值都会成为单独的类别。请将目标划分为几个区间,或改用其他目标。
  • 数值目标有 3 到 20 个取值时(例如 1 到 5 的评分),会发出警告。模型会忽略取值之间的顺序。请减少区间数量,或使用是/否阈值。
  • 上述两项检查也适用于保存数字的文本目标,例如 "1" 到 "5"。
  • 文本目标的取值超过 20 个时会发出警告。每个类别都需要有足够多的行。
glin 如何读取列

glin 会在训练前处理每一列。在预测时也使用相同的规则。

数据glin 的处理方式
数字,含缺失值glin 将其作为数字处理。缺失值会被分到单独的区间。
以文本形式存储的数字,含空白值如果至少 80% 的值是数字,glin 会将该列转换为数字。其他值会变为缺失值。
货币符号和千位分隔符($1,234.56、€1.234,56、USD 100、Rs. 100)glin 会去掉货币符号和代码。只有当该列包含明确的欧洲格式数值(例如 1.234,56 或 12,5)时,才会将逗号识别为小数分隔符。普通的 1,234 表示一千二百三十四。如果某个值同时包含两种分隔符,最后出现的分隔符就是小数分隔符。如果一列中混用了两种格式,glin 会按美国格式读取并发出警告。
负数(-5、−5、(1,234)、1234-)glin 会将 Unicode 负号、括号和末尾的负号识别为负数。
百分数(44.98%)glin 会去掉 %。数值仍以百分点表示:44.98% 会变为 44.98。
无穷大(inf、-inf)glin 会将其设为缺失值并发出警告。
缺失值代码(SUPP、NE、NP、z、*、..)在数值列中,glin 会将这些代码设为缺失值。大小写和两端空格不影响识别。要使用其他代码,请提供 suppression_codes。如果数值列中包含其他简短代码(例如 x),glin 会将其设为缺失值并发出警告。如果未知代码超过该列的 20%,该列会变为文本列,警告会建议添加相应代码。glin 不会将 <5 和 — 作为代码,因为它们可能是真实值。
文本类别,最多 250 个值glin 会将每个值作为一个类别处理,不区分大小写并忽略两端空格。预测时出现新值会被视为新类别,并发出警告。
真/假glin 会将其分别作为 0 和 1 处理。
日期和时间戳glin 会将其拆分为日期组成部分。请参阅日期和时间戳。
日期和时间戳

glin 会自动识别日期列。至少 80% 的值必须是完整日期,例如 2024-03-06、2024-03-06 14:30:00、03/06/2024、6 Mar 2024 或 Mar 6, 2024。

  • 日期组成部分: glin 会从每个日期列生成以下特征:<col>__year、<col>__month(jan 至 dec)、<col>__day_of_week(mon 至 sun)、<col>__hour 和 <col>__days_since_start。days_since_start 计算从训练数据中最早日期起经过的天数。
  • 未使用的组成部分: 如果某个组成部分没有变化,glin 会将其移除,例如对于不含时间的日期会移除 __hour。
  • 日期和月份的顺序: glin 会根据值判断是 dd/mm 还是 mm/dd。如果无法从值中判断顺序,glin 会优先按月份在前解析并发出警告。使用 ISO 日期(YYYY-MM-DD)可避免这种情况。
  • 时区: glin 会将带时区的时间转换为 UTC。
  • 非日期值: 这些值会变为缺失值,并触发警告。
  • 预测: 请提供原始日期,例如 "2024-03-06"。如果日期超出训练范围、不是日期或无法确定日和月的顺序,glin 会发出警告。警告会显示 glin 使用的日期(parsed_as)。
glin 不使用的列

glin 会在训练前移除以下列。结果会列出每个被移除的列及其原因。

数据glin 的处理方式
只有一个取值的列glin 会将其移除。
标识符(行号、连续 ID、UUID、哈希值)对于超过 50 行的数据,如果某列包含互不相同的整数,且这些数字填满一个范围(例如从 1 到 N),或者列名包含 ID 相关词(id、idx、key、uuid、guid、pk 或名称 index),glin 就会移除该列。它还会移除取值中超过 95% 都不相同的文本列。差距较大且不均匀的互异数值(例如薪资)会保留为数值。
取值超过 250 个的文本,例如自由文本glin 会将其移除。glin 不处理自然语言。
单元格中的列表或 JSONglin 不会读取其中的内容,而是将整个单元格作为一个文本值处理。
以数字存储的日期(2024、20240306、纪元秒数)glin 会将其作为数字而非日期处理。如果这些值表示日期,请将其转换为日期文本。
目标泄漏检查

如果某列直接给出了答案,就会造成目标泄漏。这种情况常见于有人根据该列(例如使用阈值)生成目标值。包含此类列的模型在测试中表现会非常好,但并不实用。

完成准备后,glin 会逐一检查每个特征。如果某个特征单独预测目标的平衡准确率达到 99% 或更高,glin 就会发出 Possible target leakage 警告。警告会显示证据,例如 > 62.5 -> 'yes' 或 {p, q} -> 'ok'。训练会继续。Agent 会询问你如何处理每条警告。如果预测时无法获知该值,请移除该列并重新训练。

  • glin 会查找阈值、区间和类别映射。它还会查找映射到类别的数值编码(20 个取值或更少),以及映射到某个类别的缺失值。
  • glin 会通过日期部分检查日期列。
  • 为避免误报,每条规则至少需要 5 行数据。glin 会忽略行数少于 10 的类别,并跳过行数少于 30 的数据。
  • glin 最多使用 20,000 行进行检查,并且最多报告 10 列。

参考

MCP 工具

所有工具都带有 MCP 注解。train_model 和 delete_model 标记为有破坏性,因为它们可能替换或删除模型。其他工具均为只读。因此,客户端可以自动运行只读工具,并在运行其他工具前询问你。

  • train_model(target_column, model_name, csv_path=None, csv_content=None, overwrite=False, hyperparameters=None, holdout_fraction=0.2, holdout_group_column=None, suppression_codes=None, sheet=None, header_rows=None) 用于训练并保存模型。
    • 提供 csv_path 或 csv_content,但不要同时提供两者。
    • holdout_fraction=0 会使用所有行进行训练,且不提供测试结果。
    • hyperparameters 接受 EBM 设置,例如 {"interactions": 0}。请参阅 list_hyperparameters。
    • 结果包含 rows_read、target_classes、features_kept、features_dropped、date_columns、warnings、hyperparameters、training_rows、training_seconds、terms 和 evaluation。对于 Excel 文件,结果还包含 sheet 和 header_rows。
    • 当 holdout_fraction=0 时,evaluation 为 null。分组留出还会添加 holdout_groups 和 train_groups。
  • predict(model_name, features, top_n=10) 返回预测类别、概率和审计信息:
    • base_logit 是截距。contributions 给出每个项的分数,并按从高到低排列。
    • 对于二元目标,分数是 score_class(target_classes 中的第二个类别)的对数几率。正分数会推动预测趋向 score_class。对于多类别目标,每个项都有 score_by_class。
    • 如果分数加总后等于模型概率,则 additivity_verified 为 true。
    • 类别值保留目标的数据类型,例如 1。概率字典的键始终是文本,例如 "1"。
    • warnings 列出模型未见过的输入:unseen_category、out_of_range、unparseable_number、unparseable_date、ambiguous_date_format 和 date_order_mismatch。
    • missing_features 列出缺失或为空的输入。
  • explain_model(model_name, top_n=15, include_shapes=True) 返回特征排名、排名靠前的项,以及二元目标中每个特征的形状。
  • inspect_model(model_name) 返回按类型(numeric、categorical 和 date)分类的特征、已删除的列、目标类别、设置和测试结果。对于每个日期列,它会给出日期部分,以及 days_since_start 的起始日期。
  • list_models() 列出所有已保存的模型。
  • list_hyperparameters() 列出每项 EBM 设置的类型、默认值、取值范围和影响。
  • delete_model(model_name) 永久删除模型。结果包含 model_name、deleted 和 path。
MCP 提示词

提示词是为 Agent 准备好的指令。在大多数客户端中,你可以在提示词菜单中选择它们。Claude Desktop 会在附加项(+)菜单中显示这些提示词。

  • build_classifier(csv_path, target_column, model_name) 执行完整流程:检查并清理数据、移除泄漏、使用固定留出进行调优(预算约为 10 次试验)、使用所有行进行训练,并报告预期性能。
  • tune_model_hyperparameters(model_name, target_column) 提供 调优模型 中所述的调优流程,并附带当前设置表。
  • prepare_csv_for_training(target_column) 提供训练前的数据检查清单:文件问题、目标选择,以及 glin 对列会做什么和不会做什么。

所有参数均为可选。glin 会根据当前默认值生成提示词,因此提示词与代码保持一致。

服务端标志

将这些标志放在客户端配置参数中的 serve 之后,例如 ["--from", "glin-ml[excel]>=0.1.5", "glin", "serve", "--allow-dir", "/Volumes/data"]。

标志作用
--allow-dir DIR允许 csv_path 读取 DIR 中的文件。可以多次使用此标志。它会替换默认文件夹。如果 DIR 是 /,glin 会向 stderr 输出警告。
--max-file-mb MB设置 csv_path 读取的最大文件大小。默认值为 200。

glin --version 会显示版本。glin serve 只向 stdout 写入 MCP 消息,并向 stderr 写入日志消息。

案例研究

10 万条销售线索的细分 使用 glin 处理带有已知规则的合成 CRM 数据。由于规则已知,该研究可以将每项预测和解释与真实情况进行对照检查。

  • 使用 glin 的 Claude 将 71% 的新线索划分到了正确的细分。对于这些线索,可能达到的最高分为 68%。
  • 单独使用 Claude 的准确率为 33%。在提示词中加入 1,000 条已标注线索后,Claude 的准确率达到 60%,每条线索使用 83,000 个 token。使用 glin 时,Claude 使用约 12,500 个 token。
  • 对于同一条线索,glin 在每个新会话中都会给出相同的答案。
  • glin 学到的影响与真实影响一致(相关系数为 0.97 至 1.00)。

印度各县的儿童发育迟缓情况(NFHS-5) 使用 glin 处理真实的公开数据。glin 模型可以预测某个县的儿童发育迟缓率是否偏高,并准确说明每项预测的原因。

开发

从此仓库的克隆副本安装可编辑版本:

git clone https://github.com/AkashChatterjee/glin.git
cd glin
pip install -e ".[dev]"      # also installs the Excel libraries, and xlwt to build .xls test files
pytest

要在 MCP 客户端中试用此检出副本,请将 "command" 设置为环境中的 glin 程序(例如 /path/to/glin/.venv/bin/glin),并将 "args" 设置为 ["serve"]。

  • glin 兼容 mcp Python SDK 1.x 和 2.x(mcp>=1.21.1,<3)。要测试其中一个版本,可添加约束,例如 pip install -e ".[dev]" "mcp>=2,<3"。
  • Tests 工作流(.github/workflows/test.yml)会在每个拉取请求以及每次推送到 main 时运行。它使用 Python 3.10 和 3.12 搭配最新的 mcp 1.x 和 2.x,以及 Python 3.10 搭配 mcp==1.21.1。
  • 数据规则位于 glin/validation.py 和 glin/preprocessor.py。EBM 设置位于 glin/hyperparameters.py。可在此处添加或更改设置。
  • 在 Python 中,EBMTabularPreprocessor 接受 suppression_codes 和 date_parse_threshold。列名不是文本的 DataFrame(例如列名为 0)会获得文本列名(例如 "0")。

发布(维护者)

只有 Publish to PyPI GitHub Actions 工作流(.github/workflows/publish.yml)会将版本发布到 PyPI。任何人都不会从本地计算机上传。请勿使用 twine upload、uv publish 或个人 API 令牌。 要发布,请推送格式为 vX.Y.Z 的标签:

git tag vX.Y.Z
git push origin vX.Y.Z

工作流会先运行 Tests 工作流(与拉取请求使用相同的矩阵)。如果测试失败,工作流会停止,不会发布。然后它会构建 sdist 和 wheel,并检查两者是否都带有标签对应的版本。随后,它会以该确切版本将它们作为 glin-ml 发布到 PyPI,并根据 CHANGELOG.md 创建 GitHub Release。

  • hatch-vcs 会根据 git 标签推导软件包版本。pyproject.toml 中没有固定版本,因此发布前无需升级软件包版本。插件和注册表文件各自有自己的版本(参见发布步骤)。
  • 未打标签的本地构建会获得类似 0.1.4.dev1+g3fa91a0 的开发版本。没有 git 元数据的源代码树会报告 0.0.0。
  • glin.__version__ 会读取已安装软件包的元数据。
  • 工作流会忽略与 vX.Y.Z 不匹配的标签。
  • PyPI 会拒绝上传已存在版本号的文件。要修复有问题的发布,请打一个新版本标签。
发布步骤

所有者在每次发布时执行以下步骤:

  1. 在 CHANGELOG.md 中,将 [Unreleased] 下的条目移至新的标题 ## [X.Y.Z] - YYYY-MM-DD 下,并在文件末尾添加比较链接。使用 gh issue list --milestone vX.Y.Z --state closed 核对这些条目。
  2. 在 server.json(version 和 packages[0].version)以及 plugins/glin/.claude-plugin/plugin.json(version)中设置发布版本。如果插件需要适配此次新发布,还要修改 plugins/glin/.mcp.json 中的最低版本,以及 安装 中的命令和配置。将这些更改合并到 main。
  3. 为此次发布打标签并推送标签:git tag vX.Y.Z 和 git push origin vX.Y.Z。
  4. 在 GitHub Actions 中,打开 Publish to PyPI 运行并批准 pypi 环境。只有获得批准后,上传步骤才会开始。
  5. 如果 CHANGELOG.md 中没有该版本对应的部分,或者 server.json 或 plugin.json 中的版本与标签不同,工作流会在开始时停止。如果一切正确,则会发布到 PyPI。随后,它会根据 CHANGELOG.md 中该版本的部分创建 GitHub Release。此外,mcp-registry 作业还会发布到 MCP Registry(参见发布到 MCP Registry)。
  6. 检查 PyPI 上是否已有新版本,以及 GitHub Release 是否已创建。
  7. 检查 MCP Registry 中的条目。新版本必须显示 isLatest: true:
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.AkashChatterjee/glin"

如果 mcp-registry 作业失败,请使用发布到 MCP Registry 中的手动备用流程。

要将变更日志与已合并的拉取请求进行比较,请在 GitHub 上打开一个草稿发布,并点击“Generate release notes”。.github/release.yml 会按标签对拉取请求进行分组。

一次性设置,确保这是唯一的发布途径

该工作流通过 PyPI 可信发布(OIDC)进行发布。这也会使本地上传无法进行。

  1. **PyPI → glin-ml 项目 → Publishing:**为所有者 AkashChatterjee、仓库 glin、工作流 publish.yml 和环境 pypi 添加一个可信发布者。
  2. **PyPI → Account settings → API tokens:**删除所有可以上传 glin-ml 的 API 令牌。不要创建新令牌。在没有令牌且启用双重身份验证(2FA)的情况下,唯一可以用于发布的凭据就是工作流的短期 OIDC 身份。同时检查项目的协作者,并移除不需要上传权限的人员。
  3. **GitHub → Settings → Rules → Rulesets:**为 v* 添加标签规则集。限制可创建标签的人员,并禁止删除或移动标签。符合条件的新标签会启动一次发布。
  4. **GitHub → Settings → Environments → pypi:**添加必需的审核者。每次发布都必须先经过人工批准,上传步骤才会运行。
发布到 MCP Registry

注册表仅保存元数据。它会检查 PyPI 软件包的 README 中是否包含 mcp-name: io.github.AkashChatterjee/glin 这一行。README 将这一行作为隐藏注释。

publish.yml 中的 mcp-registry 作业会发布到注册表。它在 publish 作业之后运行,因此版本会先发布到 PyPI。该作业会执行以下步骤:

  1. 检查 server.json 中的 version 和 packages[0].version,以及 plugins/glin/.claude-plugin/plugin.json 中的 version,是否与去掉 v 前缀后的标签一致。build 作业也会执行相同检查,因此如果不匹配,会在上传到 PyPI 前终止运行。检查脚本位于 .github/scripts/check-versions.sh。
  2. 下载固定版本的 mcp-publisher(Linux、amd64),并检查其 SHA-256。版本号位于 publish.yml 中的 MCP_PUBLISHER_VERSION。修改版本时,也要将 MCP_PUBLISHER_SHA256 改为该版本对应的 registry_<version>_checksums.txt 文件中的值。
  3. 使用 mcp-publisher login github-oidc 登录。该作业具有 id-token: write 权限。GitHub 中不会存储任何密钥或令牌。
  4. 运行 mcp-publisher publish。上传后,PyPI CDN 可能会延迟一分钟或更久,导致注册表无法看到新版本。如果命令失败,作业会等待 60 秒后重试,最多总共尝试 5 次。
  5. 查询注册表;如果标签对应的版本没有以 isLatest: true 列出,则作业会失败。

注册表会拒绝已存在的版本。如果作业在注册表接受该版本后失败,不要再次运行。请改为检查列表。

手动备用方案

如果作业无法发布,请设置 server.json 中的版本,并在版本已发布到 PyPI 后,从仓库根目录运行以下命令:

mcp-publisher login github
mcp-publisher publish

然后使用发布步骤中的 curl 命令检查列表。

检查发布版本

如需检查构建产物但不发布,请在本地运行 uv build 并检查 dist/。切勿上传。发布后,请通过全新安装确认公开软件包能够正常工作:

uvx --refresh --from 'glin-ml==X.Y.Z' glin --version
uvx --from 'glin-ml==X.Y.Z' glin serve --help

用已发布的版本替换 X.Y.Z。第一条命令必须显示该版本。指定版本也可以避免 uvx 使用通过 uv tool install 安装的旧副本。然后从 MCP 客户端启动服务,请 Agent 训练一个小型模型,再使用 delete_model 删除它。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。