共计 1804 个字符,预计需要花费 5 分钟才能阅读完成。
浏览器集成 AI 助手能大幅提升工作效率,典型场景包括:

- 表单智能填充:自动识别网页输入框并生成合规数据
- 代码实时补全:在开发工具中提供 AI 建议
- 内容摘要生成:快速提炼网页文章核心观点
技术方案对比
浏览器插件方案
优势 :
– 完全掌控 DOM 操作权限
– 可长期保持后台服务运行
– 支持离线功能开发
劣势 :
– 需处理 MV3 的 Service Worker 生命周期
– 上架商店需严格隐私审查
网页直连 API 方案
优势 :
– 开发调试流程简单
– 无需处理插件更新机制
劣势 :
– 受 CORS 策略严格限制
– API 密钥存在暴露风险
核心实现
Chrome 插件基础配置
// manifest.json (MV3 规范)
{
"manifest_version": 3,
"name": "AI 助手",
"version": "1.0",
"background": {"service_worker": "background.js"},
"content_scripts": [{"matches": ["<all_urls>"],
"js": ["content.js"]
}],
"permissions": ["storage"]
}
API 交互模块
/**
* 带重试机制的 API 请求
* @param prompt - 用户输入文本
* @param retries - 最大重试次数
*/
async function queryChatGPT(prompt: string, retries = 3): Promise<string> {
const API_ENDPOINT = 'https://api.openai.com/v1/chat/completions';
try {
const response = await fetch(API_ENDPOINT, {
method: 'POST',
headers: {'Authorization': `Bearer ${await getTempToken()}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: "gpt-3.5-turbo",
messages: [{role: "user", content: prompt}]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return (await response.json()).choices[0].message.content;
} catch (error) {if (retries > 0) return queryChatGPT(prompt, retries - 1);
throw new Error(`API 请求失败: ${error}`);
}
}
通信流程实现
- Content Script 捕获页面事件
- 通过 chrome.runtime.sendMessage 发送请求
- Background Worker 处理 API 调用
- 使用 chrome.tabs.sendResponse 返回结果
性能与安全
请求节流设计
- 采用令牌桶算法控制请求频率
- 错误响应自动触发退避重试
// 令牌桶实现示例
class RateLimiter {constructor(capacity, refillRate) {
this.tokens = capacity;
setInterval(() => {this.tokens = Math.min(capacity, this.tokens + refillRate);
}, 1000);
}
async acquire() {while (this.tokens < 1) {await new Promise(resolve => setTimeout(resolve, 100));
}
this.tokens--;
}
}
敏感数据保护
- 使用 chrome.storage.local 存储加密 token
- 设置 token 自动过期时间(推荐 1 小时)
- 实现权限分级控制
常见问题解决方案
CORS 问题突破
- 插件模式:利用 chrome.webRequest 修改响应头
- 代理方案:通过自有服务器中转请求
- 本地开发:配置 devServer 代理
商店审核要点
- 明确声明数据收集范围
- 提供隐私政策链接
- 禁止静默追踪用户行为
进阶实践
查看完整示例项目:
GitHub 仓库 (包含单元测试与 CI 配置)
挑战任务 :
尝试在 background.js 中使用 LRU 缓存实现多轮对话上下文保持,需考虑:
– 会话 ID 的生成与关联
– token 消耗计算
– 自动清理过期会话
正文完
