
写代码时最让人烦躁的不是问题本身有多难而是“切换上下文”的成本太高。比如你正在写一段数据清洗脚本Pandas 报了一个奇怪的 TypeError你要把报错信息复制到聊天窗口等模型给出答案再切回编辑器修改然后再跑一次。这个过程看起来只要几秒钟但一晚上重复十几次之后就会明显感觉到精力不是耗在解决问题上而是耗在来回切换上。如果把生成式AI直接揉进 Jupyter Notebook 里呢报错就显示在代码下方AI 的回答也显示在旁边改完代码直接在当前单元格重新运行——整个反馈回路被压缩到一个界面里。这是 Jupyter Notebook 集成生成式AI 最有吸引力的地方不是“多一个聊天窗口”而是把“提问、验证、修改、执行”变成同一条工作流。不过真正动手做的时候很多人会发现最花时间的往往不是模型本身而是环境配置、上下文管理和错误排查。这篇文章就围绕这个主题展开从环境准备、最小可用流程到上下文管理、批量调用、常见坑点和适用边界做一个完整的实操记录。1. 为什么是 Jupyter Notebook而不是单独的聊天窗口1.1 它真正改变的把问答和执行放进同一个反馈回路先做一个对比。传统使用生成式AI的方式是在网页聊天框里提问得到代码回到本地编辑器运行代码遇到报错再回到聊天框粘贴。这个流程有个隐藏的问题——聊天窗口本身不保存代码的输出状态。比如你问“帮我写一个读取 CSV 并做聚合统计的 Pandas 脚本”它给你一段代码。你运行后发现第二行报错你再问“改成按照日期分组”它看不到你的数据字段看不到你的报错上下文只能靠你描述。于是你需要在聊天框里不断补充信息像是“我的列名是 created_at”“报错是 KeyError”。这种来回本质上是把本该由开发环境承载的状态信息全部转换成聊天文本。但在 Jupyter Notebook 里代码、输出、变量的当前值全都在同一个页面上。AI 的回答可以直接写入一个单元格你可以先检查逻辑再运行它。如果报错直接把错误信息作为新的上下文传给模型不用重新描述整个环境。这是一个很本质的区别不是多人聊天而是把 AI 当成一个能在工作区里即时协作的同事。1.2 Jupyter Notebook 和 Jupyter Lab怎么选很多人在搜索“notebook”和“lab”的区别。这里先给结论刚开始做探索性实验用 Jupyter Notebook 就够了如果想把 AI 助手长期融入日常工作流更推荐 Jupyter Lab。两者的底层是同一套内核和文件格式理解这一点很重要。真正不同的是界面组织方式维度Jupyter NotebookJupyter Lab界面布局单文档视图一次打开一个 .ipynb多标签、可拖拽布局像一个小型 IDE文件管理通过启动页跳转目录左侧内置文件树直接切换文件多笔记本并行需要在不同标签页打开同一个标签页内切换更轻量终端/命令行不方便内置终端面板适用阶段简单实验、课程教学、单文件探索日常开发、多文件协作、把 Notebook 当工作台实际使用中如果你同时打开三个 Notebook分别处理数据清洗、模型实验和结果分析Lab 的体验会好很多。因为左侧文件树可以直接定位到任意文件不需要回启动页重新找。但如果只是临时写个小 demoNotebook 足够不用为了“更高级”强行切换。1.3 它和 AI 编程助手如编辑器内补全并不冲突Jupyter Notebook 集成生成式AI和 VSCode 里装 AI 编程助手是两种不同的事。编辑器里的 AI 编程助手核心场景是“补全”——你在写代码它根据上下文帮你补函数签名、补逻辑、补测试。强在生成速度快、和代码编辑深度耦合。而 Jupyter Notebook 里集成生成式AI更适合“探索性任务”你不确定某个库怎么用想让模型给出示例你拿到一个数据集想让模型帮你梳理分析思路你写完一段代码发现结果不符合预期想让模型根据输出帮你排查。两者不是替代关系。我通常的做法是写正式函数用编辑器和 AI 编程助手做数据分析或学习新库时用 Notebook 加生成式AI。前者适合产出工程代码后者适合把“思路和实验”记录下来。后者还会多一个附带价值——整个探索过程被保存成一个 .ipynb 文件几周后回来看仍然能还原当时的判断依据。2. 环境配置这一步为什么最容易卡住2.1 环境配置链路拆解先分清“四层”很多人以为“在 Jupyter 里用 AI”只需要装一个包。实际上这一条链路至少涉及四层Python 本体Notebook 依赖 Python 运行。Notebook 运行环境Jupyter Notebook 或 Jupyter Lab 本身。内核KernelNotebook 真正执行代码的 Python 解释器。包依赖OpenAI SDK、Transformers、Pandas 等库。绝大多数“安装了却 import 不了”“Notebook 打开是空白”“新环境不被识别”的问题本质都是“包装在了 A 环境而 Notebook 内核跑在 B 环境”。这个概念不理解后面很容易反复踩坑。2.2 三条主流路径Anaconda、VSCode、PyCharm根据你的工作习惯环境配置路径不太一样路径优点缺点适合人群Anaconda自带 Jupyter、Spyder、常用数据分析包用 conda 创建虚拟环境方便安装体积大新手容易在“base 环境”里乱装包数据分析和科学计算为主VSCode轻量扩展丰富可以远程连接服务器打开 Notebook内核选择逻辑需要理解第一次配置需要装 Python 和 Jupyter 扩展平时用 VSCode 写代码想统一工作区PyCharmIDE 集成度高创建项目时自动管理虚拟环境运行和调试体验好重免费版部分功能受限主用 PyCharm 写 Python 项目从我自己的经验看如果只是“想在 Notebook 里跑生成式AI”Anaconda 是最省事的一条路径因为它默认装好了 Jupyter你只需要额外安装 SDK 包。如果你已经用 VSCode 写了很久代码没必要为了 Notebook 专门装 Anaconda直接装 Python 插件和 Jupyter 插件就可以。2.3 常见环境坑位空白页、浏览器、内核不匹配这里必须提三个高频问题都是在热搜里反复出现的Windows 上 Jupyter Notebook 打开后空白。多数不是代码问题而是浏览器兼容或端口冲突。常见处理顺序先换默认浏览器重新打开再检查 8888 端口是否被占用如果装了多个插件可以尝试在无痕窗口打开。还有一个容易被忽略的原因是 jupyterlab 和 notebook 的版本冲突这时需要看启动终端里的日志而不是只看浏览器白屏。如何让 Notebook 在指定浏览器打开。生成 token 的 URL 本身就包含身份验证。如果你想用 Chrome 打开直接复制终端里带token的地址到浏览器即可。如果你希望每次启动都自动跳转可以在配置文件中设置c.NotebookApp.browser。用 Anaconda 创建了 pytorch 环境但 Jupyter 里找不到这个内核。这是因为新环境没有安装ipykernel。在对应环境的终端里执行python -m ipykernel install --user --name 环境名之后 Notebook 就能识别了。这个现象在“anaconda 配置 pytorch 环境”后很常见不是 Jupyter 坏了而是内核注册信息缺失。配置环境的时候我习惯先记一个最小验证命令# 在对应虚拟环境中执行 python -m ipykernel install --user --name myenv jupyter kernelspec list如果kernelspec list里能显示你刚注册的环境名说明内核这一层没问题。接下来再去关心 AI SDK 是否安装成功。注意不要在一个环境里把所有包都装一遍。不同项目建议拆成独立虚拟环境否则依赖冲突会让你在排查时花更多时间。3. 在 Notebook 里接入生成式AI最小可用流程3.1 最小闭环三个步骤一旦环境确认没问题就可以开始集成生成式AI。这里不做复杂架构先跑通一个最小闭环。完整的最小闭环分为三步加载密钥和模型客户端。发送一条 prompt拿到返回结果。把结果输出到单元格并检查返回结构。3.2 用 API 方式接入的示例结构以下用 OpenAI SDK 的方式作为示例你自然需要替换为实际使用的服务商和密钥# 1. 安装依赖如果你用的是 pip # !pip install openai python-dotenv import os from openai import OpenAI from dotenv import load_dotenv # 从 .env 文件中读取密钥避免硬编码 load_dotenv() client OpenAI( api_keyos.getenv(OPENAI_API_KEY), ) response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是一个 Python 代码助手擅长写清晰简洁的示例。}, {role: user, content: 请用 pandas 写一段读取 CSV 并按日期分组聚合的示例代码。}, ], temperature0.3, ) print(response.choices[0].message.content)这里有个很小的细节把 API Key 放在代码里虽然能跑通但不推荐。更稳妥的做法是放在.env文件里并确保.gitignore忽略它。很多人刚开始图省事直接把 key 写在 Notebook 里结果 Commit 到仓库后泄露这是必须提前避开的坑。3.3 用本地模型的接入方式如果你不想依赖外部 API也可以使用 Hugging Face 的 Transformers 库加载本地模型。不过这通常需要下载几个 GB 的模型文件并且推理时需要一定的显存或内存。适合有本地 GPU 或者愿意接受较慢速度的场景。一个最简的结构如下# !pip install transformers torch from transformers import pipeline generator pipeline(text-generation, modelQwen/Qwen2.5-0.5B-Instruct) result generator(请用一句话解释什么是 Jupyter Notebook。, max_new_tokens100) print(result[0][generated_text])注意这类小模型的效果通常不如商用 API亮点是数据不出本地、不用联网、按自己的算力控制成本和隐私边界。但从工程角度说两种方式的接入层逻辑其实是同一套构造消息、调用模型、解析输出。所以先跑通一种迁移到另一种时只需要改客户端部分。3.4 单次调用跑通后的检查清单看到输出正常不代表万事大吉。我建议每次跑通最小示例后按下面清单过一遍输入是否硬编码了固定的 prompt如果是实验可以但如果要复用最好抽象成参数。密钥是否通过环境变量读取有没有可能被提交到 Git响应结构是否稳定不同模型返回的字段可能不一样。如果 API 调用失败代码是否能明确打印出错误信息还是静默失败当前模型上下文窗口大小是多少如果 prompt 太长会不会截断这一步虽然“无趣”但它是后面所有扩展的基础——如果第一步就埋了雷后面批量调用和上下文管理就会一起爆。4. 从一个聊天窗口变成一个真正好用的 AI 助手4.1 会话上下文管理很多人忽略但最关键直接在 Notebook 里调用 API本质上和网页聊天窗口没有太大区别——单次问答问完即忘。真正的价值在于“连续协作”。这时候就涉及到上下文管理。先看问题现象。很多 AI 编程工具在“新开会话”后就丢失之前的记忆这在搜索热词里也反复出现。原因是每次请求的 messages 只包含当前会话的消息。如果你希望模型“记得”你之前的思路就要主动把历史消息一起传过去。一个最简单的上下文管理方式是用一个列表保存消息messages [ {role: system, content: 你是一个数据分析助手。}, ] def ask(prompt: str) - str: messages.append({role: user, content: prompt}) response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, temperature0.3, ) assistant_reply response.choices[0].message.content messages.append({role: assistant, content: assistant_reply}) return assistant_reply这样每次调用ask()模型都能看到之前所有消息。但这里有个显而易见的隐患上下文会越来越长。一旦超出模型的上下文窗口后面的请求就会报错或被截断。一个稳妥的做法是在发送前检查总 token 数超过阈值时只保留最近的 N 条消息。或者手动控制每个目标任务开始时手动重置messages只保留关键的 system 指令和历史结论。建议把“长对话”和“短问答”区分开。探索一个新问题时开启一个新会话只把上一轮的结论摘要带入。不要盲目地把所有历史都塞给模型。4.2 把代码执行结果反馈给模型上下文管理不只是“保存聊天记录”。对程序员来说最有价值的上下文其实是“代码执行结果”。比如你让模型写一段代码它在 Notebook 里运行后报错了# 执行模型给出的代码 try: exec(code_str) except Exception as e: error_msg f{type(e).__name__}: {e} print(error_msg)然后你把error_msg传给模型repair_prompt f我运行了你给的数据清洗代码报错如下\n{error_msg}\n请帮我修复。 print(ask(repair_prompt))这比手动复制报错再去聊天框里问要顺畅得多因为模型能看到原始代码、错误类型和你的诉求。你可以在这个循环里反复“生成—执行—反馈—修复”直到代码通过。这一步本质上是在搭建一个“代码自动修复回路”也是 Notebook 集成生成式AI 作为 AI 助手最有价值的用法之一。4.3 用 Markdown 单元格沉淀思路很多人把 Jupyter Notebook 当成“能运行的代码草稿纸”却忽略了它还有一个很好的能力支持 Markdown 单元格。当你通过 AI 助手解决完一个问题建议花几十秒写一个简短的 Markdown 单元格记录三件事目标这一段要解决什么问题。结论最终采用的方案是什么。理由为什么不用其他方案。这个过程看似额外花费时间但复利效应很大。两周后你重新打开这个 Notebook一眼就能知道自己当时为什么这样写。它把一个“AI 对话记录”升维成了一份“决策日志”。AI 工具会忘记上下文但你的 Notebook 文件不会。5. 从单次问答到批量任务稳定的工程化做法5.1 单条消息跑通不等于批量使用稳定很多人跑通第一个单元格之后立刻就开始循环一批 prompt然后发现各种问题有的请求超时、有的返回空内容、有的因为触发频率限制被拒绝、有的跑着跑着程序直接中断。这很正常。单条请求失败重发一次通常就能解决。但批量请求需要一套“可重试、可记录、可中断恢复”的框架。否则一旦某个请求失败后面所有的结果都会被污染你分不清哪一条是成功的、哪一条是失败的。5.2 一个更稳的批量调用框架这里给出一个适合在 Notebook 里用的批量请求结构import time from typing import Callable def run_batch(items, call_fn: Callable, max_retries3, wait_seconds2, progress_every10): results [] failures [] for idx, item in enumerate(items): for attempt in range(max_retries): try: result call_fn(item) results.append({input: item, output: result, success: True}) break except Exception as e: failures.append({input: item, attempt: attempt 1, error: str(e)}) time.sleep(wait_seconds) if (idx 1) % progress_every 0: print(f已处理 {idx 1}/{len(items)} ...) return results, failures使用方式prompts [f请用一句话解释 {term} for term in [Jupyter, Notebook, Kernel]] results, failures run_batch(prompts, ask, max_retries2)这个框架解决的核心问题不是“快”而是“可控”。失败项会被记录不会因为一个请求挂了整个任务就断掉。你可以单独对failures里的项目做二次处理。这是长期使用中最关键的工程化习惯。5.3 排查链路从现象到根因如果批量调用仍然异常建议按照这个顺序排查看现象是全部失败、部分失败、还是偶尔失败错误类型是什么看输入prompt 里是不是有特殊的转义字符、编码问题、太长的内容看环境网络是否稳定API 地址或模型名是否在当前版本仍然有效本地模型时显存/内存是否足够看参数temperature、max_tokens是否合适并发数是否超出限制看工具边界模型上下文窗口是否不足以承载你的 messages 列表API 是否因为速率限制而返回 429很多批量任务失败最后定位到的问题不是模型不行而是“同一个 prompt 生成了超长输出把上下文窗口撑爆了”或者是“没有做限速触发 API 限流”。这类问题不是改模型能解决的需要调整调用策略。5.4 保存结果Notebook 文件本身也是数据库批量调用完成后建议把结果直接保存到一个 DataFrame或者直接把结果输出到一个 CSV 文件import pandas as pd df pd.DataFrame(results) df.to_csv(batch_ai_results.csv, indexFalse, encodingutf-8-sig)把中间结果落盘不仅方便复查还能在后续处理中避免重复调用 API节省时间和成本。这一点很多人会忽略——AI 调用结果不像普通函数返回值那样稳定可复现所以有必要做持久化。6. 适用边界与长期使用建议6.1 这个方案真正适合什么场景经过一段时间使用我对“Jupyter Notebook 集成生成式AI”适合的场景有了更具体的判断数据分析探索拿到一份新数据想让 AI 帮你梳理清洗思路、生成统计代码然后在同一个 Notebook 里立刻验证。学习新库PyTorch、Transformers、Pandas 的新 API通过 Notebook 让 AI 生成示例运行、修改、加注释学习效率很高。写一次性脚本批量重命名文件、转换格式、爬取简单网页等让 AI 生成脚本你在 Notebook 里直接测试。教学和演示把 AI 的推理过程、代码示例、运行结果放在同一个文档里比截一堆聊天记录更清晰。在这些场景里Notebook 的“可交互、可执行、可记录”优势会发挥得最明显。6.2 不适合什么场景同时也要说清楚边界。这个方案不适合大型软件工程包管理、单元测试、代码审查、CI/CD 都不是 Notebook 的强项。Notebook 更适合“探索”不适合“交付”。高并发生产 API直接用 Notebook 提供 AI 能力给外部调用既不安全也不稳定。生产环境应该用正式的服务框架。需要严格权限管理的场景Notebook 文件容易被整体拷贝敏感信息难以精细化控制。对延迟敏感的场景Notebook 内部调用大模型 API几百毫秒到几秒的延迟很正常不适合做实时交互。再有如果项目涉及隐私数据你还要额外确认数据是否可以发送到外部 API。如果答案是否定的那就需要走本地模型方案而不能直接用在线 API。6.3 如果要长期使用还需要补哪些能力如果你把这个组合当作长期工作流不是“玩一玩”我建议分阶段补齐这些能力第一阶段跑通闭环。拿到 API 密钥在 Notebook 里完成一次问答。第二阶段做上下文管理。把 messages 列表、重置策略、token 限制处理到位。第三阶段工程化调用。加批量重试、日志、结果落盘。第四阶段治理与安全。密钥走.env敏感数据走本地模型输出结果做人工审核。可以对照一下你现在处于哪个阶段如果还在第一阶段就先去把最小闭环跑通不要急着写几千行的封装类。工具只有在真实流程里用起来才会慢慢长成适合你习惯的样子。最后一个提醒生成式AI 回答无论看起来多合理都要在 Notebook 里实际运行验证。代码能跑的才是真正的答案跑不出来的只是“看起来像是答案”。把 AI 当成一个“随时可以请教的同事”而不是“可以直接信任的权威”这个心态能帮你避免一大半踩坑。