使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统

系统概述

本文介绍如何使用FastAPI在AWS Elastic Kubernetes Service (EKS)上构建一个由多个微服务组成的AI问答系统。该系统能够接收用户输入的提示(prompt),通过调用其他微服务从AWS ElastiCache on Redis和Amazon DynamoDB获取相关上下文,然后利用AWS Bedrock的Meta Llama 4模型和Azure OpenAI GPT-4 API生成最终答案返回给用户。

这个架构展示了如何利用FastAPI的轻量级特性构建微服务系统,结合AWS和Azure的AI能力,同时利用云原生技术实现可扩展性和安全性。系统设计考虑了高可用性和容错能力,通过多模型集成提高回答质量,并通过云服务集成实现快速上下文检索。

架构设计

整个系统架构如下:

复制代码
用户 → [网关服务 - FastAPI] → [AI核心服务 - FastAPI]
                      ├──> Redis (AWS ElastiCache) ← 快速上下文
                      ├──> DynamoDB ← 结构化数据或备用数据
                      ├──> AWS Bedrock (Llama 4)
                      └──> Azure OpenAI (GPT-4)

微服务详解

1. 网关服务 (prompt-gateway-service)

职责

  • 接收用户通过REST API提交的提示(prompt)
  • 将提示转发给AI核心服务
  • 返回最终响应给用户

示例代码

python 复制代码
# prompt_gateway_service/main.py
from fastapi import FastAPI, HTTPException
import httpx

app = FastAPI()
AI_CORE_SERVICE_URL = "http://ai-core-service:8000/process"

@app.post("/prompt")
async def receive_prompt(prompt: str):
    async with httpx.AsyncClient() as client:
        response = await client.post(AI_CORE_SERVICE_URL, json={"prompt": prompt})
        if response.status_code != 200:
            raise HTTPException(status_code=500, detail="AI服务失败")
        return response.json()

2. AI核心服务 (ai-core-service)

职责

  • 使用提示从Redis和DynamoDB获取相关上下文
  • 将上下文与原始提示结合
  • 同时调用Llama 4(Bedrock)和GPT-4(Azure)生成响应
  • 聚合两个模型的结果并返回最终答案

示例代码

python 复制代码
# ai_core_service/main.py
from fastapi import FastAPI, Request
import boto3
import redis
import httpx
import os
import json

app = FastAPI()
redis_client = redis.Redis(host=os.getenv("REDIS_HOST"), port=6379, decode_responses=True)
dynamodb = boto3.resource("dynamodb", region_name="us-west-2")
table = dynamodb.Table("YourTableName")

@app.post("/process")
async def process_prompt(request: Request):
    data = await request.json()
    prompt = data["prompt"]
    
    # 从Redis获取上下文
    context = redis_client.get(prompt)
    if not context:
        # 回退到DynamoDB
        response = table.get_item(Key={"prompt": prompt})
        context = response.get("Item", {}).get("context", "")
    
    combined_prompt = f"Context: {context}\n\nPrompt: {prompt}"
    
    # 调用Llama 4 (Bedrock)
    bedrock = boto3.client("bedrock-runtime", region_name="us-west-2")
    llama_response = bedrock.invoke_model(
        body=json.dumps({"prompt": combined_prompt, "max_tokens": 300}),
        modelId="meta.llama4-70b-chat-v1"
    )
    llama_output = json.loads(llama_response['body'].read())['output']
    
    # 调用Azure OpenAI GPT-4
    azure_url = "https://<your-azure-openai-endpoint>/openai/deployments/<deployment>/chat/completions?api-version=2023-05-15"
    headers = {"api-key": os.getenv("AZURE_API_KEY")}
    payload = {
        "messages": [{"role": "user", "content": combined_prompt}],
        "model": "gpt-4"
    }
    async with httpx.AsyncClient() as client:
        azure_response = await client.post(azure_url, headers=headers, json=payload)
        gpt_output = azure_response.json()['choices'][0]['message']['content']
    
    return {"llama": llama_output, "gpt4": gpt_output}

AWS EKS部署

部署步骤

  1. 为两个服务构建Docker容器
  2. 推送到Amazon ECR
  3. 编写Kubernetes清单文件:
    • 部署配置
    • 服务配置
  4. 设置Redis (通过ElastiCache)和DynamoDB
  5. 使用Kubernetes Secrets存储凭证/API密钥
  6. 通过AWS ALB/Ingress Controller暴露网关API

安全措施

  1. 使用IAM角色服务账户(IRSA)允许访问DynamoDB和Bedrock
  2. 将API密钥(Azure OpenAI)存储在Kubernetes Secrets中
  3. 使用mTLS或网络策略保护服务间通信
相关推荐
fthux12 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
火山引擎开发者社区14 小时前
火山引擎混合云 veStack 智算平台 Day0 适配 Kimi K3
人工智能
RSABLOCKCHAIN15 小时前
AI Agents in LangGraph-2
人工智能·python
cd_9492172115 小时前
哪些AI工具适合生成游戏开发用的3D道具模型?从道具草稿到引擎测试的选择方法
人工智能·3d
FII工业富联科技服务15 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
WA内核拾荒者15 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
糖果店的幽灵15 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph
qq295316 小时前
2026 财搭子决策模拟器:多智能体投研架构能力拆解
大数据·人工智能·架构
码流怪侠16 小时前
【GitHub】Bend:让 GPU 并行编程像写 Python 一样简单
python·github