docs: 添加大模型应用开发学习笔记
This commit is contained in:
parent
f26e633611
commit
97b066d1cc
926
study.md
Normal file
926
study.md
Normal file
@ -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 提出的方案,你有没有能力判断它到底是在认真解决问题,还是在胡写。**
|
||||
Loading…
Reference in New Issue
Block a user