【Python】配置LLM API Key

在 Python 项目中配置大模型 API Key,有几种推荐的方式:

1. 环境变量(最常用、最安全)

创建 .env 文件

env 复制代码
# .env
OPENAI_API_KEY=sk-your-openai-key-here
ANTHROPIC_API_KEY=your-anthropic-key-here
GROQ_API_KEY=your-groq-key-here

安装依赖

bash 复制代码
pip install python-dotenv

使用示例

python 复制代码
import os
from dotenv import load_dotenv

# 加载 .env 文件中的环境变量
load_dotenv()

# 读取配置
api_key = os.getenv("OPENAI_API_KEY")
print(f"API Key: {api_key[:10]}...")  # 只显示前10位,安全起见

2. 配置文件(YAML/JSON)

config.yaml 方式

yaml 复制代码
# config.yaml
apis:
  openai:
    api_key: "sk-your-key"
    base_url: "https://api.openai.com/v1"
    model: "gpt-4"
  anthropic:
    api_key: "your-key"
    model: "claude-3"
python 复制代码
import yaml
from pathlib import Path

config_path = Path("config.yaml")
with open(config_path, 'r') as f:
    config = yaml.safe_load(f)

openai_key = config['apis']['openai']['api_key']

config.json 方式

json 复制代码
{
  "openai": {
    "api_key": "sk-your-key",
    "model": "gpt-4"
  },
  "anthropic": {
    "api_key": "your-key"
  }
}

3. 配置文件(INI格式)

python 复制代码
import configparser

config = configparser.ConfigParser()
config.read('config.ini')

# config.ini 内容:
# [openai]
# api_key = sk-your-key
# model = gpt-4

api_key = config['openai']['api_key']

4. 使用 LangChain 的配置

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
import os

# 设置环境变量
os.environ["OPENAI_API_KEY"] = "sk-your-key"
os.environ["ANTHROPIC_API_KEY"] = "your-key"

# 使用
llm_openai = ChatOpenAI(model="gpt-4")
llm_anthropic = ChatAnthropic(model="claude-3")

5. 工厂模式管理多模型

python 复制代码
from typing import Dict, Optional
from dataclasses import dataclass

@dataclass
class ModelConfig:
    api_key: str
    base_url: Optional[str] = None
    model_name: Optional[str] = None

class ModelManager:
    def __init__(self):
        self.configs: Dict[str, ModelConfig] = {}
    
    def add_config(self, provider: str, config: ModelConfig):
        self.configs[provider] = config
    
    def get_config(self, provider: str) -> ModelConfig:
        return self.configs.get(provider)

# 使用
manager = ModelManager()
manager.add_config("openai", ModelConfig(
    api_key=os.getenv("OPENAI_API_KEY"),
    model_name="gpt-4"
))

6. 安全最佳实践

使用密钥管理服务

python 复制代码
# AWS Secrets Manager 示例
import boto3
import json

def get_secret(secret_name):
    client = boto3.client('secretsmanager')
    response = client.get_secret_value(SecretId=secret_name)
    return json.loads(response['SecretString'])

secrets = get_secret("ai-api-keys")
openai_key = secrets["OPENAI_API_KEY"]

配置文件模板

python 复制代码
# config_template.py
"""
复制此文件为 config.py 并填写您的 API Key
"""

class Config:
    # OpenAI
    OPENAI_API_KEY = "your-key-here"
    OPENAI_BASE_URL = "https://api.openai.com/v1"
    
    # Anthropic
    ANTHROPIC_API_KEY = "your-key-here"
    
    # Azure OpenAI
    AZURE_OPENAI_KEY = "your-key-here"
    AZURE_ENDPOINT = "https://your-resource.openai.azure.com/"

7. 完整示例

python 复制代码
# config.py
import os
from pathlib import Path
from dataclasses import dataclass
from typing import Optional

@dataclass
class APIConfig:
    """API 配置类"""
    api_key: str
    base_url: Optional[str] = None
    model: Optional[str] = None
    
    @property
    def headers(self):
        return {"Authorization": f"Bearer {self.api_key}"}

class ConfigManager:
    """配置管理器"""
    
    def __init__(self, env_file: str = ".env"):
        self.env_file = env_file
        self.load_environment()
    
    def load_environment(self):
        """加载环境变量"""
        from dotenv import load_dotenv
        
        # 从多个位置加载 .env 文件
        env_path = Path(self.env_file)
        if env_path.exists():
            load_dotenv(env_path)
    
    def get_config(self, provider: str) -> APIConfig:
        """获取特定提供商的配置"""
        providers = {
            "openai": {
                "api_key": os.getenv("OPENAI_API_KEY"),
                "base_url": os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
                "model": os.getenv("OPENAI_MODEL", "gpt-4")
            },
            "anthropic": {
                "api_key": os.getenv("ANTHROPIC_API_KEY"),
                "model": os.getenv("ANTHROPIC_MODEL", "claude-3-opus-20240229")
            }
        }
        
        if provider not in providers:
            raise ValueError(f"Unsupported provider: {provider}")
        
        config_data = providers[provider]
        if not config_data["api_key"]:
            raise ValueError(f"API key for {provider} not found")
        
        return APIConfig(**config_data)

# 使用示例
if __name__ == "__main__":
    config_manager = ConfigManager()
    
    try:
        openai_config = config_manager.get_config("openai")
        print(f"OpenAI Model: {openai_config.model}")
        
        # 使用配置初始化客户端
        from openai import OpenAI
        client = OpenAI(
            api_key=openai_config.api_key,
            base_url=openai_config.base_url
        )
        
    except ValueError as e:
        print(f"配置错误: {e}")

8. Docker 部署配置

dockerfile 复制代码
# Dockerfile
FROM python:3.10

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

# 通过环境变量传入 API Key
CMD ["python", "app.py"]
yaml 复制代码
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    env_file:
      - .env

推荐实践

  1. 开发环境 :使用 .env 文件 + python-dotenv
  2. 生产环境:使用环境变量或密钥管理服务
  3. 多环境 :使用不同的 .env 文件(.env.dev, .env.prod
  4. 安全性:永远不要在代码中硬编码 API Key
  5. 版本控制 :将 .gitignore 中添加 .envconfig.py
bash 复制代码
# .gitignore
.env
.env.*
config.py
secrets/
*.secret

选择哪种方式取决于你的项目规模和安全要求。对于大多数项目,环境变量 + .env 文件是最佳选择。

相关推荐
纤纡.11 小时前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
June`11 小时前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
kjkdd11 小时前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程
小镇敲码人11 小时前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎11 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
WHD30611 小时前
苏州勒索病毒加密 服务器数据解密恢复
运维·服务器
Anastasiozzzz12 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人12 小时前
通过脚本推送Docker镜像
java·docker·容器
蜡笔小炘12 小时前
LVS -- 持久链接(Persistent Connection)实现会话粘滞
运维·服务器
alvin_200512 小时前
python之OpenGL应用(二)Hello Triangle
python·opengl