Skip to content

Transformers.js Gemma 4 Browser Assistant — 浏览器内本地 AI Agent

一个完全本地运行的浏览器 AI Agent Chrome 扩展。模型下载到浏览器后驻留在 IndexedDB,所有推理在本地 GPU(WebGPU)上完成,无需 API Key、无需云端服务器、支持离线使用。由 Hugging Face ML 工程师 Nico Martin 开发,Google Gemma 官方账号背书。


目录


为什么选择本地浏览器 Agent

传统浏览器 AI 助手                    Gemma 4 Browser Assistant
┌──────────────────────┐            ┌──────────────────────────┐
│ 页面数据 ──→ 云服务器 │            │ 页面数据 ──→ 本地 GPU    │
│     │        │       │            │     │        │           │
│     │     大模型推理  │            │     │   Gemma 4 (3GB)    │
│     │        │       │            │     │        │           │
│     │     结果返回   │            │     │     结果返回        │
│     │                 │            │     │                     │
│ ❌ 隐私风险          │            │ ✅ 数据不离机            │
│ ❌ 需要付费          │            │ ✅ 完全免费              │
│ ❌ 依赖网络          │            │ ✅ 离线可用              │
└──────────────────────┘            └──────────────────────────┘
维度 云端方案 本地方案
隐私 浏览数据上传到服务器 数据永不离开机器
成本 GPU 服务器费用 → 付费墙 零成本(用自己的 GPU)
网络 必须联网 离线可用
适用范围 受限于服务商 TOS 可用于内网、银行等敏感页面
模型能力 更强的云端模型 受限于浏览器可运行的模型大小

双模型架构

扩展使用两个模型,各有分工:

┌─────────────────────────────────────────────────┐
│                  Chrome Extension                 │
│                                                   │
│  ┌───────────────────────┐  ┌──────────────────┐ │
│  │   Gemma 4 E2B Instruct │  │ MiniLM-L6-v2     │ │
│  │   (推理大脑)            │  │ (嵌入模型)        │ │
│  │                       │  │                  │ │
│  │ • Agent 循环控制       │  │ • 文本 → 向量    │ │
│  │ • 工具调用决策         │  │ • 语义搜索        │ │
│  │ • 响应生成             │  │ • 历史检索        │ │
│  │                       │  │ • 页面内容检索    │ │
│  │ ~2B 有效参数          │  │ ~22M 参数        │ │
│  │ 128K context window   │  │                  │ │
│  │ 35+ 语言              │  │                  │ │
│  │ Q4F16 量化            │  │ FP32             │ │
│  └───────────────────────┘  └──────────────────┘ │
│                                                   │
│  总下载大小:约 3GB(两个模型合计)                   │
│  缓存位置:IndexedDB (chrome-extension:// origin)   │
└─────────────────────────────────────────────────┘

Gemma 4 E2B 关键特性

  • E = Effective parameters(有效参数,非总参数量)
  • 实际权重 > 2B,但推理时仅 ~2B 参数激活(per-layer embeddings 技术)
  • 推理时保持小模型体积,同时保留大量知识
  • 专为手机、笔记本、浏览器设计
  • 原生 Function Calling 支持

量化策略

模型 量化方式 效果
Gemma 4 E2B Q4F16(权重 4bit + 激活 FP16) 工作站级模型塞进浏览器内存
MiniLM-L6-v2 FP32 小模型无需量化

Chrome 扩展三层架构(Manifest V3)

┌─────────────────────────────────────────────────────────────┐
│                    Manifest V3 Architecture                   │
│                                                              │
│  ┌────────────────────────────────────────────────────────┐  │
│  │          Background Service Worker                      │  │
│  │          (控制平面 - 重量级操作)                          │  │
│  │                                                        │  │
│  │  • 模型加载与缓存                                      │  │
│  │  • Agent 生命周期管理                                   │  │
│  │  • 工具执行(WebMCP)                                  │  │
│  │  • 特征提取(Embedding pipeline)                       │  │
│  │  • 对话历史(Agent.chatMessages)                       │  │
│  │                                                        │  │
│  │  模型只加载一次,不随标签页增加                          │  │
│  └──────────┬──────────────────────────┬───────────────────┘  │
│             │ chrome.runtime.sendMessage │                      │
│             ▼                          ▼                       │
│  ┌──────────────────────┐  ┌──────────────────────────────┐  │
│  │   Side Panel (侧边栏) │  │  Content Script (内容脚本)    │  │
│  │   (交互层 - 轻量)     │  │  (页面桥接 - 轻量)            │  │
│  │                      │  │                              │  │
│  │  • 聊天输入/输出      │  │  • DOM 提取                  │  │
│  │  • 流式响应渲染       │  │  • 元素高亮                  │  │
│  │  • 模型下载进度       │  │  • 页面滚动                  │  │
│  │  • 设置控制           │  │                              │  │
│  │                      │  │  注入到每个 HTTP(S) 页面       │  │
│  └──────────────────────┘  └──────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

为什么这样拆分

Chrome Manifest V3 有严格的运行时规则: - Background Service Worker 可以执行重量级计算,但无法直接访问页面 DOM - Content Script 可以访问页面 DOM,但生命周期短、不适合加载大模型 - Side Panel 是持久化 UI,适合聊天交互

核心原则:Background 是唯一协调者,Side Panel 和 Content Script 是专职客户端。

消息传递契约

Side Panel ──→ Background              Background ──→ Content Script
──────────────────────────            ──────────────────────────────
CHECK_MODELS                        EXTRACT_PAGE_DATA
INITIALIZE_MODELS                   HIGHLIGHT_ELEMENTS
AGENT_GENERATE_TEXT                 CLEAR_HIGHLIGHTS
AGENT_GET_MESSAGES
AGENT_CLEAR
EXTRACT_FEATURES

Background ──→ Side Panel
──────────────────────────
DOWNLOAD_PROGRESS
MESSAGES_UPDATE

Agent 循环与 WebMCP 工具调用层

WebMCP — 工具调用规范化层

Nico 构建了一个叫 WebMCP 的工具调用层,将浏览器工具规范化为模型可理解的格式:

用户输入: "总结当前页面"
    │
    ▼
┌─────────────────────────────────────────────────┐
│              Agent Loop (runAgent)                │
│                                                   │
│  1. 用户消息 → chatMessages                       │
│  2. 创建占位 assistant 消息 → 流式输出 tokens      │
│  3. 解析输出 → extractToolCalls()                 │
│     │                                             │
│     ├── 有工具调用?                               │
│     │     │                                       │
│     │     ▼                                       │
│     │   ┌─────────────────────┐                   │
│     │   │   WebMCP 工具执行    │                   │
│     │   │                     │                   │
│     │   │ tool = {            │                   │
│     │   │   name,             │                   │
│     │   │   description,      │                   │
│     │   │   inputSchema,      │                   │
│     │   │   execute()         │                   │
│     │   │ }                   │                   │
│     │   └────────┬────────────┘                   │
│     │            │                                │
│     │            ▼                                │
│     │   执行结果 → 下一轮 prompt                   │
│     │   └──→ 回到步骤 2                            │
│     │                                             │
│     └── 无工具调用?→ 最终确定响应,附加 metrics     │
│                                                   │
└─────────────────────────────────────────────────┘

可用工具

工具名 功能 说明
get_open_tabs 列出所有打开的标签页 返回标题和 URL
go_to_tab 切换到指定标签页 支持语义匹配
open_url 打开新 URL 前台/后台可选
close_tab 关闭标签页
find_history 语义搜索浏览历史 基于 IndexedDB 向量库
ask_website 读取并总结页面内容 RAG:提取 → 嵌入 → 检索 → 生成
highlight_website_element 高亮页面元素 滚动到目标段落并高亮

Gemma 4 的 Tool Calling 格式

模型输出格式(Gemma-4 风格 chat template):

<|tool_call|>call:ask_website{query:<|"|>summarize this page in three sentences<|"|>}

模型决定调用工具时,输出一个特殊的 tool-call token block。extractToolCalls 解析器将其提取出来,执行实际函数,然后将结果喂回模型。


核心能力

1. 标签页管理

"切换到我的银行标签页"
    │
    ├── get_open_tabs → 列出所有标签页(标题+URL)
    └── go_to_tab → 找到匹配标签页并切换

替代手动翻找 20+ 个标签页。

2. 页面交互(RAG)

"找到这个产品页面上的定价部分"
    │
    ├── Content Script 提取 DOM(标题、段落、列表)
    ├── MiniLM 生成嵌入向量
    ├── 语义检索最相关内容块
    ├── Gemma 4 基于检索结果生成回答
    └── highlight_website_element → 滚动并高亮

不是关键词匹配,而是理解语义

3. 浏览历史语义搜索(最亮眼功能)

传统历史搜索:  关键词匹配 URL/标题
语义历史搜索:  向量相似度匹配页面内容

"找到我上周看的那篇关于降低 API 成本的文章"
    │
    ├── 每个访问过的页面 → MiniLM → 向量
    │   存储: {title, description, url, embedding}
    ├── 用户查询 → MiniLM → 向量
    ├── 余弦相似度检索
    └── 返回最匹配的历史记录

即使记不住标题或网站,用自然语言描述内容即可找到。


性能表现

硬件环境 Token 速度 体验
MacBook M3/M4 15-25 tok/s 流畅可用
Windows + 独立 GPU 15-25 tok/s 流畅可用
旧笔记本 / 集成显卡 ~5 tok/s 可用,较慢
无 WebGPU 支持 不支持 无法运行

页面总结测试:长博客文章 3 句总结, decent GPU 机器约 20 秒。


安装与开发

方式 1:Chrome Web Store(推荐普通用户)

  1. Chrome Web Store 搜索 "transformers.js Gemma 4 browser assistant"
  2. 安装(2 秒,扩展本身很小)
  3. 点击图标打开侧边栏 → 首次下载模型(约 3GB)
  4. 下载完成后,即使离线也可使用

方式 2:从源码构建(开发者)

git clone https://github.com/nico-martin/gemma4-browser-extension
cd gemma4-browser-extension
pnpm install
pnpm run dev
# Chrome → 扩展程序 → 加载已解压的扩展 → 选择 dist/ 目录

适用场景:修改 Agent 行为、添加自定义工具、研究架构。


架构的扩展可能性

Nico 的架构设计为多种变体留了空间:

当前实现                        可扩展方向
─────────                       ──────────
Side Panel 聊天        →       Popup 快捷助手
全局单一 Agent         →       Per-Tab 独立 Agent
预设工具集             →       自定义工具注册
单页面交互             →       Options 页面配置
变体 实现方式 适用场景
Popup 助手 action.default_popup 快速问答
Side Panel Copilot 当前方案 持久对话
Per-Tab Agent Background 中按 tabId 隔离状态 每个标签页独立上下文
Hybrid UI Popup + Side Panel + Options 共享 Background 全场景覆盖

关键设计原则:Background 拥有状态和推理,UI/Content 是专职客户端。


参考资料

相关笔记