Home 未来世界,浏览器自带大模型,免费、离线可用,附教程.md
Post
Cancel

未来世界,浏览器自带大模型,免费、离线可用,附教程.md

大家好,我是章北海

先给大家看个浏览器内置大模型的玩法

我也写了一个极简静态页面(代码见文末),测试完全可用:

这事儿要从1个月前说起

5月份,谷歌I/O大会上说:Chrome浏览器要内置AI功能(它家的Gemini Nano大模型)

Gemini Nano 是我们能直接在用户的移动设备上执行任务的最高效模型。无论蜂窝网络覆盖范围如何,Gemini Nano 都可以实现低延迟响应并增强数据隐私。

此图展示了您的网站或应用如何使用任务 API 和探索性网络平台 API 来访问 Chrome 中内置的模型。

内置 AI 技术有哪些好处:

  1. 易于部署:浏览器自动管理模型分发和更新。

  2. 硬件加速:利用设备的 GPU、NPU 或 CPU,优化性能。

  3. 隐私保护:本地处理敏感数据。

  4. 流畅体验:即时结果,无需服务器往返。

  5. 离线使用:无网络连接时仍可使用 AI 功能。

  6. 高访问权限:用户设备承担处理负载,降低推断费用。

能干啥呢?

1.通过 AI 增强内容消费:包括摘要、翻译、回答有关某些内容的问题、分类和特征。

2.AI 支持的内容创作:例如写作辅助、校对、语法更正和重新表述。

这么好的东西怎么迟迟不开放呢?

原来谷歌还在开发者版上测试

顺着刚刚演示的视频,我找到了开发者专用的每日构建版:Chrome Canary

开启内置AI ,过程看起来很难,其实一点都不容易:

1)需要下载 Chrome 浏览器的 Chrome Canary 版本:https://www.google.com/chrome/canary/

2)需要将浏览器语言设置为英文

  1. 在 Windows 计算机上打开 Chrome。
  2. 在右上角,依次点击“更多”图标 设置
  3. 点击左侧的语言
  4. 在“首选语言”下方,点击您要使用的语言旁边的“更多”图标 。
    • 如果系统没列出您要使用的语言,请点击添加语言来添加该语言。
  5. 点击以这种语言显示 Google Chrome
    • 此选项仅适用于 Windows 计算机,mac需要将系统语言设置为英文。
  6. 重启 Chrome 以应用所做的更改。

3)打开 chrome://flags 找到 prompt-api-for-gemini-nano 设置为“Enabled”

4)然后找到 optimization-guide-on-device-model 设置为“Enabled BypassPerfRequirement”,重启浏览器。

5)进到 chrome://components/ 找到 Optimization Guide On Device Model 然后点击“Check for update”。

注意:如果没有这个选项的话把flags那两个开启的选项禁用之后再重启,然后在开启一次再试试。

6)然后可以在控制台用这个两个命令测试是否启用,

const model = await http://window.ai.createTextSession(); await model.prompt(“1+1=?”);

PS: 我的极简静态页面代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Chat</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f0f0f0;
            margin: 0;
        }
        #chat-container {
            width: 100%;
            max-width: 600px;
            background-color: white;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            border-radius: 8px;
            overflow: hidden;
        }
        #messages {
            height: 400px;
            overflow-y: auto;
            padding: 10px;
            border-bottom: 1px solid #ddd;
            display: flex;
            flex-direction: column;
        }
        .message {
            margin-bottom: 10px;
            padding: 10px;
            border-radius: 4px;
            word-wrap: break-word;
        }
        .user {
            background-color: #e1f5fe;
            align-self: flex-end;
        }
        .bot {
            background-color: #f0f4c3;
            align-self: flex-start;
        }
        #input-container {
            display: flex;
        }
        #input-container input {
            flex: 1;
            padding: 10px;
            border: none;
            border-top: 1px solid #ddd;
        }
        #input-container button {
            padding: 10px;
            border: none;
            background-color: #2196f3;
            color: white;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="chat-container">
        <div id="messages"></div>
        <div id="input-container">
            <input type="text" id="user-input" placeholder="Type your message here..." onkeydown="handleKeyDown(event)">
            <button onclick="sendMessage()">Send</button>
        </div>
    </div>

    <!-- 引入 marked.js 库 -->
    <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

    <script>
        let session;

        async function initializeSession() {
            session = await window.ai.createTextSession();
        }

        async function sendMessage() {
            const input = document.getElementById('user-input');
            const message = input.value.trim();
            if (message === "") return;

            displayMessage(message, 'user');
            input.value = "";

            const response = await session.prompt(message);
            displayMessage(response, 'bot');
        }

        function displayMessage(message, sender) {
            const messagesContainer = document.getElementById('messages');
            const messageElement = document.createElement('div');
            messageElement.classList.add('message', sender);

            if (sender === 'bot') {
                // 使用 marked.js 渲染 Markdown
                messageElement.innerHTML = marked.parse(message);
            } else {
                messageElement.textContent = message;
            }

            messagesContainer.appendChild(messageElement);
            messagesContainer.scrollTop = messagesContainer.scrollHeight;
        }

        function handleKeyDown(event) {
            if (event.key === 'Enter') {
                sendMessage();
            }
        }

        window.onload = initializeSession;
    </script>
</body>
</html>

保存为index.html后用Chrome Canary打开即可。

补充情报:

有人已经提取了权重,感兴趣可以研究一下:

https://huggingface.co/wave-on-discord/gemini-nano/tree/main

This post is licensed under CC BY 4.0 by the author.