使用Screenpipe+本地大模型实现私人助手Agent
捕获屏幕信息并用本地大模型总结:我的 Screenpipe 实践记录(一)
一、引言
最近一直想使用大模型技术做些什么,其中一个想法就是做一个私人助手,可以记录每天的行为(浏览了哪些APP、访问了什么网页),每天自动总结生成报告;
这个项目的痛点有:
- 隐私化:我的日常行为包含一些工作内容、个人密钥,不能联网上传;
- 上下文:大模型分析依赖上下文,包括屏幕截图、录音等,这些数据如何保存、喂给大模型。
基于此,使用Screenpipe+Ollama+Cron,实现可以7*24在本地运行的私人助手
二、技术栈介绍
Screenpipe
Screenpipe是一个离线项目,它可以对你的电脑进行 24 小时监控,通过屏幕录制、OCR、音频输入和转录收集信息等途径,保存到本地数据库。
包括以下功能
- 屏幕录制:24 小时全天候监控,实时录制屏幕,捕捉每一个操作画面。
- OCR 文字识别:内置强大的 OCR 功能,支持中文及其他语言,轻松提取屏幕中的文字内容。
- 音频输入与转录:支持捕获麦克风音频输入,并实时转录为文字,保存对话与语音笔记。
- 本地数据库存储:所有信息都被安全地保存到本地数据库,保障数据隐私和安全。
Ollama
Ollama 是一个开源的大型语言模型(LLM)平台,它支持在本地启动、管理、对话自己的大模型;它支持所有主流大模型在本地启动。
NodeJs+Cron
考虑到项目需要数据管理、本地API调用、开始暂停、Web页面,因此使用NodeJs搭建;
同时,完整的天级数据会很大,本地模型算力有限,我们可以使用Cron定时5分钟记录一次,自动分析并落盘。
三、系统架构
四、项目流程介绍
完整项目开源:https://github.com/LittleCoolguy/screen-mic-agent
安装Screenpipe
Mac本地安装Screenpipe
curl -fsSL get.screenpi.pe/cli | sh
执行
screenpipe
执行后,出现如下日志,说明Screenpipe已经成功启动,屏幕数据记录ing。
安装ollame,启动模型
官网安装::https://ollama.com/download
启动ollama
ollama serve # 新终端常驻;或在后台用 systemd/launchctl
安装模型,这里我选择的是qwen2.5:7b-instruct-q4_K_M
ollama run qwen2.5:7b-instruct-q4_K_M
测试一下,成功回答问题。
上下文+模型调用
这里主要是使用Screenpipe提供的SDK获取本地屏幕OCR数据、ollama的模型问答接口
模型调用逻辑示例
import { NextResponse } from "next/server";
import { buildPrompt } from "../../../lib/prompt";
import { getRecentContext } from "../../../lib/screenpipe";export const runtime = "nodejs";export async function POST(req: Request) {try {const body = await req.json().catch(() => ({}));const minutes = Math.max(1, Math.min(Number(body?.minutes || 5), 240));const question = (body?.question || "Summarize what I did recently.") as string;const context = await getRecentContext(minutes);const prompt = buildPrompt({ minutes, question, context });console.log(`[analyze] prompt built, context: ${context.length} chars`);const host = process.env.OLLAMA_HOST || "http://localhost:11434";const model = process.env.OLLAMA_MODEL || "llama3.1:8b";const res = await fetch(`${host}/api/generate`, {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({model,prompt,stream: false})});if (!res.ok) {const errText = await res.text().catch(() => res.statusText);return NextResponse.json({ error: `Ollama request failed: ${errText}` }, { status: 500 });}const data = await res.json().catch(async () => ({ response: await res.text() }));const result = (data && (data.response || data.result || data.output)) || "No response.";return NextResponse.json({ result, minutes, usedModel: model });} catch (e: any) {return NextResponse.json({ error: e?.message || "Unknown error" }, { status: 500 });}
}
Screenpipe SDK调用示例
const { pipe } = await import("@screenpipe/js");const end = new Date();
const start = new Date(end.getTime() - minutes * 60 * 1000);console.log(`[screenpipe] querying for items from ${start.toISOString()} to ${end.toISOString()}`
);
const res = await pipe.queryScreenpipe({contentType: "ocr", // 只抓 OCR// 如果你只想看某个浏览器,可以放开下一行(示例为 Edge):appName: "Google Chrome",startTime: start.toISOString(),endTime: end.toISOString(),includeFrames: false,limit: 400 // 可按需调整
});
结果记录
五、后续优化
目前这个本地agent能够分析到笔者的屏幕行为并记录,但存在以下问题
- 屏幕数据噪音多,模型不能很好的识别,需要再尝试性能更高、文本分析能力更适合的大模型;
- 功能单一,后续计划结合Terminator插件,实现简单的自动化操作。