<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Elaina</title><description>A Material 3 anime blog</description><link>https://blog.eriiagi.com/</link><language>zh_CN</language><item><title>MianCoach · AI 面试陪练</title><link>https://blog.eriiagi.com/posts/miancoach/</link><guid isPermaLink="true">https://blog.eriiagi.com/posts/miancoach/</guid><description>基于 RAG 的技术面试陪练应用，整合知识库问答、题目收藏、模拟面试与复盘功能。使用 Spring Boot 3 + pgvector + Vue 3 构建，已部署上线。</description><pubDate>Sat, 14 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;项目简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/elaina-agi/miancoach&quot;&gt;MianCoach&lt;/a&gt; 是一个基于检索增强生成（RAG）的技术面试陪练应用，将知识库问答、题目收藏、模拟面试和练习复盘整合在同一套题库中。系统从题库原文检索参考资料，生成带来源引用的回答，并根据标准资料提供作答反馈。&lt;/p&gt;
&lt;p&gt;🌐 &lt;strong&gt;在线体验&lt;/strong&gt;：&lt;a href=&quot;https://prep.eriiagi.com&quot;&gt;prep.eriiagi.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💬 &lt;strong&gt;知识库问答&lt;/strong&gt;：支持流式回答、来源引用和多轮追问，可打开引用核对原文&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;题库浏览&lt;/strong&gt;：按板块、类目浏览题目，支持搜索高亮、题目定位和原文图片查看&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;个人收藏&lt;/strong&gt;：从知识库或问答来源原文收藏整道题，按用户隔离，支持板块筛选和分页复习&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;模拟面试&lt;/strong&gt;：按范围抽题，对照题库原文批改，展示得分、命中的知识点与补充建议&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;面试复盘&lt;/strong&gt;：历史记录和面试场次，带 AI 总结，可回放对话&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术架构&lt;/h2&gt;
&lt;h3&gt;后端技术栈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心框架&lt;/strong&gt;：Spring Boot 3.3.5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：PostgreSQL 17 + pgvector 0.8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 集成&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;生成：阿里云百炼 &lt;code&gt;qwen-plus&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;向量化：硅基流动 &lt;code&gt;BAAI/bge-m3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重排：&lt;code&gt;BAAI/bge-reranker-v2-m3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署&lt;/strong&gt;：Docker Compose&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;前端技术栈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;框架&lt;/strong&gt;：Vue 3.5 + TypeScript&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建&lt;/strong&gt;：Vite 6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 库&lt;/strong&gt;：Element Plus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态管理&lt;/strong&gt;：Pinia&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;功能详解&lt;/h2&gt;
&lt;h3&gt;1. RAG 知识问答&lt;/h3&gt;
&lt;p&gt;系统采用 &lt;strong&gt;Parent-Child 分块策略&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;检索粒度&lt;/strong&gt;：小块（child chunk），提升召回精度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答上下文&lt;/strong&gt;：大块（parent chunk），保留完整语义&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多路召回&lt;/strong&gt;：向量检索 + BM25 混合召回，pgvector 负责向量相似度计算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RAG 流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户提问经过意图分类（安全审查、拒答）&lt;/li&gt;
&lt;li&gt;查询向量化，从 PostgreSQL 检索 Top-K 候选&lt;/li&gt;
&lt;li&gt;Reranker 对候选重排，筛选最相关片段&lt;/li&gt;
&lt;li&gt;组装上下文，调用大模型流式生成&lt;/li&gt;
&lt;li&gt;答案带来源引用，点击可查看原文&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;关键实现：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 pgvector 的 HNSW 索引加速向量检索&lt;/li&gt;
&lt;li&gt;支持多轮对话，前端传递最近一轮历史&lt;/li&gt;
&lt;li&gt;游客模式不保存对话，登录用户按会话隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 模拟面试与批改&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;面试流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择范围（板块 + 类目），设置抽题数量&lt;/li&gt;
&lt;li&gt;系统随机抽题，用户依次作答&lt;/li&gt;
&lt;li&gt;AI 对照题库原文批改，给出：
&lt;ul&gt;
&lt;li&gt;得分（0-100）&lt;/li&gt;
&lt;li&gt;命中的知识点&lt;/li&gt;
&lt;li&gt;补充建议&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;面试结束后生成场次总结，可回放对话&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;批改提示词设计：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用题库原文作为标准答案&lt;/li&gt;
&lt;li&gt;要求 AI 明确指出遗漏的关键点&lt;/li&gt;
&lt;li&gt;给出具体的补充建议，不只是泛泛的鼓励&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 题库与收藏&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;题库组织：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;板块（如 Agent、RAG、工具调用）&lt;/li&gt;
&lt;li&gt;类目（二级分类）&lt;/li&gt;
&lt;li&gt;题目（Markdown 格式，包含代码、图片）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;收藏功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从问答的来源引用直接收藏&lt;/li&gt;
&lt;li&gt;从题库浏览页收藏&lt;/li&gt;
&lt;li&gt;按板块筛选，分页复习&lt;/li&gt;
&lt;li&gt;用户数据隔离，支持删除&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;h3&gt;1. pgvector 向量检索优化&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;-- HNSW 索引创建
CREATE INDEX chunks_embedding_hnsw_idx 
ON chunks USING hnsw (embedding vector_cosine_ops) 
WITH (m = 16, ef_construction = 64);

-- 向量相似度查询（余弦距离）
SELECT parent_id, content, 1 - (embedding &amp;lt;=&amp;gt; $1) AS score
FROM chunks
WHERE board_id = ANY($2)
ORDER BY embedding &amp;lt;=&amp;gt; $1
LIMIT 20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;优化策略：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 HNSW（Hierarchical Navigable Small World）索引，查询速度快&lt;/li&gt;
&lt;li&gt;&lt;code&gt;m=16, ef_construction=64&lt;/code&gt; 平衡了索引构建速度和查询精度&lt;/li&gt;
&lt;li&gt;板块过滤在向量检索前执行，减少计算量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 流式回答与引用&lt;/h3&gt;
&lt;p&gt;后端使用 &lt;code&gt;SseEmitter&lt;/code&gt; 流式推送：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;答案逐 token 流式输出，降低首字延迟&lt;/li&gt;
&lt;li&gt;引用信息在流结束后单独推送&lt;/li&gt;
&lt;li&gt;前端按行解析 SSE，实时渲染 Markdown&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 多模型配置与降级&lt;/h3&gt;
&lt;p&gt;系统支持三个独立的模型端点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chat&lt;/code&gt;：生成端（问答、批改、总结）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;embed&lt;/code&gt;：向量端（语料向量化、查询向量化）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rerank&lt;/code&gt;：重排端（召回候选打分）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;降级策略：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rerank 失败时降级为向量检索排序&lt;/li&gt;
&lt;li&gt;向量化失败时返回空结果，不阻断用户操作&lt;/li&gt;
&lt;li&gt;生成失败时返回错误提示，不影响历史记录&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 安全与权限&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JWT 认证&lt;/strong&gt;：HS256 签名，1 天过期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码加密&lt;/strong&gt;：BCrypt，防止彩虹表攻击&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据隔离&lt;/strong&gt;：会话、收藏按 &lt;code&gt;user_id&lt;/code&gt; 隔离，API 校验归属&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理员保护&lt;/strong&gt;：禁止删除自己、禁用自己或取消自己的管理员角色&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;部署运行&lt;/h2&gt;
&lt;h3&gt;本地开发&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 启动后端（需要 PostgreSQL + pgvector）
cd server
./mvnw spring-boot:run

# 2. 启动前端
cd web
pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker Compose 部署&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 生产环境（PostgreSQL + 后端 + 前端 Nginx）
docker compose -f compose.prod.yml up -d

# 查看日志
docker compose -f compose.prod.yml logs -f server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;环境变量配置：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AI_CHAT_*&lt;/code&gt;：生成模型配置（API Key、Base URL、模型名）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AI_EMBED_*&lt;/code&gt;：向量模型配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AI_RERANK_*&lt;/code&gt;：重排模型配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JWT_SECRET&lt;/code&gt;：JWT 签名密钥（生产必须修改）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_*&lt;/code&gt;：数据库连接信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;详细配置见 &lt;a href=&quot;https://github.com/elaina-agi/miancoach/blob/main/.env.example&quot;&gt;.env.example&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;开发心得&lt;/h2&gt;
&lt;h3&gt;1. RAG 不是银弹&lt;/h3&gt;
&lt;p&gt;RAG 能减少幻觉，但不能完全消除：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检索召回不准时，答案仍会偏离&lt;/li&gt;
&lt;li&gt;题库内容质量直接影响回答质量&lt;/li&gt;
&lt;li&gt;需要持续优化分块策略和检索参数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;经验：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parent-Child 分块比固定窗口效果好&lt;/li&gt;
&lt;li&gt;混合检索（向量 + BM25）召回更全&lt;/li&gt;
&lt;li&gt;Rerank 对提升精度帮助很大，但有额外成本&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 向量索引的权衡&lt;/h3&gt;
&lt;p&gt;HNSW 索引构建慢但查询快，适合读多写少的场景。我的题库约 2000 个 chunk，索引构建耗时约 10 秒，但查询只需几毫秒。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩过的坑：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初次部署时忘记建索引，查询超时&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ef_construction&lt;/code&gt; 设太大（200+），索引构建卡死&lt;/li&gt;
&lt;li&gt;调整为 &lt;code&gt;m=16, ef_construction=64&lt;/code&gt; 后平衡了性能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 流式回答的坑&lt;/h3&gt;
&lt;p&gt;SSE 在生产环境可能被 Nginx、CDN 缓冲，导致前端收不到实时数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nginx 配置 &lt;code&gt;proxy_buffering off;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每条消息以 &lt;code&gt;\n\n&lt;/code&gt; 结尾，符合 SSE 规范&lt;/li&gt;
&lt;li&gt;前端使用 &lt;code&gt;EventSource&lt;/code&gt; 或 &lt;code&gt;fetch&lt;/code&gt; 读取流&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 用户体验细节&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;游客模式&lt;/strong&gt;：不登录也能问答，降低试用门槛&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引用可点击&lt;/strong&gt;：直接查看原文，增强可信度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;暗色模式&lt;/strong&gt;：长时间复习不刺眼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：移动端也能流畅使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;未来规划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 支持更多向量模型（OpenAI、本地模型）&lt;/li&gt;
&lt;li&gt;[ ] 增加语音面试功能（语音识别 + 实时批改）&lt;/li&gt;
&lt;li&gt;[ ] 面试题库自动扩充（爬虫 + 去重）&lt;/li&gt;
&lt;li&gt;[ ] 导出复习笔记（PDF、Markdown）&lt;/li&gt;
&lt;li&gt;[ ] 跨模型对比（A/B Test 不同大模型的批改质量）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🔗 GitHub: &lt;a href=&quot;https://github.com/elaina-agi/miancoach&quot;&gt;elaina-agi/miancoach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🌐 在线体验: &lt;a href=&quot;https://miancoach.elaina.icu&quot;&gt;miancoach.elaina.icu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果这个项目对你有帮助，欢迎 Star ⭐ 和提 Issue！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;:::tip[RAG 应用开发建议]
做 RAG 应用时，&lt;strong&gt;检索质量比生成质量更重要&lt;/strong&gt;。大模型本身已经很强，但检索不准时再强的模型也无力回天。建议先把检索调好（召回、重排、分块策略），再考虑换更好的生成模型。
:::&lt;/p&gt;
&lt;p&gt;:::note[关于命名]
项目原名 &lt;code&gt;baguwen-rag&lt;/code&gt;（八股文 RAG），后改为 &lt;code&gt;miancoach&lt;/code&gt;（面试教练）。现有部署保持数据库与环境变量兼容，不影响已有用户。
:::&lt;/p&gt;
</content:encoded></item><item><title>OCR Translate - 轻量级截图翻译工具</title><link>https://blog.eriiagi.com/posts/ocr-translate/</link><guid isPermaLink="true">https://blog.eriiagi.com/posts/ocr-translate/</guid><description>用 Rust + egui 开发的 Windows 截图翻译工具，支持快速 OCR 识别和多翻译服务。框选屏幕，识别原文，悬浮窗显示译文，轻量快速。</description><pubDate>Sat, 14 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;项目简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/elaina-agi/ocr-translate&quot;&gt;OCR Translate&lt;/a&gt; 是一个轻量级的 Windows 截图翻译工具，使用 Rust 和 egui 开发。按 &lt;code&gt;Ctrl+Shift+T&lt;/code&gt; 框选屏幕，识别原文后在悬浮窗口中查看译文；也可以在主窗口翻译图片或直接输入的文字。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📸 &lt;strong&gt;框选截图翻译&lt;/strong&gt;：快捷键 &lt;code&gt;Ctrl+Shift+T&lt;/code&gt;，OCR 识别后尽早显示结果&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;轻量快速&lt;/strong&gt;：Rust 编写，启动快、占用低&lt;/li&gt;
&lt;li&gt;🪟 &lt;strong&gt;多悬浮窗口&lt;/strong&gt;：固定的结果窗会保留，新结果窗会避开已有窗口&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;最新截图优先&lt;/strong&gt;：翻译过程中可再次框选，新截图会取代旧任务&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;多翻译服务&lt;/strong&gt;：支持 DeepL、百度、火山引擎、OpenAI Vision 等&lt;/li&gt;
&lt;li&gt;🎙️ &lt;strong&gt;语音朗读&lt;/strong&gt;（可选）：Azure 语音合成，支持多种语言&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/elaina-agi/ocr-translate/releases/latest&quot;&gt;📥 下载 Windows 版本&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;技术栈&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言&lt;/strong&gt;：Rust 1.82+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GUI 框架&lt;/strong&gt;：egui + eframe（即时模式 GUI）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCR 引擎&lt;/strong&gt;：Windows OCR（系统自带，无需联网）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截图&lt;/strong&gt;：&lt;code&gt;screenshots&lt;/code&gt; crate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络请求&lt;/strong&gt;：&lt;code&gt;reqwest&lt;/code&gt;（异步 HTTP 客户端）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平台&lt;/strong&gt;：Windows 10/11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;功能详解&lt;/h2&gt;
&lt;h3&gt;1. 屏幕框选翻译&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;使用流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;code&gt;Ctrl+Shift+T&lt;/code&gt; 或点击主窗口「框选屏幕」&lt;/li&gt;
&lt;li&gt;鼠标拖动框选识别区域&lt;/li&gt;
&lt;li&gt;系统 OCR 识别原文，结果窗口尽早显示&lt;/li&gt;
&lt;li&gt;翻译服务返回译文，更新到结果窗口&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;体验优化：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OCR 识别完成后立即显示原文，不等翻译完成&lt;/li&gt;
&lt;li&gt;翻译过程中可继续框选，新截图成功后会取代旧任务&lt;/li&gt;
&lt;li&gt;旧任务的迟到结果不会覆盖新结果，避免混乱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 本地 Windows OCR&lt;/h3&gt;
&lt;p&gt;使用 Windows 系统自带的 OCR 引擎识别文字：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无需联网&lt;/strong&gt;：完全离线识别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言支持&lt;/strong&gt;：中文、英文、日文等（取决于系统安装的语言包）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量快速&lt;/strong&gt;：直接调用系统 API，不依赖第三方服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;添加语言包（如果识别不准）：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开「设置」→「时间和语言」→「语言和区域」&lt;/li&gt;
&lt;li&gt;点击「添加语言」，搜索你需要的语言（如日语）&lt;/li&gt;
&lt;li&gt;安装后，OCR Translate 会自动检测并使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 多翻译服务支持&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;内置翻译服务：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DeepL API&lt;/strong&gt;：翻译质量高，支持免费层和 Pro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;百度翻译&lt;/strong&gt;：中文支持好，需要百度翻译 API Key&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;火山引擎&lt;/strong&gt;：字节跳动的翻译服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI Vision&lt;/strong&gt;：使用视觉模型直接识别图片并翻译（可跳过 OCR）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;配置方式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在主窗口点击「设置」&lt;/li&gt;
&lt;li&gt;填入对应服务的 API Key&lt;/li&gt;
&lt;li&gt;密钥使用 Windows DPAPI 加密存储，只能由同一台电脑的同一用户解密&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 悬浮结果窗口&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;窗口特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可拖动、可缩放&lt;/li&gt;
&lt;li&gt;可复制译文到剪贴板&lt;/li&gt;
&lt;li&gt;固定后会在后续截图中保留&lt;/li&gt;
&lt;li&gt;新窗口会自动避开已有窗口，不重叠&lt;/li&gt;
&lt;li&gt;点击「打开主窗口」可回到设置界面&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 语音朗读（可选）&lt;/h3&gt;
&lt;p&gt;集成 Azure 语音合成服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持中文、英文、日文等多种语言&lt;/li&gt;
&lt;li&gt;支持调整语速、音调&lt;/li&gt;
&lt;li&gt;需要 Azure 语音服务的订阅密钥&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;h3&gt;1. Rust + egui 的即时模式 GUI&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;为什么选择 egui？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;即时模式&lt;/strong&gt;：不需要维护复杂的状态树，代码更简洁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：理论上可以移植到 macOS、Linux（但 Windows OCR API 不跨平台）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能好&lt;/strong&gt;：Rust 原生性能，启动快、占用低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内置布局&lt;/strong&gt;：flexbox 风格的布局系统，易用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// egui 的即时模式写法
egui::Window::new(&quot;结果&quot;)
    .resizable(true)
    .show(ctx, |ui| {
        ui.label(&amp;amp;self.original_text);
        ui.separator();
        ui.label(&amp;amp;self.translated_text);
        if ui.button(&quot;复制译文&quot;).clicked() {
            self.copy_to_clipboard();
        }
    });
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 异步任务处理&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;tokio&lt;/code&gt; 异步运行时处理 OCR 和翻译：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OCR 和翻译在后台线程执行，不阻塞 GUI&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;mpsc&lt;/code&gt; 通道在线程间传递结果&lt;/li&gt;
&lt;li&gt;超时控制：网络请求 20 秒超时，避免卡死&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 截图取消机制&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户快速连续截图时，旧的翻译任务可能还在进行&lt;/li&gt;
&lt;li&gt;如果不处理，旧结果会覆盖新结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每次新截图时，生成一个唯一的任务 ID&lt;/li&gt;
&lt;li&gt;翻译完成时，检查任务 ID 是否匹配&lt;/li&gt;
&lt;li&gt;不匹配则丢弃结果，不更新窗口&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 配置加密存储&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;安全措施：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Key 使用 Windows DPAPI 加密后存储在 &lt;code&gt;%APPDATA%\ocr-translate\config.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;只能由同一台电脑的同一 Windows 用户解密&lt;/li&gt;
&lt;li&gt;临时截图保存在系统临时目录，程序退出时自动清理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开发动机&lt;/h2&gt;
&lt;h3&gt;为什么要做这个工具？&lt;/h3&gt;
&lt;p&gt;在学习日语、查看外文文档时，经常需要翻译屏幕上的文字。市面上的翻译工具要么太重（带广告、后台常驻）、要么要收费、要么隐私不安全。我想要一个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轻量级&lt;/strong&gt;：启动快，占用少，用完就关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离线 OCR&lt;/strong&gt;：不把截图传到云端，隐私安全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源免费&lt;/strong&gt;：代码透明，可审计&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;为什么用 Rust？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;性能好&lt;/strong&gt;：Rust 编译出的可执行文件小、启动快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;：正好在学 Rust，拿来练手&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生态成熟&lt;/strong&gt;：&lt;code&gt;egui&lt;/code&gt;、&lt;code&gt;reqwest&lt;/code&gt;、&lt;code&gt;tokio&lt;/code&gt; 等库都很好用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;部署运行&lt;/h2&gt;
&lt;h3&gt;下载使用&lt;/h3&gt;
&lt;p&gt;直接下载编译好的可执行文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/elaina-agi/ocr-translate/releases/latest&quot;&gt;下载最新版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;解压后运行 &lt;code&gt;ocr-translate.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;首次运行会要求设置翻译服务（可选 DeepL、百度等）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;从源码构建&lt;/h3&gt;
&lt;p&gt;需要 Rust 1.82+ 和 Visual Studio C++ Build Tools：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 克隆仓库
git clone https://github.com/elaina-agi/ocr-translate.git
cd ocr-translate

# 开发运行
cargo run

# 测试
cargo test --locked

# 发布构建
cargo build --release --locked
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建产物位于 &lt;code&gt;target/release/ocr-translate.exe&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;开发心得&lt;/h2&gt;
&lt;h3&gt;1. egui 的即时模式很爽&lt;/h3&gt;
&lt;p&gt;和传统的保留模式 GUI（如 Qt、GTK）不同，egui 的即时模式不需要维护复杂的状态树。每一帧都重新绘制整个界面，代码逻辑更清晰。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不需要手动同步状态和 UI&lt;/li&gt;
&lt;li&gt;调试方便，状态变化立即体现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;复杂动画不如保留模式流畅&lt;/li&gt;
&lt;li&gt;需要注意避免每帧都做重复计算&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Windows API 的坑&lt;/h3&gt;
&lt;p&gt;Windows OCR API 是 WinRT 接口，Rust 调用需要通过 &lt;code&gt;windows&lt;/code&gt; crate：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;异步 API 要转成 Rust 的 &lt;code&gt;async/await&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;语言包检测依赖系统设置，需要给用户明确提示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 多线程的挑战&lt;/h3&gt;
&lt;p&gt;截图、OCR、翻译都是耗时操作，不能阻塞 GUI 主线程。用 &lt;code&gt;tokio&lt;/code&gt; 异步处理后，还要注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GUI 更新必须在主线程&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;mpsc&lt;/code&gt; 通道传递结果&lt;/li&gt;
&lt;li&gt;任务取消要及时响应&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 用户体验细节&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;快捷键全局生效&lt;/strong&gt;：不需要窗口在前台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果窗避开已有窗口&lt;/strong&gt;：减少重叠，一次截图能看到多个结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCR 先显示，翻译后更新&lt;/strong&gt;：即使翻译慢，也能先看到原文&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;未来规划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 支持 macOS 和 Linux（需要替换 Windows OCR）&lt;/li&gt;
&lt;li&gt;[ ] 增加 OCR 结果编辑（识别错误时手动修正）&lt;/li&gt;
&lt;li&gt;[ ] 支持更多翻译服务（Google Translate、彩云小译等）&lt;/li&gt;
&lt;li&gt;[ ] 历史记录功能（保存最近的翻译结果）&lt;/li&gt;
&lt;li&gt;[ ] 划词翻译（监听剪贴板）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🔗 GitHub: &lt;a href=&quot;https://github.com/elaina-agi/ocr-translate&quot;&gt;elaina-agi/ocr-translate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📥 下载: &lt;a href=&quot;https://github.com/elaina-agi/ocr-translate/releases&quot;&gt;Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;欢迎 Star ⭐、提 Issue 和 PR！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;:::tip[给 Rust 初学者]
这个项目很适合 Rust 入门者练手：代码量适中（约 2000 行），涉及 GUI、异步、网络请求等常见场景。egui 的即时模式比传统 GUI 框架好上手。
:::&lt;/p&gt;
&lt;p&gt;:::note[隐私说明]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OCR 使用 Windows 系统本地引擎，截图不上传&lt;/li&gt;
&lt;li&gt;翻译需要调用在线 API，但只传送文本，不传送图片&lt;/li&gt;
&lt;li&gt;API Key 加密存储在本地，不上传到任何服务器
:::&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>