从单语言到双语切换:一个 AI Native 开发者的 Python 与工具链觉醒
前八篇,我走了一条完整的弧线。
OPC(认知)→ Prompt(沟通)→ Agent(工具)→ CLI(工作流)→ Git(版本)→ 模块化(架构)→ FDE(业务)→ 数组去重(基本功)。八个方向,八个维度,每一篇都在补充 AI Native 开发者的一块拼图。
v008 往下沉到了代码基本功——一道数组去重题翻了六遍,发现每一层抽象背后都是同一种思维:更精准地描述意图。
今天,第九天,我继续往下扎。但路径不一样了。
今天的学习不是线性的,而是一个循环:从 Agent 工程认知出发 → 学 Python 基础 → 调 LLM API → 优化 Prompt → 回到更深的 Agent 认知。一圈下来,"Agent"这个词在我脑子里的含义,和早上刚坐到电脑前时完全不同了。
更重要的是,今天我发现了一件事:在 AI Native 的路上,"用什么语言学"和"在哪学",比"学什么"更先决。
这篇博客聊三个东西:① 怎么找到好的学习平台和资源 ② NoteBook 如何加速学习循环 ③ Python 和 JS 的深层对比。比前八篇更长,也更深。
一、学习资源从哪来:Model Scope 与平台化学习
想学 Agent 工程,第一步去哪?
v001 的答案是"打开 Claude Code,开始写 Prompt"。那是因为当时的目标是"用 AI 做产品"——工具就是 Claude Code,直接上手就行。
但今天的目标变了。我想理解 Agent 的底层——LLM API 是怎么调用的、Prompt 在代码层面长什么样、Python 生态和 AI 生态的关系是什么。这时候,打开 IDE 直接写代码不是最优路径。你得先找到一个能让你快速试错的平台。
我找到的是 Model Scope(魔搭)。
Model Scope 是中国的 Hugging Face。Hugging Face 是全球最大的开源 AI 社区,拥有数十万预训练模型和海量数据集。Model Scope 做了类似的事,但有两个差异化:一是数据服务——直接提供训练数据和评测数据集;二是 NoteBook 环境——浏览器里写 Python,立刻运行,不需要配任何环境。
这个"不需要配环境"五个字,比你想象的重要得多。
传统的学习链条是这样的:看文档 → 打开编辑器 → 配 Python 环境 → 装依赖 → 写代码 → 跑代码。链条有六步,任何一步卡住,学习就中断了。尤其是"配环境"这一步——Python 版本冲突、pip 源不通、虚拟环境搞混——对初学者来说,这是最大的劝退点。
平台化学习把链条缩短到了三步:打开 NoteBook → 写代码 → 看到结果。
这让我想起 v004 聊 CLI 工作流时的感受。CLI 缩短了"想法→执行"的路径——从打开 VS Code、找文件、点运行,变成一行命令直接出结果。NoteBook 做的是同样的事,但更激进:它缩短的是"想法→验证"的路径。你有一个关于 Python 切片的疑问,写三行代码,按 Shift+Enter,答案就出来了。
v001 说一人公司的第一步不是写代码,而是找到正确的工具和资源。今天补上后半句:找到正确的学习平台,比打开编辑器更先决。
二、NoteBook:缩短学习循环的利器
NoteBook 到底是什么?
一句话:在浏览器里写 Python,按一个键,立刻看到结果。
但它不是 REPL。REPL 是一行一行执行的,写完一行看结果,再写下一行。NoteBook 是 单元格(Cell) 式的——你可以在一个单元格里写十行代码,一起执行;也可以把一个大问题拆成五个单元格,逐个执行,每个单元格的输出都保留在那里,随时可以回头看。
这种模式特别适合三种场景:NLP 实验、算法验证、语言学习。三者的共同点是——你需要不断地"写一小段 → 看结果 → 调整 → 再写一小段"。
我把 NoteBook 和之前用过的工具链做了个对比:
- Claude Code(v003):写 Prompt → Agent 执行 → 看结果。这是项目级循环——你给一个完整的任务描述,AI 帮你做完,你看最终结果。
- CLI 工作流(v004):命令 → 输出 → 下一步。这是命令级循环——每一步都是一个独立的命令,执行完看输出,决定下一步。
- NoteBook:代码片段 → 输出 → 下一个代码片段。这是单元级循环——粒度最细,反馈最快。
三种循环不是替代关系,而是嵌套关系。NoteBook 适合学习和验证,CLI 适合操作和部署,Claude Code 适合项目级的生成和修改。AI Native 开发者需要的不是一个编辑器,而是一套能在不同粒度上缩短反馈循环的工具链。
NoteBook 在学习阶段的价值,就是一句话:降低一切非学习本身的成本。 你不需要花时间配环境,不需要花时间找文件路径,不需要花时间处理"代码写对了但跑不起来"的环境问题。你所有的注意力,都在代码本身。
这就是"最小阻力路径"。
三、Python vs JavaScript:不是替代,是互补
"人生苦短,我用 Python。"
这句话在编程圈流传了很多年。以前我觉得这只是一种语言偏好的表达,今天学完 Python 基础之后,我开始理解这句话背后真正的逻辑:Python 把"表达意图"的成本压到了最低。
先说 JavaScript 的领地,不能否定。
v003 的落地页、v006 的全栈项目——前端交互、幻灯片、滚动加载、用户体验——这些全是 JS 的主场。Web 前端是 JavaScript 的护城河,没有任何语言能在这个领域替代它。浏览器只认 JS(WebAssembly 先不算),你在浏览器里做的所有交互,最终都是 JS 在驱动。
但出了浏览器,JS 就开始吃力了。
数学计算?JS 的浮点数精度问题、没有原生的矩阵运算、缺少科学计算库——做数据处理和数值分析时,JS 的体验可以用"痛苦"来形容。NLP?JS 社区在这方面几乎是空白。爬虫?Node.js 能做,但生态远不如 Python 的 Scrapy 和 BeautifulSoup。AI?所有主流框架——PyTorch、TensorFlow、Transformers——Python 是第一公民,JS 是后来者。
再看 Python 的优势。
没有花括号、没有分号、缩进就是语法。这不只是"代码好看"的问题——它降低了认知负荷。你写 Python 的时候,脑子里不需要同时处理"这个括号配对了吗""这个分号漏了吗""这个 var 还是 let"这些问题。你的注意力全在逻辑上。
List 的灵活性也是 JS 数组比不了的。v008 聊了六种数组去重解法,每一种都在和 JS 的类型系统做斗争——obj[key] 的隐式类型转换、=== 的严格比较、splice 的副作用。Python 的 list 没有这些包袱:放任意类型的数据、无需声明容量、切片语法一步到位。
但 Python 的灵活性也有代价。没有类型约束意味着运行时错误更多,大型项目的可维护性不如 TypeScript。这就是为什么 v006 聊模块化时我说"每一个设计决定都有代价"——Python 选择了灵活性,牺牲了类型安全;TypeScript 选择了类型安全,增加了语法开销。
核心观点:不是"哪个更好",而是"在什么场景用什么语言。"
做产品(前端交互、用户体验)→ JavaScript。 做 AI 工程(模型调用、数据处理、NLP、爬虫)→ Python。 AI Native 开发者 = 双语能力。
这和 v001 OPC 的"一人分饰七角"是一回事——不同角色用不同工具。也和 v007 FDE 的判断力一致——FDE 需要根据业务场景选择技术栈,语言选择本身就是一种工程判断。
四、Python 基础:从 JS 开发者视角看
这不是 Python 教程。这是一个 JS 开发者学 Python 时的思维转换笔记。
List vs Array
Python 没有内置的"数组"。它有的是 list——一个灵活有序的容器,可以放任意类型的数据,无需提前指定容量,随时增删改查。
L = ['高', 500, '张', '赖', '江', '朱']
JS 开发者的第一反应:"这不是数组吗?"
不完全是。JS 的 Array 有固定的方法集(push、pop、map、filter……),类型相对统一。Python 的 list 更像一个万能容器——字符串、数字、甚至函数,都可以往里放。你在 JS 里写 arr.push(item),在 Python 里写 L.append(item),表面一样,但底层的类型约束完全不同。
For 循环和 range()
r = []
n = 3
for i in range(n):
r.append(L[i])
对比 JS:
const r = []
for (let i = 0; i < n; i++) {
r.push(arr[i])
}
Python 不需要 let、不需要花括号、不需要分号。range(n) 生成 0 到 n-1 的整数序列——和 JS 的循环逻辑完全一样,但语法成本低了一半。
初学者可能会问:"Python 不需要声明变量类型吗?"不需要。r = [] 就是声明一个空 list,不需要 const,不需要类型注解。这是 Python 的哲学:信任程序员,少写废话。
切片(Slice):Python 最让 JS 开发者惊喜的特性
L[:3] # ['高强', 500, '张训图']
L[-2:] # ['江祖豪', '朱凡杰']
P = list(range(100))
P[:10:2] # [0, 2, 4, 6, 8] —— 前10个中每两个取一个
P[::5] # [0, 5, 10, 15, ...] —— 每五个取一个
'ABCDEFG'[::2] # 'ACEG' —— 字符串也能切片
负索引、省略边界、步长切片——这三样东西在 JS 里都需要写循环才能实现。Python 用 [start:end:step] 三个参数一步到位。
v008 的数组去重六种解法里,排序+相邻比较那一种(第三层),在 Python 里用切片可以写得更简洁。这不是"语法糖"的问题——切片是一种数据访问的抽象,它让你用"描述"而不是"遍历"来表达你要什么。
trim 函数:一个 bug 的教学价值
def trim(s):
start = 0
end = len(s) - 1
while start < len(s) and s[start] == " ":
start += 1
while end >= start and s[end] == " ":
end -= 1
return s[start : end]
trim(" hello world ") # 'hello worl'
输出 'hello worl'——少了最后一个字符 d。
Bug 在哪?Python 的切片是左闭右开的:s[start:end] 取的是 s[start] 到 s[end-1]。end 指向的是最后一个非空格字符的位置,但切片不包含 end 位置的元素。修复方法:return s[start : end + 1]。
这个 bug 特别有意思。JS 的 substring(start, end) 也是左闭右开——理论上应该不会犯这种错。但写 Python 的时候,思维切换还不够彻底,把"指针位置"和"切片边界"搞混了。
v008 说调试能力是编程基本功的一部分。今天给这句话加了一个注脚:不同语言之间的思维切换本身,就是一种需要调试的能力。
五、LLM API 调用:从 Python 到 AI 的最短路径
为什么几乎所有 LLM API 教程都是 Python 写的?
答案很简单:OpenAI SDK 的 Python 版本是业界标杆。 2022 年底 ChatGPT 发布以来,OpenAI 的 Python SDK 就成了事实上的行业标准。DeepSeek、智谱、百川——国内几乎所有大模型厂商都兼容 OpenAI API 规范。你只需要改 base_url 和 api_key,就能用同一套代码调用不同的模型。
这就是 Python 生态和 AI 生态的天然绑定。不是因为 Python 语言本身多优秀,而是因为历史选择了它。就像 JavaScript 之于 Web 前端,Python 之于 AI 工程,已经是既定事实。
标准调用流程三步走:
# 第一步:pip install openai
from openai import OpenAI
# 第二步:实例化 client
client = OpenAI(
api_key="sk-your-api-key-here",
base_url="https://api.deepseek.com/v1"
)
# 第三步:调用
prompt = """
Consideration product : 工厂现货PVC充气青蛙夜市地摊热卖充气玩具发光蛙儿童水上玩具。
1. Compose human readable product title used on Amazon in english within 20 words
2. Write 5 selling points for the products in Amazon
3. Evaluate a price range for this product in U.S.
Output the result in json format with three properties called title,
selling_points and price_range.
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
输出:
{
"title": "Glow in Dark PVC Inflatable Frog Toy for Kids, Night Market & Water Play",
"selling_points": [
"Glow-in-the-dark design enhances nighttime play visibility",
"Made from durable PVC material, safe for water and land use",
"Lightweight and easy to inflate",
"Bright colors stimulate children's imagination",
"Great for party favors and carnival prizes"
],
"price_range": "$4.99 – $9.99 per piece"
}
三步。不需要 HTTP 请求库,不需要手动拼 JSON,不需要处理响应解析。pip install openai → 实例化 → 调用。Python 的简洁在这里体现得淋漓尽致。
这让我重新理解了 v002 和 v003 讲的东西。
v002 的 Prompt 是给 Claude Code 看的——自然语言指令,描述一个完整项目的需求。v009 的 Prompt 是给 DeepSeek API 看的——结构化指令 + 输出格式约束,描述一个精确任务。粒度不同,但本质相同:清晰的意图 + 约束的输出 = 可靠的结果。
v003 说 Agent 是"AI 帮你干活的工具"。今天我看到了 Agent 的发动机:client.chat.completions.create() 就是 Agent 的一个齿轮。 Claude Code 做的事,拆到底层,就是多轮 API 调用 + 文件操作 + 命令执行的编排。理解了 API 调用,就理解了 Agent 的"发动机"长什么样。
六、Prompt 高级设计模式:从 API 调用到结果控制
调用 API 是第一步。调用 API 并得到你想要的格式的结果,是另一回事。
今天的 Prompt 用了三个设计原则:
原则一:详细且准确的指令。
不是"帮我写个产品标题",而是"在 20 个词以内,写一个适合 Amazon 的英文产品标题"。前者的结果可能是任何长度、任何语言、任何风格的标题。后者的结果是精确可控的。
原则二:一步步引导 LLM 工作。
Prompt 里用了编号指令——1、2、3,每一步一个明确任务。这不是为了好看,而是在引导 LLM 的思维链。编号指令让模型按顺序处理,减少遗漏和混淆。
原则三:约束输出格式。
最后一句——"Output the result in json format with three properties called title, selling_points and price_range"——是整个 Prompt 最关键的一句。它约束了输出的结构,让结果可以直接被程序处理。
{
"title": "...",
"selling_points": [...],
"price_range": "..."
}
下游代码可以直接 JSON.parse() 这个结果,提取字段,写入数据库,传给前端渲染。如果 Prompt 不约束格式,输出可能是自然语言段落,你还得再写一层解析逻辑。
这就是我说的"输出工程"——Prompt 不只是"说话的艺术",更是"输出流水线的起点"。
v002 的五块分割法(Goal / Input / Output / Layout / Features)是面向项目的 Prompt 设计——给 Claude Code 一个完整项目的指令。今天的 Prompt 是面向函数的——给 LLM 一个精确任务的指令。粒度更细,控制更精确。
v007 聊 FDE 的时候说,FDE 搭建 Agent 工作流,每一个节点的 prompt 都需要精确设计。今天看到了这种"精确设计"在代码层面的样子:编号指令、格式约束、字段命名——每一个细节都影响着下游流程的可靠性。
v008 说"能跑"和"好用"之间隔着整个工程化思维。Prompt 也一样——"能生成文本"和"能生成可处理的结构化数据",差的不是一句话,是一整套设计思路。
七、循环学习法:Agent → Python → API → Agent
回到引言里提到的"循环"。
今天的学习路径是这样的:
Agent 认知(为什么要学 Python)→ Python 基础(语言能力)→ LLM API 调用(工具能力)→ Prompt 优化(表达能力)→ 更深的 Agent 认知
每一圈循环,同样的概念都被重新定义。
"Agent" 在 v003 是"Claude Code 帮我搭落地页"——一种工具,一种黑箱。你给指令,它给结果,中间发生了什么,你不清楚。
"Agent" 在 v009 是"多轮 client.chat.completions.create() 调用 + 工具编排 + 上下文管理"——你知道了发动机长什么样,你知道了每一层 API 调用的成本,你知道了 Prompt 的质量如何影响每一轮输出。
同一个词,认知深度完全不同。
这就是螺旋式学习。
v008 结语说:"向上抽象和向下扎根,是同一棵树的两个生长方向。" 今天加一层:每一圈螺旋,都让你同时向上和向下。 学 Python 基础是"向下",但理解了 Python 就能调 API 是"向上"。调 API 是"向下",但理解了 API 就能设计更好的 Agent 是"向上"。向下和向上不是两条路,是同一条路的两个方向。
NoteBook 在这种交叉学习中扮演了关键角色。你不需要"学完 Python 再学 API"——在 NoteBook 里,写一行 Python、调一次 API、看一个结果、学一个概念,所有事情可以在同一个环境里同步进行。工具链决定了学习效率,NoteBook 让螺旋式学习成为可能。
结语
今天学到的不只是 Python 语法或 API 调用。是三件事:
第一,找到对的学习平台。 Model Scope 的 NoteBook 环境让我跳过了"配环境"的泥潭,直接进入"写代码→看结果"的正循环。
第二,用 NoteBook 缩短反馈循环。 从项目级(Claude Code)到命令级(CLI)到单元级(NoteBook),不同粒度的工具解决不同粒度的问题。
第三,在 JS 和 Python 之间做有意识的切换。 做产品用 JS,做 AI 工程用 Python。不是二选一,是双语能力。
回顾九篇文章的完整路径:
- v001-v004:AI 工具链(OPC → Prompt → Agent → CLI)
- v005-v006:工程基本功(Git → 模块化)
- v007:业务视角(FDE)
- v008-v009:编程基本功 + 语言扩展(数组去重 → Python + API)
两条线交替推进:一条向上——抽象、业务、架构;一条向下——基础、语言、工具。它们不是矛盾的,是同一棵树的两个生长方向。
FDE 的未来需要双语能力:JS 做产品,Python 做 AI 工程。AI Native 开发者的下一步,不是选语言,而是建工具链。
下篇见。