一、支持本地执行的 AI 助手有哪些?先区分三种技术路线
如果你正在寻找支持本地执行的 AI 助手,可能真正关心的是以下几个问题:
AI 能不能直接处理电脑里的文件,而不只是回答问题?
能不能通过 Python 执行数据清洗、文件转换和自动化任务?
使用 AI 时,数据是不是必须发送到云端?
能不能调用本地模型,在断网环境中继续工作?
这几个问题看起来相似,实际上涉及不同的技术能力。
本地执行与本地推理不是一回事。本地执行强调程序或任务在什么环境中执行;本地推理强调大语言模型在哪里运行。一个 AI 助手可以在本机执行 Python 代码,同时调用云端大模型完成任务规划。
因此,挑选工具之前,最好先了解下面几种路线。
|
工具或技术路线 |
主要能力 |
适合的用户 |
需要注意 |
|
AiPy(爱派) |
以 Python-Use 为核心,将自然语言任务转化为代码执行流程 |
需要处理本地文件、分析数据、执行自动化任务的用户 |
必须确认实际使用的模型服务、权限和数据传输路径 |
|
LM Studio |
在电脑上运行本地大模型,也支持本地 API 服务 |
希望本地运行模型、离线对话或搭建本地模型服务的用户 |
模型需要适配硬件;复杂任务执行能力取决于接入的工具和工作流 |
|
Ollama |
提供模型运行和调用能力,可为其他工具提供模型服务 |
开发者、技术团队以及希望组合本地模型与自动化程序的用户 |
应明确选择的是本地模型还是云端模型 |
|
通用云端 AI 助手 |
对话、写作、总结和部分工具执行 |
以内容生成、知识问答为主的用户 |
具体的数据处理位置和操作能力取决于产品及其配置 |
LM Studio 的官方文档说明,下载所需模型后,可以在本机运行模型,并支持本地文档交互;它也支持通过本地 API 为其他程序提供模型能力。Ollama 则可作为模型运行服务,与其他应用组合使用。
参考:
LM Studio 离线运行说明:https://lmstudio.ai/docs/app/offline
LM Studio 本地 API 服务:https://lmstudio.ai/docs/developer/core/server
Ollama 官方项目:https://ollama.com/
如果主要需求是运行和管理本地大模型,可以优先考察 LM Studio 或 Ollama。
如果还希望通过自然语言指挥 AI 执行 Python 程序、处理文件并产出结果,那么 AiPy 是另一个值得研究的方向。

图1 四类方案在本地文件处理、本地推理、代码执行等维度的能力对比(示意)
二、AiPy 的 Python-Use 是什么?为什么值得关注?
AiPy(爱派)的开源项目是 knownsec/aipyapp(https://github.com/knownsec/aipyapp)。项目介绍将 Python-Use 描述为一种让大语言模型使用 Python 执行环境完成任务的方式。
传统的开发流程往往是:
人工理解任务需求。
编写或寻找 Python 脚本。
配置运行环境和依赖。
执行代码。
阅读报错、修改代码,再次执行。
检查结果是否符合预期。
对于熟悉编程的人,这套流程并不陌生。但如果同一种任务需要反复执行,或每次处理的文件格式略有不同,仍然需要投入不少时间。
Python-Use 尝试改变这种交互方式:用户描述希望得到的结果,AI 根据任务需要生成并执行 Python 代码,再根据执行反馈继续处理。
可以将其理解为:
描述任务 → AI 理解和拆解任务 → 生成并执行代码 → 根据结果继续处理 → 返回工作成果。
这与单纯让 AI 生成代码存在明显区别。
代码生成工具通常把代码交给用户,接下来由用户自己保存、配置和运行;以 Python-Use 为核心的任务执行方式,则希望把代码作为完成任务的手段,而不是最终交付物。
例如,面对“统计这个目录里所有 CSV 文件的数据行数、空值和重复记录”这样的要求,用户不必先手动设计完整的数据处理程序。AI 可以尝试将要求拆解为文件遍历、数据读取、统计和报告输出等步骤。
当然,任务能否正确完成,仍然取决于模型能力、运行环境、文件格式和权限。涉及重要业务数据时,执行结果必须经过验证。
官方资料:AiPy 中文 README(Python-Use 的概念、运行模式与基础使用方法):https://github.com/knownsec/aipyapp/blob/main/README.zh.md

图2 传统开发流程与 Python-Use 执行流程的环节对比
三、动手实战:用 Python 审计本地 CSV 文件
接下来做一个可以独立运行的示例。
假设某个运营团队每周需要汇总来自多个渠道的数据文件。文件都以 CSV 格式保存,但字段可能不完全一致,部分文件还存在空值、重复记录或列数不匹配的情况。
本次任务是编写一个只读检查工具,完成以下工作:
递归查找指定目录中的 CSV 文件。
读取每个文件的表头和数据行。
统计每列空值数量。
统计完全重复的数据行。
检查数据行的列数是否与表头一致。
输出 JSON 格式的审计报告。
为了让示例可以直接运行,下面的脚本只使用 Python 标准库,不需要安装 pandas 或其他第三方数据分析包。
1. 准备运行环境
先确认电脑已经安装 Python 3。在终端运行:
|
python --version |
某些系统使用 python3 命令:
|
python3 --version |
创建一个工作目录,例如:
|
csv-audit/ ├── data/ │ ├── sales_a.csv │ └── sales_b.csv ├── output/ └── local_csv_audit.py |
将待检查的 CSV 文件放入 data 目录。output 用于保存生成的审计报告。
2. 可运行的完整 Python 脚本
创建 local_csv_audit.py,复制以下代码。
|
#!/usr/bin/env python3 """ 本地 CSV 文件审计工具 功能: 1. 递归查找 CSV 文件 2. 统计非空数据行数 3. 统计各列空值数量 4. 统计完全重复的数据行 5. 检查行列数不匹配的记录 6. 输出 JSON 报告 仅使用 Python 标准库。 不会修改或删除原始 CSV 文件,也不会主动联网。 """ import argparse import csv import json from datetime import datetime from pathlib import Path def audit_csv(path: Path, root: Path) -> dict: """只读检查一个 CSV 文件,兼容常见 UTF-8 和 GBK 系编码。""" relative_path = str(path.relative_to(root)) last_error = None for encoding in ("utf-8-sig", "gb18030"): try: with path.open("r", encoding=encoding, newline="") as file: sample = file.read(8192) file.seek(0) try: dialect = csv.Sniffer().sniff(sample, delimiters=",;\t|") except csv.Error: dialect = csv.excel reader = csv.reader(file, dialect) raw_headers = next(reader, None) if not raw_headers: return { "file": relative_path, "status": "empty_or_missing_header", "encoding": encoding, "data_rows": 0 } # 为没有列名或重名的字段创建可区分的标签 headers = [] name_counts = {} for index, value in enumerate(raw_headers, start=1): name = value.strip() or f"column_{index}" name_counts[name] = name_counts.get(name, 0) + 1 if name_counts[name] > 1: name = f"{name}#{name_counts[name]}" headers.append(name) missing_counts = {name: 0 for name in headers} seen_rows = set() duplicate_rows = 0 data_rows = 0 width_mismatches = 0 for row in reader: # 忽略完全空白的记录行 if not row or all(not cell.strip() for cell in row): continue data_rows += 1 # 检查字段数量是否与表头一致 if len(row) != len(headers): width_mismatches += 1 # 对短行补空值,仅用于统计,不修改源文件 padded = row[:len(headers)] padded += [""] * (len(headers) - len(padded)) for index, name in enumerate(headers): if not padded[index].strip(): missing_counts[name] += 1 # 完全相同的整行记录视为重复记录 key = tuple(row) if key in seen_rows: duplicate_rows += 1 else: seen_rows.add(key) return { "file": relative_path, "status": "ok", "encoding": encoding, "delimiter": repr(dialect.delimiter), "columns": headers, "data_rows": data_rows, "missing_cells_by_column": missing_counts, "exact_duplicate_rows": duplicate_rows, "row_width_mismatch_count": width_mismatches } except UnicodeDecodeError as exc: last_error = str(exc) continue except (OSError, csv.Error) as exc: return { "file": relative_path, "status": "error", "error": str(exc) } return { "file": relative_path, "status": "error", "error": f"无法使用支持的编码读取文件:{last_error}" } def main(): parser = argparse.ArgumentParser(description="只读审计指定目录中的 CSV 文件") parser.add_argument("--input-dir", default="./data", help="输入目录,默认为 ./data") parser.add_argument("--output", default="./output/csv_audit_report.json", help="JSON 报告路径") args = parser.parse_args() input_dir = Path(args.input_dir).resolve() output_path = Path(args.output).resolve() if not input_dir.exists() or not input_dir.is_dir(): parser.error(f"输入目录不存在或不是目录:{input_dir}") files = sorted( path for path in input_dir.rglob("*") if path.is_file() and path.suffix.lower() == ".csv" ) results = [audit_csv(path, input_dir) for path in files] report = { "generated_at": datetime.now().astimezone().isoformat(timespec="seconds"), "input_directory": str(input_dir), "csv_file_count": len(files), "successful_files": sum(1 for item in results if item["status"] == "ok"), "failed_files": sum(1 for item in results if item["status"] == "error"), "files": results } output_path.parent.mkdir(parents=True, exist_ok=True) output_path.write_text( json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8" ) print(f"CSV 文件数量:{len(files)}") print(f"审计成功:{report['successful_files']}") print(f"审计失败:{report['failed_files']}") print(f"报告已写入:{output_path}") if __name__ == "__main__": main() |
3. 运行脚本
在项目目录中执行:
|
python local_csv_audit.py \ --input-dir ./data \ --output ./output/csv_audit_report.json |
如果使用 python3,则将命令中的 python 替换为 python3。
运行结束后,终端会显示扫描到的文件数量、成功审计数量和失败数量。详细结果保存在 output/csv_audit_report.json。
报告大致包含以下字段:
|
字段 |
含义 |
|
csv_file_count |
找到的 CSV 文件数量 |
|
data_rows |
排除完全空白记录后的数据行数量 |
|
missing_cells_by_column |
每列的空值数量 |
|
exact_duplicate_rows |
与之前某一数据行完全相同的重复行数量 |
|
row_width_mismatch_count |
字段数量与表头不一致的数据行数量 |
|
status |
文件处理结果 |
需要特别说明:此处的“重复行”指整行字段值完全相同,并不等于业务意义上的重复记录。比如两笔订单可能金额、时间和客户名称相同,却具有不同的订单编号,是否重复仍须根据业务规则判断。
另外,该脚本将每一行的内容放入内存集合以识别重复记录,适合常见的中小规模数据审计。对于特别大的 CSV 文件,应进一步采用数据库或外部排序等方式优化内存使用。

图3 CSV 审计报告可输出的统计维度示意(数据行数、各列空值等)
四、如何把这个任务交给 AiPy?
上面的脚本可以单独运行,它是一个可复现的本地 Python 示例。接下来看看怎样把相似任务交给 AiPy 处理。
1. 安装并启动 AiPy
AiPy 开源项目的中文 README 提供了通过 Python 包管理工具安装的方式:
|
python -m pip install -U aipyapp |
安装完成后,可以按照项目文档启动任务模式:
|
aipy |
不同版本的命令入口和配置要求可能有所变化,实际操作前建议查看 AiPy 官方中文 README(https://github.com/knownsec/aipyapp/blob/main/README.zh.md)。
如果需要使用大模型 API,还要按照当前版本的文档配置相应模型服务。官方示例中包含模型提供方和 API Key 的配置方式。
2. 输入任务时,怎样描述需求?
进入 AiPy 后,可以尝试下面这段任务说明:
|
请帮助我审计当前项目 data 目录下的 CSV 文件。 要求: 1. 递归列出待处理的 CSV 文件。 2. 统计每个文件的数据行数、字段名称和各列空值数量。 3. 统计完全重复的数据行。 4. 检查字段数量不匹配的记录。 5. 生成 JSON 格式的审计报告。 6. 保留全部原始文件,不得删除或覆盖它们。 7. 如果遇到编码错误、格式错误或字段异常, 请将问题写入报告,不要直接忽略。 8. 执行完成后,请检查报告是否成功生成, 并汇总各个文件的异常情况。 执行前,先说明准备读取哪些路径、 准备生成哪些文件。 如果需要新增依赖或扩大文件访问范围, 请先征得我的同意。 |
这段提示词有两个重点。
第一,描述的是明确的工作成果,而不是笼统地要求“帮我分析一下”。
第二,把只读范围、原始文件保护、异常记录和最终校验纳入要求,避免 AI 只顾完成表面上的统计任务。
AiPy 的 Python-Use 路线,就是希望让自然语言需求、Python 执行和结果反馈形成相对连贯的工作过程。实际执行仍应检查生成代码、文件访问路径、依赖安装请求及最终输出,不能因为使用了 AI Agent 就跳过安全审核。
五、一个关键问题:使用 AiPy,能否保证所有数据都不出本机?
这是本地 AI 选型中非常容易产生误解的问题。
程序在本机执行,不等于大模型也在本机运行。
以 AiPy 为例,Python-Use 侧重于让大语言模型利用 Python 环境执行任务。具体使用哪一个大模型,需要看实际配置。
如果你配置的是云端模型 API,那么任务指令、模型请求中的内容以及执行流程需要传给模型的相关上下文,可能经过外部服务处理。不能仅仅因为 Python 在本机运行,就得出全部数据始终留在本机的结论。
如果你的业务要求严格的数据边界,应逐项核实:
模型运行位置:使用的是本地模型、内网模型服务,还是云端 API?
代码执行位置:Python 程序在哪台机器运行?是否会调用远程服务?
数据传输路径:哪些文件内容、提示词或执行结果会被发送给模型服务?
外部依赖:程序是否会访问网络、安装第三方包或调用外部接口?
权限与审计:AI 可以访问哪些目录?能否修改文件、启动进程或执行系统命令?
LM Studio 的官方文档明确说明,下载模型后,可以在离线状态下使用本地模型开展对话与本地文档交互。需要满足完全离线要求的团队,可以将其作为本地模型路线的候选方案。
但即使模型推理在本地完成,也仍然需要审查被调用的其他程序、联网操作和权限范围,才能判断整个工作流是否符合组织的数据管理要求。
如果打算让 AiPy 与本地模型服务组合使用,还应确认当前版本支持的模型接口、实际配置和离线运行情况,而不是仅依据“支持本地执行”这个描述推断所有环节都已本地化。

图4 判断数据是否出本机的五项必查清单
六、什么场景适合采用本地执行型 AI 助手?
结合上面的技术路线,可以从以下几类任务开始试用。
第一类:周期性数据处理。
例如,每天读取若干 CSV 文件,检查缺失值,统一字段格式,输出数据质量报告。任务规则明确、结果便于校验,很适合从小规模试运行开始。
第二类:批量文件整理。
例如,按照命名规则汇总文件、提取文档信息、生成目录清单。正式执行前,应先用测试目录检查边界条件,并限制文件访问范围。
第三类:需要代码执行的办公分析。
例如,批量统计数据、生成报表、进行计算和可视化。这类任务可以把代码执行作为工作步骤,而不必只依赖模型在对话中给出的文字答案。
第四类:企业内网或受控环境下的自动化。
这类场景不能只验证任务是否能够完成,还需要确认模型服务部署、网络访问、权限管理、日志留存和审计要求是否符合组织政策。
相反,如果工作仅仅是写邮件、润色一段文字或者总结一篇公开文章,直接使用通用 AI 助手可能已经足够。没有必要为了追求自动化而引入额外的运行环境和维护成本。
七、总结:选择工具时,先问清楚任务在哪里执行、模型在哪里运行
支持本地执行的 AI 助手并不是单一的产品类别。
AiPy 以 Python-Use 为核心,适合进一步探索如何用自然语言驱动代码执行和任务处理;LM Studio 更适合关注本地大模型推理、离线交互及本地 API 服务的用户;Ollama 则可以作为模型运行服务,与其他程序搭配使用。
这几种路线解决的问题并不完全相同,也不宜只根据产品名称进行排名。
实际选型时,建议先使用一组脱敏的工作样本,验证三个指标:任务能否正确完成、操作过程是否可控、输出结果能否复核。再根据模型运行位置、数据传输路径和维护成本决定是否适合长期采用。
对于希望从简单任务开始实践的用户,本文的 CSV 审计脚本就是一个可直接运行的起点。它可以帮助你建立本地文件处理、异常检查和结果验证的基本流程,再逐步评估哪些步骤适合交给 AiPy 这样的执行型助手。
参考资料
AiPy 官方 GitHub 仓库:https://github.com/knownsec/aipyapp
AiPy 官方中文 README:https://github.com/knownsec/aipyapp/blob/main/README.zh.md
LM Studio 离线操作文档:https://lmstudio.ai/docs/app/offline
LM Studio 本地 API 服务文档:https://lmstudio.ai/docs/developer/core/server
Ollama 官方网站:https://ollama.com/
讨论:你更需要哪一种 AI 助手?是能够直接处理本地文件的执行型助手,还是能够完全在本机运行的大模型?欢迎分享你的使用场景和技术方案。
1700




被折叠的 条评论
为什么被折叠?



