你可以不从 0 写代码,现在也没必要要求自己能脱离 AI 手搓一整个项目。 但是你必须知道**什么是好代码,什么是烂代码,AI 写出来的代码大概在干什么,有没有明显问题。** 所以最基础的代码概念和软件开发概念还是要知道。 这部分咱们主要说**大模型应用开发**,暂时不说模型算法。 ### 基础代码概念 什么是变量,什么是字符串、整数、浮点数、布尔值 什么是 list、dict、set、tuple,这些东西分别是干什么的 尤其是 dict 很重要,因为你以后会天天看到类似 JSON 的结构 什么是输入和输出 什么是 if / else 什么是 for / while 循环 什么是函数(非常重要) 什么是 def 什么是参数 什么是返回值 为什么代码要拆成一个个函数,而不是从头写到尾 什么是作用域,为什么一个函数里面定义的变量外面不一定能直接用 什么是 None / null 什么是对象,什么是类 这部分不用深入学面向对象,但是至少看到: `client.xxx.xxx()` 这种代码的时候,要大概知道是什么意思 什么是 import 什么是模块 什么是包 为什么代码可以从别的文件或者第三方库里面导入东西 什么是文件路径 相对路径和绝对路径有什么区别 怎么读取和写入文件 什么是命令行 最基础的 cd、ls、运行 python 文件是什么意思 什么是cli? cmd powershell这些黑窗口是什么? 什么是 pip / npm 为什么很多代码安装一个包以后才能运行 --- ### 错误和调试 什么是报错,程序为什么会报错 怎么看报错信息和 traceback 什么是异常 什么是 try / except / finally 为什么有些代码需要捕获异常 为什么不能为了“程序不报错”就在所有地方乱套 try 为什么 `except: pass` 很危险 什么是调试 什么是 debug 什么是日志 为什么程序不能只靠 print 调试 为什么要保存日志 什么是 debug / info / warning / error 日志 为什么线上程序出问题以后,日志非常重要 --- ### 数据格式 什么是纯文本 什么是 Markdown 格式 什么是 JSON 格式(很重要) 什么是 CSV 格式 什么是 YAML 格式 为什么程序更喜欢: ```json { "name": "小明", "age": 18 } ``` 而不是: ```text 小明今年18岁 ``` 什么叫结构化数据 什么是 JSON Schema 为什么有时候不能只让大模型“随便输出一段文字”,而是要让它按照固定 JSON 格式输出 --- ### Git 什么是 Git(重要) 什么是 Git 仓库 什么是 commit 什么是 push 什么是 pull 什么是 diff 什么是 branch 什么是 merge 什么是 .gitignore 什么是 revert / rollback 你可以不完全会自己敲 Git 命令,但是这些东西最基础的意思一定要知道。 以后完全可以让 AI 帮你操作 Git,但是: **你必须知道 AI 到底改了什么,以及出问题以后怎么退回去。** 现在 AI 一次可能帮你改十几个文件,不懂 Git 的话其实挺危险的。 --- ### 项目和运行环境 什么是依赖 为什么别人电脑能运行的项目,你电脑上不一定能直接运行 什么是虚拟环境 为什么不同项目最好使用不同的虚拟环境 什么是环境变量 为什么 API Key、数据库密码这些东西不能直接写死在代码里面 什么是 `.env` 为什么 `.env` 一般不能提交到 Git 什么是 requirements.txt / pyproject.toml / package.json 什么是配置文件 为什么配置和代码最好分开 --- ### 前端和后端 什么是前端 什么是后端 浏览器里面运行的代码和服务器里面运行的代码有什么区别 为什么 API Key 不能直接放在前端 JS 里面 一个网页点击“发送”以后,到底发生了什么: ```text 用户点击按钮 ↓ 前端 JavaScript ↓ HTTP 请求 ↓ 你的后端 ↓ 大模型 API ↓ 模型返回结果 ↓ 你的后端 ↓ 前端 ↓ 显示在网页上 ``` 这整个流程一定要搞明白。 --- ### Web 基础 什么是 HTTP 什么是 HTTPS 什么是 Request 什么是 Response 什么是 GET / POST 什么是状态码 200、400、401、403、404、429、500 大概是什么意思 什么是 REST API 什么是 WebSocket 什么是 SSE 为什么 ChatGPT 可以一个字一个字地输出,而不是等答案全部生成完才显示 --- ### 数据存储 为什么不能什么东西都往 JSON 文件里面存 什么时候适合用 JSON 文件 什么时候应该使用数据库 什么是 SQLite 什么是数据库里的表、行、列 什么是主键 最基础的 SELECT / INSERT / UPDATE / DELETE 是什么意思 为什么聊天记录这种东西用 SQLite 通常比一个 messages.json 更合适 但是也不是“SQLite 永远比 JSON 高级”,比如 config.json 拿来保存配置就完全没问题 以后再知道 PostgreSQL 这些正式数据库是干什么的 --- ### 同步、异步和并发 先知道普通程序为什么一般是从上往下一行一行执行 为什么请求一个 API 的时候程序可能会在那里等几秒 什么是同步 什么是异步 什么是 async / await 什么是并发 为什么同时处理 20 个模型请求,不一定需要一个处理完再处理下一个 什么是竞态条件(race condition) 为什么多个任务同时修改同一个数据的时候可能出问题 这些不用一开始研究得特别深,但是做稍微复杂一点的项目以后一定会碰到。 --- ### 前端技术 为什么最基础的网页可以只用 HTML CSS 是干什么的 JavaScript 是干什么的 为什么通常会把 HTML / CSS / JS 分开 什么时候原生 HTML / CSS / JS 已经够用了 为什么项目复杂以后会使用 Vue / React 什么是组件 什么是状态 为什么 UI 复杂以后,Vue / React 会比手写一大堆 DOM 操作方便 不是说 Vue / React 一定比原生 JS “高级”,而是它们解决复杂前端项目的组织问题。 --- # 然后开始大模型部分 ### 什么是 API 调用 什么叫 API 为什么你写程序可以调用 OpenAI、Claude、Gemini 这些模型 API Key 是干什么的 Request 里面一般会发送什么 Response 里面一般会返回什么 为什么 API 请求可能失败 什么是 timeout 什么是 retry 什么是 rate limit 什么是 429 为什么不能无限并发请求模型 模型 API 为什么要花钱 输入和输出为什么都会产生费用 --- ### Message 和 Role 什么是 message 什么是 role 什么是 user 什么是 assistant 什么是 system 什么是 developer 什么是 tool 这些 role 分别是干什么的 为什么不同位置的指令优先级可能不一样 注意这些 role 并不是所有厂商的 API 都完全一样,要结合具体模型 API 看。 --- ### Prompt 什么是 prompt 什么是 system prompt system prompt 和用户输入有什么区别 怎么写一个比较好的 system prompt 为什么不要把所有要求全部堆成一大坨文字 为什么最好把: 身份 任务 规则 输出格式 边界条件 写清楚 为什么 prompt 不是越长越好 --- ### Token 和上下文 什么是 token 为什么字符数不等于 token 数 什么是上下文窗口(context window) 什么叫最大上下文 什么叫最大输出长度 为什么: ```text System Prompt + 聊天记录 + 用户当前消息 + RAG 搜索到的资料 + Tool 返回结果 ``` 全部都会占上下文 为什么聊天越来越长以后,不能把所有历史记录永远全部塞给模型 为什么需要上下文压缩 --- ### 模型生成参数 为什么同一个问题问模型两次,答案不一定完全一样 什么是 temperature 什么是 top_p 什么时候希望模型输出更加稳定 什么时候可以让模型更加随机 这部分不需要研究背后的数学公式,知道它们会影响模型生成方式就可以。 --- ### Streaming 什么是流式输出 为什么 ChatGPT 是一边生成一边显示 为什么模型 API 不一定要等完整答案生成完再返回 Streaming 和普通 API 请求有什么区别 Streaming 会怎么影响前端和后端代码 --- ### Structured Output 什么是 Structured Output 为什么做程序的时候: ```text 这个人的名字叫小明,他18岁 ``` 通常没有: ```json { "name": "小明", "age": 18 } ``` 好处理 为什么要让模型按照 Schema 输出 为什么即使是大模型生成的 JSON,也应该进行验证 为什么永远不能默认“大模型输出的一定是合法数据” --- ### Tool Calling 什么是 Tool 为什么模型本身不能真的替你查数据库、发 HTTP 请求、读硬盘 什么叫 Tool Calling / Function Calling 大模型是怎么决定调用 Tool 的 最重要的是理解: ```text 用户 ↓ 大模型判断需要工具 ↓ 大模型输出: 我要调用 get_weather(city="上海") ↓ 你的代码真正执行 get_weather ↓ 把结果返回给模型 ↓ 模型根据工具结果回答用户 ``` 也就是说: **很多时候不是模型自己执行了工具,而是模型告诉你的程序它想调用什么工具,你的程序负责真正执行。** 这一点理解以后,Agent 就没那么神秘了。 --- ### 多模态模型 什么是纯文本模型 什么是多模态模型 什么是文本输入 什么是图片输入 什么是音频输入 什么是视频输入 什么是模型的文本输出 / 图片输出 / 音频输出 不同模型分别支持哪些输入输出形式 --- # 再往后就是现代大模型应用最常碰到的东西 ### Embedding 什么是 Embedding 为什么一句话可以变成一堆数字 为什么可以用这些数字判断两段文字语义上像不像 不需要先学背后的向量算法。 先知道: ```text 文本 ↓ Embedding ↓ 向量 ↓ 计算相似度 ↓ 找到语义相近的内容 ``` 就可以了。 --- ### RAG 什么是 RAG 为什么大模型不知道你自己的私人文档 怎么先搜索相关资料,再把资料给模型 基本流程: ```text 用户提问 ↓ 搜索相关内容 ↓ 找到最相关的几段资料 ↓ 把资料放进上下文 ↓ 让模型根据资料回答 ``` 一定要理解: **RAG 不是让模型“学会了”这些资料。** 只是每次问问题的时候,临时找出相关资料给模型看。 --- ### 向量数据库 什么是 Vector Database 为什么普通数据库适合查: ```text user_id = 123 ``` 但是向量搜索适合查: ```text 找和“猫为什么喜欢纸箱”意思最接近的文章 ``` 向量数据库和 SQLite / PostgreSQL 不是完全一种用途。 --- ### Memory 什么是聊天记录 什么是上下文 什么是长期记忆 什么是用户 Profile 这几个一定不要混起来。 比如: ```text 数据库: 保存所有聊天记录 上下文: 这一次真正发送给模型看的内容 短期记忆: 最近聊天的重要信息 长期记忆: 以前聊天里面值得以后继续记住的信息 Profile: 用户名、偏好、角色设定这些相对稳定的信息 ``` 模型自己并不会天然记得你几个月以前聊过什么。 所谓“大模型记忆”通常都是你的应用程序帮模型实现的。 --- ### 上下文压缩 为什么不能永远把 5000 条历史消息全塞给模型 什么叫滑动窗口 什么叫摘要 什么叫对话压缩 哪些信息应该保留 哪些信息可以丢掉 为什么摘要本身也可能损失信息 什么是上下文缓存? 为什么发给api请求时,之前的内容不能变? 为什么这样能极大程度的省钱? --- ### Agent 什么是 Agent 最简单理解: ```text 用户给一个目标 ↓ 模型思考下一步做什么 ↓ 选择 Tool ↓ 执行 Tool ↓ 查看结果 ↓ 决定下一步 ↓ 继续 ↓ 直到完成任务 ``` 先理解这个循环。 不要一开始就直接学 LangChain、LangGraph 这些框架。 最好先自己写一个最简单的 Tool Calling Loop,知道 Agent 到底在干什么以后,再去用框架。 不然很容易变成会调框架,但是不知道里面发生了什么。 --- ### 大模型应用安全 什么是 Prompt Injection 为什么用户可能故意给模型输入恶意指令 什么是 Indirect Prompt Injection 为什么模型从网页、文档、邮件里面读到的文字也不能完全信任 为什么: ```text 用户输入 网页内容 文件内容 Tool 返回内容 模型输出 ``` 全部都应该当成“不可信数据” 为什么 Tool 要限制权限 为什么不能给一个 Agent 一个“可以随便删数据库”的 Tool,然后完全相信模型不会乱调用 为什么重要操作要有权限控制和二次确认 --- # 最后再慢慢接触“生产级代码” 什么叫 Demo 什么叫“我电脑上能跑” 什么叫生产环境 什么叫生产级代码 为什么代码不能永远全部写在一个文件里面 为什么要把: ```text 路由 数据库 模型调用 配置 工具 业务逻辑 前端 ``` 慢慢拆开 为什么配置和代码要分开 为什么 API Key 不能硬编码 为什么请求要有 timeout 为什么失败以后有时候要 retry 为什么 retry 也不能无限 retry 为什么要处理 rate limit 为什么需要日志 为什么需要测试 什么是单元测试 为什么修改一个功能以后,要确认没有把其他功能搞坏 什么是缓存 为什么有些模型结果或者数据库结果没必要重复计算 什么是 Docker 为什么“我电脑上能运行”不代表服务器也能运行 什么是部署 什么是域名 什么是服务器 什么是监控 程序上线以后怎么知道它挂了 怎么知道模型 API 报错了 怎么知道用户请求变慢了 怎么知道一天烧了多少钱的 Token --- 然后不要想着: **“我要把这些东西全部学完以后,才能开始写项目。”** 不是这样的。 应该是一边写,一边遇到问题,一边学。 第一个项目可以直接写: **一个支持多轮对话、对话记录存储、上下文自动压缩、角色人设自定义卡片的角色扮演聊天网页应用。** 第一版甚至可以特别垃圾: ```text 一个输入框 + 一个发送按钮 + 调用一次模型 API ``` 然后一点一点加东西。 加多轮聊天 → 学 message / role / context 加聊天记录保存 → 学 SQLite 加角色卡 → 学 system prompt 加逐字输出 → 学 Streaming 聊天太长开始失忆 → 学 token / context window / 上下文压缩 角色记住以前发生过的事情 → 学 Memory 角色从几百篇设定资料里面找相关内容 → 学 Embedding / RAG 角色可以查天气 → 学 Tool Calling 角色可以自己决定查什么东西 → 学 Agent 多人同时用 → 学 async / 并发 / 竞态条件 模型偶尔请求失败 → 学 timeout / retry / rate limit 想给朋友真正用 → 学部署 / Docker / 日志 / 安全 所以整个学习过程最好不是: ```text 学完 Python ↓ 学完前端 ↓ 学完后端 ↓ 学完数据库 ↓ 学完大模型 ↓ 终于开始做项目 ``` 而是: ```text 学一点 ↓ 写一点 ↓ 遇到问题 ↓ 再学一点 ↓ 把问题解决 ↓ 继续加功能 ``` 尤其现在有 AI 帮你写代码以后,**会不会背语法已经不是最重要的了。** 真正重要的是: **你知不知道自己在做什么。** **AI 给你的东西你看不看得懂大概结构。** **出了问题你知不知道应该往哪查。** **AI 提出的方案,你有没有能力判断它到底是在认真解决问题,还是在胡写。**