写点什么

DeepSeek Api 开发实践

  • 2025-02-23
    吉林
  • 本文字数:5260 字

    阅读完需:约 17 分钟

DeepSeek Api开发实践

春节前后,DeepSeek 无疑是 AI 领域最火爆的话题,也在国内外掀起轩然大波。一时间各种介绍、私有化部署、应用尝试的文章层出不穷,仿佛不提 DeepSeek 就远远落后于这个时代。

最近政府机关、国央企更是热闹非凡,各种接入 DeepSeek、用 DeepSeek 办公的消息层出不穷,也不知道到底是真实解决了领域问题,还是单纯凑热闹,反正从官方角度说肯定是效率提升 xx,形式一片大好。

作为开发人员,自然更不能落于人后,从接收到接入 DeepSeek 的需求开始,就对模型部署和 API 调用做了了解。受限于资源,要把大模型本地部署后支撑业务的高频调用显然不现实,毕竟企业应用不是一个本地起来运行一下就可以拿来吹牛的玩具;DeepSeek 官方 API 不稳定并且也停止了重置服务,所以最终选择了某大厂提供的 DeepSeek API。

一 API 选择

1.1 百炼

阿里云百炼平台,地址:https://bailian.console.aliyun.com/?spm=5176.12818093_47.console-base_search-panel.dtab-product_sfm.3be916d0tDDQuP#/model-market。 模型广场中增加了 DeepSeek 相关模型,DeepSeek-R1 和 V3 提供 100 万的免费 token 额度;70B 及以下目前都提供限时免费调用。

1.2 硅基流动(siliconflow)

官网地址:https://cloud.siliconflow.cn/models。与百炼类似,模型广场包括 DeepSeek-R1、V3、70B、32B、14B、8B 等等。其中 8B 以下模型提供免费调用。

这里选择使用百炼平台 API。

二 DeepSeek 模型简介及 API 说明

2.1 DeepSeek 各模型说明

DeepSeek-R1 模型包含 671B 参数,激活 37B,在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力,尤其在数学、代码、自然语言推理等任务上。

DeepSeek-V3 为 MoE 模型,671B 参数,激活 37B,在 14.8T Token 上进行了预训练,在长文本、代码、数学、百科、中文能力上表现优秀。

DeepSeek-R1-Distill 系列模型是基于知识蒸馏技术,通过使用 DeepSeek-R1 生成的训练样本对 Qwen、Llama 等开源大模型进行微调训练后,所得到的增强型模型。

几个版本的模型支持的上下文长度、最大输入长度、最大思维链长度和回复长度信息如下所示:

注意:

最大输出的 Token 数包含思考过程(reasoning_content字段)与最终输出(content字段)的 Token 之和。

2.2 API 调用(百炼版)

这里以百炼提供的 API 为例。第一步自然是在平台获取 Api key,由于兼容 OpenAI,可以通过 OpenAI SDK 或 OpenAI 兼容的 HTTP 方式快速体验 DeepSeek 模型。

2.2.1 Python 调用示例

import osfrom openai import OpenAI
client = OpenAI( # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx", api_key=os.getenv("DASHSCOPE_API_KEY"), # 如何获取API Key:https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
completion = client.chat.completions.create( model="deepseek-r1", # 此处以 deepseek-r1 为例,可按需更换模型名称。 messages=[ {'role': 'user', 'content': '9.9和9.11谁大'} ])
# 通过reasoning_content字段打印思考过程print("思考过程:")print(completion.choices[0].message.reasoning_content)
# 通过content字段打印最终答案print("最终答案:")print(completion.choices[0].message.content)
复制代码

2.2.2 Node.js

import OpenAI from "openai";
const openai = new OpenAI( { // 若没有配置环境变量,请用百炼API Key将下行替换为:apiKey: "sk-xxx", apiKey: process.env.DASHSCOPE_API_KEY, baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1" });const completion = await openai.chat.completions.create({ model: "deepseek-r1", // 此处以 deepseek-r1 为例,可按需更换模型名称。 messages: [ { role: "user", content: "9.9和9.11谁大" } ],});console.log("思考过程:")console.log(completion.choices[0].message.reasoning_content)console.log("最终答案:")console.log(completion.choices[0].message.content)
复制代码

2.2.3 HTTP 请求

这也是可以跨语言调用的方式,Java 语言可以直接使用 RestTemplate 进行调用:

curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \-H "Authorization: Bearer $DASHSCOPE_API_KEY" \-H "Content-Type: application/json" \-d '{    "model": "deepseek-r1",    "messages": [        {            "role": "user",             "content": "9.9和9.11谁大"        }    ]}'
复制代码

json 结构的返回结果:

{    "choices": [        {            "message": {                "content": "9.9比9.11大。\n\n**解析:**\n1. **统一小数位数:** 将9.9补位为9.90,与9.11对齐位数。\n2. **逐位比较:**\n   - 整数部分均为9,相等。\n   - 第一位小数:9(来自9.90)> 1(来自9.11),此时已可判定大小。\n3. **结论:** 9.90 > 9.11,即 **9.9 > 9.11**。\n\n**常见误解提醒:**  \n若直接比较小数点后的数字(如误认为“11 > 9”),可能得出错误结论。需注意小数位的实际值(十分位、百分位等),补零对齐后再比较。",                "reasoning_content": "\n嗯,用户问的是9.9和9.11谁大。这个问题看起来好像挺简单的,但可能有些小陷阱,特别是涉及到小数点的比较。首先,我需要确认用户是否在问数字的大小比较,还是有没有其他可能的含义,比如日期之类的。不过根据数字的写法,应该是数字比较。\n\n首先,我需要明确这两个数的结构。9.9和9.11。这时候可能有些人会直接比较小数点后的数字,比如9和11,认为11比9大,所以9.11更大。但这种比较方法其实是错误的,因为小数点后的位数不同,需要将它们转换成相同位数来比较。\n\n正确的做法应该是将两个数统一到相同的小数位数。比如,9.9可以写成9.90,而9.11保持不变。这样的话,比较的话就是9.90和9.11。这时候,从小数点后第一位开始比较,第一位都是9,接着第二位是0和1。因为0小于1,所以9.90小于9.11,也就是9.9小于9.11。\n\n不过,用户可能有不同的理解,特别是如果他们对小数比较不熟悉的话,可能会误以为9.11更大,因为11比9大。这时候需要解释清楚位数的不同带来的影响,比如小数点后的第一位是十分位,第二位是百分位,所以9.9实际上是9又十分之九,而9.11是9又百分之十一,换算成小数的话,0.9等于0.90,而0.11是0.11,显然0.90更大,所以这个时候反而9.9更大?\n\n啊,这里好像我之前的分析有问题。这时候需要再仔细计算一下。因为当我们将9.9写成9.90,而9.11是9.11的话,比较的话应该从高位到低位依次比较。比如,整数部分都是9,所以相同。然后第一位小数,9和1比较,9大于1,所以这时候9.90已经比9.11大了,所以结论是9.9大于9.11?\n\n等等,这里好像矛盾了。这说明我之前犯了错误。为什么会这样呢?原来在比较小数时,应该逐位比较。例如:\n\n9.9 和 9.11\n\n将9.9写成9.90:\n\n比较整数部分:都是9,相等。\n比较第一位小数:9(来自9.90)和1(来自9.11)。因为9 > 1,所以整个数9.90大于9.11,所以9.9大于9.11。\n\n这样一来,之前的结论是错误的,正确的结论应该是9.9更大。这说明我需要仔细检查自己的思路,避免犯低级错误。\n\n可能用户在这里容易混淆,因为9.11的小数部分有两位,可能以为0.11比0.9大,但实际上0.9是0.90,而0.90大于0.11。所以正确的比较是9.9更大。\n\n总结来说,正确的答案是9.9比9.11大。需要确保在比较的时候注意小数位数,补全后再逐位比较。\n",                "role": "assistant"            },            "finish_reason": "stop",            "index": 0,            "logprobs": null        }    ],    "object": "chat.completion",    "usage": {        "prompt_tokens": 19,        "completion_tokens": 797,        "total_tokens": 816    },    "created": 1739069910,    "system_fingerprint": null,    "model": "deepseek-r1",    "id": "chatcmpl-e55cdb8a-9ce1-9662-b87c-cf3da706e4f3"}
复制代码

注意,当前是非流式请求,并且没有开启互联网搜索。 R1 模型的返回结果包含思考过程,接入后可以在前端展示,来实现与 DeepSeek 官方页面相同的效果,也可以减少等待时间,提升用户体验。


三 注意事项

3.1 能力范畴

DeepSeek 模型仅支持文本输入,不支持输入图片或文档,因此 API 无法处理图片或文档。但实际上官网支持上传文档,虽然只能识别图片/文档中的文字。个人推测是在调用 DeepSeek 模型前,前置了图片、文档识别的小模型或简单的 OCR/文档内容提取。


3.2 不支持参数说明

DeepSeek-R1 类模型不支持 Function Calling、JSON Output、对话前缀续写、上下文硬盘缓存;

参数temperaturetop_ppresence_penaltyfrequency_penaltylogprobstop_logprobs,设置这些参数都不会生效,即使没有输出错误提示。

  • DeepSeek官方不建议设置 System Message,原文:"Avoid adding a system prompt; all instructions should be contained within the user prompt."

DeepSeek-V3:参数默认值:

  • temperature:0.7(取值范围是[0:2));

    top_p:0.6;

    presence_penalty:0.95。

    不支持设置的参数和功能:frequency_penaltylogprobstop_logprobs参数;不支持 Function Call、JSON Output 等功能。

3.3 DeepSeek 流式请求

与通义千问的 API 流式返回不同,DeepSeek 的每个流返回的内容仅包含部分文字,而不像通义千问那样是从开始到当前拼接好的文字。示例如下:

data: {"choices":[{"delta":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071776,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a351a53b-00a6-9cf6-9c64-ce491bc462a8"}
data: {"choices":[{"delta":{"content":"","reasoning_content":"\n"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071776,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a351a53b-00a6-9cf6-9c64-ce491bc462a8"}
data: {"choices":[{"delta":{"content":"","reasoning_content":"好的"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071776,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a351a53b-00a6-9cf6-9c64-ce491bc462a8"}
data: {"choices":[{"delta":{"content":"","reasoning_content":","},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071776,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a351a53b-00a6-9cf6-9c64-ce491bc462a8"}
data: {"choices":[{"delta":{"content":"","reasoning_content":"我现在"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071776,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a351a53b-00a6-9cf6-9c64-ce491bc462a8"}
......data: {"choices":[{"delta":{"content":"}\n","reasoning_content":""},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071797,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a2282bc4-2a01-99c5-a0a6-c1862a058f19"}
data: {"choices":[{"delta":{"content":"\\]","reasoning_content":""},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071797,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a2282bc4-2a01-99c5-a0a6-c1862a058f19"}
data: {"choices":[{"finish_reason":"stop","delta":{"content":""},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1739071797,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a2282bc4-2a01-99c5-a0a6-c1862a058f19"}
data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":13,"completion_tokens":1436,"total_tokens":1449},"created":1739071797,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-a2282bc4-2a01-99c5-a0a6-c1862a058f19"}
data: [DONE]
复制代码

另外,DeepSeek 模型进行数学问题推理时,会返回 Latex 格式的一些字符,可以通过前端插件处理,或者后端简单粗暴通过字符串正则表达式处理(效果差,会存在大量无用换行)。

发布于: 刚刚阅读数: 5
用户头像

磨炼中成长,痛苦中前行 2017-10-22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
DeepSeek Api开发实践_2月日更_程序员架构进阶_InfoQ写作社区