Skip to content

案例:个人生活助手 ​

案例信息

场景 ​

一个跑在自己机器上的私人助手:能聊天、记得住事、会查我的笔记、按时提醒我。 不想把数据交给云厂商,模型用本地 Ollama。

为什么选 zhin ​

候选放弃原因
直接写 Ollama HTTP 调用记忆、工具、会话压缩都要自己造,两周后变成一坨
Koishi / NoneBot插件生态强,但 AI Agent 面(工具编排、记忆、子任务)不是一等公民
LangChain 脚本是库不是产品:没有 IM 接入、没有管理台、没有权限

zhin 的契合点:IM 框架和 AI 是可拆开的——这个案例里 AI 全本地,但将来想接 QQ/微信 只需加一个适配器包,助手逻辑一行不改。

部署架构 ​

┌────────────┐   ws    ┌─────────────────────────────────┐
│  浏览器     │ ──────▶ │  zhin(life-assistant-bot)      │
│  Console   │  API    │  ├─ Sandbox 适配器(本地调试)    │
└────────────┘  :8068  │  ├─ ZhinAgent(对话/工具/压缩)  │
                       │  ├─ knowledge_search(知识库)   │
┌────────────┐         │  ├─ 三层 Markdown 记忆           │
│  Ollama    │ ◀────── │  └─ Assistant Runtime(定时任务)│
│  :11434    │  HTTP   └─────────────────────────────────┘
└────────────┘

关键配置(脱敏) ​

yaml
# zhin.config.yml
configVersion: 2

http:
  host: 127.0.0.1
  port: 8068
  token: ${HTTP_TOKEN}

plugins:
  sandbox: '@zhin.js/adapter-sandbox'

sandbox:
  endpoints:
    - id: local-sandbox
      owner: assistant-user

ai:
  enabled: true
  knowledge:
    baseDir: ./knowledge        # 我的笔记目录,knowledge_search 自动检索
yaml
# ai.plan.yml(由 npx zhin setup --ai 生成,首次启动自动导入)
version: 1
services:
  - id: ollama
    label: Ollama (Local)
    driver: ollama
    baseUrl: http://127.0.0.1:11434
accounts:
  - id: ollama-local
    label: Local Ollama
    serviceId: ollama
    authKind: none
profiles:
  - id: default-chat
    label: Local Qwen
    serviceId: ollama
    accountId: ollama-local
    model: qwen3:8b
defaults:
  chatProfileId: default-chat

踩过的坑 ​

  1. 本地模型上下文短:qwen3:8b 长对话会爆上下文。解法:zhin 的会话压缩是内置的, 不用自己写;把 knowledge/ 里大文档拆小,检索命中率明显更好。
  2. 提醒任务想"别烦我":assistant 的定时任务默认失败也通知。 assistant.defaults.notifyOnFailure: false 关掉。
  3. Console 连不上:token 就是 .env 里的 HTTP_TOKEN, Console 里填 http://127.0.0.1:8068 + 该 token(或直接打开 http://127.0.0.1:8068/sandbox)即可,不用配任何账号系统。

后续扩展方向 ​

  • 加 @zhin.js/adapter-qq → 同一个助手进 QQ
  • pnpm add @zhin.js/speech → 语音输入/播报
  • 换云模型只需在 ai.plan.yml 或 Console 里新增云端 Service / Profile,本地与云端模型可并存分流

下一步 ​