RAG不是机器学习,ML工具包解决了错误的问题

RAG不是机器学习,ML工具包解决了错误的问题

RAG不是机器学习,ML工具包解决了错误的问题

📰 来源:Towards Data Science | 📅 翻译日期:2026年6月2日
🔗 原文查看原文
🤖 翻译:DeepSeek AI · 仅供参考

一个开发团队花了六个月时间微调他们的RAG管道。

他们进行了五次Optuna搜索。
他们添加了一个自定义重排序器。
他们用自己的数据微调了嵌入模型。

生产环境的准确率从未改变。试点用户一直在抱怨同样的错误答案。六个月后,bug出在解析器上。

团队迷失了,而不是停滞不前。RAG不是机器学习,而ML工具包解决了错误的问题。这是当今企业RAG中最昂贵的一个误解。它浪费了数月的精心工作,让错误的人做错误的任务,并悄然侵蚀了对系统的信任。

RAG看似像机器学习

RAG看起来足够像机器学习,以至于ML工具包感觉像是自然的下一步。直觉(超参数优化、评估数据集、可解释性框架)本身并没有错。但它们是从错误的领域引入的。适用于训练模型的方法并不适用于组装搜索系统。

要点不是ML不好。驱动向量搜索的嵌入模型本身就是一个深度学习模型,但你不是训练它,而是消费它。关键是,你围绕它构建的系统不是一个模型,而把它当作模型来对待会浪费时间、选择错误的指标、雇佣错误的人,并隐藏真正的失败模式。

“RAG不是ML”这一立场是《企业文档智能第一卷》的一部分,该书逐一构建企业RAG的砖块。这四块砖(解析、问题解析、检索、生成)是本文指向的工程工具包。

两个不同的问题

机器学习解决的问题是真实答案未知且需要预测的情况。这个客户会流失吗?这笔交易欺诈的概率是多少?这张图片是猫吗?你事先不知道答案。这就是为什么你要训练一个模型。模型从带标签的样本中学习,泛化到新输入,并产生预测。性能在数千个测试用例的聚合上衡量,因为个别预测可能错误,但整体模型仍然有用。

RAG解决了不同的问题。 “这份合同的有效期是什么?”的答案要么存在于文档的第一页,要么根本不存在。没有什么可预测的。系统要么在文档中找到答案并忠实报告,要么失败并应如此声明。性能在问题级别是二元的(得到或没得到),即使你在许多问题上测量聚合率。

这些差异是具体的:

  • 在ML中,“模型在8%的情况下错了”是系统的一个特征。你构建冗余、下游检查、人工审核来处理边界情况。
  • 在RAG中,“系统有8%的时间给出错误答案”是一个bug。每一个8%都有特定原因:检索到了错误的段落,检索到了正确的段落但模型糟糕地转述了它,答案不在语料库中而系统编造了一个。它们不是可以在平均上优化的统计噪声。它们是可以单独修复的失败

在ML中,你通常无法说出模型为什么在某个案例上错了。这就是为什么可解释性是一个研究领域。在RAG中,你总是可以知道。检索日志记录了返回的段落。生成器恰好看到了那些段落。如果答案错了,你沿着链条往回走,找到断裂的环节。没有隐藏的东西。

在ML中,模型通过训练更多数据改进。在RAG中,系统通过更好的索引、更仔细的解析、更精确的检索、更清晰的提示改进。这些都不是训练。它们是工程

这个差异改变了当某件东西坏了时你使用的工具。

第2篇文章中编目的案例正好落在这里:否定、精确标识符、内部缩写、长上下文中的信号稀释、主题接近性超越实际答案。当你更换嵌入模型或扫描块大小时,这些都不会改变。它们不是模型可以学习摆脱的bug,因为没有标签信号说“这是正确的行”供模型训练。修复是结构性的(问题解析、专家关键词、了解文档结构的检索),接下来的部分详细介绍了三种ML反射,它们选择了错误的工具。

三个不适用的论点

三种ML方法默认被引入RAG项目:超参数优化、带有训练/测试分割的评估数据集、以及特征归因可解释性。每种在ML内部都是合理的。但在这里都失灵了。

超参数参数

最常见的说法是这样的:块大小、重叠、top-k、相似度阈值。这些是超参数,你应该像优化ML模型一样优化它们,使用像Optuna或Ray Tune这样的工具。运行搜索,绘制曲线,选择最佳配置。

在这些设置中,top_k是检索器保留的段落数,similarity_threshold是段落必须达到的最低余弦分数。下面的代码将所有四个声明为要优化的数字:

# 团队通常写的内容(以及为什么是错误的活动)
import optuna

def objective(trial):
    chunk_size = trial.suggest_int("chunk_size", 100, 2000)
    chunk_overlap = trial.suggest_int("chunk_overlap", 0, 200)
    top_k = trial.suggest_int("top_k", 1, 20)
    threshold = trial.suggest_float("threshold", 0.5, 0.95)
    accuracy = run_rag_pipeline_and_score(
        chunk_size, chunk_overlap, top_k, threshold
    )
    return accuracy

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=200)  # 两周的计算后...

这里有一点真理。这些变量确实影响检索质量,值得调整。问题始于“超参数”这个词,它带来了一个带有隐藏假设的比喻。

在机器学习中,超参数控制模型如何学习:学习率、正则化强度...


📌 *本文由 DeepSeek AI 自动翻译排版,如有不准确之处欢迎指正*
©版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

评论已关闭