Python和FastAPI框架开发和容器化部署AWS上支持多种LLM和向量数据库的微服务API

用FastAPI创建一个输入提示词和所使用的LLM名称和向量搜索方式的API,返回LLM输出文本,其中用到OpenAI GPT 4o3和AWS Bedrock上的多个LLM模型的API,通过内部的类配置使用的模型和向量数据搜索类型,向量数据搜索类型包括faiss向量数据库和AWS Kendra向量数据库搜索服务,这样的逻辑用设计模式中的工厂模式实现,用Python实现Docker打包项目Python代码并在AWS ECR上注册,在AWS ECS容器中运行,已注册则直接使用现有的。

使用工厂模式实现LLM和向量搜索的灵活切换。以下是实现步骤:

  1. 修改后的项目结构:
fastapi-on-ecs/
├─ app/
│  ├─ src/
│  │  ├─ factories.py
│  │  ├─ llms/
│  │  │  ├─ base.py
│  │  │  ├─ openai.py
│  │  │  ├─ bedrock.py
│  │  ├─ vector_db/
│  │  │  ├─ base.py
│  │  │  ├─ faiss.py
│  │  │  ├─ kendra.py
│  ├─ main.py
│  ├─ Dockerfile
│  ├─ deploy.sh
│  ├─ requirements.txt
  1. 修改后的main.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from src.factories import LLMFactory, VectorSearchFactoryapp = FastAPI()class InferenceRequest(BaseModel):prompt: strllm_name: strvector_search_type: str@app.post("/generate")
async def generate_text(request: InferenceRequest):try:# 向量搜索vector_search = VectorSearchFactory.create(request.vector_search_type)context = vector_search.search(request.prompt)# LLM推理llm = LLMFactory.create(request.llm_name)response = llm.generate(f"Context: {context}\nPrompt: {request.prompt}")return {"response": response}except ValueError as e:raise HTTPException(status_code=400, detail=str(e))except Exception as e:raise HTTPException(status_code=500, detail=str(e))@app.get("/models")
async def list_models():return {"llm_models": LLMFactory.list_models(),"vector_dbs": VectorSearchFactory.list_vector_dbs()}@app.get("/")
def root():return {"message": "Welcome to LLM Inference API"}
  1. 工厂实现 (src/factories.py):
from typing import Dict, Type
from src.llms.base import BaseLLM
from src.llms.openai import OpenAIGPT
from src.llms.bedrock import BedrockLLM
from src.vector_db.base import BaseVectorDB
from src.vector_db.faiss import FAISSDB
from src.vector_db.kendra import KendraDBclass LLMFactory:_models: Dict[str, Type[BaseLLM]] = {"gpt-4o3": OpenAIGPT,"ai21-jamba": BedrockLLM,"claude-3-opus": BedrockLLM,# 其他模型映射...}@classmethoddef create(cls, model_name: str) -> BaseLLM:if model_name not in cls._models:raise ValueError(f"Unsupported model: {model_name}")return cls._models[model_name](model_name)@classmethoddef list_models(cls):return list(cls._models.keys())class VectorSearchFactory:_dbs: Dict[str, Type[BaseVectorDB]] = {"faiss": FAISSDB,"kendra": KendraDB}@classmethoddef create(cls, db_type: str) -> BaseVectorDB:if db_type not in cls._dbs:raise ValueError(f"Unsupported vector DB: {db_type}")return cls._dbs[db_type]()@classmethoddef list_vector_dbs(cls):return list(cls._dbs.keys())
  1. 基础类实现 (src/llms/base.py):
from abc import ABC, abstractmethodclass BaseLLM(ABC):@abstractmethoddef generate(self, prompt: str) -> str:pass
  1. OpenAI实现 (src/llms/openai.py):
import openai
from .base import BaseLLMclass OpenAIGPT(BaseLLM):def __init__(self, model_name: str):self.model_name = model_namedef generate(self, prompt: str) -> str:response = openai.ChatCompletion.create(model=self.model_name,messages=[{"role": "user", "content": prompt}])return response.choices[0].message.content
  1. Bedrock实现 (src/llms/bedrock.py):
import boto3
from .base import BaseLLMclass BedrockLLM(BaseLLM):def __init__(self, model_id: str):self.client = boto3.client('bedrock-runtime')self.model_id = model_iddef generate(self, prompt: str) -> str:body = {"prompt": prompt,"maxTokens": 1024}response = self.client.invoke_model(modelId=self.model_id,body=json.dumps(body)return json.loads(response['body'].read())['completion']
  1. 向量数据库实现示例 (src/vector_db/faiss.py):
import faiss
import numpy as np
from .base import BaseVectorDBclass FAISSDB(BaseVectorDB):def __init__(self):self.index = faiss.IndexFlatL2(768)# 加载预构建的索引def search(self, query: str) -> str:# 实现向量搜索逻辑return "FAISS search results"
  1. 更新requirements.txt:
fastapi==0.109.2
uvicorn==0.27.1
openai>=1.0.0
boto3>=1.34.0
faiss-cpu>=1.7.4

部署步骤:

  1. 构建并推送Docker镜像:
export AWS_ACCOUNT_ID=123456789012
export AWS_REGION=us-west-2
export REGISTRY_NAME=llm-api
export TAG=latest# 构建镜像
docker build --platform linux/amd64 -t $REGISTRY_NAME .# 推送镜像
aws ecr get-login-password | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
docker tag $REGISTRY_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REGISTRY_NAME:$TAG
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REGISTRY_NAME:$TAG
  1. ECS任务定义需要包含以下权限(通过IAM角色):
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "bedrock:*","Resource": "*"},{"Effect": "Allow","Action": "kendra:*","Resource": "*"}]
}

该实现的关键点:

  1. 使用工厂模式灵活切换模型和向量数据库
  2. 通过boto3集成AWS Bedrock服务
  3. 提供标准化的API接口
  4. 容器化部署支持
  5. 完善的错误处理机制

测试API:

curl -X POST http://<ALB_DNS>/generate \-H "Content-Type: application/json" \-d '{"prompt": "Explain quantum computing","llm_name": "claude-3-opus","vector_search_type": "kendra"}'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33045.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习优化-Gradient Checkpointing

数学原理参考&#xff1a; 梯度检查点技术&#xff08;Gradient Checkpointing&#xff09;详细介绍&#xff1a;中英双语-CSDN博客 视频讲解参考&#xff1a; 用梯度检查点来节省显存 gradient checkpointing_哔哩哔哩_bilibili Gradient Checkpointing&#xff08;梯度检查…

sql靶场-时间盲注(第九、十关)保姆级教程

目录 时间盲注&#xff08;第九、十关&#xff09; 1.判断 2.确认时间盲注 2.手工尝试时间盲注 数据库名长度 数据库名字符 表数 表名长度 表名字符 字段数 字段名长度 字段名字符 4.脚本时间盲注注入 5.第十关 时间盲注&#xff08;第九、十关&#xff09; 1.判…

小米路由器SSH下安装DDNS-GO

文章目录 前言一、下载&#xff06;安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS&#xff1f; DDNS&#xff08;Dynamic Domain Name Server&#xff09;是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP&#xff0c;DDNS可以将路由器变化的外网I…

Flutter_学习记录_device_info_plus 插件获取设备信息

引入三方库device_info_plus导入头文件 import package:device_info_plus/device_info_plus.dart;获取设备信息的主要代码 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…

【现代深度学习技术】卷积神经网络05:汇聚层

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Amazon RDS ProxySQL 探索(一)

:::info &#x1f4a1; 在日常开发中&#xff0c;开发者们会涉及到数据库的连接&#xff0c;在使用Amazon RDS数据库时&#xff0c;若使用集群模式或者多数据库时&#xff0c;会出现一写多读多个Endpoint&#xff0c;在实际开发中&#xff0c; 开发者们配置数据库连接通常希望走…

Appium高级操作--ActionChains类、Toast元素识别、Hybrid App操作、手机系统API的操作

书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客文章浏览阅读712次&#xff0c;点赞24次&#xff0c;收藏6次。下面总结Appium模拟复杂手势整体流程创建类实例action时&#xff0c;一定要传入WebDriver实例参数&#xff0c;创建实例成功后&#xff0c;调用…

媲美Deepseek R1 671B的千问QwQ32B本地部署与远程访问实测流程

文章目录 前言1. 环境准备2.QwQ 32B模型安装与运行测试3. 安装Open WebUI图形化界面3.1 安装Open WebUI3.2 添加QWQ32B模型 4. 安装内网穿透工具5. 配置固定公网地址总结 前言 近日&#xff0c;阿里千问发布了最新推理模型QwQ32B &#xff01;并表示“它只有 320亿参数&#x…

SpringBoot整合RabbitMq

1.引入依赖 <!--RabbitMq相关--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>2.application.yml文件配置 spring:rabbitmq:host: 192.168.101.129…

2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈

蓝桥杯原题&#xff1a; 题目描述&#xff1a; “在五子棋的对弈中&#xff0c;友谊的小船说翻就翻&#xff1f; ” 不&#xff01;对小蓝和小桥来说&#xff0c;五子棋不仅是棋盘上的较量&#xff0c;更是心与心之间的沟通。这两位挚友秉承着 “ 友谊第一&#xff0c;比赛第二…

PyQt基础——简单的图形化界面(窗口)

一、代码展示 import sysfrom PyQt6.QtGui import QPixmap from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QLineEdit, QPushButton from PyQt6 import uic from PyQt6.QtCore import Qt# 封装一个我的窗口类 class MyWidget(QWidget):def __init__(self):supe…

大语言模型-1.2-大模型技术基础

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

【MATLAB例程】AOA(到达角度)法,多个目标定位算法,三维空间、锚点数量自适应(附完整代码)

给出AOA方法下的多目标定位,适用三维空间,锚点数量>3即可,可自定义目标和锚点的数量、坐标等。 文章目录 运行结果源代码代码讲解概述功能代码结构运行结果 10个锚点、4个目标的情况: 100个锚点、10个目标的情况: 修改方便,只需调节下面的两个数字即可: 源代码 …

[CVE-2017-10271]Weblogic--WLS Security反序列化漏洞复现

文章目录 靶机地址靶机说明开启并访问靶机POCexp反弹shell后续查找flag过程略 靶机地址 网站地址 cyberstrikelab.com 靶机地址CVE-2017-10271 靶机说明 Weblogic的WLS Security组件对外提供webservice服务&#xff0c;其中使用了XMLDecoder来解析用户传入的XML数据&#xf…

如何在vscode中编译linux中的c++文件

方式一 在终端打开进行连接编译 指令含义&#xff1a;将 muduo_server.cpp 源文件编译成一个可执行文件 server&#xff0c;并且在链接过程中使用 muduo_net、muduo_base 库以及 pthread 库 方式二 在vscode中修改配置文件 按F1打开配置文件搜索栏&#xff0c;输入C/C 打开…

Unity中刚体撞墙抖动的原因和本质

当我们制作角色移动的时候我们都知道使用设置位置的方法来移动一个带有刚体和碰撞体的物体&#xff0c;遇到碰撞体的时候就会抖动。 上网查找原因&#xff0c;都说是和物理系统冲突导致的&#xff0c;然后再也找不到其他线索。 这个说法&#xff0c;对&#xff0c;但它并不是最…

文件解析漏洞靶场通关合集

一、IIS解析漏洞 &#xff08;一&#xff09;iis6的目录解析漏洞(.asp目录中的所有文件都会被当做asp文件执行) 第一步&#xff1a;在网站根目录下创建了一个x.asp文件夹&#xff0c;并在文件夹中创建一个名为1.txt的文本文档 第二步&#xff1a;文本文档中输入<% now()%&…

【Linux】浅谈冯诺依曼和进程

一、冯诺依曼体系结构 冯诺依曼由 输入设备、输出设备、运算器、控制器、存储器 五部分组成。 冯诺依曼的设计特点 二进制表示 所有数据&#xff08;包括程序指令&#xff09;均以二进制形式存储和运算&#xff0c;简化了硬件逻辑设计&#xff0c;提高了可靠性。 存储程序原理…

技术聚焦:Debezium 如何将数据库数据精准注入 Kafka

#作者&#xff1a;任少近 文章目录 第一章 Debezium抽取mysql数据给kafka原理第二章 Debezium 与kafka抽取方法及验证2.1 debezium2.0kafka3.3.1mysql82.2 debezium2.0kafka2.6.1mysql82.3 debezium2.0kafka2.6.1mysql5.7 第一章 Debezium抽取mysql数据给kafka原理 debezium的…

SpringBoot学生宿舍管理系统的设计与开发

项目概述 幽络源分享的《SpringBoot学生宿舍管理系统的设计与开发》是一款专为校园宿舍管理设计的智能化系统&#xff0c;基于SpringBoot框架开发&#xff0c;功能全面&#xff0c;操作便捷。该系统涵盖管理员、宿管员和学生三大角色&#xff0c;分别提供宿舍管理、学生信息管…