Ollama部署translategemma-4b-it:图文翻译服务与FastAPI封装完整示例
Ollama部署translategemma-4b-it图文翻译服务与FastAPI封装完整示例想不想在本地电脑上就拥有一个能看懂图片里的英文并帮你翻译成中文的智能助手今天我们就来手把手教你部署一个这样的服务。它不仅能处理纯文本翻译还能“看懂”图片里的文字实现真正的图文翻译。我们将使用Ollama来运行Google最新开源的轻量级翻译模型——translategemma-4b-it。这个模型虽然小巧但支持55种语言翻译质量相当不错。更重要的是我们会把它封装成一个标准的Web API服务让你可以像调用普通接口一样轻松集成到你的应用里。无论你是开发者想给自己的产品加个翻译功能还是普通用户想搭建一个私有的翻译工具这篇文章都能帮你搞定。整个过程清晰明了跟着步骤走半小时内就能看到效果。1. 环境准备与模型部署在开始之前我们需要准备好运行环境。整个过程非常简单主要分为两步安装Ollama和拉取翻译模型。1.1 安装OllamaOllama是一个让你能在本地轻松运行大模型的工具它把复杂的模型部署过程变得像安装软件一样简单。对于Mac和Linux用户打开终端一行命令就能搞定curl -fsSL https://ollama.ai/install.sh | sh安装完成后Ollama服务会自动启动。你可以在终端输入ollama --version来验证是否安装成功。对于Windows用户可以直接从Ollama官网下载安装程序双击运行即可。安装后你会在系统托盘看到Ollama的图标。1.2 拉取translategemma-4b-it模型模型已经准备好了我们只需要把它“下载”到本地。打开你的终端或命令提示符输入以下命令ollama pull translategemma:4b这个命令会从Ollama的模型库中拉取translategemma-4b-it模型。模型大小约4B参数对于翻译任务来说这个尺寸在保证质量的同时对硬件要求也很友好。下载过程可能需要几分钟具体时间取决于你的网络速度。完成后你可以用下面的命令测试一下模型是否正常工作ollama run translategemma:4b然后尝试输入一些英文比如Translate Hello, world! to Chinese.看看它是否能正确返回中文翻译。2. 理解translategemma-4b-it模型在开始封装服务之前我们先简单了解一下我们要用的这个模型。知道它的能力边界用起来才更得心应手。2.1 模型简介translategemma-4b-it是Google基于Gemma 3模型系列构建的轻量级翻译模型。它有以下几个特点多语言支持能处理55种语言的翻译任务覆盖了全球大多数常用语言。图文翻译这是它的一大亮点不仅能翻译纯文本还能读取图片中的文字并进行翻译。轻量高效模型体积相对较小这意味着它可以在普通的笔记本电脑、台式机甚至一些云服务器上流畅运行不需要昂贵的专业显卡。输入输出输入可以是文本字符串也可以是图片图片会被自动处理为896x896分辨率。输出就是翻译后的目标语言文本。2.2 基础使用方式在Ollama的Web界面里使用这个模型非常简单打开Ollama的Web界面通常是http://localhost:11434。在模型选择下拉框中找到并选择translategemma:4b。在对话框里输入你的翻译指令和内容。一个典型的使用场景是翻译图片中的英文。你可以这样输入你是一名专业的英语en至中文zh-Hans翻译员。你的目标是准确传达原文的含义与细微差别同时遵循英语语法、词汇及文化敏感性规范。 仅输出中文译文无需额外解释或评论。请将图片的英文文本翻译成中文然后上传包含英文文字的图片模型就会返回中文翻译结果。不过通过Web界面使用虽然方便但不利于集成到其他应用。接下来我们就把它变成一个标准的API服务。3. 构建FastAPI翻译服务现在进入核心部分用Python和FastAPI把模型封装成Web服务。这样任何能发送HTTP请求的程序都能调用我们的翻译功能了。3.1 创建项目环境首先我们创建一个干净的项目目录并设置Python虚拟环境。这能确保我们的依赖包不会影响系统其他项目。# 创建项目目录 mkdir translate-api-service cd translate-api-service # 创建虚拟环境Python 3.8 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate3.2 安装必要依赖我们需要安装几个关键的Python包fastapi用来构建Web API框架uvicornASGI服务器用来运行FastAPI应用requests用于向Ollama发送请求pillow处理图片文件python-multipart支持文件上传在激活的虚拟环境中运行pip install fastapi uvicorn requests pillow python-multipart3.3 编写核心API代码创建一个名为main.py的文件我们将在这里编写主要的服务代码。代码结构清晰我加了详细注释你可以边看边理解。from fastapi import FastAPI, UploadFile, File, Form from fastapi.responses import JSONResponse from PIL import Image import requests import io import base64 import json from typing import Optional # 初始化FastAPI应用 app FastAPI( titleTranslategemma图文翻译API服务, description基于Ollama部署的translategemma-4b-it模型提供文本和图片翻译服务, version1.0.0 ) # Ollama服务的地址默认运行在本地11434端口 OLLAMA_URL http://localhost:11434/api/generate class TranslationService: 翻译服务核心类封装与Ollama的交互逻辑 def __init__(self): self.model_name translategemma:4b def prepare_image_prompt(self, image_bytes: bytes) - str: 准备包含图片的翻译提示词 模型需要特定的提示词格式来处理图片翻译 # 将图片转换为base64编码 image_b64 base64.b64encode(image_bytes).decode(utf-8) # 构建模型能理解的提示词 # 这个格式是translategemma模型要求的 prompt f你是一名专业的英语en至中文zh-Hans翻译员。你的目标是准确传达原文的含义与细微差别同时遵循英语语法、词汇及文化敏感性规范。 仅输出中文译文无需额外解释或评论。请将图片的英文文本翻译成中文image{image_b64}/image return prompt def prepare_text_prompt(self, text: str, source_lang: str en, target_lang: str zh-Hans) - str: 准备纯文本翻译的提示词 可以指定源语言和目标语言 prompt f你是一名专业的{source_lang}至{target_lang}翻译员。你的目标是准确传达原文的含义与细微差别同时遵循{source_lang}语法、词汇及文化敏感性规范。 仅输出{target_lang}译文无需额外解释或评论。请翻译以下文本{text} return prompt def call_ollama(self, prompt: str) - str: 调用Ollama API进行推理 返回模型生成的翻译结果 payload { model: self.model_name, prompt: prompt, stream: False # 我们不需要流式响应一次性返回全部结果 } try: response requests.post(OLLAMA_URL, jsonpayload, timeout60) response.raise_for_status() # 如果请求失败抛出异常 result response.json() return result.get(response, ).strip() except requests.exceptions.RequestException as e: return f调用翻译服务失败: {str(e)} except json.JSONDecodeError as e: return f解析响应失败: {str(e)} # 创建翻译服务实例 translator TranslationService() app.get(/) async def root(): 服务健康检查端点 return { service: Translategemma图文翻译API, status: running, model: translategemma:4b, endpoints: { /translate/text: POST - 文本翻译, /translate/image: POST - 图片翻译, /health: GET - 服务健康检查 } } app.get(/health) async def health_check(): 服务健康检查 # 简单测试一下Ollama服务是否可用 try: test_response requests.get(http://localhost:11434/api/tags, timeout5) ollama_status available if test_response.status_code 200 else unavailable except: ollama_status unavailable return { api_service: healthy, ollama_service: ollama_status, model: translator.model_name } app.post(/translate/text) async def translate_text( text: str Form(..., description待翻译的文本), source_lang: str Form(en, description源语言代码如en、es、fr等), target_lang: str Form(zh-Hans, description目标语言代码如zh-Hans、ja、ko等) ): 文本翻译接口 - 支持55种语言互译 - 默认英语翻译成简体中文 if not text.strip(): return JSONResponse( status_code400, content{error: 翻译文本不能为空} ) # 准备提示词 prompt translator.prepare_text_prompt(text, source_lang, target_lang) # 调用模型翻译 translated_text translator.call_ollama(prompt) return { success: True, original_text: text, translated_text: translated_text, source_lang: source_lang, target_lang: target_lang, model: translator.model_name } app.post(/translate/image) async def translate_image( image: UploadFile File(..., description包含文字的图片文件支持PNG、JPG、JPEG格式), source_lang: str Form(en, description图片中文字的源语言), target_lang: str Form(zh-Hans, description目标翻译语言) ): 图片翻译接口 - 上传包含文字的图片 - 自动识别图片中的文字并翻译 - 支持多种图片格式 # 检查文件类型 allowed_types [image/png, image/jpeg, image/jpg] if image.content_type not in allowed_types: return JSONResponse( status_code400, content{error: f不支持的文件类型。请上传PNG或JPEG格式的图片} ) try: # 读取图片数据 image_data await image.read() # 验证图片数据有效性 img Image.open(io.BytesIO(image_data)) img.verify() # 验证图片完整性 # 重新打开图片verify会关闭图片 img Image.open(io.BytesIO(image_data)) # 可以在这里添加图片预处理逻辑比如调整大小等 # 但translategemma模型内部会处理图片所以不是必须的 # 准备包含图片的提示词 prompt translator.prepare_image_prompt(image_data) # 调用模型翻译 translated_text translator.call_ollama(prompt) return { success: True, original_image: image.filename, image_size: f{img.width}x{img.height}, translated_text: translated_text, source_lang: source_lang, target_lang: target_lang, model: translator.model_name } except Exception as e: return JSONResponse( status_code500, content{error: f处理图片时出错: {str(e)}} ) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)这段代码创建了一个完整的翻译API服务主要提供了三个接口根路径(/): 服务信息展示健康检查(/health): 检查服务状态文本翻译(/translate/text): 纯文本翻译图片翻译(/translate/image): 图片内容翻译4. 运行与测试翻译服务代码写好了现在让我们启动服务并测试一下效果。4.1 启动服务确保Ollama服务正在运行安装后默认会自动启动。然后在项目目录下运行我们的FastAPI应用# 确保在项目目录下并且虚拟环境已激活 python main.py你会看到类似这样的输出INFO: Started server process [12345] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRLC to quit)服务现在已经运行在http://localhost:8000了。4.2 测试文本翻译接口打开浏览器访问http://localhost:8000/docs你会看到自动生成的API文档页面。这是FastAPI的一个很棒的功能不需要我们手动写文档。让我们先测试文本翻译。在文档页面找到/translate/text接口点击Try it out按钮。在测试表单中填入text:Hello, world! This is a test of the translation service.source_lang:en(默认)target_lang:zh-Hans(默认)点击Execute你会看到类似这样的响应{ success: true, original_text: Hello, world! This is a test of the translation service., translated_text: 你好世界这是翻译服务的测试。, source_lang: en, target_lang: zh-Hans, model: translategemma:4b }你也可以用curl命令测试curl -X POST http://localhost:8000/translate/text \ -H Content-Type: application/x-www-form-urlencoded \ -d textHello, world! This is a test of the translation service. \ -d source_langen \ -d target_langzh-Hans4.3 测试图片翻译接口图片翻译的测试稍微复杂一点因为需要上传文件。在API文档页面找到/translate/image接口。点击Try it out然后选择一个包含英文文字的图片文件PNG或JPG格式点击Execute如果一切正常你会得到图片中文字的翻译结果。如果你想用代码测试这里有一个Python示例import requests # 图片翻译测试 url http://localhost:8000/translate/image with open(test_image.png, rb) as img_file: files {image: (test_image.png, img_file, image/png)} data {source_lang: en, target_lang: zh-Hans} response requests.post(url, filesfiles, datadata) print(response.json())4.4 常见问题解决如果在测试中遇到问题可以按以下步骤排查Ollama服务未运行# 检查Ollama是否运行 curl http://localhost:11434/api/tags如果返回错误需要启动Ollamaollama serve模型未下载# 检查模型是否已下载 ollama list如果看不到translategemma:4b需要重新拉取ollama pull translategemma:4b端口冲突如果8000端口被占用可以修改main.py中的端口号uvicorn.run(app, host0.0.0.0, port8080) # 改为其他端口图片处理失败确保图片格式是PNG、JPG或JPEG检查图片文件是否损坏尝试减小图片尺寸大图片可能处理时间较长5. 进阶使用与优化建议基础服务已经跑起来了但要让它在实际项目中更好用我们还可以做一些优化。5.1 添加请求限流为了防止服务被滥用我们可以添加简单的限流机制。修改main.py添加以下代码from fastapi import Request from fastapi.responses import JSONResponse import time # 简单的内存缓存记录请求时间 request_times {} app.middleware(http) async def rate_limit_middleware(request: Request, call_next): 简单的限流中间件每个IP每分钟最多60次请求 client_ip request.client.host current_time time.time() # 清理1分钟前的记录 request_times[client_ip] [ t for t in request_times.get(client_ip, []) if current_time - t 60 ] # 检查请求频率 if len(request_times.get(client_ip, [])) 60: return JSONResponse( status_code429, content{error: 请求过于频繁请稍后再试} ) # 记录本次请求 request_times.setdefault(client_ip, []).append(current_time) response await call_next(request) return response5.2 添加日志记录好的日志能帮助我们快速定位问题。添加一个简单的日志配置import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(ftranslation_service_{datetime.now().strftime(%Y%m%d)}.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) # 在翻译函数中添加日志 app.post(/translate/text) async def translate_text(...): logger.info(f文本翻译请求: {text[:50]}...) # 只记录前50个字符 # ... 原有代码 ... logger.info(f翻译完成: {source_lang} - {target_lang}) return result5.3 支持批量翻译如果需要一次性翻译多段文本可以添加批量翻译接口from pydantic import BaseModel from typing import List class BatchTranslationRequest(BaseModel): texts: List[str] source_lang: str en target_lang: str zh-Hans app.post(/translate/batch) async def batch_translate(request: BatchTranslationRequest): 批量文本翻译接口 if not request.texts: return JSONResponse( status_code400, content{error: 翻译文本列表不能为空} ) results [] for text in request.texts: prompt translator.prepare_text_prompt( text, request.source_lang, request.target_lang ) translated translator.call_ollama(prompt) results.append({ original: text, translated: translated }) return { success: True, total: len(results), results: results, source_lang: request.source_lang, target_lang: request.target_lang }5.4 部署到生产环境对于生产环境建议做以下优化使用生产级服务器# 使用uvicorn的多worker模式 uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4添加API密钥认证在main.py中添加from fastapi import HTTPException, Security from fastapi.security import APIKeyHeader API_KEY_NAME X-API-Key api_key_header APIKeyHeader(nameAPI_KEY_NAME, auto_errorFalse) # 简单的API密钥验证实际项目中应该使用更安全的方式 VALID_API_KEYS {your-secret-api-key-here} async def verify_api_key(api_key: str Security(api_key_header)): if api_key not in VALID_API_KEYS: raise HTTPException( status_code403, detail无效的API密钥 ) return api_key # 在需要保护的接口上添加依赖 app.post(/translate/text) async def translate_text( api_key: str Depends(verify_api_key), ... # 其他参数 ): # ... 原有代码 ...使用环境变量管理配置 创建.env文件OLLAMA_URLhttp://localhost:11434/api/generate MODEL_NAMEtranslategemma:4b API_KEYSkey1,key2,key3 RATE_LIMIT60在代码中读取import os from dotenv import load_dotenv load_dotenv() OLLAMA_URL os.getenv(OLLAMA_URL, http://localhost:11434/api/generate) MODEL_NAME os.getenv(MODEL_NAME, translategemma:4b)6. 总结通过这篇文章我们完成了一个完整的图文翻译服务的搭建。从Ollama模型部署到FastAPI服务封装再到实际测试和优化建议我们一步步构建了一个实用的翻译API。这个服务有几个明显的优点完全本地化所有数据都在本地处理不需要将敏感信息发送到第三方服务器隐私有保障。多语言支持基于translategemma模型支持55种语言互译满足大多数需求。图文双修不仅能翻译纯文本还能处理图片中的文字应用场景更广泛。易于集成标准的RESTful API接口可以轻松集成到Web应用、移动应用或其他服务中。成本可控在本地运行没有按次计费长期使用成本更低。你可以基于这个基础版本根据自己的需求进行扩展。比如添加更多语言对的支持、实现实时翻译、构建翻译记忆库或者开发一个带界面的翻译应用。最重要的是整个过程都是开箱即用的。你不需要深入了解大模型的复杂原理也不需要配置繁琐的环境跟着步骤走就能拥有一个属于自己的智能翻译服务。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。