当前位置: 首页 > news >正文

RAG5个常见错误

向量数据库并非硬性规定

几乎互联网上所有关于RAG的教程都使用向量存储。如果你一直在搜索RAG相关内容,你就会明白我们在说什么。

基于向量的检索无疑是RAG成功的重要因素。向量嵌入非常适合映射文本的语义含义。它们也能很好地处理不同大小的文本。你的查询可能只是一个句子,但你的文档存储包含整页的文章?—向量搜索能够处理这些情况。

然而,检索并不仅限于基于向量的检索。

RAG可以从互联网、关系型数据集、Neo4J中的知识图谱,或者这三者的组合中检索信息。

在许多情况下,我们注意到混合方法往往能带来更好的性能。

对于通用应用,你可以使用向量存储,但当向量存储中没有可用信息时,你可以搜索互联网。

对于客户聊天机器人,你可能需要授予RAG访问部分客户数据库的权限,这可能是一个关系型数据库。

公司的知识管理系统可能会创建知识图谱并从中检索信息,而不是使用向量存储。

从定义上讲,所有这些都是RAG。

然而,确定使用哪些数据源的过程并不是很直接。你需要尝试各种选项,了解每种方法的优缺点。接受或拒绝某个想法的原因可能受到技术和业务考虑的双重影响。

例如,你可以创建每个客户资料信息的文本版本,并将其向量化以供检索。这对于查询来说效率很高,因为你只需处理单个数据库。但它可能不如运行SQL查询准确。这是一个需要考虑的技术原因。

然而,让LLM运行SQL查询可能导致SQL注入攻击。这既是技术问题也是业务顾虑。

向量数据库对语义检索也很有效。但这并不意味着其他数据库无法处理语义检索;几乎所有其他数据库都可以处理向量搜索。

优先选择微调过的小型模型

嵌入模型可以将任何内容转换为向量形式。在更大的模型上你会看到比小模型更好的性能。

然而,这并不意味着更大就总是更好。

忘掉规模吧。所有模型都是在公开数据集上训练的。它们知道苹果(水果)和苹果(品牌)之间的区别。但是,如果你和你的朋友用"苹果"作为暗号,嵌入模型无法知道这一点。

而且,我们创建的几乎所有应用都专注于一个小众话题。

对于这些应用,使用更大模型带来的好处是微不足道的。

下面是一种不同的做法:

为你的领域数据创建一个数据集,并微调一个小型嵌入模型。

小型模型足以捕捉语言细微差别,但可能无法理解在不同情境中具有特殊含义的词语。

但仔细想想,为什么你的模型需要理解木星的卫星是什么呢?

小型模型更高效。它们速度快且成本低。

要让模型具备领域知识这一缺失能力,你可以对其进行微调。

这两个提示可以修复高效检索的索引部分。但是,检索过程本身也可以优化。

检索过程可以更先进

最直接的检索过程是直接查询。

如果你使用向量数据库,可以对用户输入进行语义搜索。否则,你可以使用LLM生成SQL或Cipher查询。

如果需要,你也可以调用HTTP端点。

但直接查询方法很少能产生可靠的上下文。

你可以通过更高级的方法查询数据源。例如,你可以尝试查询路由技术来决定从哪个数据源获取数据。具有良好推理能力的LLM可以用于此目的。你还可以对较小的模型进行指令微调,以节省成本并减少延迟。

另一种技术是链式请求。对于初始查询,我们可以从数据源获取信息。然后,基于获取的文档,我们可以获取后续文档。

分块是RAG中最具挑战性和最重要的部分

当上下文中包含不相关信息时,LLM往往会失控。

防止RAG中出现幻觉的最佳方法是分块。

现代LLM可能支持更长的上下文长度。例如,Gemini 2.5 Pro支持高达200万个token,足以容纳两到三本大学级别的物理教科书。

但对于关于基础力学的问题,你很少需要来自量子物理学的上下文信息。

如果你将教科书分解成更小的部分,可能每一部分只讨论一个主题,那么你只需获取与问题相关的信息。

这里的挑战在于有许多分块技术。每种技术都有自己的优缺点。对你的领域最有效的方法可能对其他领域不起作用。

递归字符分块可能是最简单的,也是我们的默认选择。然而,它假设文本中每个主题的讨论长度相等,这在现实中很少见。尽管如此,最好从这开始。

沿着这条路走下去,你甚至可以尝试主题聚类和代理式分块。

尝试重排序

最后但同样重要的是重排序。

已经证明,相关分块的位置对高质量LLM响应至关重要。

然而,常规的向量搜索,甚至数据库查询,都不能非常智能地排序结果。而LLM可以。

因此,我们使用专门的大型语言模型(LLM)作为重排器,对获取的上下文进行重新排序,并进一步过滤,只找出最相关的分块。

这种二级重排序在某些应用中有益,但在其他应用中则不然。但有一些技术可以用来改进重排序结果。

其中一种是获取大量初始结果。宽松定义初始标准会拉取一些不相关的上下文,但它增加了找到正确内容的概率。

现在,重排器可以处理这个大集合并过滤出更相关的内容。

相关文章:

  • Codeforces Round 1020 (Div. 3)(题解ABCDEF)
  • 如何使用@KafkaListener实现从nacos中动态获取监听的topic
  • 浏览器环境下JS执行机制
  • 解锁大数据新视野:构建强大可观测平台
  • femap许可常见问题及解决方案
  • 数字域残留频偏的补偿原理
  • DeepSeek本地部署手册
  • 7.10 GitHub Sentinel CLI开发实战:Python构建企业级监控工具的5大核心技巧
  • canvas画板!随意画!!
  • C语言标准库函数setlocale用法详解
  • 自定义异常处理(全局异常处理)
  • 用python进行OCR识别
  • 《解锁LLMs from scratch:开启大语言模型的探索之旅》
  • “生成式AI大模型、多模态技术开发与应用”学习
  • 谈谈接口和抽象类有什么区别?
  • 在 WSL 安装 OpenFOAM-12
  • stone 3d v3.3.0版本发布,含时间线和连接器等新功能
  • Coding Practice,48天强训(22)
  • Nginx通过自定义参数,实现同一域名在不同设备下访问不同站点的操作
  • RefFormer论文精读
  • 融创中国清盘聆讯延至8月25日,清盘呈请要求遭到部分债权人反对
  • 客流持续高位运行,长三角铁路计划增开153列旅客列车
  • 云南省政协原党组成员、秘书长车志敏接受审查调查
  • 2025年五一档电影票房破4亿,《水饺皇后》领跑
  • 同日哑火丢冠,双骄的下山路,手牵手一起走
  • 澎湃回声丨23岁小伙“被精神病”8年续:今日将被移出“重精”管理系统