translategemma-4b-it开发者案例:Ollama+FastAPI封装为微服务供前端调用

1. 项目背景与价值

在实际开发中,我们经常需要将AI模型能力集成到现有系统中。直接让前端调用Ollama服务存在诸多不便:跨域问题、安全性考虑、接口标准化等。通过FastAPI将translategemma-4b-it模型封装为标准的RESTful API,可以让前端开发者像调用普通接口一样使用翻译能力。

这种微服务架构的优势很明显:前后端分离、接口标准化、易于扩展、便于监控。无论是Web应用、移动端还是其他服务,都能通过统一的API接口获得高质量的翻译服务。

2. 环境准备与部署

2.1 基础环境要求

确保你的系统已经安装以下组件:

  • Python 3.8+
  • Ollama(最新版本)
  • FastAPI及相关依赖

2.2 Ollama模型部署

首先确保translategemma:4b模型已经正确安装:

# 拉取模型(如果尚未安装)
ollama pull translategemma:4b

# 验证模型是否可用
ollama run translategemma:4b "你好"

2.3 安装必要的Python包

创建项目目录并安装依赖:

mkdir translate-service
cd translate-service
python -m venv venv
source venv/bin/activate  # Linux/Mac
# 或 venv\Scripts\activate  # Windows

pip install fastapi uvicorn requests python-multipart

3. FastAPI服务实现

3.1 创建主服务文件

新建main.py文件,实现核心API逻辑:

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import requests
import json
from pydantic import BaseModel

app = FastAPI(title="TranslateGemma API Service", version="1.0.0")

# 允许跨域请求
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

class TranslationRequest(BaseModel):
    text: str
    source_lang: str = "en"
    target_lang: str = "zh-Hans"

class ImageTranslationRequest(BaseModel):
    image_url: str
    target_lang: str = "zh-Hans"

@app.post("/translate/text")
async def translate_text(request: TranslationRequest):
    """
    文本翻译接口
    """
    prompt = f"""你是一名专业的{request.source_lang}至{request.target_lang}翻译员。
你的目标是准确传达原文的含义与细微差别,同时遵循语法、词汇及文化敏感性规范。
仅输出{request.target_lang}译文,无需额外解释或评论。请翻译以下文本:
{request.text}"""
    
    try:
        response = requests.post(
            "http://localhost:11434/api/generate",
            json={
                "model": "translategemma:4b",
                "prompt": prompt,
                "stream": False
            }
        )
        
        if response.status_code == 200:
            result = response.json()
            return {"translated_text": result["response"]}
        else:
            raise HTTPException(status_code=500, detail="翻译服务内部错误")
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"翻译失败: {str(e)}")

@app.post("/translate/image")
async def translate_image(request: ImageTranslationRequest):
    """
    图片翻译接口
    """
    prompt = f"""你是一名专业的翻译员。请将图片中的文本翻译成{request.target_lang}。
仅输出{request.target_lang}译文,无需额外解释或评论。"""
    
    try:
        # 这里需要根据实际情况处理图片URL或base64编码
        # 示例中使用图片URL,实际可能需要下载图片或处理base64
        response = requests.post(
            "http://localhost:11434/api/generate",
            json={
                "model": "translategemma:4b",
                "prompt": prompt,
                "images": [request.image_url],
                "stream": False
            }
        )
        
        if response.status_code == 200:
            result = response.json()
            return {"translated_text": result["response"]}
        else:
            raise HTTPException(status_code=500, detail="图片翻译服务内部错误")
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"图片翻译失败: {str(e)}")

@app.get("/health")
async def health_check():
    """服务健康检查"""
    return {"status": "healthy", "model": "translategemma:4b"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

3.2 启动服务

运行以下命令启动FastAPI服务:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

服务启动后,访问 http://localhost:8000/docs 可以看到自动生成的API文档。

4. 前端调用示例

4.1 JavaScript调用示例

前端可以使用fetch或axios调用翻译服务:

// 文本翻译示例
async function translateText(text, sourceLang, targetLang) {
    try {
        const response = await fetch('http://localhost:8000/translate/text', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                text: text,
                source_lang: sourceLang,
                target_lang: targetLang
            })
        });
        
        const result = await response.json();
        return result.translated_text;
    } catch (error) {
        console.error('翻译失败:', error);
        return null;
    }
}

// 使用示例
translateText("Hello, how are you?", "en", "zh-Hans")
    .then(translation => console.log(translation));

4.2 图片翻译调用示例

// 图片翻译示例
async function translateImage(imageUrl, targetLang) {
    try {
        const response = await fetch('http://localhost:8000/translate/image', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                image_url: imageUrl,
                target_lang: targetLang
            })
        });
        
        const result = await response.json();
        return result.translated_text;
    } catch (error) {
        console.error('图片翻译失败:', error);
        return null;
    }
}

5. 高级功能扩展

5.1 批量翻译支持

可以扩展API支持批量文本翻译:

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):
    """
    批量文本翻译接口
    """
    results = []
    for text in request.texts:
        # 这里可以添加并发处理提高效率
        translated = await translate_text_internal(text, request.source_lang, request.target_lang)
        results.append(translated)
    
    return {"translations": results}

5.2 支持更多语言对

通过动态生成prompt支持多种语言对:

def generate_translation_prompt(text, source_lang, target_lang):
    language_pairs = {
        ("en", "zh-Hans": "英语至中文",
        ("zh-Hans", "en": "中文至英语",
        ("en", "ja": "英语至日语",
        # 添加更多语言对支持
    }
    
    pair_name = language_pairs.get((source_lang, target_lang), f"{source_lang}至{target_lang}")
    
    return f"""你是一名专业的{source_lang}至{target_lang}翻译员。
你的目标是准确传达原文的含义与细微差别,同时遵循语法、词汇及文化敏感性规范。
仅输出{target_lang}译文,无需额外解释或评论。请翻译以下文本:
{text}"""

6. 部署与优化建议

6.1 生产环境部署

对于生产环境,建议使用:

# 使用gunicorn部署(多worker)
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

# 或者使用docker部署
# Dockerfile示例
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

6.2 性能优化建议

  1. 连接池管理:为Ollama请求使用连接池
  2. 异步处理:使用异步HTTP客户端(如httpx)
  3. 缓存机制:对常见翻译结果进行缓存
  4. 负载均衡:多个Ollama实例负载均衡

7. 总结

通过FastAPI将translategemma-4b-it封装为微服务,我们实现了:

  1. 标准化接口:提供统一的RESTful API供前端调用
  2. 跨平台支持:任何能发送HTTP请求的应用都能使用翻译服务
  3. 易于扩展:可以轻松添加批量翻译、多语言支持等功能
  4. 部署灵活:支持本地部署、容器化部署等多种方式

这种架构不仅解决了直接调用Ollama的技术限制,还为后续的功能扩展和性能优化提供了良好基础。无论是个人项目还是企业应用,都能通过这种方式快速集成高质量的翻译能力。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐