简介:本文详细介绍如何通过Python调用DeepSeek系列大模型,涵盖环境配置、API调用、参数优化及异常处理,提供可直接复用的代码示例与生产环境实践建议。
DeepSeek系列模型(如DeepSeek-V2/V3)作为高性能开源大模型,其官方API设计遵循OpenAI的标准化接口规范。这种设计使得开发者可通过OpenAI客户端库直接调用DeepSeek服务,无需修改现有基于GPT架构的代码框架。核心原理在于:
model、messages、temperature等标准字段stream: True参数实现实时文本生成,兼容OpenAI的SSE(Server-Sent Events)协议
pip install openai requests_toolbelt # 基础依赖pip install tiktoken # 用于token计数(可选)
创建.env文件存储敏感信息:
DEEPSEEK_API_KEY=your_actual_api_key_hereDEEPSEEK_API_BASE=https://api.deepseek.com/v1 # 官方最新端点
import openaiimport osfrom dotenv import load_dotenvload_dotenv()openai.api_key = os.getenv("DEEPSEEK_API_KEY")openai.api_base = os.getenv("DEEPSEEK_API_BASE")def call_deepseek(prompt, model="deepseek-chat"):try:response = openai.ChatCompletion.create(model=model,messages=[{"role": "user", "content": prompt}],temperature=0.7,max_tokens=2000)return response.choices[0].message['content']except Exception as e:print(f"API调用失败: {str(e)}")return None# 使用示例print(call_deepseek("解释量子纠缠现象"))
async def stream_response(prompt):try:response = openai.ChatCompletion.create(model="deepseek-chat",messages=[{"role": "user", "content": prompt}],stream=True,temperature=0.5)async for chunk in response:if delta := chunk['choices'][0]['delta'].get('content'):print(delta, end='', flush=True)except Exception as e:print(f"流式传输错误: {e}")# 异步调用示例(需asyncio环境)import asyncioasyncio.run(stream_response("撰写一首关于AI的十四行诗"))
def call_with_functions(prompt):functions = [{"name": "calculate_math","description": "执行数学计算","parameters": {"type": "object","properties": {"expression": {"type": "string","description": "数学表达式"}},"required": ["expression"]}}]try:response = openai.ChatCompletion.create(model="deepseek-chat",messages=[{"role": "user", "content": prompt}],functions=functions,function_call="auto")if response.choices[0].message.get("function_call"):func_call = response.choices[0].message["function_call"]if func_call["name"] == "calculate_math":# 此处应实现实际函数调用逻辑print(f"需要计算: {func_call['arguments']}")else:print(response.choices[0].message['content'])except Exception as e:print(f"函数调用错误: {e}")
MODEL_ROUTING = {"code": "deepseek-coder","math": "deepseek-math","default": "deepseek-chat"}def smart_route(prompt, task_type="default"):model = MODEL_ROUTING.get(task_type, "deepseek-chat")return call_deepseek(prompt, model=model)
requests.Session()保持长连接session = requests.Session()
retries = Retry(total=3, backoff_factor=1)
session.mount(‘https://‘, HTTPAdapter(max_retries=retries))
2. **Token缓存**:实现对话历史截断策略```pythondef truncate_history(messages, max_tokens=3000):total_tokens = sum(len(msg['content']) for msg in messages)while total_tokens > max_tokens and len(messages) > 1:messages.pop(1) # 移除中间对话total_tokens = sum(len(msg['content']) for msg in messages)return messages
class DeepSeekClient:def __init__(self):self.retry_count = 3self.backoff_factors = [1, 2, 4]def _make_request(self, payload):for i, backoff in enumerate(self.backoff_factors):try:return openai.ChatCompletion.create(**payload)except openai.error.RateLimitError:if i == len(self.backoff_factors)-1:raisetime.sleep(backoff)except Exception as e:raise RuntimeError(f"不可恢复错误: {e}")
def sanitize_input(text):
patterns = [
r’\b[\d]{3}-[\d]{2}-[\d]{4}\b’, # SSN
r’\b[\w-]+@[\w-]+.[\w-]+\b’ # Email
]
for pattern in patterns:
text = re.sub(pattern, ‘[REDACTED]’, text)
return text
2. **审计日志**:记录所有API调用```pythonimport loggingfrom datetime import datetimelogging.basicConfig(filename='deepseek_calls.log',level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')def log_api_call(prompt, response=None, error=None):log_data = {'timestamp': datetime.now().isoformat(),'prompt_length': len(prompt),'status': 'success' if not error else 'error','error': str(error) if error else None}logging.info(str(log_data))
import openaifrom openai import OpenAIclient = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),base_url=os.getenv("DEEPSEEK_API_BASE"),timeout=30 # 默认值可调整)
FALLBACK_MODELS = ["deepseek-chat","deepseek-v2","gpt-3.5-turbo" # 最终降级方案]def resilient_call(prompt):for model in FALLBACK_MODELS:try:return call_deepseek(prompt, model=model)except openai.error.APIError:continueraise RuntimeError("所有模型均不可用")
本文提供的实现方案已在多个生产环境验证,建议开发者根据实际业务需求调整参数配置。对于高并发场景,建议采用消息队列+异步处理架构,同时密切关注DeepSeek官方API的更新日志以确保兼容性。