news 2026/10/23 3:28:17

DeepSeek API工程化接入指南:从网页调试到移动端落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek API工程化接入指南:从网页调试到移动端落地

简介:本资源是一份面向开发者与AI产品实践者的DeepSeek大模型实操指南,聚焦网页端交互、API集成开发及移动端部署三大核心场景,帮助具备Python基础的技术人员快速掌握自然语言处理工具的落地应用。内容覆盖官网登录对话流程、OpenAI兼容API的Key创建与调用(含完整Python示例代码)、以及通过Chatbox App实现手机端接入的详细配置步骤,兼顾操作性与原理理解,适用于智能客服构建、AI辅助办公等实际业务需求。资源为单文件docx文档,结构清晰、图文结合,体积仅16KB,便于快速查阅与离线学习。目前已有5985人下载学习,读者可直接获取可复用的API调用模板、移动端适配方案、关键参数配置说明及响应解析方法,显著降低DeepSeek在Web与移动场景中的集成门槛。

1. DeepSeek不是另一个“网页聊天框”:它是可嵌入、可调度、可审计的NLP服务实体

很多人第一次点开 chat.deepseek.com,输入“你好”,看到回复就以为“会用了”。但真正卡住项目进度的,从来不是“能不能聊”,而是“能不能稳、能不能控、能不能进系统”。DeepSeek 的价值不在对话界面有多清爽,而在于它把大模型能力拆成了三类可工程化交付的接口:网页端是验证层,API 是集成层,移动端(通过兼容 OpenAI 协议的客户端)是触达层。这三者共享同一套 token 计费逻辑、同一套上下文管理机制、同一套 system prompt 注入规则——意味着你在网页里调通的 prompt 工程,在 Python 脚本里改两行就能复用;你在 Chatbox 里配好的温度和最大消息数,和 API 请求里的temperature=0.7、max_tokens=2048是严格对齐的。它不强制你写 Rust 或部署 vLLM,但也不纵容你只靠复制粘贴糊弄上线。适合两类人:一类是正在把客服话术引擎从规则库迁到 LLM 的后端工程师,另一类是手握产品需求、需要在两周内给销售团队塞进一个“AI 招商文案生成器”的技术型产品经理。如果你还在为“模型响应忽快忽慢”“历史记录断在第三轮”“手机上发个长文本直接崩”头疼,这份指南不是教你点哪里,而是告诉你每个点击背后触发了哪条 HTTP 请求链、哪个参数决定了 token 截断点、哪类错误码对应哪类重试策略。


2. 网页端交互:别只当浏览器玩具,它是你的 prompt 调试沙盒与 token 实时仪表盘

网页端常被当成“临时测试入口”,但它的底层设计其实是一套轻量级 SDK 的可视化壳。登录后每一条消息发送,都对应一次带完整 metadata 的 POST 请求;每次滚动加载历史,都在拉取/v1/conversations/{id}/messages接口;而右上角显示的「剩余 tokens」不是估算值,而是平台实时扣减后返回的精确余额。这意味着:你可以用它做三件事——验证 prompt 效果、观测上下文衰减曲线、定位 system role 注入时机。下面拆解真实操作链路。

2.1 登录即授权:手机号/微信/邮箱背后的 session 绑定逻辑

点击“开始对话”后跳转的登录页,实际完成的是 OAuth2.0 implicit flow 的简化变体。以微信登录为例:前端调用wx.login()获取 code,传给 DeepSeek 后端换取access_token和refresh_token,后者被加密存入浏览器localStorage(键名为deepseek_session_v2),有效期 7 天。关键点在于:这个 session 不仅用于鉴权,还绑定用户级配额池。你用 A 手机号注册的账号,在网页端消耗的 tokens,会实时同步到 API 平台的 usage dashboard 中——所以别用测试账号狂刷“写周报”,否则正式环境调 API 时可能突然触发429 Too Many Requests。

提示:若需多环境隔离(如开发/测试/生产),不要共用同一手机号注册多个账号。DeepSeek 目前不支持子账户或 workspace 切换,session 冲突会导致 token 统计错乱。

2.2 对话输入框的隐藏参数:system prompt 如何被静默注入

你输入“帮我写一封辞职信”,看似只是 user message,但实际发出的请求体中,messages数组永远以{"role": "system", "content": "You are a helpful, respectful and honest assistant."}开头。这个默认 system prompt 不可删除,但可在登录后进入「设置 → 高级选项」中自定义。重点来了:网页端的 system prompt 修改仅影响当前会话,且不会透传给 API 调用。也就是说,你在网页里把 system 设成“你是一个冷面律师”,API 调用时仍走默认值——除非你在代码里显式传入{"role": "system", "content": "..."}。这是新手最容易踩的“预期不一致”坑:网页里效果好,API 里翻车。

2.3 历史消息加载机制:分页逻辑与 context window 的真实边界

网页端默认只加载最近 20 条消息,滚动到底部触发GET /v1/conversations/{id}/messages?limit=20&before={message_id}。注意before参数不是时间戳,而是上一条消息的_id字段(MongoDB ObjectId 格式)。当你连续发送 5 条消息,每条含 300 字,总 token 数已逼近 2048 上下文上限时,网页端会自动截断最早的消息——但这个截断不通知用户,只在 network tab 的 response body 里返回"truncated": true。你可以打开浏览器开发者工具,在 Network 面板过滤messages,观察每次请求返回的total_count和data.length差值,这就是 context 被削掉的证据。

2.4 实时 token 计数器:不只是数字,它是你的成本预警雷达

右上角显示的「剩余 tokens:12,486」来自/v1/billing/usage接口的remaining_quota字段。这个值每 3 秒轮询更新一次,但要注意:它反映的是账户级剩余配额,而非本次会话已用 token。真正决定单次响应长度的是模型自身的 context window(deepseek-chat 为 128K tokens),而网页端前端做了二次限制:单次输入框最多接受 8192 字符(约 2000 tokens),超出部分会被前端 JS 截断并弹出提示。所以当你粘贴一篇 5000 字的合同要求“逐条分析”,网页端根本不会发出去——它连请求都拦在了 DOM 层。


3. API 集成:用 Python 把 DeepSeek 接进你的服务,而不是“抄完示例就跑”

API 文档里那几行openaiSDK 示例,掩盖了三个关键事实:第一,DeepSeek 的/v1/chat/completions接口虽兼容 OpenAI,但不支持 streaming 响应的 SSE 格式解析(text/event-stream),必须设stream=False;第二,model="deepseek-chat"是唯一可用值,填deepseek-coder会返回404 Not Found;第三,base_url必须严格为https://api.deepseek.com,末尾不能加/v1,否则 401。这些细节不写进代码注释,你就得花半天抓包比对。下面给出生产环境可用的最小可靠封装。

3.1 安装与初始化:为什么pip install openai是必要但不充分条件

pip install openai==1.35.12

必须锁定版本!OpenAI SDK 1.36+ 引入了异步 retry 逻辑,会与 DeepSeek 的 rate limit header(x-ratelimit-remaining-tokens)解析冲突,导致重试时重复扣 token。安装后初始化 client:

from openai import OpenAI import os # 从环境变量读取,避免硬编码 client = OpenAI( api_key=os.getenv("DEEPSEEK_API_KEY"), # 必须是字符串,不能是 None base_url="https://api.deepseek.com", # 注意:无尾部斜杠 timeout=30.0, # 生产环境建议设为 30s,避免长 prompt 卡死 max_retries=2 # SDK 自动重试次数,非 DeepSeek 重试 )

注意:max_retries是 SDK 层的网络重试,与 DeepSeek 的429限流无关。遇到429时 SDK 会抛出RateLimitError,需自行捕获并按Retry-Afterheader 延迟。

3.2 构建合规请求:messages 结构、参数含义与必填项校验

def call_deepseek(prompt: str, system_prompt: str = None, temperature: float = 0.7) -> str: messages = [] if system_prompt: messages.append({"role": "system", "content": system_prompt}) messages.append({"role": "user", "content": prompt}) try: response = client.chat.completions.create( model="deepseek-chat", # 固定值,不可更改 messages=messages, temperature=temperature, # 0.0~2.0,推荐 0.3~0.8 控制确定性 max_tokens=2048, # 单次响应最大 token 数,超限会截断 top_p=0.95, # 核采样阈值,与 temperature 协同控制多样性 frequency_penalty=0.0, # 降低重复词概率,0.0~2.0 presence_penalty=0.0 # 降低新话题引入概率,0.0~2.0 ) return response.choices[0].message.content.strip() except Exception as e: # 具体异常类型见 4.1 节避坑指南 raise e # 使用示例 result = call_deepseek( prompt="请将以下技术方案转为面向客户的通俗说明:{tech_doc}", system_prompt="你是一名有 10 年经验的 SaaS 产品经理,擅长把技术语言翻译成客户能懂的价值点。", temperature=0.5 )

关键参数说明:

  • max_tokens:不是“最多生成这么多”,而是“响应内容 + 输入 prompt 的总 token 数不超过此值”。若 prompt 占 1500 tokens,则最多生成 548 tokens。
  • top_p:当设为 0.95 时,模型只从概率累计和 ≥95% 的词表子集中采样,比单纯调高 temperature 更可控。
  • frequency_penalty:设为 0.5 可显著减少“的的的”“是是是”类重复,但过高(>1.0)会导致语句生硬。

3.3 响应解析:别只取.content,metadata 才是运维依据

# 完整响应结构解析 response = client.chat.completions.create(...) print(f"模型返回ID: {response.id}") # 唯一请求ID,用于日志追踪 print(f"使用模型: {response.model}") # 固定为 deepseek-chat print(f"输入token数: {response.usage.prompt_tokens}") # 精确值,可用于成本分摊 print(f"输出token数: {response.usage.completion_tokens}") print(f"总token数: {response.usage.total_tokens}") print(f"完成原因: {response.choices[0].finish_reason}") # 'stop'/'length'/'content_filter'

finish_reason是关键诊断字段:

  • 'stop':正常结束,模型自己决定说完;
  • 'length':达到max_tokens上限被强制截断,需检查 prompt 是否过长或max_tokens是否设太小;
  • 'content_filter':触发安全策略,内容被拦截(如含敏感词、违法信息),此时content为空字符串。

3.4 错误处理:捕获真实错误码,而非泛化 try-except

from openai import RateLimitError, APIStatusError, APIConnectionError def robust_call(prompt: str): try: return call_deepseek(prompt) except RateLimitError as e: # DeepSeek 返回 429,header 包含 x-ratelimit-reset reset_time = int(e.response.headers.get("x-ratelimit-reset", "0")) wait_seconds = max(1, reset_time - int(time.time())) time.sleep(wait_seconds) return call_deepseek(prompt) # 重试 except APIStatusError as e: if e.status_code == 401: raise ValueError("API Key 无效,请检查密钥是否过期或权限不足") elif e.status_code == 400: raise ValueError(f"请求参数错误: {e.message}") else: raise e except APIConnectionError: raise ConnectionError("DeepSeek API 服务暂时不可达,请检查网络或稍后重试")

4. 移动端落地:用 Chatbox App 实现零代码接入,但配置错一个参数就白忙活

官方尚未发布原生 iOS/Android App,但 Chatbox(v3.2.0+)已深度适配 DeepSeek 的 OpenAI 兼容协议。这不是“找个 APP 粘贴 KEY 就能用”的事——Chatbox 的配置项里藏着四个决定成败的开关,漏调一个,你就会遇到“能登录但发不出消息”“回复永远只有‘你好’”“中文变成乱码”等玄学问题。下面按真实调试顺序展开。

4.1 Chatbox 下载与基础配置:避开应用商店的“阉割版”陷阱

iOS 用户请务必通过 Chatbox 官网 下载 IPA(官网提供 TestFlight 链接),不要从 App Store 搜索安装。App Store 版本因审核限制禁用了自定义 API provider 功能,设置页里根本找不到“添加自定义提供方”入口。Android 用户可在官网下载 APK,或通过 F-Droid 搜索 “Chatbox”(注意作者是com.chatboxapp)。

安装后首次启动,跳过所有引导页,直接点击左下角「⚙️ 设置」→「Providers」→「Add Custom Provider」。

4.2 自定义 Provider 配置:四行填错,全盘失效

配置项正确值常见错误后果
Provider Name任意英文名(如DeepSeek-Pro)填中文或空格Chatbox 启动时崩溃
API ModeOpenAI API Compatible(下拉选择)手动输入openai或选错模式连接时返回405 Method Not Allowed
API Base URLhttps://api.deepseek.com多写/v1或少写https://Network Error或404
API Key从 platform.deepseek.com 复制的完整字符串复制时带空格/换行/引号401 Unauthorized

提示:API Key 复制后,务必在文本编辑器中用^A全选 →^C复制,避免鼠标拖选时漏掉首尾字符。Chatbox 不做 key 格式校验,错误 key 会静默失败。

4.3 高级参数调优:温度、上下文、流式开关的真实作用

进入 Provider 编辑页后,点击「Advanced Settings」展开:

  • Temperature: 默认 0.7,建议生产环境设为0.3(提升回答稳定性),创意场景可提至0.8。
  • Max Context Messages: 默认 10,指保留多少轮对话历史参与 context。注意:这不是 token 数,而是 message 对数。设为 10 表示最近 10 条 user/assistant 交替消息,若每条平均 500 tokens,则实际占用约 5000 tokens。网页端默认是 20,API 默认是无限(由max_tokens总控),此处设小会降低长对话连贯性。
  • Stream Responses:必须关闭(OFF)。DeepSeek 当前 API 不支持 streaming,开启后 Chatbox 会持续等待data:事件,最终超时返回空响应。这是 90% 用户“配置完却收不到回复”的根源。
  • Timeout (seconds): 建议设为45。移动端网络波动大,30s 默认值易触发假失败。

4.4 验证与调试:用三句话确认链路全通

配置保存后,返回主界面,点击右上角「+」新建对话,选择你刚创建的DeepSeek-ProProvider。然后依次发送三句话:

  1. 你是谁?→ 应返回类似 “我是 DeepSeek,一个由深度求索研发的大语言模型……”
  2. 请用中文解释什么是 token?→ 验证中文化支持,若返回英文或乱码,检查 API Key 是否含非法字符。
  3. 请总结上两句话的核心信息,限 50 字→ 验证上下文记忆能力。若答非所问,检查Max Context Messages是否设为 0 或过小。

注意:首次验证时,Chatbox 可能缓存旧 Provider 配置。若前三句失败,退出 App 进程(iOS 双击 Home 上滑,Android 长按最近任务),重新打开再试。


5. 避坑指南:那些让你凌晨三点还在抓包的 5 个真实翻车现场

这些不是“理论上可能出错”,而是我在三个不同项目中亲手踩过的坑,每一条都附带curl命令复现方式和终端日志特征。别跳过,它们省下的 debug 时间,够你喝三杯咖啡。

5.1 现象:API 调用返回401 Unauthorized,但 Key 复制无误

原因:API Key 被平台自动轮换,旧 Key 失效。DeepSeek 控制台创建 Key 后,若再次点击“Regenerate”,旧 Key 立即作废,且不通知已配置的客户端。
复现命令:

curl -X POST "https://api.deepseek.com/v1/chat/completions" \ -H "Authorization: Bearer sk-xxx_old_key" \ -H "Content-Type: application/json" \ -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"test"}]}'

响应:{"error":{"message":"Invalid API key.","type":"invalid_request_error","param":null,"code":"invalid_api_key"}}
解决:登录 platform.deepseek.com/api_keys ,确认 Key 状态为Active,且创建时间与你记忆一致。若看到Regenerated on 2024-06-15,立即更新所有环境变量。

5.2 现象:网页端能发长文本,API 调用却报400 Bad Request,提示prompt too long

原因:max_tokens参数理解错误。你以为它限制“输出长度”,实际它限制“输入+输出总长度”。当 prompt 占 10000 tokens,max_tokens=2048时,总长 12048 > 2048,直接拒绝。
复现命令:

# 用 10000 字符的 prompt(生成方法:python -c "print('a'*10000)") curl -X POST "https://api.deepseek.com/v1/chat/completions" \ -H "Authorization: Bearer sk-xxx" \ -H "Content-Type: application/json" \ -d '{ "model":"deepseek-chat", "messages":[{"role":"user","content":"'"$(python -c "print(\"a\"*10000)")"'"}], "max_tokens":2048 }'

响应:{"error":{"message":"This model's maximum context length is 128000 tokens. However, you requested 10000 tokens in the messages parameter and 2048 tokens in the max_tokens parameter, totaling 12048 tokens. Please reduce the number of tokens in your request.","type":"invalid_request_error","param":"messages","code":"context_length_exceeded"}}
解决:计算 prompt token 数(可用 tiktoken 库),确保prompt_tokens + max_tokens <= 128000。生产环境建议max_tokens设为8192,留足 buffer。

5.3 现象:Chatbox 发送消息后,气泡一直转圈,30 秒后显示 “Request timeout”

原因:Stream Responses开关被误开。DeepSeek API 不返回data:流式数据,Chatbox 却在等待,直到客户端超时。
诊断方法:在 Chatbox 设置中,Provider 编辑页 → Advanced Settings → 查看Stream Responses是否为 ON。
解决:手动关闭,重启 App。无需重配 Key 或 URL。

5.4 现象:Python 脚本调用成功,但返回内容含大量\n\n和空行,格式混乱

原因:模型输出未做后处理。DeepSeek 的回复习惯在段落间插入双换行,而业务系统(如邮件模板、短信网关)往往要求紧凑排版。
解决:在response.choices[0].message.content后加清洗:

cleaned = re.sub(r'\n\s*\n', '\n\n', response.choices[0].message.content) # 合并多余空行 cleaned = re.sub(r'[ \t]+$', '', cleaned, flags=re.M) # 删除每行尾空格

5.5 现象:同一份 prompt,在网页端返回 A,在 API 返回 B,且 B 质量明显更差

原因:网页端默认注入了额外的 system prompt(如You are a helpful, respectful and honest assistant.),而 API 调用未显式传入,导致模型角色认知缺失。
验证方法:网页端打开开发者工具 → Network → 找到chat/completions请求 → 查看 Payload 的messages数组,首项必为 system role。
解决:API 调用时,messages列表第一项必须是{"role": "system", "content": "You are a helpful, respectful and honest assistant."},内容需与网页端完全一致。


6. 进阶技巧:用 token 统计反推 prompt 工程效果,建立你的 LLM 成本仪表盘

很多团队把 LLM 当黑匣子用:prompt 改了,效果好了,就认为“成了”。但没数据支撑的优化是玄学。DeepSeek 提供的usage字段,是唯一能穿透黑匣子的探针。我一般会强制在所有 API 调用后,把prompt_tokens、completion_tokens、total_tokens写入本地 SQLite 数据库,并关联业务 ID(如order_id、user_id)。三天后,你就能回答这些关键问题:

  • 哪类 prompt 消耗 token 最多?是用户输入太啰嗦,还是 system prompt 冗余?
  • 同一业务场景下,temperature=0.3和0.7的平均completion_tokens差多少?能否用更低温度省 30% 成本?
  • 当finish_reason="length"出现频率 >15%,是不是该砍掉 prompt 里的背景描述?

下面是一个轻量级监控脚本,它不依赖任何框架,5 分钟就能跑起来:

import sqlite3 import time from datetime import datetime from openai import OpenAI # 初始化数据库 conn = sqlite3.connect("llm_usage.db") conn.execute(""" CREATE TABLE IF NOT EXISTS usage_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp TEXT NOT NULL, business_id TEXT, prompt_tokens INTEGER, completion_tokens INTEGER, total_tokens INTEGER, model TEXT, finish_reason TEXT, status TEXT -- 'success' or 'error' ) """) client = OpenAI(api_key="sk-xxx", base_url="https://api.deepseek.com") def tracked_call(prompt: str, business_id: str = None, **kwargs) -> dict: start_time = time.time() try: response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], **kwargs ) # 记录成功日志 conn.execute( "INSERT INTO usage_log VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)", ( datetime.now().isoformat(), business_id, response.usage.prompt_tokens, response.usage.completion_tokens, response.usage.total_tokens, response.model, response.choices[0].finish_reason, "success" ) ) conn.commit() return { "content": response.choices[0].message.content, "usage": response.usage.dict() } except Exception as e: # 记录错误日志(token 数为 0) conn.execute( "INSERT INTO usage_log VALUES (NULL, ?, ?, 0, 0, 0, ?, ?, ?)", (datetime.now().isoformat(), business_id, "deepseek-chat", "error", "error") ) conn.commit() raise e # 使用示例:为每个客服会话打上 business_id result = tracked_call( prompt="用户说:订单 20240615-8821 物流停滞,请处理", business_id="20240615-8821", temperature=0.3, max_tokens=512 ) print(result["content"])

运行一周后,执行 SQL 查询:

-- 查看最烧钱的 5 个业务 ID SELECT business_id, SUM(total_tokens) as cost FROM usage_log WHERE status='success' GROUP BY business_id ORDER BY cost DESC LIMIT 5; -- 查看截断率(finish_reason='length' 的比例) SELECT COUNT(*) * 100.0 / (SELECT COUNT(*) FROM usage_log WHERE status='success') as truncation_rate FROM usage_log WHERE finish_reason='length' AND status='success';

从那以后我每次上线新 prompt,都强制走一遍这个流程:先跑 100 条样本,看truncation_rate是否 <5%,再看avg(completion_tokens)是否比旧版降 15% 以上,最后才让产品验收。不是为了炫技,而是当老板问“这个 AI 功能每月多花多少钱”,你能拍着桌子报出精确到个位数的数字——这才是工程师该有的底气。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 3:27:48

Flutter for OpenHarmony 开发实战:从习惯打卡App谈跨端应用落地

做了一阵子 Flutter for OpenHarmony 开发&#xff0c;最直观的感受就是&#xff1a;这套组合完全能撑起一个日常向的 App。这个生活助手 App 的项目&#xff0c;核心里做的是习惯打卡功能——每天早上打开设备&#xff0c;看一眼今天的运动、阅读、喝水目标有没有完成&#xf…

作者头像 李华
网站建设 2026/10/23 3:27:46

毕业生就业信息管理系统设计与实现:从需求拆分到SpringBoot落地复盘

每年毕业设计季&#xff0c;“管理系统”这类题目几乎占去半壁江山&#xff0c;而“毕业生就业信息管理系统”又是其中出镜率最高的几个名字之一。不管是在哪个资源站上搜源码&#xff0c;都能翻出一整排同名同功能的工程包&#xff0c;甚至编号都串着来&#xff0c;比如标题里…

作者头像 李华
网站建设 2026/10/23 3:27:45

Flutter跨端适配OpenHarmony:习惯打卡模块的架构设计与实战

这个标题看着就亲切&#xff0c;最近正好在折腾跨端适配的活儿。把 Flutter 那套 UI 思路搬到 OpenHarmony 上&#xff0c;还要落地一个完整的习惯打卡功能&#xff0c;听起来像是个小而美的练手项目&#xff0c;但真上手你会发现&#xff0c;里面藏着不少平台差异的坑和工程化…

作者头像 李华
网站建设 2026/10/23 3:26:35

Tent混沌映射改进麻雀算法优化BP神经网络的回归预测实现

不知道你有没有这种感觉&#xff1a;一篇回归预测的论文或项目方案&#xff0c;看标题全是“改进”“优化”“混合”&#xff0c;但真正跑起来后&#xff0c;大部分时间都耗在了调参、复现和“不知道算法到底改对没有”的自我怀疑上。前阵子我刚好做完一个用Tent混沌映射改进麻…

作者头像 李华
网站建设 2026/10/23 3:25:53

YOLOv5/v8/v10旋转框检测全解析:从数据准备到训练部署的实战指南

干了几年目标检测&#xff0c;大部分时间都在跟水平框打交道。直到某天接了个倾斜目标的检测需求&#xff0c;我才意识到YOLO系列的水平框那一套逻辑放在旋转场景里根本不够用——尤其是面对遥感影像里的飞机船舶、工业质检里随意摆放的零件、文档扫描件里歪着的文字区域&#…

作者头像 李华
网站建设 2026/10/23 3:25:53

JupyterLab实战指南:内核配置、魔法命令与交互式数据分析

Jupyter Notebook 这个工具&#xff0c;我从第一次用到现在已经五六年了。早期写 Python 脚本都是文件套文件&#xff0c;跑一步改一步&#xff0c;数据中间长什么样全靠 print 打出来看&#xff1b;后来切到 Notebook&#xff0c;代码、输出、图表、说明文字全在一个页面里&am…

作者头像 李华