当前位置: 首页 > news >正文

Google 迎来「DeepSeek 时刻」:TurboQuant算法实现bit无损、×加速、×压缩、零预处理鼗

从 UI 工程师到 AI 应用架构者

13 年前,我的工作是让按钮在 IE6 上对齐;

13 年后,我用 fetch-event-source 订阅大模型的“思维流”,用 OCR 解锁图片中的文字——前端,正在成为 AI 产品的第一道体验防线。

最近,我基于 Vue 3 + Vite + TypeScript + Ant Design Vue 开发了一款企业级 AI 多语翻译平台。它支持:

文本/图片/文档多模态输入

大模型动态切换(通义千问、DeepSeek 等)

行业领域定制(医疗、法律、金融)

SSE 流式输出(使用 fetch-event-source)

今天,我将逐行拆解核心代码,带你复现这一高价值 AI 应用的前端架构。

一、技术选型:为什么是 fetch-event-source?

虽然浏览器原生支持 EventSource,但在现代前端工程中,我们更倾向使用 @microsoft/fetch-event-source:

基于 fetch,天然支持 AbortController(可取消请求)

支持 自定义 headers(用于鉴权)

更好的 TypeScript 类型支持

与 Axios/Vite 生态无缝集成

安装:

npm install @microsoft/fetch-event-source

二、OCR 图片识别:前端只管“传”和“显”

用户上传一张英文菜单截图,系统自动提取文字并翻译。前端不碰 OCR 算法,但要管理全流程状态。

真实代码实现(来自 文本_r9uv.txt)

1. 系统配置加载(含文件大小限制)

// src/views/translation/index.vue

const loadSystemPublicConfig = async () => {

try {

const response = await findSystemPublicConfig({ configKey: 'upload_file_max_limit_mb' });

const config = response.data[0];

systemConfig.value.uploadFileMaxLimit = parseInt(config.value) || 10; // 默认10MB

} catch (error) {

ElMessage.error('加载系统配置失败');

}

};

2. 文件选择与校验

const handleFileSelect = (event: Event) => {

const input = event.target as HTMLInputElement;

if (input.files && input.files.length > 0) {

const file = input.files[0];

const maxSize = systemConfig.value.uploadFileMaxLimit * 1024 * 1024;

if (file.size > maxSize) {

message.error(`文件不能超过 ${systemConfig.value.uploadFileMaxLimit} MB`);

return;

}

currentFile.value = file;

startParsing(file);

}

};

3. 调用 OCR 接口(Ant Design Vue 组件反馈)

const handleObtainFileContentText = async () => {

if (!currentFile.value) return;

const formData = new FormData();

formData.append('file', currentFile.value);

try {

const response = await obtainFileContentText(formData);

if (response.success) {

sourceLanguageText.value = response.data.contentText;

currentUploadStatus.value = 'success';

} else {

currentUploadStatus.value = 'failed';

message.error(response.message || '解析失败');

}

} catch (error) {

currentUploadStatus.value = 'failed';

message.error('网络错误,请重试');

}

};

关键设计:状态分为 'idle' | 'parsing' | 'success' | 'failed',对应四个 UI 区块,避免用户困惑。

三、大模型动态集成:让选择“无感而智能”

AI 模型不是越多越好,而是要默认最优 + 动态适配。

真实代码实现

1. 加载模型与语种字典

// 加载大模型列表

const loadLargeModelDictionary = async () => {

const response = await findLargeModelDictionary({ keyword: '' });

largeModelList.value = response.data;

if (largeModelList.value.length > 0) {

const firstModel = largeModelList.value[0];

selectedModelId.value = firstModel.id;

await loadLargeModelLanguageSupport(firstModel.id); // 关键:联动语种

}

};

// 加载某模型支持的语种

const loadLargeModelLanguageSupport = async (modelId: string) => {

const response = await findLargeModelLanguageSupport({ largeModelId: modelId });

languageSupportList.value = response.data;

};

2. 行业领域初始化

const loadIndustrySectorDictionary = async () => {

const response = await findIndustrySectorDictionary({ keyword: '' });

industrySectorList.value = response.data;

// 业务逻辑:若默认为 'general',则跳过

if (defaultIndustrySector.value === 'general' && industrySectorList.value.length > 1) {

defaultIndustrySector.value = industrySectorList.value[1].code;

}

};

3. Ant Design Vue 下拉框绑定

v-model:value="selectedModelId"

style="width: 100%"

@change="handleModelChange"

>

v-for="item in largeModelList"

:key="item.id"

:value="item.id"

>

{{ item.name }}

四、SSE 流式翻译:用 fetch-event-source 实现“打字机效果”

这是体验升级的核心!我们使用 @microsoft/fetch-event-source 替代原生 EventSource。

完整流式翻译实现(结合你的项目结构)

import { fetchEventSource } from '@microsoft/fetch-event-source';

// 存储控制器,用于取消请求

let abortController: AbortController | null = null;

const handleTranslate = async () => {

if (isTranslating.value) return;

// 重置结果

translationResult.value = '';

isTranslating.value = true;

// 创建 AbortController

abortController = new AbortController();

const params = new URLSearchParams({

largeModelId: selectedModelId.value,

sourceLangCode: selectedSourceLangCode.value,

targetLangCode: selectedTargetLangCode.value,

industrySector: defaultIndustrySector.value,

enableDeepThinking: String(enableDeepThinking.value),

content: sourceLanguageText.value.trim(),

});

try {

await fetchEventSource(`/api/v1/large-model/translate/stream${params}`, {

method: 'GET',

headers: {

'Authorization': `Bearer ${getToken()}`, // 从 Pinia 或 localStorage 获取

},

signal: abortAssistant.signal, // 支持取消

onmessage(event) {

if (event.data) {

translationResult.value += event.data;

nextTick(() => {

scrollToBottom();

});

}

},

onclose() {

isTranslating.value = false;

},

onerror(err) {

console.error('SSE Error:', err);

message.error('翻译服务异常,请稍后重试');

isTranslating.value = false;

abortController.abort(); // 主动关闭

},

});

} catch (error) {

if (abortController.signal.aborted) {

console.log('翻译已取消');

} else {

message.error('连接失败');

}

isTranslating.value = false;

}

};

// 取消翻译

const cancelTranslation = () => {

if (abortController) {

abortController.abort();

isTranslating.value = false;

message.info('翻译已取消');

}

};

自动滚动到底部

const scrollToBottom = () => {

const container = document.querySelector('.translation-result-content');

if (container) {

container.scrollTop = container.scrollHeight;

}

};

为什么不用 WebSocket?

SSE 是 单向流(服务端 → 客户端),完美匹配“AI 生成文本”场景

fetch-event-source 提供 Promise 风格 API,更符合现代前端习惯

五、工程化亮点:13年经验的沉淀

1. 响应式布局(PC/Mobile 适配)

const updateMainHeight = () => {

const mainEl = document.querySelector('.main') as HTMLElement;

if (!mainEl) return;

if (isMobile.value) {

mainEl.style.minHeight = '100vh';

mainEl.style.height = 'auto';

} else {

mainEl.style.height = '100vh';

mainEl.style.minHeight = 'auto';

}

};

2. 内存清理(防止泄漏)

onUnmounted(() => {

if (abortController) {

abortController.abort();

}

window.removeEventListener('resize', checkIsMobile);

});

3. 防重复提交 + 加载状态

type="primary"

:loading="isTranslating"

@click="handleTranslate"

:disabled="!sourceLanguageText.trim()"

>

{{ isTranslating '翻译中...' : '开始翻译' }}

结语:前端的价值,在“AI 与人之间”

这个项目让我确信:AI 时代,前端工程师的不可替代性在于“体验设计”。

我们用 fetch-event-source 把冰冷的 token 流变成温暖的“打字机”;

我们用 Ant Design Vue 让复杂配置变得简单;

我们用状态机管理 OCR 的每一步,不让用户迷失。陆傅导厦

http://www.jsqmd.com/news/629581/

相关文章:

  • 从48小时到15分钟:OpCore-Simplify如何让黑苹果配置变得简单
  • 3分钟快速上手:罗技鼠标宏自动压枪完整配置指南
  • 终极LRC歌词批量下载方案:告别手动搜索,让离线音乐库焕发新生
  • 现在不建模型血缘追踪,Q4将面临AI治理审计风暴:工信部《生成式AI工程化实施指南》强制条款逐条解读
  • OpenClaw本地部署指南:nanobot镜像中/root/.nanobot/config.json字段详解
  • ai视觉训练营--利用VisionPro (R) QuickBuild做零件尺寸测量与显示
  • prompt提示词和prompt-engineering提示词工程基础学习
  • 为什么你的系统防护失效?3步完整解决方案帮你恢复安全屏障
  • ORM性能测试Benchmark(最终版)置
  • 3个技巧解决外语游戏和视频翻译难题:免费实时屏幕翻译神器Translumo
  • 从零搭建A股实时行情+K线+MACD/RSI计算系统:Python轻量级实战
  • 破解中文心理健康AI瓶颈:Emotional First Aid Dataset 的技术深度与应用前景
  • 2026年南京专业代理记账机构最新推荐榜:南京记账、财务、会计、记账报税机构全解析 - 海棠依旧大
  • 终极指南:如何让Mac鼠标滚轮体验媲美触控板
  • 剖析2026泉州石材水景厂家,哪家技术强口碑好 - 工业品网
  • 光纤测温技术:从原理到工业落地的关键技术解析
  • Python如何让CNC控制和3D打印变得如此简单?
  • FanControl技术深度解析:Windows系统风扇控制的架构设计与高级调优
  • RexUniNLU效果对比:相比传统UIE,在小样本冷启动场景下F1值高出18.6%
  • 2026凤县婚庆公司可靠性鉴别:宝鸡婚庆推荐/宝鸡婚庆策划/宝鸡婚礼司仪/宝鸡婚礼布置/宝鸡婚礼摄像/宝鸡婚礼摄影/选择指南 - 优质品牌商家
  • 终极指南:如何5分钟快速上手text2vec-base-chinese中文文本向量化工具
  • 探讨好用的高考复读冲刺机构,武汉地区如何选择 - 工业品牌热点
  • 2026最权威的六大降AI率神器推荐
  • 什么年代了怎么还在用bash啊?现代化shell开箱体验: fish, nu, elvish杀
  • OpCore Simplify终极指南:如何30分钟完成黑苹果EFI智能配置
  • 避坑指南:STM32 RTC闹钟用LSI还是LSE?实测F103C8T6精度与功耗对比
  • Pyfa:EVE Online舰船配置助手,让你的星际舰队规划更高效
  • 别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!捶
  • 聊聊超市竞标,世纪联华在全国的口碑排名情况如何? - 工业设备
  • 如何在Windows 10/11上完美运行经典游戏:DDrawCompat兼容性解决方案详解