在 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
推荐实践
- 开发环境 :使用
.env文件 +python-dotenv - 生产环境:使用环境变量或密钥管理服务
- 多环境 :使用不同的
.env文件(.env.dev,.env.prod) - 安全性:永远不要在代码中硬编码 API Key
- 版本控制 :将
.gitignore中添加.env和config.py
bash
# .gitignore
.env
.env.*
config.py
secrets/
*.secret
选择哪种方式取决于你的项目规模和安全要求。对于大多数项目,环境变量 + .env 文件是最佳选择。