跳至主要内容

将 OpenClaw 与 Ollama 配合使用:构建本地数据分析助手

学习如何使用 OpenClaw 和 Ollama 构建完全本地的 AI 数据分析助手,在不将数据发送到云端的前提下,编排多步工作流、分析数据集并生成可视化报告。
· 13分钟 阅读

使用 AI 探索

现代 AI 工作流通常依赖云端 API。但如果您想要一个完全在本机运行、确保数据私密、同时仍支持多步代理工作流的系统,该怎么办?

在本教程中,您将构建一个“本地优先”的 AI 执行应用,其中:

  • Web 界面用于接收用户请求和文件
  • OpenClaw 负责编排工作流并执行本地工具
  • Ollama 提供本地 LLM,用于推理与摘要
  • 所有输出都会写入磁盘,随时可预览

这种模式对私有分析、内部工具,以及所有必须确保数据留在设备上的工作流尤为有价值。如果您的数据包含敏感的财务报表、法律文件或客户记录,云端 AI 方案可能并不合适。 

该设置在保持全部数据与处理完全由您本地控制的同时,依然提供智能的多步行为能力。

得益于 OpenClaw 的渠道集成,同一套本地系统也可以扩展到 WhatsApp 或 Slack 等界面,让您在熟悉的环境中安全访问工作流。

为什么要将 OpenClaw 与 Ollama 搭配运行?

将 OpenClaw 与本地的 Ollama 模型配合运行,会把您的系统变成一个自包含的 AI 环境。与其把提示与数据发往外部 API,不如让整个工作流(包括推理、文件访问与制品生成)都在您的机器上完成。

这种设置具备多项实用优势:

  • 从设计上保证隐私: 所有数据集、文档与中间输出均保留在本机,不会传输到外部服务。
  • 完全透明与可控: 从发送给 OpenClaw 的斜杠命令,到生成的文件与执行轨迹,每一步都可检查。
  • 离线运行: 模型通过 Ollama 拉取完成后,系统即可在无网络环境下工作。
  • 代理式执行: 单个用户请求即可触发多步工作流,而非只返回一段文本。

本教程聚焦于构建本地代理架构:OpenClaw 作为执行引擎,Ollama 提供推理层。

OpenClaw + Ollama 教程:构建本地数据分析助手

本节中,我们将使用 OpenClaw 和本地 Ollama 模型,在您的机器上完全运行一个“本地数据分析助手”应用。从整体来看,系统执行三项核心任务:

  • 接收用户上传的 CSV 数据集
  • 可选地摄取支持性上下文文档(PDF、TXT 或 Markdown)
  • 运行多步分析工作流,生成洞见与可视化

系统会生成三类输出制品:

  • trend_chart.png
  • analysis_report.md
  • tool_trace.json

在幕后,工作流由三部分协同完成:

  • Web 界面(web_assistant.py):该 Python 文件处理文件上传、创建运行目录,并向 OpenClaw 发送斜杠命令。
  • OpenClaw 代理:OpenClaw 代理加载工作区技能,通过工具执行本地命令,并使用由 Ollama 托管的本地 LLM 进行推理与摘要。
  • 分析引擎(main.py):该文件读取数据集、推断相关列、生成图表与洞见,并将所有输出写入磁盘。

工作流完成后,Web 界面会预览生成的制品,方便用户查看结果与执行轨迹。

步骤 1:安装 OpenClaw

在构建“本地数据分析助手”工作流之前,需要在您的机器上运行 OpenClaw Gateway。您可以将 OpenClaw 视为本项目的执行层:它接收来自 Web UI 的请求,加载工作区技能,运行本地工具(如 shell 命令和 Python 脚本),并协调端到端的完整工作流。

curl -fsSL https://openclaw.ai/install.sh | bash
openclaw onboard --install-daemon

该命令会安装 OpenClaw CLI,运行引导向导以配置本地环境,并设置网关守护进程,以便轻松启动与停止。尽管我们在本演示中会以前台方式运行网关,但安装守护进程可确保标准化设置并便于排障。

现在,让我们确认一切正常:

openclaw doctor
openclaw gateway status

OpenClaw doctor 会报告 OpenClaw 是否已正确安装。OpenClaw gateway status 会显示网关当前是否在运行。此时可能显示“未运行”,这没问题。关键在于命令可执行且安装已被识别。

若想详细了解全部引导选项(渠道、认证、技能、网关安全)逐步说明,可参考这篇OpenClaw 教程。

步骤 2:安装 Ollama

接下来我们将设置 Ollama,它将作为本项目的本地 LLM 后端。OpenClaw 仍负责编排工作流,但在需要模型智能进行摘要或推理时,会通过 Ollama 调用 LLM。 

运行以下命令:

brew install ollama
ollama serve
ollama pull qwen3:8b

上述命令会安装 Ollama 运行时,启动本地模型服务(OpenClaw 将与之通信),并下载 qwen3:8b 模型。我们选择 qwen3:8b,因为它在多数笔记本上兼顾性能与质量,但您也可根据设备资源选择其他模型。您还可以参考 Ollama 的这份集成指南进行设置。 

步骤 3:配置 OpenClaw

接下来,我们需要将 OpenClaw 配置为使用本地的 Ollama 实例。这可确保所有推理、摘要与分析完全在您的机器上进行,不会调用任何外部 API。

创建本地配置目录:

mkdir -p .openclaw-local

然后创建文件:

.openclaw-local/openclaw.json

{
  "models": {
    "providers": {
      "ollama": {
        "baseUrl": "http://127.0.0.1:11434/v1",
        "apiKey": "ollama-local",
        "api": "openai-completions",
        "models": [
          {
            "id": "qwen3:8b",
            "name": "qwen3:8b",
            "reasoning": false,
            "input": ["text"],
            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
            "contextWindow": 131072,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": { "primary": "ollama/qwen3:8b" }
    }
  },
  "tools": {
    "web": {
      "search": { "enabled": false },
      "fetch": { "enabled": true }
    }
  }
}

上述配置定义了三项关键组件:

  • baseUrl 指向由 ollama serve 暴露的本地 API 端点,而 api: openai-completions 设置启用与 OpenAI 兼容的通信。对 qwen3:8b 的模型注册声明了其能力,包括可处理大型数据集的 131K 上下文窗口,以及用于控制响应的 token 限制。由于模型在本地运行,成本值均设为 0。
  • agent defaults 部分控制 OpenClaw 代理用于推理的模型。将主模型设置为 ollama/qwen3:8b 后,所有代理任务(如解析提示、生成摘要或对数据进行推理)都会自动路由到本地 Ollama 模型,无需任何外部 API 调用。
  • 工具配置用于管理外部能力,如 Web 搜索被禁用以确保隐私并阻止出站请求;而 fetch 工具在需要时保留有限的资源获取能力。 

上述设置共同确保整条工作流在您的机器上私密运行,由 OpenClaw 负责编排,Ollama 提供本地智能。

步骤 4:定义工作区技能

在此步骤中,我们定义工作区技能,以告知 OpenClaw 如何执行工作流。我们不依赖模型来规划工具使用,而是采用“命令分发模式”,允许斜杠命令直接触发本地执行命令,使工作流更快且完全本地化。

让我们在您的工作区中创建如下 SKILL.md 文件:

---
name: local-data-analyst
description: Local Data Analyst: analyze private local data with Ollama, generate chart/report, and keep all data on-device.
user-invocable: true
command-dispatch: tool
command-tool: exec
command-arg-mode: raw
---
Invoke as /local-data-analyst <raw command>.
This skill bypasses model planning and dispatches raw command text directly to the exec tool.
Use this exact command template in this workspace:
python3 /……/main.py --docs-dir <context_dir> --data-file <data_file> --output-dir <output_dir> --prompt "<prompt>" --use-ollama --model qwen3:8b
Expected outputs under <output_dir>:
- trend_chart.png
- analysis_report.md
- tool_trace.json

此技能配置决定了 OpenClaw 如何执行分析:

  • 顶部前言区(文件最上方的结构化元数据块)定义了一个可由用户调用的技能 local-data-analyst,它会以斜杠命令 /local-data-analyst 的形式提供。
  • 斜杠命令是 OpenClaw 在聊天或 UI 中触发结构化操作的方式。
  • command-dispatch: tool 启用命令分发模式,OpenClaw 会将命令直接路由到工具,而不是让模型决定该做什么。
  • 借助 command-arg-mode: raw,完整命令字符串会原样传递给 exec 工具,确保可预测的执行行为。
  • 该命令运行本地的 main.py 脚本,其功能包括:
    • 加载数据集与可选的上下文文档
    • 使用 Ollama (qwen3:8b) 进行推理与摘要
    • 生成三类制品,包括图表、Markdown 报告与工具执行轨迹

因此,OpenClaw 负责编排与执行,而 Ollama 提供本地推理。下一步,我们将把该技能接入 Web 界面,让用户上传数据并一键触发分析。

步骤 5:创建 Web 界面

此时,我们已经拥有两个核心部分:OpenClaw 工作区技能,以及提供推理能力的本地模型后端(Ollama)。现在需要一个轻量级界面,让您无需每次都使用终端即可上传文件并触发运行。

web_assistant.py 文件充当一个精简的前端服务器,负责:

  • 接收文件上传,
  • 为每次执行创建隔离的运行目录,
  • 构建指向磁盘文件的 OpenClaw 斜杠命令,
  • 在本地调用 OpenClaw 代理,
  • 等待输出,
  • 将可预览的制品返回给浏览器。

这里的关键设计是:Web 服务器本身从不运行分析逻辑。它把一切委派给 OpenClaw,从而保持 UI 简洁。 

步骤 5.1:构建斜杠命令

目标是生成一条 OpenClaw 可作为聊天消息接收的字符串,例如:/local-data-analyst python3 ... --data-file ... --output-dir …

def build_slash_command(
    data_path: Path,
    docs_dir: Path,
    output_dir: Path,
    prompt: str,
    model: str,
    x_col: str,
    y_col: str,
) -> str:
    args = [
        "python3",
        str(BASE_DIR / "src" / "main.py"),
        "--docs-dir", str(docs_dir),
        "--data-file", str(data_path),
        "--output-dir", str(output_dir),
        "--prompt", prompt,
        "--use-ollama",
        "--model", model,
    ]
    if x_col:
        args.extend(["--x-column", x_col])
    if y_col:
        args.extend(["--y-column", y_col])
    raw = " ".join(shlex.quote(a) for a in args)
    return f"/local-data-analyst {raw}"

build_slash_command() 函数准备将发送给 OpenClaw 的精确指令。Web 应用并不直接执行分析,而是构造一个结构化的斜杠命令,OpenClaw 能将其路由到对应的工作区技能。该函数执行四项关键工作:

  • args 列表定义了对 src/main.py 的 CLI 调用。这与您在终端中手动运行的命令完全一致。
  • 仅在提供时才追加 --x-column 与 --y-column 标志。若缺失,这个分析脚本可自动从数据集中推断列。
  • shlex.quote() 会对所有参数(包括用户提示)进行转义。对处理空格与特殊字符至关重要,并在将用户输入传给 shell 命令时防止命令注入风险。

该函数返回以 /local-data-analyst 开头的字符串。此前缀与 SKILL.md 中定义的技能名相匹配。OpenClaw 收到该斜杠命令后,会立即将请求路由到 local-data-analyst 工作区技能,并通过 exec 工具执行底层命令。

步骤 5.2:OpenClaw 执行 

有了斜杠命令之后,我们使用 CLI 代理运行器将其发送给 OpenClaw。这一步正是 Web 应用交接执行权的地方。

slash_message = build_slash_command(
    data_path=data_path,
    docs_dir=docs_dir,
    output_dir=output_dir,
    prompt=prompt,
    model=model,
    x_col=x_col,
    y_col=y_col,
)
agent_cmd = [
    "openclaw", "agent",
    "--local",
    "--session-id", f"stealth-web-{run_id}",
    "--message", slash_message,
    "--timeout", "120",
]
proc = subprocess.run(agent_cmd, capture_output=True, 
                     text=True, env=openclaw_env())

OpenClaw 代理的调用即为交接点:Web 应用停止工作,转而请求 OpenClaw 端到端执行工作流。 

  • 使用 --local 可确保运行留在本机;代理通过本地网关与 Ollama 支持的模型处理请求,而非任何托管服务。
  • --session-id stealth-web-{run_id} 为每次运行分配独立会话命名空间,避免状态互相影响,也便于后续针对特定执行进行调试。 
  • --message 参数会传入与用户在聊天中输入完全一致的斜杠命令字符串;OpenClaw 接收后,将其路由到 /local-data-analyst 技能,并通过 exec 工具执行底层命令。 
  • 最后,--timeout 120 作为安全阀,避免分析停滞导致 Web UI 无限等待;env=openclaw_env() 则强制子进程使用项目本地的 OpenClaw 配置与状态目录,从而稳定指向预期的 Ollama 设置。

下一步,我们将加载生成的制品(包括图表、报告与工具轨迹),并在浏览器中渲染轻量预览。

步骤 5.3:服务器设置

最后,web_assistant.py 会运行一个小型本地 HTTP 服务器,以便您通过浏览器进行交互。

 def main() -> int:
    host = "127.0.0.1"
    port = 8765
    server = ThreadingHTTPServer((host, port), Handler)
    print(f"Local Data Analyst web UI: http://{host}:{port}")
    print("Press Ctrl+C to stop.")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        pass
    return 0

这使得部署更为简单:

  • ThreadingHTTPServer 允许并发处理多个请求,而不阻塞整个应用。
  • 所有“实际工作”都在请求 Handler 中完成:接收上传、创建运行文件夹、触发 OpenClaw,并返回预览。

注意:完整的 web_assistant.py 实现可在项目GitHub 仓库中查看。

步骤 6:构建本地分析引擎

至此,OpenClaw 已可通过工作区技能执行工作流,Web UI 也能借助斜杠命令触发运行。剩下的部分是分析引擎:它接收您上传的文件,执行工作流步骤,并生成制品。

该仓库中的 main.py 重点实现了两项定义流水线核心的功能:加载表格数据与调用 Ollama 进行本地推理。 

步骤 6.1:加载表格数据 

这个辅助函数在保持工作流一致性的同时,支持多种输入格式。

def load_tabular_data(data_path: Path, events: List[SkillEvent]) -> pd.DataFrame:
    ext = data_path.suffix.lower()
    if ext == ".csv":
        df = pd.read_csv(data_path)
    elif ext in {".tsv", ".tab"}:
        df = pd.read_csv(data_path, sep="\t")
    elif ext in {".json", ".jsonl"}:
        try:
            df = pd.read_json(data_path)
        except ValueError:
            df = pd.read_json(data_path, lines=True)
    elif ext in {".xlsx", ".xls"}:
        df = pd.read_excel(data_path)
    else:
        raise ValueError(f"Unsupported data file...")
    log_event(events, "fs", "read", f"Loaded data file: {data_path.name}")
    return df

load_tabular_data() 使用 data_path.suffix 识别文件类型,并交由正确的 pandas 加载器处理。CSV 与 TSV 文件通过 read_csv() 读取,其中 TSV/TAB 只需将分隔符切换为 \t。JSON 输入先用 read_json() 读取,若 pandas 抛出 ValueError,则回退至 lines=True 处理 JSONL。通过 read_excel() 增加了对 Excel 的支持,用户可直接上传 .xlsx 文件,无需预处理。

最后,log_event() 会记录一条结构化的跟踪条目,流水线稍后会将其序列化为 tool_trace.json。 

步骤 6.2:Ollama 集成 

由于本演示不依赖 SDK,因此直接调用 Ollama 的本地 HTTP API。

def ollama_generate(model: str, prompt: str) -> str:
    url = "http://localhost:11434/api/generate"
    payload = json.dumps({
        "model": model, 
        "prompt": prompt, 
        "stream": False
    }).encode("utf-8")
    req = request.Request(url, data=payload, 
                         headers={"Content-Type": "application/json"})    
    with request.urlopen(req, timeout=45) as resp:
        body = json.loads(resp.read().decode("utf-8"))
    return str(body.get("response", "")).strip()

ollama_generate() 函数向 localhost 的 Ollama /api/generate 端点发送 JSON 负载。负载包含模型名称(例如 qwen3:8b)、最终的提示字符串,并禁用流式输出,以便一次返回完整响应。

使用 urllib.request 使该封装轻量且可移植,同时 timeout=45 可防止模型响应缓慢或服务器不可用时导致工作流无限挂起。最后,函数从 response 字段中提取模型输出并返回干净文本,后续将用于写入 analysis_report.md 文件。

步骤 7:构建 Web 服务器

以下是一个迷你启动脚本,用于启动本地 Web UI,以接收上传并在后台触发 OpenClaw 运行。

set -euo pipefail
ROOT="$(cd "$(dirname "$0")" && pwd)"
cd "$ROOT/.."
python3 ../web_assistant.py

此脚本执行三件事:

  • set -euo pipefail 让脚本快速失败:遇到错误即停止、将未设置变量视为错误、并避免管道中的静默失败。
  • ROOT=... 解析脚本所在目录,即便您在其他位置运行也可正常工作。
  • cd "$ROOT/.." 进入预期的项目根目录,然后启动 web_assistant.py,该脚本托管 UI 并处理整个流水线。

脚本运行后,浏览器 UI 就成为本演示的入口。

步骤 8:启动系统

最后一步,我们采用双进程方式运行系统。OpenClaw 网关处理所有任务执行,而 Web 界面则作为用户层,用于提交请求与查看生成的输出。

终端 1:网关

在启动界面之前,先启动 OpenClaw 网关。该进程充当系统的执行层,处理代理请求、加载工作区技能、调用本地工具,并将推理调用路由到 Ollama 模型。

image1.png

export OPENCLAW_CONFIG_PATH="$PWD/.openclaw-local/openclaw.json"
openclaw gateway --force

在该终端中,OPENCLAW_CONFIG_PATH 指向项目本地配置(我们在其中将默认模型固定为 ollama/qwen3:8b,并为隐私禁用了 Web 搜索)。随后,openclaw gateway --force 会启动网关,即使 OpenClaw 认为已有进程在运行或部分配置存在也会强制启动。 

网关就绪后,即可接受本地代理消息(包括我们的 /local-data-analyst 斜杠命令)。

终端 2:Web UI

网关启动后,运行 Web 界面,它会收集用户输入,将每个请求发送给本地 OpenClaw 代理,并显示生成的图表、报告与执行轨迹。

./local_data_analyst/run_web.sh

image4.png

然后打开:

http://127.0.0.1:8765

Web 服务器运行在 127.0.0.1,因此仅能从您的本机访问。点击“Run Analysis”后,UI 会写入运行文件夹、构造斜杠命令、调用 openclaw agent --local,随后轮询磁盘中的输出文件以便预览:

  • trend_chart.png
  • analysis_report.md
  • tool_trace.json

最终输出看起来会类似如下。您可以使用一些示例文件进行测试。image5.png

总结

在本教程中,我们构建了一个“本地优先”的 AI 应用:一个简洁的 Web 界面即可触发由 OpenClaw 与本地 Ollama 模型驱动的完整代理工作流。系统不调用外部 API,而是在您的机器上自洽闭环运行。

OpenClaw 负责编排与工具执行,Ollama 提供本地智能层。最终形成代理式工作流:单个请求即可产出结构化制品,如可视化、报告与审计轨迹。

接下来,您可以沿多个方向扩展本项目:为不同工作流添加新的工作区技能、集成更多本地工具(例如数据库查询或文档检索)、或将 OpenClaw 连接至 Slack、WhatsApp 等消息渠道以实现安全的远程访问。 

您也可以尝试不同的 Ollama 模型,根据硬件在性能与质量间取得平衡。

若要进一步了解如何在工作流中使用 AI,建议查看《面向开发者的 AI 辅助编程》课程。也推荐查看我们的Moltbook 入门指南。

OpenClaw 与 Ollama 常见问题

在本地运行这个 OpenClaw + Ollama 项目是否需要 GPU?

不一定。qwen3:8b 模型可在 CPU 上运行,但性能会较慢。为了获得更流畅的体验,建议使用至少 16–32 GB 内存,或配备 8–12 GB 显存的 GPU。

这种设置下,我的任何数据会离开本机吗?

不会。所有处理均通过 OpenClaw 和 Ollama 在本地完成。配置中已禁用 Web 搜索,且不使用任何外部 API。

OpenClaw 与 Ollama 的角色分别是什么?

OpenClaw 是执行与编排引擎。它接收请求、运行工具并管理工作流。Ollama 是 OpenClaw 调用以进行推理与文本生成的本地模型后端。

我可以用其他模型替代 qwen3:8b 吗?

可以。您可以替换为任何 Ollama 支持的模型(例如适配轻量系统的 qwen3:1.5b,或追求更高质量的 qwen3:14b),只需先拉取模型并更新配置。

该系统能离线工作吗?

可以。一旦安装了 Ollama 和模型,整个工作流即可在无网络的情况下运行。

Aashi Dutt

作者

Aashi Dutt

我是一名 Google Developers 机器学习(生成式 AI)领域的专家、Kaggle 三项专家,以及 Women Techmakers 大使,拥有 3 年以上的技术从业经验。2020 年我共同创办了一家健康科技初创公司,目前在佐治亚理工学院攻读计算机科学硕士,专攻机器学习。

主题