diff --git a/study.md b/study.md new file mode 100644 index 00000000..7e076fc0 --- /dev/null +++ b/study.md @@ -0,0 +1,926 @@ +你可以不从 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 提出的方案,你有没有能力判断它到底是在认真解决问题,还是在胡写。** \ No newline at end of file