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