正文内容
GitHub上一个帖子最近被顶得很高,楼主问:“有没有比OpenAI便宜、能力在线、支持工具调用的模型?”
底下第一条回复就五个字:DeepSeek,下一个。
评论区直接炸了。有人贴了自己的token消耗截图,有人贴代码,还有人把华为云的接入文档链接甩了出来。那篇文档里写得挺清楚:DeepSeek-V3.2支持128K上下文,输入每百万tokens 0.28美元,输出0.42美元,缓存命中只要0.028美元。
比GPT-4便宜了不止一个量级。
一、先搞定API Key
华为云的文档里写得很细:先去MaaS控制台,找到“预置服务”页签,选DeepSeek-V3.2,点“开通服务”。开通后点“调用说明”,创建API Key。
有个坑得注意:Key创建后不会立即生效,等几分钟才能用。
Alibaba Cloud的文档也提了同样的事——Base URL默认是https://api.deepseek.com/v1,不用改。但如果走华为云或者Zenlayer的渠道,地址会变。
WaveSpeedAI的开发者Dora踩过一个更细的坑:她把Key直接写在代码里,结果不小心推到GitHub,两小时后收到账单报警。后来她改成python-dotenv加载环境变量:
from dotenv import load_dotenv
import os
load_dotenv()
API_KEY = os.getenv("DEEPSEEK_API_KEY")
if not API_KEY:
raise RuntimeError("Missing DEEPSEEK_API_KEY")
她的帖子底下有人回复:“第一次跑API的人,80%的错都是Key没配好。”
二、最简代码:跑通第一个对话
AIML API的文档给了Python和JavaScript的完整示例。Python版长这样:
import requests
import json
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "deepseek-chat",
"messages": [
{"role": "user", "content": "介绍一下你自己"}
]
}
)
data = response.json()
print(json.dumps(data, indent=2, ensure_ascii=False))
Dora在WaveSpeedAI的博客里补充了一个细节:模型名称会变。她测试的时候用的是deepseek-chat,但不同区域、不同时间可能叫deepseek-v3.2或deepseek-reasoner。每次跑之前看一眼官方文档确认一下,能省半小时查错时间。
三、流式输出:让响应“动起来”
如果你做过聊天机器人,应该知道流式输出对用户体验的影响有多大。等十几秒才看到完整回复,和字一个一个往外蹦,完全是两种感受。
DeepSeek支持标准的SSE(Server-Sent Events)流式。Dora给的代码可以直接复制:
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "给我讲个长一点的故事"}],
"stream": True,
"temperature": 0.2
}
with requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}"},
json=payload,
stream=True,
timeout=60
) as r:
r.raise_for_status()
for line in r.iter_lines(decode_unicode=True):
if not line:
continue
if line.startswith("data: "):
chunk = line[6:]
if chunk == "[DONE]":
break
# 解析JSON,提取内容
她在帖子里特意说了一句:“早期token到达的速度很快,一两秒就能看到第一个字。接入CLI工具后感觉明显比GPT快。”
四、工具调用:让AI“动手做事”
DeepSeek最值钱的能力之一,是并行工具调用。
AG2的文档里给了一个旅游助手的例子:同时让AI查汇率和天气,它会一次性调两个工具,然后整合结果。
@user_proxy.register_for_execution()
@chatbot.register_for_llm(description="Currency exchange calculator.")
def currency_calculator(
base_amount: float,
base_currency: str = "USD",
quote_currency: str = "EUR"
) -> str:
# 实现汇率换算逻辑
return f"{quote_amount} {quote_currency}"
那个例子里,用户说“我要去欧洲待一周,预算1000美元”,AI自动去查美元兑欧元汇率,再调天气工具看当地气温,最后给出换多少钱、带什么衣服的建议。
五、Rust版:给追求极致性能的人
如果你用Rust,crates.io上有个ds-api库,支持工具定义、流式输出、中断注入。
它的设计挺有意思:用宏定义工具,方法签名自动转成JSON Schema:
#[tool]
impl Tool for Search {
/// Search the web and return results.
/// query: the search query
async fn search(&self, query: String) -> Value {
json!({ "results": format!("results for: {query}") })
}
}
while let Some(event) = stream.next().await {
match event.unwrap() {
AgentEvent::Token(text) => print!("{text}"),
AgentEvent::ToolCall(c) => println!("\n[calling {}]", c.name),
AgentEvent::ToolResult(r) => println!("[result] {}", r.result),
}
}
GitHub上这个项目的issues区有人问“和Python版本比速度怎么样”,作者回:Rust版在tool call密集场景下快30%左右,但第一次接入的学习曲线陡一点。
六、错误处理:别等崩了才想起来
Dora在WaveSpeedAI的第二篇帖子里专门讲了错误处理。她定义了一个可重试的状态码集合:
RETRIABLE = {408, 409, 425, 429, 500, 502, 503, 504}
加上指数退避:
backoff = 0.5
for i in range(attempts):
try:
return await chat_once(client, messages)
except RuntimeError as e:
if "Retryable" in str(e) and i < attempts - 1:
await asyncio.sleep(backoff)
backoff *= 2
continue
raise
她在帖子里补了一句:“429最常见,限流了。加随机jitter(50-150ms)能避免同时重试造成的‘羊群效应’。”
七、Dify集成:10分钟搭个智能客服
华为云有一篇文档专门讲DeepSeek + Dify搭建网站客服。步骤很清晰:
- 在华为云“西南-贵阳一”区域部署Dify
- 开通DeepSeek预置服务,获取API Key和地址
- 在Dify里添加“OpenAI-API-compatible”供应商,填地址和Key
- 上传知识库文档,配置提示词
文档里有个截图:Dify后台配置页,填Base URL时要去掉末尾的/chat/completions,只留https://api.modelarts-maas.com。很多人卡在这一步。
配置完后,可以在网页里嵌入一个智能客服,基于企业内部文档回答问题。评论区有人贴了自己公司的落地效果:上线后人工客服咨询量降了60%。
八、Zenlayer的参数说明
| 参数 | 说明 |
|---|---|
| temperature | 0-2,越大越随机,代码场景建议0.1-0.3 |
| max_tokens | 单次回复最大token数 |
| presence_penalty | -2到2,正值鼓励新话题 |
| frequency_penalty | -2到2,正值降低重复 |
有个做翻译工具的开发者在底下留言:“presence_penalty设0.6,翻译时能避免反复用同一个词,输出流畅很多。”
DeepSeek的API文档散在各处,华为云的、阿里云的、Zenlayer的各讲了一部分。但核心代码就那么几段,上面这些够你跑通90%的场景了。
有人把更完整的Python SDK封装发在了 DeepSeek API 专题里,支持流式、工具调用、异步批量,可以直接拿去改。