python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python调用DeepSeek模型

Python使用openai实现调用DeepSeek模型并调整参数

作者:detayun

DeepSeek是深度求索推出的系列开源大模型,本文介绍了如何使用OpenAI官方Python库调用私有化部署的DeepSeek系列大模型(包括通用对话、代码和数学专用版本),希望对大家有所帮助

前言

DeepSeek 是深度求索推出的系列开源大模型,包含通用对话、代码、数学专用版本,性能优秀,很多企业会基于 vLLM、SGLang 私有化部署 DeepSeek 推理服务。

这类推理服务全部兼容 OpenAI 标准 /v1 接口,我们不需要使用厂商专属SDK,直接通过官方 openai Python 库即可完成调用。

本文完整覆盖客户端初始化、普通同步调用、流式实时输出、参数说明、常见踩坑,全部代码可直接运行,适配本地私有化部署 DeepSeek 场景。

一、环境准备

1. 安装依赖包

仅需安装 openai 官方库,无需额外推理框架:

pip install openai

2. 部署前置条件

  1. DeepSeek 模型已通过 vLLM / SGLang 部署完成,获取接口地址 http://ip:port/v1
  2. 服务端配置鉴权 api_key;
  3. 本地网络能够正常访问模型服务器端口。

二、客户端基础初始化

不管是 DeepSeek-V2、DeepSeek-Coder、DeepSeek-R1,客户端初始化逻辑完全一致,仅修改模型名称即可。

from openai import OpenAI

# 替换为你的模型服务地址和密钥
client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="自定义接口密钥"
)

三、完整实战代码

3.1 非流式同步调用(批量处理、结构化输出)

适用于文档处理、JSON生成、批量问答,一次性返回全部结果。

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="自定义接口密钥"
)

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,
        # vLLM扩展参数放入extra_body,避免参数报错
        extra_body={
            "top_k": 30,
            "repetition_penalty": 1.06
        }
    )
    result = response.choices[0].message.content
    return result

if __name__ == "__main__":
    res = deepseek_normal_chat("Python列表嵌套字典怎么转为标准JSON字符串?")
    print("模型输出:\n", res)

3.2 流式调用(长文本、前端实时打字效果)

长文本生成推荐使用 stream 模式,分片实时返回内容,注意循环内必须做空值判断过滤无效分片。

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="自定义接口密钥"
)

def deepseek_stream_chat(question: str) -> str:
    stream = client.chat.completions.create(
        model="DeepSeek-R1",
        messages=[
            {"role": "system", "content": "直接输出答案,不要多余铺垫文字"},
            {"role": "user", "content": "讲解MySQL索引优化常用方案"}
        ],
        max_tokens=4096,
        temperature=0.1,
        top_p=0.3,
        stream=True,
        extra_body={
            "top_k": 30
        }
    )
    full_text = ""
    print("实时输出:", end="", flush=True)
    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

if __name__ == "__main__":
    deepseek_stream_chat("梳理企业制度文档标准大纲层级")

四、参数分类详解

OpenAI SDK 会校验外层参数,推理框架私有参数必须放在 extra_body 字典内传递,否则会报参数不存在异常。

4.1 标准外层通用参数

  1. model:模型标识,必须与部署名称完全匹配,示例:DeepSeek-R1DeepSeek-Coder-V2
  2. messages:对话上下文,system 定义全局规则,user 用户提问,assistant 存放历史对话用于多轮交互。
  3. max_tokens:单次最大输出token,中文1字约2token,通用场景4096足够,不要超过服务端限制。
  4. temperature:随机性控制:00.3适合结构化、严格指令;0.60.8适合普通问答、文案创作。
  5. top_p:核采样,缩小词汇范围,搭配低 temperature 使用,减少模型自由发挥。
  6. frequency_penalty:重复惩罚,正数抑制重复句子、循环换行,推荐0.05。
  7. stream:布尔值,False一次性返回完整内容,True开启流式分片输出。
  8. stop:自定义停止词列表,识别指定文本立刻终止生成,无需求填 None。

4.2 extra_body 扩展私有参数(vLLM专用)

不属于OpenAI官方规范,必须放入extra_body透传给后端推理服务:

  1. top_k:限制每次采样候选词汇数量,收紧输出范围;
  2. repetition_penalty:全局重复惩罚,数值大于1即可抑制重复段落。

补充:DeepSeek 原版模型无 Qwen3.6 那样的 enable_thinking 思考链开关,不需要配置该参数。

五、两套业务参数模板

模板1:结构化输出(JSON、大纲整理、数据提取)

max_tokens=4096,
temperature=0.1,
top_p=0.3,
frequency_penalty=0.05,
stream=False,
extra_body={
    "top_k":30,
    "repetition_penalty":1.06
}

模板2:通用问答、代码生成、创意文案

max_tokens=8192,
temperature=0.7,
top_p=0.8,
frequency_penalty=0.05,
stream=True,
extra_body={
    "top_k":40
}

六、高频报错与解决办法

1. unexpected keyword argument ‘top_k’

问题原因:将 top_k 直接写在 create 外层,SDK校验拦截非法参数。

解决方式:把 top_k、repetition_penalty 全部放入 extra_body 字典。

2. 流式调用无任何输出

常见两点原因:

  1. 输入文本过长,超出服务上下文限制,请求静默失败;
  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 调用差异小结

  1. 参数差异:DeepSeek 无 enable_thinking 思考链开关,不需要配置;Qwen3.6 结构化场景必须关闭思考链;
  2. 通用逻辑:两者都兼容 OpenAI 接口,客户端、流式逻辑、extra_body 扩展参数规则完全通用;
  3. 调参区别:DeepSeek 代码、数学能力更强,代码生成场景可适度调高 temperature;千问文档排版、层级整理表现更稳定。

八、Python 使用OpenAI调用DeepSeek模型参数该如何调整

前置基础:参数存放规则

OpenAI SDK会强制校验外层入参,不在官方规范内的扩展参数直接抛unexpected keyword argument报错,参数分两类存放,必须严格遵守:

  1. 标准参数model、messages、temperature、top_p、max_tokens、stream、frequency_penalty等,直接写在create()外层;
  2. 推理扩展参数top_k、repetition_penalty,必须放入extra_body={}字典透传给后端DeepSeek服务;

补充:DeepSeek模型没有Qwen3.6系列的enable_thinking思考链参数,无需额外配置。

基础客户端固定代码,下文所有示例复用该初始化逻辑:

from openai import OpenAI
client = OpenAI(
    base_url="http://127.0.0.1:8000/v1", # 你的DeepSeek服务地址
    api_key="服务分配的鉴权密钥"
)

标准接口参数详解&调整思路

1. max_tokens 最大输出长度

作用:限制模型单次生成token上限,1个中文汉字约占用2个token,超出直接截断文本。

调整策略:

禁忌:不要无脑填超大数值,多数vLLM服务有全局输出上限,超出会直接请求失败。

2. temperature 随机性核心参数(最重要)

取值范围0 ~ 2,直接决定模型是否严格遵守提示词,是调参第一优先级。

3. top_p 核采样阈值

和temperature作用重叠,两者一般只微调其中一个,无需同时拉高。

逻辑:只保留累计概率达到top_p的词汇参与生成,数值越小候选词池越窄。

搭配方案:

4. frequency_penalty 重复惩罚

取值范围-2 ~ 2,正数抑制文本内重复句子、重复标题、连续空行、循环话术。

调整建议:所有业务统一固定0.05

若输出频繁出现重复段落、重复编号,上调至0.1;负数会鼓励重复,业务场景不建议使用。

5. presence_penalty 新词激励

正数会引导模型生成前文未出现过的词汇、新角度;负数会复用已有内容。

适用场景:创意写作可调至0.1

结构化、大纲、固定格式场景保持0.0,防止模型擅自新增无关内容偏离需求。

6. stream 流式开关

布尔值,无需精细调整,按需切换:

7. stop 自定义停止符

数组格式,识别到指定字符串立刻终止生成,无自定义终止规则填None

示例:stop=["###", "总结", "---"],适合需要截断多余后文的场景。

extra_body扩展参数(vLLM部署DeepSeek专用)

这组参数不属于OpenAI官方标准,必须放在extra_body字典中,否则直接报错。

1. top_k

限制每次采样仅选取概率最高的K个词汇,进一步收紧输出范围,辅助低temperature提升指令遵循度。

不需要时可以不传入该键。

2. repetition_penalty 全局重复惩罚

针对全文本的重复抑制,数值大于1生效,专门解决长篇输出中反复出现相同篇章、相同句子的问题。

默认推荐1.06;文本重复严重可调至1.1;不要超过1.2,会导致语句生硬不通顺。

完整extra_body示例:

extra_body={
    "top_k": 30,
    "repetition_penalty": 1.06
}

四大业务场景成套参数模板(直接复制使用)

模板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. 私有化部署的 DeepSeek 全部兼容 OpenAI 标准接口,仅依靠 openai 库即可完成调用,无需额外适配工具;
  2. 参数分为标准外层参数与 extra_body 扩展参数,区分存放是避免参数报错的关键;
  3. 结构化、JSON、规范排版类业务统一使用低 temperature 参数,提升提示词遵循度;
  4. 流式输出必须增加分片判空逻辑,解决无返回、内容丢失问题;
  5. 一套调用代码,仅修改 base_url、api_key、model 名称,即可在 DeepSeek、Qwen3 等各类开源模型之间无缝切换。

到此这篇关于Python使用openai实现调用DeepSeek模型并调整参数的文章就介绍到这了,更多相关Python调用DeepSeek模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文