
简介这是一份DeepSeek使用入门指南面向刚接触国产AI大模型的普通用户与技术爱好者解决“不知道如何下载、如何在V3与R1之间选择、怎样本地部署或通过API调用”等常见问题。资源共1个PDF文档压缩包仅约311KB篇幅紧凑但覆盖完整适合快速通读。内容首先对DeepSeek V3和R1做了清晰对比V3功能全面适合绝大多数任务R1在逻辑推理、写代码、数学题求解上更强但成本更高可按需切换。随后系统介绍三种使用路径——官方网页版与手机APP的注册登录及对话方法基于Ollama平台安装蒸馏版DeepSeek的步骤含1.5B、14B、34B版本建议以及通过ChatBox等客户端配合硅基流动API密钥调用的进阶配置同时提醒了API调用付费与模型选择注意事项。无论是追求最佳免费体验、重视数据隐私还是希望灵活部署的读者都能从中获得清晰的操作路径和选型参考。目前已有365人学习/下载。1. DeepSeek使用方法.pdf与其搜教程不如把这份 PDF 变成你的操作手册很多人拿到“DeepSeek使用方法.pdf”第一反应是保存下来吃灰第二反应是翻几页发现讲的是官网界面截图然后继续去群里问“到底怎么用才不翻车”。这个标题背后真正值得做的事不是读完一份 PDF而是把 DeepSeek 从“聊天玩具”变成“能接进自己工作流的工具”。这份 PDF 覆盖的应该是从注册、API 调用、参数调整到本地部署的完整链路而你需要的是一次能照着敲的实战拆解。适合谁三类人刚拿到 API Key 不知道先调哪个参数的初学者想把 DeepSeek 接进自动化脚本或业务系统的开发者以及已经跑通但总感觉回答质量不稳定的熟手。下面按“先理解运行逻辑再动手复现最后避开常见深坑”的顺序把这套方法讲透新手能跟着走熟手能直接拿参数表去对照自己的配置。2. DeepSeek 的运行逻辑先搞懂它的输入输出再谈使用方法2.1 对话补全与模型行为为什么同样的问题两次回答不一样DeepSeek 的 API 核心是 chat completion 接口输入一个 messages 数组输出一个 choices 数组。这一点和 OpenAI 的接口格式高度一致所以如果你之前调过其他大模型 API迁移成本几乎为零。但真正决定回答质量的是 system prompt 的写法和你对 temperature、top_p 这类采样参数的控制。许多第一次用 DeepSeek 的人会犯一个错误把 system prompt 当成摆设或者只写一句“你是一个助手”。实际上DeepSeek 对 system prompt 的遵循程度比很多人想象的高。你给我一个明确的角色、输出格式、语气要求它就能稳定地按这个框架走你不给它就按训练时的默认行为自由发挥结果就是两次调用拿到两种风格的答案。这不是模型不稳定而是你没有把约束条件写清楚。from openai import OpenAI client OpenAI( api_keysk-你的key, base_urlhttps://api.deepseek.com/v1 ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是资深Python工程师回答必须包含代码示例和参数说明代码用markdown代码块包裹。}, {role: user, content: 如何用requests库实现带超时和重试的HTTP请求} ], temperature0.3, max_tokens2048, streamFalse ) print(response.choices[0].message.content)这段代码的逻辑是先初始化客户端再构造 messages 列表最后调用 create 方法拿到完整响应。system prompt 在这里不是摆设它直接决定了回答的格式和深度temperature 设置为 0.3意味着输出偏向确定性和保守适合代码生成和文档撰写场景。如果你在跑数据分析或头脑风暴可以放宽到 0.7 以上让模型有更多发散空间。2.2 上下文窗口与 token 计算便宜背后不是没有代价DeepSeek 的上下文窗口在主流模型中属于够用级别但你要清楚一件事上下文窗口大不等于你可以无限堆内容。每次请求都会把整个 messages 数组里的内容全部发送给模型包括历史对话。这意味着每轮对话的 token 消耗是累加的对话越长单次请求的 cost 越高响应时间越长。实际使用中我见过太多人把长文档直接塞进 user prompt结果模型“忘”了开头的内容或者开始复读中间段落。这是因为当输入超过模型的有效注意力范围时中间部分的信息很容易被稀释。正确做法是用 max_tokens 控制输出长度用裁剪策略控制输入长度——比如做文档问答时只把命中检索结果的段落拼进 prompt而不是整份 PDF 原文一股脑传进去。import tiktoken encoding tiktoken.get_encoding(cl100k_base) system_text 你是资深Python工程师。 user_text 如何用requests库实现带超时和重试的HTTP请求 system_tokens len(encoding.encode(system_text)) user_tokens len(encoding.encode(user_text)) print(fsystem prompt tokens: {system_tokens}) print(fuser prompt tokens: {user_tokens}) print(f总和: {system_tokens user_tokens}, 建议预留 max_tokens 输出空间)这段代码用 tiktoken 估算 token 数帮助你在设计 prompt 时心里有数。注意 DeepSeek 的 tokenizer 和 OpenAI 不完全一致这里用的是近似估算但误差在可接受范围内。当你需要严格控制成本时就把这个估算逻辑写进你的日志系统里每次请求记录输入输出的 token 数跑一段时间你就能知道自己的场景大概消耗多少。3. 把 DeepSeek 接入实际工作流从 API 调用到参数调优3.1 最小可用调用不依赖第三方框架用原生 HTTP 请求跑通很多教程一上来就让你安装各种封装库其实完全没必要。DeepSeek 的 API 是标准的 RESTful 接口用 Python 自带的 urllib 或者 requests 库就能跑通。这对新手尤其友好——你不需要理解 OpenAI SDK 的内部逻辑只需要知道 POST 一个 JSON 到指定 endpoint然后解析返回的 JSON 就行。import requests import json url https://api.deepseek.com/v1/chat/completions headers { Authorization: Bearer sk-你的key, Content-Type: application/json } payload { model: deepseek-chat, messages: [ {role: system, content: 你是一个擅长用通俗语言解释技术的助手。}, {role: user, content: 什么是RAG用一句话说清楚。} ], temperature: 0.5, max_tokens: 512 } resp requests.post(url, headersheaders, jsonpayload, timeout30) data resp.json() print(data[choices][0][message][content])这段代码演示了最核心的调用逻辑构造请求头、构造请求体、发送 POST、解析响应。核心参数有三个第一个是 modeldeepseek-chat 是通用对话模型如果你在做代码生成或逻辑推理可以换 deepseek-reasoner它的推理链更长但速度慢一些第二个是 temperature控制随机性第三个是 max_tokens控制输出上限。timeout 建议设 30 秒以上因为大模型接口在高峰期响应可能超过 10 秒。3.2 用 deepseek-reasoner 处理复杂推理代码审查和逻辑分析的正确姿势deepseek-reasoner 是 DeepSeek 的推理增强模型它会在正式回答之前生成一段内部的思考过程reasoning_content然后再产出最终答案。这个模型不适合闲聊但在需要多步推理的场景里表现非常突出——比如代码审查、SQL 生成、算法题讲解。from openai import OpenAI client OpenAI( api_keysk-你的key, base_urlhttps://api.deepseek.com/v1 ) response client.chat.completions.create( modeldeepseek-reasoner, messages[ {role: user, content: 审查这段代码并指出问题 for i in range(len(my_list)): my_list.remove(my_list[i]) } ] ) reasoning response.choices[0].message.reasoning_content answer response.choices[0].message.content print(思考过程, reasoning) print(最终回答, answer)这里有个关键区别deepseek-reasoner 的响应对象里包含了 reasoning_content 字段这是模型的推理链。你可以选择把它展示给用户也可以只展示最终答案。我的建议是在代码审查工具里保留这个字段它能帮开发者理解模型为什么得出某个结论比直接抛一个“有 bug”更有说服力。3.3 流式输出长回答不等待体验和效率同时提升当你做对话产品或者需要实时输出场景时流式输出几乎是必须的。非流式调用会把整个回答生成完再一次性返回如果回答比较长用户会盯着一个 spinner 等十几秒。流式输出则是一边生成一边推送用户能立刻看到第一个字。const axios require(axios); async function streamChat() { const response await axios.post( https://api.deepseek.com/v1/chat/completions, { model: deepseek-chat, messages: [ { role: system, content: 你是一个写作助手。 }, { role: user, content: 写一篇关于微服务的800字介绍。 } ], stream: true, max_tokens: 2048 }, { headers: { Authorization: Bearer sk-你的key, Content-Type: application/json }, responseType: stream, timeout: 60000 } ); response.data.on(data, (chunk) { const lines chunk.toString().split(\n); for (const line of lines) { if (line.startsWith(data: )) { const data line.slice(6); if (data [DONE]) return; const json JSON.parse(data); const content json.choices[0]?.delta?.content; if (content) process.stdout.write(content); } } }); } streamChat();流式输出的解析逻辑不复杂但有几个细节需要注意。每个 chunk 是 SSE 格式以data:开头最后以[DONE]标记结束。response.choices[0].delta.content 是增量内容需要你手动拼接。还有一个常见坑是 chunk 可能被 TCP 分片切断也就是一行数据被拆成了两半所以建议先按\n\n做缓冲再逐行解析而不是直接按\n切。3.4 必调参数表不想翻车就把这几个值落在你的配置里参数取值范围推荐初始值适用场景说明temperature020.3代码生成、格式化输出值越大越发散top_p010.9核采样与 temperature 二选一调不要同时猛调max_tokens181922048控制输出上限回答被截断时调大presence_penalty-220鼓励话题扩展时调正做问答时保持 0frequency_penalty-220抑制重复内容时调正值长文生成时用streamtrue/falsefalse长回答且需要即时体验时改 truetimeout自定义30s非流式建议 30s流式建议 60s这张表是实战中最常用的参数集合。我的经验是 temperature 和 top_p 不要同时大幅度调整二选一作为主控制即可。presence_penalty 和 frequency_penalty 在创意写作里有用但在技术问答场景里保持 0 就好调高了容易让回答变得散乱。4. 本地部署与模型选择什么时候不该用 API而该自己跑4.1 本地部署的价值与代价数据隐私和成本之间的权衡DeepSeek 提供了 API 服务但并不是所有场景都适合走 API。企业内部数据处理、敏感业务逻辑、离线环境——这些场景下把数据发送到外部 API 会有合规风险。这时候本地部署就成了唯一选择。DeepSeek 开源了多个尺寸的模型权重本地部署是可行的。本地部署的代价也很明显你得有一块足够大的显卡或者接受 CPU 推理的慢速。量化后的 7B 模型在 RTX 4090 上能跑出不错的速度但 16B 以上模型就需要更多显存或者用 vLLM 做内存优化。我的建议是如果你只是个人学习先从 7B 量化版开始如果是团队用再考虑更大模型和推理优化框架。4.2 用 llama.cpp 跑起最小本地服务从 GGUF 量化模型到 HTTP 接口llama.cpp 是目前跑本地大模型最常用的工具之一它对 CPU 和 GPU 都做了优化安装和使用相对简单。下面演示如何在 Linux 环境下用 llama.cpp 加载一个 DeepSeek 的 GGUF 量化模型并启动 HTTP 服务。# 克隆 llama.cpp 并编译 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make -j4 # 下载 DeepSeek 的 GGUF 量化模型示例实际以 HuggingFace 上对应仓库为准 # 这里假设你已经下载了 deepseek-chat-7b.Q4_K_M.gguf 到 ./models/ 目录 # 启动 HTTP API 服务 ./llama-server \ -m ./models/deepseek-chat-7b.Q4_K_M.gguf \ --host 127.0.0.1 \ --port 8080 \ --ctx-size 4096 \ -ngl 999命令行里几个关键参数的解释-m指定模型文件路径--ctx-size控制上下文长度4096 是稳妥的起点-ngl 999表示尽可能把所有层加载到 GPU如果你的显存不够改成 20 或 30 表示只卸载部分层到 GPU其他留在 CPU。启动成功后访问http://127.0.0.1:8080就能看到 API 文档。from openai import OpenAI client OpenAI( api_keynot-needed, base_urlhttp://127.0.0.1:8080/v1 ) response client.chat.completions.create( modellocal-model, messages[ {role: user, content: 用一句话解释什么是死锁。} ], temperature0.7 ) print(response.choices[0].message.content)这段代码和调用官方 API 几乎一模一样只是把 base_url 换成了本地服务的地址。这是 llama.cpp 的一个优势它提供了 OpenAI 兼容接口所以你在 API 和本地部署之间切换时业务代码几乎不用改。唯一要留意的是本地模型的能力上限——7B 量化模型的复杂推理能力不如官方 API 的大模型所以不要把生产环境的复杂任务直接压给它。4.3 用 vLLM 部署大模型服务高并发场景的吞吐量优化如果你要服务多个人或接入自动化流水线llama.cpp 的并发能力可能不够。这时候可以用 vLLM它通过 PagedAttention 等技术大幅提升推理吞吐量在同时服务多个请求时表现更好。pip install vllm vllm serve deepseek-ai/DeepSeek-V2-Lite \ --host 0.0.0.0 \ --port 8000 \ --max-model-len 8192 \ --gpu-memory-utilization 0.9vllm serve 命令会自动从 HuggingFace 拉取模型权重。--max-model-len设成 8192 表示上下文长度上限--gpu-memory-utilization控制在 0.9意思是用到 90% 显存留一点余量给系统。启动后默认的 API 地址是http://localhost:8000/v1同样兼容 OpenAI 格式用之前那个 requests 脚本改下 base_url 就能用。vLLM 的部署难度比 llama.cpp 高一些主要在于模型格式和版本匹配。如果你遇到“KeyError: qwen2 这类报错大概率是 transformers 库版本和模型不兼容pip install -U transformers通常能解决。还有一个常见问题是显存不够但你还硬着头皮部署大模型——把 --gpu-memory-utilization 调低或者换更小的量化模型。5. DeepSeek 使用避坑指南5 个让新手翻车的经典场景5.1 连续对话变“失忆”messages 数组没有被正确维护现象用户在多轮对话后发现 DeepSeek 开始重复之前的回答或者完全忘掉了第一轮提到的关键信息。原因前端只把最新一轮的 user 消息发给 API没有携带历史 messages。API 是无状态的它只根据你每次传入的 messages 数组生成回答所以会“失忆”。解决客户端维护一个完整的 message 历史列表每轮对话把之前的 user 和 assistant 消息都带上去。如果你担心 token 消耗太大可以用滑动窗口只保留最近 510 轮并在截断时加一条系统提示说明“前面讨论过的内容可能不再可见”。5.2 回答被截断成半句话max_tokens 设置太小现象生成的长回答在中间或结尾突然停止没有完整的收尾。原因max_tokens 限制了输出长度模型在达到上限时被迫停止生成。解决调大 max_tokens或者在 prompt 里注明“回答控制在 300 字以内”。前者是给模型更多空间后者是让它主动压缩内容。我一般会两个都做——max_tokens 设 2048prompt 里也写长度要求双保险。5.3 温度调太高回答变得“胡言乱语”现象同一个问题temperature 设为 1.5 以上时回答经常跑题甚至出现语法错误。原因高 temperature 会放大采样的随机性模型从概率较低的 token 里“冒险”选择导致逻辑链条断裂。解决把 temperature 控制在 0.30.7 之间。如果你确实需要多样性优先调大 top_p 而不是 temperature或者用 presence_penalty 取代。5.4 流式输出时 JSON 解析失败SSE 数据被 TCP 分片切碎现象stream 模式下你按照data:前缀逐行解析但代码偶尔报 JSON decode error。原因网络传输过程中一个完整的数据帧可能被拆分到两个 chunk 里导致单行数据不完整。解决不要直接按整行解析而是维护一个 buffer每次收到数据先追加进 buffer再按\n\n分割成多条 SSE 消息最后逐条解析。这是流式解析里的经典坑几乎每个人都会踩一次。5.5 本地部署 llm 请求超时并发数太高把显存打爆现象用 vLLM 部署后并发请求一多部分请求直接超时或者服务崩溃。原因并发请求太多占满显存和计算资源导致推理排队时间过长。解决限制最大并发数或者在请求前检查当前排队长度。vLLM 的--max-num-seqs参数可以控制同时处理的序列数调得保守一些比如 16 或 32换取更稳定的响应时间。另一条经验是给 timeout 留足余量——本地大模型在负载高时单次请求等 60 秒是正常的别把 timeout 设成 10 秒然后骂部署有问题。6. 把 DeepSeek 用成生产力工具从 API Key 管理到错误处理的进阶技巧6.1 环境变量管理 API Key不要让你的密钥出现在代码仓库里任何人把 API Key 写死在代码里然后推到 GitHub都是给自己埋雷。我把 API Key 放在.env文件里用python-dotenv加载或者直接在系统环境变量里导出。这样即使代码泄漏密钥也不会暴露。import os from dotenv import load_dotenv load_dotenv(.env) api_key os.getenv(DEEPSEEK_API_KEY) base_url os.getenv(DEEPSEEK_BASE_URL, https://api.deepseek.com/v1) print(API Key 已加载:, api_key[:8] ... if api_key else 未找到请检查 .env 文件).env文件的格式是DEEPSEEK_API_KEYsk-你的key。这段代码检查 key 是否存在并做个简单脱敏打印。另一个建议是给 API Key 设置消耗上限DeepSeek 控制台提供余额告警把这个配置打开能防止程序出 bug 时无限调用把你的余额打穿。6.2 错误处理与重试429、500、超时分别怎么应对大模型 API 不是零故障的。我见过 429 限流、500 内部错误、请求超时、还有网络波动导致的连接重置。不处理这些异常你的脚本就会在凌晨 3 点静默失败然后你第二天早上才发现任务全挂了。正确的做法是建立一套分级重试策略。import time import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session requests.Session() retries Retry( total5, backoff_factor1, status_forcelist[429, 500, 502, 503], allowed_methods[POST] ) session.mount(https://, HTTPAdapter(max_retriesretries)) url https://api.deepseek.com/v1/chat/completions headers {Authorization: Bearer sek-你的key, Content-Type: application/json} payload { model: deepseek-chat, messages: [{role: user, content: 你好}], temperature: 0.3, max_tokens: 128 } try: resp session.post(url, headersheaders, jsonpayload, timeout30) resp.raise_for_status() print(resp.json()[choices][0][message][content]) except requests.exceptions.Timeout: print(请求超时建议指数退避重试) except requests.exceptions.HTTPError as e: status e.response.status_code if status 429: print(触发限流等待 60 秒后重试) elif status 500: print(服务端错误重试可能解决) else: print(fHTTP {status}: {e.response.text[:200]})这段代码的核心价值在于 Retry 对象和异常捕获。burst 型限流适合短退避重试持续型限流需要更长等待。我的习惯是看响应头里的Retry-After字段——如果服务端给了这个值就按它来等待不要自己拍脑袋定时长。6.3 缓存机制让重复问题不再重复花钱如果你在做问答系统或者自动化工具同类型的请求会反复出现。给所有请求加一个基于 prompt 哈希的缓存层能省下大量 token 费用。只有缓存 miss 时才真正调用 API命中的直接返回历史结果。这个方案简单可靠但要注意一个问题缓存 key 要包含 model、temperature 和 messages 的全部内容否则会出现“同样的问题两次回答不同”的情况用户会觉得很奇怪。import hashlib import json import redis r redis.Redis(hostlocalhost, port6379, db0) def get_cache_key(messages, model, temperature): raw json.dumps({messages: messages, model: model, temperature: temperature}, ensure_asciiFalse) return hashlib.sha256(raw.encode()).hexdigest() def query_with_cache(messages, model, temperature0.3): key get_cache_key(messages, model, temperature) cached r.get(key) if cached: return json.loads(cached)[content] content call_deepseek_api(messages, model, temperature) r.setex(key, 3600, json.dumps({content: content})) return content这段代码用 Redis 做缓存key 由 messages、model、temperature 共同决定有效期设 3600 秒。上线后你观察一下缓存命中率如果命中率很高说明大量请求是重复的可以进一步放大缓存有效期如果命中率低说明你的 prompt 变体太多就需要考虑做语义缓存而不是精确匹配了。最后一件事也是我自己的血泪教训任何基于大模型的功能永远要加一层兜底输出。模型返回空、返回乱码、返回格式错误你的代码都要能吞下并返回一个保底结果给用户。这层保护不是优化是必需品。希望这份“DeepSeek 使用方法”的实战拆解能帮你少走几步弯路把模型真正用成顺手的生产力工具。本文还有配套的精品资源点击获取