ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ensu 工作原理深度解析:Ente 端到端本地推理聊天应用的技术内幕

Ensu 工作原理深度解析:Ente 端到端本地推理聊天应用的技术内幕 Ensu 工作原理深度解析Ente 端到端本地推理聊天应用的技术内幕【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/enteEnsu 是 Ente 开源的本地优先 AI 聊天应用完整定位可参见介绍页它把大语言模型的加载、提示词处理与 token 生成全部搬到你的设备本地执行聊天过程中不依赖任何云端推理服务。本文以 Ensu How it works 文档为主体结合 monorepo 内 Rust 推理核心与 Web 端推理实现的源码证据为你讲清 Ensu 的架构形态、模型文件、消息处理流水线、本地存储布局、隐私边界与信任模型让你能独立审计其结构性隐私承诺并理解各平台实现差异的底层原因。架构形态反转主流 AI 聊天应用的结构几乎所有主流 AI 聊天应用ChatGPT、Claude、Gemini 等都遵循同一形态设备上的瘦客户端与服务器上运行的模型对话。模型太大装不进手机重活都在别处完成代价是你输入的一切最终都落在别人的机器上。Ensu 把这个结构反转过来模型足够小可以装进你的设备聊天 UI 与模型运行在同一个应用、同一台机器上推理链路中不存在服务器。当然小模型的能力不如云端最大型模型但对日常很多场景已经够用而且本地模型正在快速进步。Ensu 的职责就是让本地版本的体验与云端一样顺畅。更完整的定位与使用场景隐私反思与日记、离线使用、书籍与想法讨论等可以参考Ensu 介绍页。各平台运行形态共享 Rust 核心按平台包装Ensu 构建在一个共享的Rust 核心之上负责模型加载、提示与 token 生成同一个核心被各平台的原生应用包装平台实现方式iOS / AndroidRust 核心以原生库形式内置上层为 Swift / Kotlin UImacOS / Windows / LinuxTauri 应用Rust 核心做推理 轻量原生外壳 内嵌 Ensu Web UIWeb全部运行在浏览器中模型以 WebAssembly 运行模型文件缓存在浏览器的 Origin Private File SystemOPFS中避免每次访问重复下载底层推理引擎原生平台基于 llama.cpp浏览器端则是它的 WebAssembly 构建。Ensu 在这个引擎外面做了一层封装让聊天 UI、模型下载与设置在各平台表现一致。这一双后端结构在 Web 端代码中有直接体现inference.ts 中的createInferenceBackend依据运行环境选择后端——Tauri 环境下返回TauriInference否则返回WasmInference并抽象出统一的InferenceBackend接口loadModel/createContext/generateChatStream/cancel等。Rust 侧则通过llama_cpp_2crate 封装 llama.cppLlamaBackend使用OnceLock做进程级单例初始化见 llm/mod.rs模型加载走LlamaModel::load_from_file见 llm/model.rs。整个 Ensu 代码库Rust 推理核心、各平台 UI、Web 应用都开源在 Ente 的 monorepo 中与 Photos、Auth、Locker 等应用同仓。模型文件GGUF 格式与平台默认模型模型本身是单个文件手机上通常 600 MB 到 2 GB内存充足的桌面上有几 GB。格式为GGUF——与 llama.cpp 同款格式。多模态模型还会附带一个独立的mmproj文件内含处理图像的视觉投影器vision projector。Ensu 首次启动时会根据你的设备挑选默认模型并从 Hugging Face 下载默认模型参数量量化适用设备大小Gemma 4 E4BQ4_K_M40 亿4B多模态DeepMind 出品Q4_K_M桌面端macOS / Windows / Linux且内存 ≥ 16 GB约 6 GBLFM 2.5 VL 1.6BQ4_016 亿1.6B多模态Liquid AI 出品Q4_0其余全部Android、iOS、低内存桌面、Web约 700 MB这些预设模型在 config.rsLFM与 config.rsGemma中以ModelPreset形式硬编码包含 Hugging Face 下载地址、精确字节大小与 SHA-256 校验值例如 LFM 2.5 VL 1.6B 主模型 695,752,480 字节、mmproj 583,109,888 字节——下载后会做完整性校验这也解释了为什么模型文件必须是 GGUF 且校验严格。设备选择逻辑与内存阈值相关源码中MOBILE_HIGH_MEMORY_THRESHOLD_BYTES 7 GB注释说明移动 OS 报告的内存低于标称值7 GB 目标对应 8 GB 设备、DESKTOP_HIGH_MEMORY_THRESHOLD_BYTES 16 GB见 config.rs。原生平台的下载是可断点续传的如果下载中断下次启动应用时会从断点继续。下载在可能的情况下并行进行并自动重试。这一机制在 Web 端代码里同样成立inference.ts 的ensureModelCached会把模型写入 OPFS 缓存目录通过Range: bytesdownloaded-请求头实现断点续传见 inference.ts并记录 ETag、原始大小等元数据用于校验isModelAvailable会校验文件头是否为 GGUF 魔数GGUF四字节见 inference.ts且至少 1 MB。发送消息时发生了什么一次完整的本地推理流水线当你按下发送键输入框把消息、图片附件如有和最近的聊天历史交给本地模型Ensu 把系统提示词和仍在上下文中的历史消息前置然后要求模型继续这段对话模型把 token 流式返回给应用你看到的内容逐块出现模型生成完毕或被你停止后最终消息与其余聊天内容一起保存到本地存储。整个流程不发任何网络请求。聊天过程中 Ensu 产生的唯一网络流量来自操作系统自身DNS、系统后台任务不涉及任何 Ente 端点。你可以在模型下载完成后把设备切到飞行模式验证这一点——Ensu 依然可用。从 Rust 源码可以还原这条流水线的具体实现均在 llm/generate.rs请求模型ChatRequest定义了一次生成的全部参数——messages、template_override、add_assistant、image_paths、mmproj_path、max_tokens、temperature、top_p、top_k、repeat_penalty、frequency_penalty、presence_penalty、seed、stop_sequences、grammar见 generate.rs。Web 端通过buildGenerateChatRequest做字段映射、buildSamplingConfig做采样参数换算见 inference.ts。提示词构造build_chat_prompt读取模型自带的 chat template可被template_override覆盖对带enable_thinking的模板走 OpenAI 兼容的模板应用路径普通模型则用apply_chat_template拼出完整提示见 generate.rs。默认max_tokens为 8192DEFAULT_GENERATION_MAX_TOKENS见 generate.rs。上下文与 KV 缓存复用Context内持有LlamaContext与已缓存 token 列表见 llm/context.rsappend_only_prefix_len只在提示严格以已缓存前缀开头时复用缓存避免每次对话都重新 prefill见 generate.rs并有对应单元测试only_strict_extensions_reuse_cache。提示超过上下文窗口会返回PromptTooLong错误generate.rs。采样器链build_sampler按需组装惩罚repeat/frequency/presence、grammar、top-k、top-p、温度与随机种子采样器temperature ≤ 0时退化为 greedy 解码见 generate.rs。流式解码StreamDecoder按 token 累积字节并保持 UTF-8 完整性跨字节边界的中文字符、emoji 不会乱码同时检测停止序列、在命中时截断输出见 generate.rs测试stream_decoder_emits_complete_utf8验证了 emoji 的完整输出。多模态路径当携带image_paths时要求必须提供mmproj_path通过缓存的MtmdContext把图像编码为视觉 token 与文本 token 一起送入模型见 generate.rs。桌面端还有prewarmMultimodalContext预热机制见 inference.ts。取消与停止每个生成任务注册原子取消标志UI 上的停止按钮通过cancel(jobId)jobId ≤ 0 时取消全部触发生成循环在每步检查该标志见 generate.rs。Web 端WasmInference走等价路径formatChat拼提示、tokenize统计 prompt token、createCompletion流式产出 chunk、按job_id管理 abort controller见 inference.ts。什么被存储存在哪里Ensu 把所有与聊天相关的东西都存在你的设备上。默认没有 Ente 账号因此 Ente 服务器上没有任何地方承载这些数据。本地数据包括模型文件多模态模型还有 mmproj 文件——体积最大的项语音转写模型iOS / Android使用语音输入时聊天历史消息、附件、会话标题、分支元数据设置系统提示词、模型选择等偏好日志用于调试不含聊天内容仅在你选择导出时使用。存储位置平台路径macOS~/Library/Application Support/io.ente.ensu/Windows%APPDATA%\io.ente.ensu\Linux~/.local/share/io.ente.ensu/或$XDG_DATA_HOME/io.ente.ensu/iOS应用沙盒内删除应用即清除Android应用内部与外部文件目录卸载即清除Web模型存浏览器 OPFS聊天历史存 IndexedDB聊天历史在 Web 端由 chat/services/persistence.ts 等模块落盘移动端上会话与分支的持久化逻辑在 rust/crates/ensu/src/db/chat/ 的 SQLite 后端含 schema 与迁移中实现。卸载方式可参考 Uninstall Ensu 文档。什么不会被存储隐私边界清单永远不会离开你设备的数据你在输入框输入的文字你为语音输入录制的语音本地转写你附加的图片由多模态投影器本地处理模型的回答。Ensu 不会做的事聊天无需账号——登录流程是为未来的同步功能准备的完全可选没有任何分析或遥测追踪你问模型的内容没有任何后台上传。所有会走网络的行为仅此而已首次启动或切换模型、Ensu 更新导致模型版本变化时从 Hugging Face 下载聊天模型iOS / Android 上首次使用语音输入时从models.ente.com下载 Parakeet 转写模型与 Silero VAD 模型除非已缓存软件更新检查由平台应用商店或桌面自动更新器处理如果你为未来的同步功能登录会有一轮标准的认证交互。在必需模型下载完成后离线运行 Ensu或直接检查源码都可以确认以上任何一点。同步与备份已构建完成尚未启用当前发布版本不会把你的聊天同步到任何地方每个设备的历史相互独立。加密同步与备份已经构建完成并可用但本版本未启用团队希望在最终确定架构前先收集产品方向上的反馈。同步上线后使用你现有的 Ente 账号可随时选择加入或退出端到端加密复用 Ente Photos、Auth、Locker 使用的同一套加密库与密钥派生方式——Ente 服务器只能看到密文与 Ente 其他部分一样支持自托管你现有的本地聊天会被接管并备份设备上已有的内容不会丢失。更多细节见 FAQ 的同步章节仓库内 FAQ 全文在 faq/index.md。信任模型结构性隐私而非承诺Ensu 的隐私是结构性的而不是口头承诺模型运行在设备上明文数据根本不需要离开默认没有 Ente 账号介入链路服务器端没有可被攻破的对象应用开源你可以独立验证以上任何一点。Ensu不防御的情形被攻破的设备如果手机或电脑上有能读取应用数据的东西就能读到你的聊天历史。请使用设备级防护全盘加密、应用锁、屏幕锁模型自身的缺陷本地模型同样可能产生幻觉或错误答案请像对待其他 AI 输出一样看待它提示词导致的推断风险如果你把敏感文档粘贴进聊天并要求总结文档在你的设备上但它同时也成了本地聊天历史的一部分。防的是第三方而不是你自己或能接触到同一台设备的人。关于未来云端同步的隐私保证见上文同步与备份。延伸阅读Ensu 介绍安装、发送第一条消息与推荐提示词Ensu 功能总览按功能组织的全平台能力清单Ensu FAQ隐私、模型、同步与故障排查Rust 推理核心流式生成、采样器、多模态与 KV 缓存复用实现Web 端推理服务WASM / Tauri 双后端与 OPFS 断点续传下载模型预设配置各平台默认模型的 URL、大小与 SHA-256。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表