| FROM python:3.11-slim |
|
|
| WORKDIR /app |
|
|
| # 1. 安装必要的 Python 库 |
| RUN pip install fastapi uvicorn sentence-transformers torch --index-url https: |
|
|
| # 2. 创建一个稳健的后端服务 (app.py) |
| RUN echo "from fastapi import FastAPI, Request, HTTPException" > app.py && \ |
| echo "from fastapi.responses import JSONResponse" >> app.py && \ |
| echo "from sentence_transformers import SentenceTransformer" >> app.py && \ |
| echo "import os, uvicorn" >> app.py && \ |
| echo "MODEL_ID = os.getenv('MODEL_ID', 'microsoft/harrier-oss-v1-0.6b')" >> app.py && \ |
| echo "print(f'正在加载模型: {MODEL_ID}')" >> app.py && \ |
| echo "model = SentenceTransformer(MODEL_ID, device='cpu')" >> app.py && \ |
| echo "print('模型加载完毕!准备接收请求...')" >> app.py && \ |
| echo "app = FastAPI()" >> app.py && \ |
| echo "@app.post('/v1/embeddings')" >> app.py && \ |
| echo "async def create_embeddings(request: Request):" >> app.py && \ |
| echo " try:" >> app.py && \ |
| echo " body = await request.json()" >> app.py && \ |
| echo " input_text = body.get('input', '')" >> app.py && \ |
| echo " if not input_text:" >> app.py && \ |
| echo " raise HTTPException(422, '缺少 input 字段')" >> app.py && \ |
| echo " embeddings = model.encode(input_text).tolist()" >> app.py && \ |
| echo " return JSONResponse({" >> app.py && \ |
| echo " 'object': 'list'," >> app.py && \ |
| echo " 'data': [{'object': 'embedding', 'embedding': embeddings, 'index': 0}]," >> app.py && \ |
| echo " 'model': MODEL_ID" >> app.py && \ |
| echo " })" >> app.py && \ |
| echo " except HTTPException:" >> app.py && \ |
| echo " raise" >> app.py && \ |
| echo " except Exception as e:" >> app.py && \ |
| echo " return JSONResponse({'error': str(e)}, status_code=500)" >> app.py && \ |
| echo "if __name__ == '__main__':" >> app.py && \ |
| echo " uvicorn.run(app, host='0.0.0.0', port=7860)" >> app.py |
|
|
| # 3. 启动服务 |
| CMD ["python", "app.py"] |