DeepSeek 是深度求索推出的开源大模型系列,包含通用对话、代码专用版本,性能优秀。企业常通过 vLLM、SGLang 私有化部署推理服务,这些服务兼容 OpenAI 标准 v1 接口,因此只需使用 openai Python 库即可完成调用。本文完整覆盖客户端初始化、非流式与流式调用、参数含义、四套业务模板以及常见报错解决,所有代码均可直接运行。
一、环境准备
仅需安装 openai 官方库:确保 DeepSeek 模型已通过 vLLM 等框架部署,获取接口地址(如 http://ip:port/v1),并准备好 api_key。
二、客户端初始化
初始化 OpenAI 客户端时,只需修改 base_url 和 api_key,模型名称根据部署指定。以下为基础代码,后续所有调用均复用此 client:- from openai import OpenAI
- client = OpenAI(
- base_url="http://127.0.0.1:8000/v1",
- api_key="你的api_key"
- )
复制代码
三、参数分类与存放规则
OpenAI SDK 会校验外层参数,私有扩展参数必须放入 extra_body 字典,否则会报 "unexpected keyword argument"。
标准外层参数(直接放在 create() 中):
- model:模型标识,必须与部署名称一致(如 "DeepSeek-R1")。
- messages:对话上下文,system 定义全局规则,user 提问,assistant 存放历史。
- max_tokens:最大输出 token 数,中文约 1 字 2 token。
- temperature:随机性,0~2。0~0.3 严格模式,0.6~0.8 平衡模式,>1 高发散。
- top_p:核采样,缩小候选词汇范围。与 temperature 协同使用,一般只微调其一。
- frequency_penalty:重复惩罚(-2~2),正数抑制重复句子,推荐 0.05。
- presence_penalty:新词激励(-2~2),正数鼓励新词,结构化场景保持 0.0。
- stream:False 一次性返回,True 流式分片。
- stop:自定义停止词列表,无则 None。
extra_body 扩展参数(放在 create 的 extra_body 字典中,vLLM 部署专用):
- top_k:限制候选词汇数量,收紧输出范围。结构化 30,代码/问答 40。
- repetition_penalty:全局重复惩罚,>1 生效,推荐 1.06~1.1,不超 1.2。
DeepSeek 模型无 Qwen3 系列的 enable_thinking 参数,无需配置。
四、实战代码
4.1 非流式同步调用(适用于批量处理、JSON 输出)- def deepseek_normal_chat(question: str) -> str:
- response = client.chat.completions.create(
- model="DeepSeek-R1",
- messages=[
- {"role": "system", "content": "回答简洁严谨,无多余空行"},
- {"role": "user", "content": question}
- ],
- max_tokens=4096,
- temperature=0.1,
- top_p=0.3,
- frequency_penalty=0.05,
- presence_penalty=0.0,
- stream=False,
- stop=None,
- extra_body={"top_k": 30, "repetition_penalty": 1.06}
- )
- return response.choices[0].message.content
复制代码
4.2 流式调用(长文本生成、前端打字效果)- def deepseek_stream_chat(question: str) -> str:
- stream = client.chat.completions.create(
- model="DeepSeek-R1",
- messages=[
- {"role": "system", "content": "直接输出答案,不要多余铺垫"},
- {"role": "user", "content": question}
- ],
- max_tokens=4096,
- temperature=0.1,
- top_p=0.3,
- stream=True,
- extra_body={"top_k": 30}
- )
- full_text = ""
- for chunk in stream:
- # 必须做双重判空,避免无输出或报错
- if chunk.choices and chunk.choices[0].delta.content:
- content = chunk.choices[0].delta.content
- full_text += content
- print(content, end="", flush=True)
- return full_text
复制代码 注意:流式输出时,循环内务必备判空逻辑,否则可能无任何输出。
五、四套业务参数模板(直接复制使用)
模板1:结构化输出(JSON、大纲、数据提取)- response = client.chat.completions.create(
- model="DeepSeek-R1",
- messages=[...],
- max_tokens=4096,
- temperature=0.1,
- top_p=0.3,
- frequency_penalty=0.05,
- presence_penalty=0.0,
- stream=False,
- stop=None,
- extra_body={"top_k": 30, "repetition_penalty": 1.06}
- )
复制代码
模板2:代码生成(DeepSeek-Coder 专用)- response = client.chat.completions.create(
- model="DeepSeek-Coder-V2",
- messages=[...],
- max_tokens=8192,
- temperature=0.6,
- top_p=0.75,
- frequency_penalty=0.05,
- presence_penalty=0.05,
- stream=True,
- extra_body={"top_k": 40, "repetition_penalty": 1.05}
- )
复制代码
模板3:通用问答、文档总结- response = client.chat.completions.create(
- model="DeepSeek-R1",
- messages=[...],
- max_tokens=4096,
- temperature=0.7,
- top_p=0.8,
- frequency_penalty=0.05,
- presence_penalty=0.1,
- stream=True,
- extra_body={"top_k": 40, "repetition_penalty": 1.05}
- )
复制代码
模板4:创意写作、故事文案- response = client.chat.completions.create(
- model="DeepSeek-V2",
- messages=[...],
- max_tokens=8192,
- temperature=1.2,
- top_p=0.9,
- frequency_penalty=0.03,
- presence_penalty=0.2,
- stream=True,
- extra_body={"top_k": 50, "repetition_penalty": 1.02}
- )
复制代码
六、高频报错与解决办法
1. unexpected keyword argument 'top_k':将 top_k 直接放入了 create 外层。解决方法:放入 extra_body 字典。
2. 流式调用无任何输出:常见原因:输入过长超出上下文限制;循环未做 choices/delta.content 判空。解决方法:精简输入,增加空值判断。
3. 401 AuthenticationError:api_key 错误或包含空白字符。重新复制正确密钥。
4. NameError: name 'response' is not defined:请求中途异常(超时、崩溃),response 未创建。解决方案:添加 try-except 捕获异常,打印堆栈。
5. 输出重复内容、大量空行:调高 repetition_penalty 至 1.06 以上,配合 frequency_penalty=0.05 双重抑制。
七、DeepSeek 与 Qwen3 调用差异
DeepSeek 没有 enable_thinking 思考链开关,无需配置;Qwen3.6 结构化场景需关闭思考链。两者都兼容 OpenAI 接口,客户端/流式/extra_body 规则通用。调参上,DeepSeek 代码数学能力更强,可适度调高 temperature;千问文档排版更稳定。
八、总结
私有化部署的 DeepSeek 全部兼容 OpenAI 标准接口,仅靠 openai 库即可完成调用。参数严格分标准参数和 extra_body 存放,避免非法参数报错。结构化场景使用低 temperature,提升指令遵循度。流式输出必须判空。一套代码,修改 base_url、api_key、model 即可切换不同模型。 |