我用 Electron + Ollama,手搓了一个真正能干活的本地 AI Agent

0 阅读8分钟

唉,上个月被裁员了,在求职过程中,我发现了一个残忍的现实,前端真的要失业了,目前很多岗位都要求ai agent 能力,奈何这方面确实不足,因此作者去研究了一番,做了一个本地的agent,(想要在前端领域苟延残喘一番)。这个agent 处于初期,并不完善,但是作为新手摸索和学习足够了。

项目支持两种模式,本地模型和在线api,同时集成了一部分工具,用户还可以编写skill。 有兴趣的可以参考

项目地址github.com/fangzhouzhu… 欢迎star和二次开发,后续项目还会逐渐完善。

为啥选择Ollama ?

因为本地部署不用花钱!!!,当然你可以使用在线的api 。

话不多数,先上图。

image.png

配置界面

image.png

rag image.png

下面的介绍由ai 生成

说实话,这段时间 AI 产品看了很多,聊天机器人也用了不少,但总有一个问题让我很难受:

能聊的不一定能干活,能干活的往往又不够顺手。

所以我就想,干脆自己做一个:

  • 放在桌面上,随时打开就能用
  • 不只是聊天,还能读写文件、分析文档、联网搜索
  • 能接本地模型,也能切第三方大模型
  • 最重要的是,整个过程我自己可控、可扩展

于是,这个项目就这么一点点做出来了。

它不是一个“只能陪你聊天”的 AI,而是一个更像本地工作台的 Agent。


一开始,我想做的其实很简单

最开始的目标就 3 个:

  1. 先把对话跑起来
  2. 让它能调用工具
  3. 让它能看懂我上传的文件

技术栈也选得比较直接:

  • Electron:做桌面端壳子
  • React + TypeScript:做界面
  • LangChain:负责大模型调用和工具编排
  • Ollama:负责本地模型运行
  • OpenAI-Compatible API:兼容第三方在线模型
  • MemoryVectorStore + Embeddings:做 RAG 检索

这个组合的好处是:本地优先、开发快、后续扩展空间也大。


第一步:先把“像 ChatGPT 一样聊天”做出来

这个阶段没追求花活,重点就是把链路打通:

  • 前端输入消息
  • Electron 主进程接收
  • 调用本地模型
  • 流式把结果回传到界面

为了保证桌面应用的安全性,我把权限分层做得比较清楚:

  • renderer 负责 UI
  • preload 通过 contextBridge 暴露有限 API
  • main 负责真正的能力调用

这样做完之后,最基础的聊天就有了,而且还是流式输出的,体验上已经很接近一个成品了。


第二步:让它不只是“会说”,还得“会做”

光聊天没什么意思,Agent 的灵魂其实在 工具调用

所以我给它加了一批常用工具:

  • 读取文件
  • 写入文件
  • 删除文件
  • 搜索文件
  • 列出目录
  • 获取当前时间
  • 数学计算
  • 单位换算
  • 联网搜索
  • 抓取网页
  • 查询天气
  • 汇率转换

这一步做完之后,整个项目一下子就“活了”。

比如你不再是问它:

“怎么查当前目录?”

而是可以直接说:

“帮我看看这个目录里有哪些文件”
“把这个内容写到某个文件里”
“帮我算一下 2354×34”
“查一下今天北京天气”

这时候它已经不只是一个聊天框,而是一个会执行任务的桌面助手了。


第三步:加上 RAG,让它能分析你自己的文件

这是我觉得整个项目最有意思的一部分。

因为很多时候,我们真正想问的不是“通用知识”,而是:

  • “帮我总结这份 PDF”
  • “这个文档的重点是什么”
  • “这个 Word 里提到的结论在哪一页”
  • “把我上传的资料做个归纳”

所以我做了一个很实用的 RAG 流程:

  1. 支持上传 txt / md / pdf / docx / csv / json / ts / js
  2. 解析文本内容
  3. 切分 chunk
  4. nomic-embed-text 做向量化
  5. 存进内存向量库
  6. 提问时只从当前文件里检索相关上下文来回答

这一步之后,项目的定位就从“桌面聊天工具”升级成了:

本地知识问答 + 文档分析工作台

而且我还专门处理了一个很烦的坑:
旧文件上下文污染新文件回答。

后来我给每一轮 RAG 会话加了 ragContextId 做隔离,重新上传或移除文件后,不会再串上下文了。


第四步:一个模型不够,那就做“自动路由”

做着做着就发现,不同场景其实适合不同模型:

  • 普通闲聊,轻一点的小模型就够了
  • 工具调用、代码分析,需要更强一点的模型
  • 文档问答,又是另一种场景

于是我把模型拆成了三条路由:

  • chat:普通对话
  • agent:复杂任务 / 工具调用
  • rag:文档问答

然后再根据消息内容自动判断该走哪条路。

后面我又往前推了一步:
不仅支持 本地 Ollama 模型,还支持 在线第三方模型

也就是说,你现在可以:

  • 本地用 qwen / llama / deepseek
  • 在线接 OpenAI
  • Moonshot
  • DeepSeek
  • SiliconFlow
  • OpenRouter
  • 甚至接 智谱 AI

而且这些都能放到设置里统一配置。


第五步:再往前一步,做 Skills,让它更像“专长助手”

工具有了,模型也能切了,但我还想让它更“懂场景”。

所以我又加了一个 Skills 配置中心,支持本地配置:

  • 技能名称
  • 描述
  • 关键词
  • 优先级
  • 系统提示词
  • 优先路由场景(chat / agent / rag / auto)

比如你可以自己配:

  • 写作助手
  • 代码助手
  • 文档分析助手
  • 产品经理助手
  • 联网研究助手

这样一来,它不只是“能干活”,而是会根据你的配置,用不同方式干活

这一步是我自己特别喜欢的,因为它让整个项目从“功能堆叠”变成了“可定制工作流”。


第六步:把体验打磨到“真能天天用”

功能有了之后,我开始处理那些最影响体验的小细节:

  • 每条回复下面显示当前模型 / 路由场景
  • 工具调用结果做成更易读的卡片
  • 增加“思考与执行过程”面板
  • 上传文档时显示处理进度
  • 代码块支持复制
  • 链接点击后走系统默认浏览器
  • 上滑时底部出现“回到底部”按钮
  • 设置页拆成 模型配置Skills 配置 两个 Tab

这些功能单看都不大,但加在一起之后,整个产品的完成度提升非常明显。

你会发现,它已经不是一个 demo 了,而是一个可以持续迭代的桌面应用。


现在,这个项目已经能做什么?

一句话总结:

这是一个支持本地模型、在线模型、工具调用、RAG、Skills 配置、多会话持久化的桌面 AI Agent。

目前已经支持:

✅ 对话能力

  • 普通多轮聊天
  • 流式输出
  • 多会话管理
  • 本地历史持久化

✅ Agent 能力

  • 文件读写 / 搜索 / 删除
  • 时间、天气、汇率、计算
  • 网页抓取、联网搜索
  • 工具执行过程可视化

✅ RAG 能力

  • 上传 PDF / Word / Markdown / 代码文件
  • 自动切片与向量化
  • 基于当前文档上下文问答
  • 文件上下文隔离,避免串内容

✅ 模型能力

  • 本地 Ollama 模型切换
  • 第三方在线模型接入
  • 场景化模型路由
  • 预设保存与一键切换

✅ 可配置能力

  • Skills 技能中心
  • 本地提示词管理
  • 优先级与关键词触发
  • 按场景分配不同工作方式

这次做完,我最大的感受是:

以前我总觉得 AI Agent 离“真正能用”还有点远。
但自己一步一步做下来之后,反而越来越确定一件事:

Agent 不一定非得是一个庞大、复杂、全自动的系统。
很多时候,只要它能解决你真实的日常工作问题,它就已经很有价值了。

而这个项目,正是朝着这个方向一点点长出来的:

  • 从聊天开始
  • 到工具调用
  • 到文档理解
  • 到模型路由
  • 到 Skills 工作流
  • 再到真正能用的桌面体验

它还远没到终点,但已经足够让我每天愿意打开它。


结尾

如果你也想做一个不是只会聊天,而是真的能帮你处理事情的 AI Agent,
那 Electron + React + LangChain + Ollama 这条路,真的很值得试。

自己做一遍,你会对“AI 能落地到什么程度”有完全不一样的理解。

如果这篇文章你觉得有帮助,欢迎交流。
我后面也准备继续把它往下面几个方向做:

  • 向量索引持久化
  • 更完整的工具权限控制
  • 更强的工作流编排
  • 插件化 skills / tools 体系