15 KiB
你可以不从 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 格式
为什么程序更喜欢:
{
"name": "小明",
"age": 18
}
而不是:
小明今年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 里面
一个网页点击“发送”以后,到底发生了什么:
用户点击按钮
↓
前端 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)
什么叫最大上下文
什么叫最大输出长度
为什么:
System Prompt
+
聊天记录
+
用户当前消息
+
RAG 搜索到的资料
+
Tool 返回结果
全部都会占上下文
为什么聊天越来越长以后,不能把所有历史记录永远全部塞给模型
为什么需要上下文压缩
模型生成参数
为什么同一个问题问模型两次,答案不一定完全一样
什么是 temperature
什么是 top_p
什么时候希望模型输出更加稳定
什么时候可以让模型更加随机
这部分不需要研究背后的数学公式,知道它们会影响模型生成方式就可以。
Streaming
什么是流式输出
为什么 ChatGPT 是一边生成一边显示
为什么模型 API 不一定要等完整答案生成完再返回
Streaming 和普通 API 请求有什么区别
Streaming 会怎么影响前端和后端代码
Structured Output
什么是 Structured Output
为什么做程序的时候:
这个人的名字叫小明,他18岁
通常没有:
{
"name": "小明",
"age": 18
}
好处理
为什么要让模型按照 Schema 输出
为什么即使是大模型生成的 JSON,也应该进行验证
为什么永远不能默认“大模型输出的一定是合法数据”
Tool Calling
什么是 Tool
为什么模型本身不能真的替你查数据库、发 HTTP 请求、读硬盘
什么叫 Tool Calling / Function Calling
大模型是怎么决定调用 Tool 的
最重要的是理解:
用户
↓
大模型判断需要工具
↓
大模型输出:
我要调用 get_weather(city="上海")
↓
你的代码真正执行 get_weather
↓
把结果返回给模型
↓
模型根据工具结果回答用户
也就是说:
很多时候不是模型自己执行了工具,而是模型告诉你的程序它想调用什么工具,你的程序负责真正执行。
这一点理解以后,Agent 就没那么神秘了。
多模态模型
什么是纯文本模型
什么是多模态模型
什么是文本输入
什么是图片输入
什么是音频输入
什么是视频输入
什么是模型的文本输出 / 图片输出 / 音频输出
不同模型分别支持哪些输入输出形式
再往后就是现代大模型应用最常碰到的东西
Embedding
什么是 Embedding
为什么一句话可以变成一堆数字
为什么可以用这些数字判断两段文字语义上像不像
不需要先学背后的向量算法。
先知道:
文本
↓
Embedding
↓
向量
↓
计算相似度
↓
找到语义相近的内容
就可以了。
RAG
什么是 RAG
为什么大模型不知道你自己的私人文档
怎么先搜索相关资料,再把资料给模型
基本流程:
用户提问
↓
搜索相关内容
↓
找到最相关的几段资料
↓
把资料放进上下文
↓
让模型根据资料回答
一定要理解:
RAG 不是让模型“学会了”这些资料。
只是每次问问题的时候,临时找出相关资料给模型看。
向量数据库
什么是 Vector Database
为什么普通数据库适合查:
user_id = 123
但是向量搜索适合查:
找和“猫为什么喜欢纸箱”意思最接近的文章
向量数据库和 SQLite / PostgreSQL 不是完全一种用途。
Memory
什么是聊天记录
什么是上下文
什么是长期记忆
什么是用户 Profile
这几个一定不要混起来。
比如:
数据库:
保存所有聊天记录
上下文:
这一次真正发送给模型看的内容
短期记忆:
最近聊天的重要信息
长期记忆:
以前聊天里面值得以后继续记住的信息
Profile:
用户名、偏好、角色设定这些相对稳定的信息
模型自己并不会天然记得你几个月以前聊过什么。
所谓“大模型记忆”通常都是你的应用程序帮模型实现的。
上下文压缩
为什么不能永远把 5000 条历史消息全塞给模型
什么叫滑动窗口
什么叫摘要
什么叫对话压缩
哪些信息应该保留
哪些信息可以丢掉
为什么摘要本身也可能损失信息
什么是上下文缓存? 为什么发给api请求时,之前的内容不能变? 为什么这样能极大程度的省钱?
Agent
什么是 Agent
最简单理解:
用户给一个目标
↓
模型思考下一步做什么
↓
选择 Tool
↓
执行 Tool
↓
查看结果
↓
决定下一步
↓
继续
↓
直到完成任务
先理解这个循环。
不要一开始就直接学 LangChain、LangGraph 这些框架。
最好先自己写一个最简单的 Tool Calling Loop,知道 Agent 到底在干什么以后,再去用框架。
不然很容易变成会调框架,但是不知道里面发生了什么。
大模型应用安全
什么是 Prompt Injection
为什么用户可能故意给模型输入恶意指令
什么是 Indirect Prompt Injection
为什么模型从网页、文档、邮件里面读到的文字也不能完全信任
为什么:
用户输入
网页内容
文件内容
Tool 返回内容
模型输出
全部都应该当成“不可信数据”
为什么 Tool 要限制权限
为什么不能给一个 Agent 一个“可以随便删数据库”的 Tool,然后完全相信模型不会乱调用
为什么重要操作要有权限控制和二次确认
最后再慢慢接触“生产级代码”
什么叫 Demo
什么叫“我电脑上能跑”
什么叫生产环境
什么叫生产级代码
为什么代码不能永远全部写在一个文件里面
为什么要把:
路由
数据库
模型调用
配置
工具
业务逻辑
前端
慢慢拆开
为什么配置和代码要分开
为什么 API Key 不能硬编码
为什么请求要有 timeout
为什么失败以后有时候要 retry
为什么 retry 也不能无限 retry
为什么要处理 rate limit
为什么需要日志
为什么需要测试
什么是单元测试
为什么修改一个功能以后,要确认没有把其他功能搞坏
什么是缓存
为什么有些模型结果或者数据库结果没必要重复计算
什么是 Docker
为什么“我电脑上能运行”不代表服务器也能运行
什么是部署
什么是域名
什么是服务器
什么是监控
程序上线以后怎么知道它挂了
怎么知道模型 API 报错了
怎么知道用户请求变慢了
怎么知道一天烧了多少钱的 Token
然后不要想着:
“我要把这些东西全部学完以后,才能开始写项目。”
不是这样的。
应该是一边写,一边遇到问题,一边学。
第一个项目可以直接写:
一个支持多轮对话、对话记录存储、上下文自动压缩、角色人设自定义卡片的角色扮演聊天网页应用。
第一版甚至可以特别垃圾:
一个输入框
+
一个发送按钮
+
调用一次模型 API
然后一点一点加东西。
加多轮聊天 → 学 message / role / context
加聊天记录保存 → 学 SQLite
加角色卡 → 学 system prompt
加逐字输出 → 学 Streaming
聊天太长开始失忆 → 学 token / context window / 上下文压缩
角色记住以前发生过的事情 → 学 Memory
角色从几百篇设定资料里面找相关内容 → 学 Embedding / RAG
角色可以查天气 → 学 Tool Calling
角色可以自己决定查什么东西 → 学 Agent
多人同时用 → 学 async / 并发 / 竞态条件
模型偶尔请求失败 → 学 timeout / retry / rate limit
想给朋友真正用 → 学部署 / Docker / 日志 / 安全
所以整个学习过程最好不是:
学完 Python
↓
学完前端
↓
学完后端
↓
学完数据库
↓
学完大模型
↓
终于开始做项目
而是:
学一点
↓
写一点
↓
遇到问题
↓
再学一点
↓
把问题解决
↓
继续加功能
尤其现在有 AI 帮你写代码以后,会不会背语法已经不是最重要的了。
真正重要的是:
你知不知道自己在做什么。
AI 给你的东西你看不看得懂大概结构。
出了问题你知不知道应该往哪查。
AI 提出的方案,你有没有能力判断它到底是在认真解决问题,还是在胡写。