6 RAG知识库 和 微调 如何选择?

因为其实很多时候, 微调和 RAG 都有达同样的效果, 那我们如果区分呢?

这个其实很好理解,我可以举一个非常好理解的例子:

前提场景: 参加一场专业的数学考试, 数学能力很强的大学生 (基座GPT模型)

  1. RAG: 就是给这个大学生带一本相关的数学书,里面有各种习题和公式, 开卷考试, 如果学生悟性够高基础好,那么题也是可以做出来的
  2. 微调: 我给这个大学生,进行考前突击, 就给他讲那些他没学过的专业的数学知识, 那么这个学生学会后去考试, 闭卷开始, 也可以做出来

结论: 其实我们得分场景去考虑用哪种方法, 找到适合的方法

1. 快速决策框架

直接给一些结论 , 在选择是否微调时,有实际场景强需求的时候, 我们可以大概率直接选择

  • 动态数据 → RAG 知识库
    • 因为微调每次都要训练, 总不能每次微调一遍吧 ,成本太高了
  • 低延迟 → 微调
    • 知识库每次都要去检索一遍数据, 上下文也长,所以整体还是比较慢的
  • 需要解释为什么? (比如需要参考文章) →RAG知识库
    • 这个就很明显了, 还是RAG知识库比较好
  • 还要需要原来模型比较强的通用能力 → rag知识库
    • 因为微调可能会造成”遗忘”,这个不好控制
  • 成本:这个不好评估, 得看调用量, 但是大部分是 rag > 微调

2. 微调的优缺点

优点:

  1. 长期一致性:模型行为更加可预测和一致, 回答可以保持比较一致
  2. 低延迟:不需要实时检索,响应速度更快
  3. 知识整合能力:可以将知识深度融入模型参数中
  4. 上下文理解提升:对特定领域的理解更深入
  5. 小型化可能:某些情况下可以获得更小的专用模型

缺点:

  1. 单独的训练成本高:耗费计算资源和时间, 还要时间去整理,高质量的训练数据集
  2. 灵活性差:知识更新需要重新训练
  3. 灾难性遗忘:微调还是改变了原来的模型, 可能丢失原有的通用能力

RAG的优缺点

优点:

  1. 动态知识更新:知识库可以随时更新而无需重训练
  2. 实施门槛低,成本低:通常不需要模型训练, 现在的 rag 知识库都是可以直接搭建的
  3. 减少幻觉:通过提供参考内容减少虚假信息
  4. 保留通用能力:不影响基础模型的能力

缺点:

  1. 延迟较高:检索过程增加响应时间, 这种模式速度相对慢很多
  2. 实时计算成本:每次查询都需要检索,长期使用成本可能高
  3. 复杂推理长文章能力有限:对于需要跨文档推理的问题效果欠佳, 当输入多个长文档片段时,关键信息可能被大量不太相关的内容"稀释",模型检索的精度下降, 导致回答就效果不好
  4. 知识库管理复杂:需要维护和优化知识库

总结:

通常情况下,最简单的判断方法就是:

最佳策略是先尝试提示工程和RAG,如果效果不理想再考虑微调。许多场景下,RAG与提示工程的结合已经能够解决大部分问题,而无需进行成本较高的微调。

可以共存:

更好的的做法, 先微调一下, 再给微调的模型加RAG知识库

### 对RAG模型进行微调的方法 对于希望改善特定任务性能的情况,可以通过不同的方式对检索增强生成(Retrieval-Augmented Generation, RAG)模型实施微调[^3]。具体来说,存在三种主要类型的微调策略: #### 检索器微调 (Retriever Fine-tuning) 此方法侧重于改进信息查找的过程。通过针对具体的领域数据集训练检索部分,可以使模型更好地理解查询并找到最相关的文档片段。这通常涉及到调整用于表示问题文档嵌入空间的编码器参数。 ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq") retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True) model = RagSequenceForGeneration.from_pretrained("facebook/rag-token-nq", retriever=retriever) # 假设我们有一个自定义的数据加载器custom_dataloader来提供训练样本 for epoch in range(num_epochs): for batch in custom_dataloader: outputs = model(input_ids=batch['input_ids'], labels=batch['labels']) loss = outputs.loss loss.backward() optimizer.step() scheduler.step() ``` #### 生成器微调 (Generator Fine-tuning) 这种方法聚焦于提高输出质量方面的工作。通过对预训练的语言模型执行监督学习,可以使其适应新的上下文环境或风格需求。这里的关键在于准备高质量的目标文本作为标签来进行训练。 #### 协同微调 (Joint Fine-tuning) 为了最大化整体系统的效能,还可以考虑同时优化两个组成部分间的合作机制。这意味着不仅要单独强化各自的特性,还要确保它们能够无缝协作以达到最佳效果。这种综合性的处理往往能带来更好的最终成果。 当采用上述任何一种形式的微调时,都应考虑到目标应用的具体特点以及可用资源的数量等因素的影响。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值