算法

梯度消失和梯度爆炸

梯度消失是深层神经网络中梯度逐层衰减接近于零的现象,导致浅层参数无法更新;

梯度爆炸则是梯度指数级增长至无穷大,造成训练不稳定甚至数值溢出

二者均源于反向传播的链式连乘效应

梯度消失的典型原因:

  1. 激活函数

    • Sigmoid/Tanh:导数最大仅0.25 / 1,多层叠加后梯度指数衰减
    $$ \sigma(x)=\frac{1}{1+e^{-x}}\qquad \sigma'(x)=\sigma(x)(1-\sigma(x))\\ \tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \qquad \tanh'(x)=\frac{4}{(e^x+e^{-x})^2} $$
    • ReLU:正区间导数为1,但负区间导数为0,可能导致神经元“死亡”引发梯度消失
  2. 网络层数太深

  3. 权重初始化不当

    • 过小权重:前向输出小 → 激活函数饱和区→ 梯度消失;
    • 过大权重:前向输出大 → ReLU输出爆炸 → 梯度爆炸;

大模型

弱模型无法结构化输出,怎么改进?

从 Prompt 约束、输出约束、错误重试和模型优化解决

可以通过 System Prompt 明确输出格式,并提供 Few-shot 示例,让模型学习字段结构和输出规范

如果推理框架支持,可以使用 Structured Outputs,将 JSON Schema 转换为生成过程中的语法约束,限制模型只能生成符合格式要求的 Token

在程序侧对输出的JSON进行校验,判断字段是否缺失、数据类型是否异常

如果校验失败,可以将错误信息反馈给模型,让它修复输出,并设置最大重试次数,避免 Agent 无限循环

提示词里的约束怎么设计?

  • 规则具体化
  • 规定正向与失败行为
  • 减少冲突,明确优先级
  • 将关键约束放到程序层执行

RAG

为什么既要 Embedding 又要 Rerank

  • Embedding(向量检索):负责从海量文档中快速召回可能相关的候选文档,强调召回率(Recall)和检索效率
  • Reranker(重排序):负责对召回的候选文档进行更精细的相关性判断,强调排序质量和准确率

Embedding 通常使用双编码器(Bi-Encoder),将 Query 和 Document 分别编码成向量,通过向量相似度进行快速检索

但这种方式将文本压缩成固定维度向量,可能损失细粒度信息,导致语义相似但无法回答问题的文档排名靠前

因此,我们使用 Reranker 对候选文档进行更细致的 Query-Document 相关性评估,把真正包含答案的证据排在前面

核心就是:Embedding 负责快速找到候选,Reranker 负责精细排序

为什么不能全部 Rerank

理论上可以,但在大规模文档库中计算成本过高

Agent

Agent loop

最典型的是 Reasoning → Action → Observation → Reasoning,也就是常说的 ReAct 模式

一个完整的 Agent Loop 包含

阶段 负责方 主要操作
1. Context Runtime 组织 Prompt、历史信息和工具定义
2. Reasoning LLM 分析任务,决定下一步行动
3. Tool Selection LLM 输出 Tool Name 和 Tool Arguments
4. Tool Execution Runtime 检查权限并执行工具
5. Observation Runtime → LLM 返回工具结果、报错等
6. Iteration Runtime 更新消息历史,再次调用 LLM
7. Termination LLM / Runtime 完成回答、请求用户介入或停止执行

LLM 负责决定调用什么工具,但工具并不是由 LLM 自己执行的

Agent任务结束

正常情况下,Agent 在每一轮根据当前上下文决定是否继续调用工具。当 LLM 认为信息足够、不再发起 Tool Call,而是生成 Final Answer 时,Agent Loop 就可以正常结束。

另外,Runtime 通常会设置最大迭代次数、超时、Token 预算等限制,防止 Agent 陷入无限循环。用户主动中断或不可恢复的工具错误也可能导致任务终止。