mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-06 05:54:10 +00:00
Update 学习路线 - 大模型应用开发.md
同步笔记的更新,调整部分导读和参考要点。
This commit is contained in:
@@ -231,7 +231,7 @@ Token 是模型处理文本的单位,也是计费和上下文长度的单位
|
||||
|
||||
### 第 6 天:幻觉与推理模型
|
||||
|
||||
幻觉一节按定义、原因、缓解的顺序读,Agent 中的幻觉出现在调用工具的过程中,重点看为什么要在工具结果和代码上约束,只靠提示词不够。推理模型一节很短,说明它和普通模型的区别。
|
||||
幻觉一节按定义、原因、缓解的顺序读,Agent 中的幻觉出现在调用工具的过程中,重点看为什么要在工具结果和代码上约束,只靠提示词不够。推理模型一节说明它和普通模型的区别,以及小模型怎样通过蒸馏获得推理能力。
|
||||
|
||||
阅读:《大模型应用》从[幻觉](大模型应用.md#幻觉)读到[推理模型](大模型应用.md#推理模型)。
|
||||
|
||||
@@ -245,7 +245,7 @@ Token 是模型处理文本的单位,也是计费和上下文长度的单位
|
||||
<summary>参考要点</summary>
|
||||
|
||||
1. 幻觉指生成看似合理、但与事实或给定资料不符的内容,分事实性幻觉和忠实性幻觉;根本原因是训练目标是生成通顺的下一个 Token 而不是核对事实,只按答对比例打分的评测又鼓励猜测;此外还有知识缺失、采样出错后顺着错误生成、上下文过长或资料有噪声。
|
||||
2. 检测:有资料时把回答拆成结论逐条检查依据,引文和数字用代码核对;RAG 答错时先看正确的资料是否在提示词中,区分检索和生成的问题;没有资料时多次采样比较,编造的内容往往每次不同;缓解:用 RAG 提供资料并允许回答不知道,降低温度、要求引用,用程序或另一个模型校验,展示来源、高风险结果人工确认。
|
||||
2. 检测:有资料时把回答拆成结论逐条检查依据,引文和数字用代码核对(只能确认它们存在,是否支持结论仍要逐条判断);RAG 答错时先看正确的资料是否在提示词中,区分检索和生成的问题;没有资料时多次采样比较,编造的内容往往每次不同,但始终一致的错误查不出来;缓解:用 RAG 提供资料并允许回答不知道,降低温度、要求引用,用程序或另一个模型校验,展示来源、高风险结果人工确认。
|
||||
3. 编造参数,例如用户没给订单号就自己编一个去查;编造或误读工具结果,例如接口超时仍说“正在运输中”、把 updated_at 当成送达时间;声称做了没做的事,例如没调用退款工具却说已退款;应对要靠工具和代码:结果字段写清楚、校验参数来源、用代码核对关键信息。
|
||||
|
||||
</details>
|
||||
@@ -288,7 +288,7 @@ Token 是模型处理文本的单位,也是计费和上下文长度的单位
|
||||
<details>
|
||||
<summary>参考要点</summary>
|
||||
|
||||
1. 身份、规则和输出格式放在系统消息中,写清任务、约束、输出格式和示例;要求具体,例如“不超过 100 字”而不是“简洁一些”;说明信息不足时怎么处理,否则模型倾向编造;用少样本示例说明格式,多步推理让模型先写步骤(CoT);改动在评测集上比较,每条运行多次,从失败的样例入手补规则或示例。
|
||||
1. 身份、规则和输出格式放在系统消息中,写清任务、约束、输出格式和示例;要求具体,例如“不超过 100 字”而不是“简洁一些”;说明信息不足时怎么处理,否则模型倾向编造;用少样本示例说明格式,多步推理让普通模型先写步骤(CoT),推理模型不必再这样要求;改动在评测集上比较,每条运行多次,从失败的样例入手补规则或示例。
|
||||
2. 优先用约束解码:每生成一个 Token 前按 Schema 屏蔽会让输出不合法的 Token;JSON 模式只保证是合法 JSON,不保证字段;不支持时先修复(去掉代码块标记、截取首个 { 到末个 }),再用 JSON Schema 校验,失败时带着具体错误重试 1~2 次,仍失败就返回默认值或转人工。
|
||||
3. 不一定,约束解码和 Schema 校验只保证格式;订单是否属于当前用户、退款是否超过实付金额这类业务规则要在代码中校验;还要检查 finish_reason 是否为 length,以及字段类型是否与代码一致。
|
||||
|
||||
@@ -421,7 +421,7 @@ Embedding 把文本变成向量,相似度检索靠它完成。向量索引回
|
||||
|
||||
1. 向量检索擅长匹配措辞不同的近义内容,但精确匹配不准,E1024 和 E1025 文档的相似度 0.762 与 0.743 几乎分不开;BM25 按词频、逆文档频率和文档长度打分,罕见词 E1024 权重高,两篇得分 1.088 与 0.130;两路同时召回,分数尺度不同,用 RRF 按排名融合;混合不一定比单路好,口语化问题上等权 RRF 的 Recall@3(0.950)低于单独的向量检索(0.975),BM25 的权重要在评测集上确定。
|
||||
2. Embedding 模型分别编码问题和文档,文档向量能提前算好,速度快,但细节的对应关系在压成一个向量时丢失;重排模型(交叉编码器)把问题和文档拼在一起编码,每个词之间都能算注意力,更准,但每一对都要重算;所以先快速召回几十条,再重排选出几条;混入 12.5 万条干扰文本时,重排 RRF 的前 50 个候选使 Recall@1 从 0.275 升到 0.700。
|
||||
3. HNSW 删除一般只做标记、检索时跳过,之后统一清理,更新等于删除加插入;Milvus 的删除在位图中标记,Compaction 时才真正去掉,所以更新要批量进行;文档修改后按文档 ID 和内容哈希找出变化的文档,删除它的全部旧切片再写新切片,只改权限或版本状态时只更新元数据;按切片 ID 幂等写入,并与关系数据库定期对账;更换 Embedding 模型或切片方式时,在新集合中重建索引并评测,再把别名切过去,查询用的模型同时切换。
|
||||
3. HNSW 删除一般只做标记、检索时跳过,之后统一清理,更新等于删除加插入;Milvus 的删除只记下被删除的主键、查询时过滤,Compaction 时才真正去掉,大量删除和更新会累积未清理的数据,占用内存并拖慢检索;文档修改后按文档 ID 和内容哈希找出变化的文档,删除它的全部旧切片再写新切片,只改权限或版本状态时只更新元数据;按切片 ID 幂等写入,并与关系数据库定期对账;更换 Embedding 模型或切片方式时,在新集合中重建索引并评测,再把别名切过去,查询用的模型同时切换。
|
||||
|
||||
</details>
|
||||
|
||||
@@ -450,7 +450,7 @@ Embedding 把文本变成向量,相似度检索靠它完成。向量索引回
|
||||
|
||||
1. 召回的 K 是每路交给重排的候选数(如 50),在评测集上取召回率不再明显上升的位置,有重排时可以取大些;放进提示词的 K 是重排后保留的数量(如 3~5),太大增加成本、混入无关或旧版本资料,太小答不全,按端到端正确率和上下文预算确定。
|
||||
2. 向量相似度的绝对值很难定阈值:实测阈值 0.50 时无答案的问题放行 40%,0.60 时有答案的问题误拒 10%;所以只用较低的阈值过滤明显无关的结果,有没有答案靠重排分数和“资料不足时回答不知道”的提示词判断;阈值在评测集上确定,换模型后重新确定。
|
||||
3. 原始问题常不适合直接检索:有指代(“那 ConcurrentHashMap 呢”)时结合历史补全;问题太短时用 HyDE 先生成假设的回答再检索;多个子问题拆开分别检索再合并,RAG-Fusion 改写成多个查询后用 RRF 合并;代价是多一次模型调用。
|
||||
3. 原始问题常不适合直接检索:有指代(“那 ConcurrentHashMap 呢”)时结合历史补全;问题太短时用 HyDE 先生成假设的回答再检索;多个子问题拆开分别检索再合并,RAG-Fusion 改写成多个查询后用 RRF 合并;代价是多一次模型调用,改写也可能变差,已有较强的 Embedding 和重排时 HyDE 这类扩展收益有限,要在评测集上比较。
|
||||
|
||||
</details>
|
||||
|
||||
@@ -558,7 +558,7 @@ Embedding 把文本变成向量,相似度检索靠它完成。向量索引回
|
||||
|
||||
动手:阅读[附录 A6](大模型应用.md#a6-意图路由的三种做法),比较三种路由做法的准确率,再结合[三种做法](大模型应用.md#1-三种做法)一节说出各自的延迟、成本和适合的场景。
|
||||
|
||||
预期:规则准确率 73.3%,毫秒级、没有成本,但换个说法就漏,适合“转人工”这类精确的情况;分类模型 78.3%,毫秒级、有置信度,需要标注数据;Qwen2.5-7B 95%(3B 90%),每次多一次模型调用,能理解没见过的说法,但可能输出不存在的类别,适合说法多样的消息。
|
||||
预期:规则准确率 73.3%,毫秒级、没有成本,但换个说法就漏,适合“转人工”这类精确的情况;Embedding 相似度 78.3%,毫秒级、有置信度,每类只需几条示例,但示例少时容易被字面相似误导;Qwen2.5-7B 95%(3B 90%),每次多一次模型调用,能理解没见过的说法,但可能输出不存在的类别,适合说法多样的消息。
|
||||
|
||||
算法(回溯与搜索,中等):[46. 全排列](https://leetcode.cn/problems/permutations/),题解见[排列](Leetcode%20题解%20-%20搜索.md#5-排列)。
|
||||
|
||||
@@ -579,7 +579,7 @@ Embedding 把文本变成向量,相似度检索靠它完成。向量索引回
|
||||
<details>
|
||||
<summary>参考要点</summary>
|
||||
|
||||
1. 短期记忆是当前会话的原始消息(含工具调用和结果)、摘要和任务状态,常以会话 ID 为键存在 Redis,请求时放入“摘要 + 最近几轮 + 任务状态”;长期记忆由后台提取或模型调用 save_memory 写入,只写用户明确说过、以后有用、业务系统查不到的事实;使用时按用户 ID 过滤,按相似度和时间检索最相关的几条。
|
||||
1. 短期记忆是当前会话的原始消息(含工具调用和结果)、摘要和任务状态,常以会话 ID 为键缓存在 Redis(需要保留的消息和要恢复的任务状态先写入数据库),请求时放入“摘要 + 最近几轮 + 任务状态”;长期记忆由后台提取或模型调用 save_memory 写入,只写用户明确说过、以后有用、业务系统查不到的事实;使用时按用户 ID 过滤,按相似度和时间检索最相关的几条。
|
||||
2. 写入前检索相似的旧记忆,由模型选择 ADD、UPDATE、DELETE 或 NOOP(Mem0 论文的做法,开源版后来改为只新增),用户 ID、时间等字段由代码填写;冲突时用户本次说的优先,亲口说的优先于推断,同一来源以新的为准,只对这一次有效的说法不覆盖,仍无法判断就问用户;旧记忆标记失效而不物理删除,并按时间衰减排序、定期清理。
|
||||
3. 完整历史在上下文中时模型一般能理解指代,问题出在检索、压缩和多个候选;检索前结合最近几轮和任务状态改写成完整的问题,例如“它什么时候发货”改为“订单 1026 什么时候发货”;任务状态记录当前和提到过的订单,有多个候选时追问而不是猜。
|
||||
|
||||
@@ -709,7 +709,7 @@ MCP 规定应用怎样接入外部的工具和数据,Skills 规定怎样按需
|
||||
<summary>参考要点</summary>
|
||||
|
||||
1. 接口用 SSE:响应类型为 text/event-stream,连接保持打开,每生成一段内容写一条事件;事件由若干行“字段: 值”组成、以空行结束,data 是内容、id 是编号、event 是类型,冒号开头的行是注释(常作心跳);OpenAI 兼容接口以 data: [DONE] 结束,断线后 EventSource 带着 Last-Event-ID 重连。
|
||||
2. 前缀缓存降低的是单价:不变的系统提示词和工具定义放最前、工具顺序固定、历史原样追加;减少 Token 的数量:工具先返回摘要或片段,需要时再读全文;设置 max_tokens,输出单价是未命中缓存输入的 4 倍;简单问题交给小模型;历史过长时压缩,但压缩会改变前缀,不宜过于频繁;避免模型反复调用同一个工具。
|
||||
2. 前缀缓存降低的是单价:不变的系统提示词和工具定义放最前、工具顺序固定、历史原样追加;减少 Token 的数量:工具先返回摘要或片段,需要时再读全文;设置 max_tokens,以 deepseek-flash 为例,输出单价是未命中缓存输入的 4 倍;简单问题交给小模型;历史过长时压缩,但压缩会改变前缀,不宜过于频繁;避免模型反复调用同一个工具。
|
||||
3. 早期系统按最大长度为每个请求预留连续的显存,真正存放 KV Cache 的只有 20.4%~38.2%;PagedAttention 借鉴操作系统的分页,把 KV Cache 切成固定大小的块(vLLM 默认 16 个 Token)按需分配,用块表记录位置,只浪费最后一块的空余;同样 7 GB 显存按 8K 预留只能服务 16 个请求,请求平均只用到 2K Token 时按块分配可服务 64 个;延迟相近时吞吐是 FasterTransformer、Orca 的 2~4 倍。
|
||||
|
||||
</details>
|
||||
@@ -737,7 +737,7 @@ MCP 规定应用怎样接入外部的工具和数据,Skills 规定怎样按需
|
||||
<details>
|
||||
<summary>参考要点</summary>
|
||||
|
||||
1. 非流式请求的总超时要大于 TTFT + 最大输出 Token 数 × TPOT,例如 1000 个 Token、30 毫秒时要 30 多秒;流式请求分别设首 Token 超时、间隔超时和总时长上限,心跳不算内容;429、5xx、超时可以重试,400、401 直接失败,按指数退避加随机抖动、遵守 Retry-After,次数设上限且只在一层重试。
|
||||
1. 非流式请求的总超时要大于 TTFT + 最大输出 Token 数 × TPOT,例如 1000 个 Token、30 毫秒时要 30 多秒;流式请求分别设首 Token 超时、间隔超时和总时长上限,心跳不算内容;临时限流的 429、5xx、超时可以重试,400、401 和花费上限导致的 429 直接失败,按指数退避加随机抖动、遵守 Retry-After,次数设上限且只在一层重试。
|
||||
2. 还没输出任何内容时直接重试,用户感知不到;已输出部分文字时,把已输出的部分作为 assistant 消息的开头请求续写(如 DeepSeek 的对话前缀续写),不支持就丢弃重新生成并通知前端清空;工具调用的参数只输出了一半时不能执行,丢弃后重新请求。
|
||||
3. 提示词注入指通过输入的内容改变模型原本的指令,指令也可能藏在网页、文档或工具结果中(间接注入);指令和资料最终拼成同一个 Token 序列,模型无法可靠区分,提示词只能降低风险,重点是限制后果;外部内容标注为不可信,工具按最小权限提供、在代码中按当前用户校验,高风险操作人工确认;读过不可信内容的任务不给对外发送的工具,前端不自动加载输出中的外部图片,防止数据外泄;输出转义、查询参数化,提示词中不放密钥,记录审计日志。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user