目前,企业使用人工智能最常见的情况是在他们必须做出决策的数据中寻找答案,或者提供精心制作但完全无用的报告,以便高层管理人员可以证明他们的巨额奖金是合理的。都是非常重要且合法的应用🧐。
问题是,你的数据分析和人工智能部门(如果有的话)可能会说巫术语言,无法给出连贯的答案,解释为什么我们拥有如此多的数据,但仍然无法回答相当琐碎的问题。
我感受到你的痛苦,让我们看看他们在说什么。
在生成式人工智能热潮之前,搜索文档和公司知识库的主要方式要么是全文搜索引擎,如 Apache Lucene、Elasticsearch 和 Solr,要么是数据库引擎中的类似功能,如 Microsoft SQL 全文搜索、原始关键字-基于搜索或核心 ML/数据科学的东西。不再。
它们确实有效,但它们的功能有限,或者实施成本只有波音 747 的一半,因此使用这些方法的系统也非常有限。它们无法处理复杂或模糊的问题,因为系统需要理解问题的含义和对话的上下文,而不是单个单词。
我的实践示例——专利检索。这是一项艰巨的任务,旧的方法不能很好地解决,因为相似的事情在不同的专利中以非常不同的方式描述。
现在它成为可能,罪魁祸首是大型语言模型或法学硕士。人们可以争论它们是否真正聪明,但有一点是明确的——它们对于理解人类语言的复杂性非常有用。 LLM技术令人印象深刻,几乎成为人工智能的代名词。
L LM 在这方面有两个作用:
- 它们帮助理解用户问题并将其转化为计算机可以处理的内容。听起来可能不太令人印象深刻,但它很大。他们可以理解用户提供的任何胡言乱语,并将其转化为有意义的东西。
- 他们根据可用数据和对话上下文生成有意义的答案
两者之间有一项是法学硕士不处理的——检索数据来回答问题。从技术上讲,法学硕士可能知道足够的知识(即拥有足够的数据)来回答问题,如果它接受过该领域数据的培训,或者问题非常通用。但通常情况下,对于在特定领域工作的公司来说,情况并非如此。 LLM 可能不知道您公司的财务状况或营销主管的姓名和电话号码,因此您可以在深夜打电话给他,提出非常紧急的问题,例如他们何时要更改营销报告的字体。不是很有用。
所以中间还有一层称为 Retriever 。它在公司数据库、文档、CRM 等中搜索相关信息,并将其提供给法学硕士。因此,非常流行的术语 RAG 是 Retrieval Augmented Generation,它的意思就是——一个使用 LLM 和检索器来提供答案的系统。
您很可能需要多个检索器来搜索公司不同孤岛中的数据,因此在检索过程结束时,您需要合并它们的搜索结果。这称为猎犬组装。
那么RAG系统终于解决了文档搜索问题了吗?嗯,不完全是。
RAG有其自身的局限性,其中主要来自于LLM的工作方式。具体来说,法学硕士只能处理每个请求的有限文本量,因此我们无法向其发送所有可用信息来找出答案。您的公司可能拥有数百甚至数千份文档、数据库记录和其他内容。你不可能以某种方式神奇地将所有这些内容传输给法学硕士来查看。因此,如果我们有很多文档 – 我们必须过滤它们,如果文档本身很大 – 我们必须将它们分成小块。
此外,我们发送给LLM的每个代币都需要花钱,所以我们不想发送大量无用和不相关的数据并为此付费。如您所知,大多数文件都被大量垃圾冲淡了。因此,我们确实只想发送我们认为与答案相关的信息。
这带来了一系列挑战:如果我们对信息进行分块并将其存储在不同的块中,我们如何确保在检索过程中使用所有需要的块?如果您考虑包含大量表格等的复杂文档,那么这可能会非常困难,其中表格的说明可能位于文档的不同部分而不是表格本身。或者在不同的文档中。此外,您的系统中可能存在同一文档的不同版本,且信息相互冲突……
解决这个问题的方法之一就是重新排序。
在默认 RAG 中,使用数据存储中的语义搜索来查找文档,该搜索会查找与用户问题类似的文档。例如,如果你问:“为什么我的猫密谋统治世界?”该搜索使用向量嵌入来查找与猫的恶作剧相关的文档。然后,这些文件和问题一起发送给法学硕士,以得出最终的(希望不会令人担忧的)答案。
不幸的是,语义搜索算法在许多情况下无法找到完美的匹配。
发生这种情况的原因有多种,例如文档通常包含的信息不是一个主题而是多个主题,可能包含冲突和过时的信息,文档不是完整存储而是分块存储在矢量数据库中。
所以语义搜索可以返回这样的文档:
- 猫:人类奴役史
- 如果我停止喂猫,它会吃我吗?
- 音乐剧《猫》今年占据票房冠军
- ……
- 如何赢得猫并影响人们
正如您所看到的,第 3 项不是此处的相关文档。
还有一个我用一个类比来解释。假设你认识一位知识渊博的教授。他读过各种各样的书籍,并且在技术上了解很多东西。你问他关于加拉帕戈斯群岛上的鹈鹕的事——他都知道。你问他特朗普是否比拜登更好,他也知道很多这方面的信息。现在你觉得这家伙很聪明吧!我可以问他任何事!我在工作中遇到了这个问题,让这个家伙来解决吧!所以你问他,根据“偿付能力II指令”,如果一家保险公司假设为一群经营自己的对冲基金的超聪明松鼠提供保险,那么他们基于风险的资本要求将如何根据其固有的不可预测性进行调整。坚果期货?
和???当然,他也知道!他给了你答案。问题是,这完全是垃圾。他在前面的主题上是正确的,但如果你进入特定的行业领域,他会给出可信但不准确的答案。原因是法学硕士接受了大量互联网数据的训练,但这些数据都是非常通用的。它不是特定于领域的,因此它会产生通用答案。
重新排名通过使用在特定领域文本上训练的重新排名模型来帮助解决这个问题,因此它可以为法学硕士提供最相关的上下文。因此,在前面的示例中,我们要求重新排序以按照相关性顺序对语义搜索输出重新排序,它将给出以下结果:
- 猫:人类奴役史
- 如果我停止喂猫,它会吃我吗?
- 如何赢得猫并影响人们
- ……
- 音乐剧《猫》今年占据票房冠军
现在,您可以获取最相关文档的第一棵树,并将它们发送给我们非常聪明的教授(法学硕士)来提供答案。
重新排名的方法有很多,这里介绍其中一些。通常,在生产系统中,会使用最适合当前领域的多种方法的组合。
要重新排列数据,您需要提取数据进行存储。有几种选择。
对于 RAG 的工作,Retriever 可以在任何地方搜索数据。例如直接在公司 SQL 数据库或您的电子邮件中。或者它可以使用公司已有的全文搜索系统进行搜索。问题是——它不实用,因为它会很慢而且不准确。存储 RAG 检索数据的首选(目前)方式是矢量数据库或矢量存储。
在向量数据库中(或更准确地说,在向量空间中),语义相似的概念彼此靠近,无论其表示如何。例如,单词“dog”和“bulldog”会很接近,而单词“lock”(如门锁)和“lock”(如城堡)会相距很远。
此外,矢量数据库将存储元数据,即有关数据的数据,以存储诸如权限(谁可以访问数据)、数据来自哪里、如何存储、数据类型和类别等内容。
因此,向量数据库非常适合语义数据搜索。
有很多选择,从开源 Quadrant 到企业 Pinecone。大多数经典数据库和 NoSQL 数据库现在也有矢量选项。
流行的矢量数据库(截至目前):
- QDrant — 开源数据库,对于大多数任务我更喜欢这个
- Pinecone——云原生(即,他们会向你收取很多费用)数据库,支持很多企业功能
- Chroma — 另一个开源数据库(Apache-2.0 许可证)
- Weaviate — 在 BSD-3-Clause 许可证下开放
- Milvus — 在 Apache-2.0 许可证下开放
- Marqo — 开源平台和完全托管的云服务
- FAISS — 一个单独的野兽,不是数据库,而是 Meta 的框架
- PostgreSQL 的 Pgvector
- Mongo 的 Atlas
用于构建此类 RAG 系统的最常见框架(也是我个人最喜欢的框架)是 LLamaindex 。它是一个 Python 库,提供以下工具:
- 数据摄取:您的数据可能分布在不同的位置和格式,例如 PDF 文档、SQL 数据库、公司 wiki、CRM 等。法学硕士无法直接处理这些问题,因此我们需要从这些地方获取数据。 LLamaindex 为此提供了数据连接器。
- 数据索引:当我们从存储的任何地方获取数据时,您的数据可能会变得一团糟,超级计算机无法导航。所以我们需要将其构建为LLM可以理解的格式。
- 查询引擎:一旦我们获得了可使用格式的数据,我们就需要一个工具来查询它。 LLama索引提供了通过各种方法查询数据并将其与应用程序集成的工具。
- 数据代理:这些是基于 LLM 的工作人员,可以使用数据执行复杂的任务,例如调用 API、扩充数据和调用辅助函数。它们用于构建工作流程。
LLamaindex 还有其他选择,例如,如果您使用 Microsoft 堆栈,您可以选择 Semantic Kernel,尽管在我看来它仍然有很多 bug。另一个流行的替代方案是 Haystack。
我建议避免还有一种选择:
L angchain 是另一个用于构建 RAG 系统的框架,尽管它更通用并且不是专门为此构建的。它被广泛用于构建各种由法学硕士支持的应用程序,例如聊天机器人,并且据说应该通过提供大量构建块并将它们链接在一起以构建流程来加快开发速度。
您甚至可以同时使用 LangChain 和 LLamaindex。我想在这里补充的一件事是,Langchain 开发人员更改内容如此频繁且如此之多,以至于他们经常破坏东西,并且框架不是很稳定,使得使用起来非常烦人。我有时开始怀疑它是否适合生产系统……
这是另一个问题。在您当前的系统中,您可能有某种访问控制。 LLM级别没有访问控制,尝试在LLM级别上实现它是徒劳的。无论你向法学硕士发出什么指令,都可以被打破,基本上,任何法学硕士都可以通过足够的努力来解决几乎任何事情。
LLM 安全行业的一位领导者 Lakera 推出了一款有趣的游戏,很好地展示了这一点。
我并不是说你不应该为 LLM 输入和输出设置护栏,只是说你不能依赖它们进行访问控制或秘密数据。
这一事实的一个重要含义是,您也无法将您的法学硕士训练为此类数据,因为最终,它会很乐意将其告诉不应该知道的人。
因此,实际上,工作方法是在用户请求级别的检索过程中向 LLM 提供必要的数据,并且仅提供该用户可以访问的数据,例如,应在数据存储级别检查这些数据。
权限和类别是元数据的一种形式,为了使整个系统正常工作,这些元数据必须在数据摄取阶段保存在矢量数据库或其他地方。相应地,在向量数据库中进行搜索时,需要检查找到的文档的角色或其他访问属性是否与用户可用的相对应。一些(尤其是商业企业矢量)数据库已经将此功能作为标准。
您可以在这里找到一个很好的例子。
它不是 RAG 系统的强制性部分,但如果您有大量数据或数据以某种对于理解数据很重要的方式存储,您可能会需要它。
例如,考虑计算机上包含照片的文件夹。如果您要随机重命名所有子文件夹 – 尽管数据本身(照片)没有改变,但在其中找到任何内容会有多容易?
我们人类有点相似。如果没有结构,信息对我们来说就没多大意义,所以我们脑子里有这些知识图。我们从数据存储方式(即从结构或元数据)的约定中了解数据的含义,以便有效地使用它。对于LLM来说,这个问题可以通过带有元数据的知识图(也称为知识图)来解决,这意味着LLM不仅拥有原始数据,还拥有有关存储结构和不同数据实体之间的连接的信息。这种方法也称为图检索增强生成(GraphRAG)。
图非常适合以结构化形式表示和存储异构且互连的信息,轻松捕获不同类型数据之间的复杂关系和属性,而矢量数据库则难以做到这一点。
。
普通的 RAG 看起来像这样:
修改后的流程将如下所示:
所以,其实这是一个向量数据库和知识图谱的集合。正如我在上一篇文章中关于集成的部分中提到的,它们通常会提高准确性,并且通常包括通过常规数据库或关键字(例如 Elasticsearch)进行搜索。
已经有很多图存储解决方案(尽管公司经常制作自己的版本):
- Nebula — Apache 2.0 许可下的开源,良好的性能和可扩展的架构,我个人的偏好
- Neo4j – 流行,支持 Cypher 查询语言,使其可用于各种应用程序,它们有 GPL v3 下的社区版,但对于任何严肃的事情,您将需要企业版
- OrientDB — 结合了图模型和文档模型的多模型数据库。开源(Apache 2.0)并且已经存在一段时间了。如果您需要混合文档图形模式,可能是一个选项,否则最好使用 Nebula
- Memgraph — 一种内存图形数据库,专为实时图形分析和需要低延迟性能的用例而设计。如果您需要实时处理,很可能您必须在内存中进行
- ArangoDB — 一个多模型数据库,在单个数据库引擎中支持图形、文档和键/值数据模型。它并不只专注于图表,因此如果您只想要图表 – Nebula 会更好
- JanusGraph — 在 Apache 2.0 许可下开源,支持各种存储后端,包括 Apache Cassandra、HBase 和 BerkeleyDB。利用 Gremlin 图形遍历语言,它是 Apache TinkerPop 框架的一部分,因此如果您已经使用过该语言 — 可能是一个不错的选择。
这可能是最困难的问题。无论您如何构建 RAG 系统,如果它存储垃圾,它就会产生垃圾。垃圾进来——垃圾出去。
只提取干净的数据是很困难的,如果数据来源是像 PDF 文档这样的非结构化垃圾,则尤其困难。老实说,有人应该通过一项法律,在全球范围内禁止这种格式。
LLamaParse 和类似的框架在一定程度上可以帮助解决这个问题。但这不仅仅是格式的问题,文档版本控制也存在问题,即您拥有相似文档的多个版本,或者当一个域中的信息与另一个域中的信息相矛盾时……在这种情况下人们会做什么?我想这会有所不同,并且并不总是有一个正确的答案。
这是一个本质上很困难的问题,除非我们拥有超级智能,否则无法完全解决。有一些方法,例如最大边际相关性搜索 (MMR) 算法。它会考虑信息的相关性和新颖性来过滤和重新排序文档。
重要的是:
- 系统应该能够意识到它有冲突的信息,并在不确定的情况下将其交给用户来解决
- 为此,您必须存储文档的版本控制元数据,并决定在与 MMR 等算法以及其他类型的重新排名和相关性评分发生冲突时如何解决版本和优先级
这里没有灵丹妙药,因为这在很大程度上取决于您如何在系统中存储数据,但如果已经制定了解决冲突的结构和政策,那么它肯定会有所帮助。在这种情况下,您有机会将这些内容正式化并向法学硕士代理人解释或使用类似的方法。
作为数据的一部分,您可能有图像,或者您可能希望用户使用图像查询系统。现在在视觉变形金刚的帮助下这一切成为可能。不过,这是一个很大的单独主题。
让我们来谈谈房间里的大象。每个人都知道法学硕士会产生幻觉。在我看来,这使得它们在关键系统中无法使用,例如医疗保健决策或财务咨询。在这些领域,它可以充当人类专业人士的助手,甚至可以非常谨慎。
模特为什么会产生幻觉?它肯定不会从中得到任何好处,所以它没有任何私心,所以有几个主要原因:
大型语言模型是在来自多个来源的庞大且多样化的数据集上进行训练的。这种训练是无监督的,因此很难确保数据的公平、公正或准确。语言模型本质上无法区分真实与虚构。它们依赖于训练数据中的模式,其中可能包括冲突或主观信息。这可能会导致看似合乎逻辑但实际上不正确的输出。
像 GPT 这样的大型语言模型是为一般任务而设计的,当应用于医学、法律或金融等特定领域时,可能会产生幻觉或产生不正确的结果。出现这些幻觉是因为模型试图在没有特定领域知识的情况下创建连贯的响应。
用户通过提示提供指示。编写清晰准确的提示至关重要,就像编码一样。如果提示缺乏足够的细节或上下文,模型可能会生成不相关或不正确的响应。为了获得正确的答案,提出正确的问题非常重要。
故意错位
或者简单地说——模型被训练去撒谎。对于 ChatGPT 或 Gemini 等公开可用的模型尤其如此。他们接受过大量可疑政策的培训,以遵守各种法律和愚蠢的法规,因此他们对敏感话题提供了荒谬的答案。
上下文丢失
该模型的上下文窗口或短期记忆有限。如果对话太长或者您尝试提供的数据量太大,它将开始丢失上下文详细信息并开始产生非感官结果。我认为随着上下文窗口变大并且在某种程度上是可用计算能力的函数,这个问题很快就会得到解决。但到目前为止,这是一个问题,构建 RAG 系统以优化上下文大小非常重要。
有可能消除幻觉吗?简短的回答是否定的。有一些方法可以降低出现幻觉的可能性:
- 根据相关领域数据微调模型。
- 使用 RAG 提供有效的上下文,同时避免上下文溢出
- 使用提示工程创建提示,专门指示模型不要添加不确定的信息。
- 使用带有少量提示的即时调整。
- 使用LLM类似自我检查的策略“思维树”来验证其思维过程和输出。
- 实际上,您可以要求它返回代币的分布及其概率,然后看看模型对其所构建的内容(计算代币级别的不确定性)到底有多大信心?如果分布中的概率很低(什么被认为是低取决于任务),那么很可能模型已经开始制造(幻觉)并且对其响应完全没有信心。这可用于评估响应并向用户返回诚实的“我不知道”。
- 您可以使用其他模型和预言机来验证输出的真实性。
- 后处理和过滤机制,用于审查不符合公司政策或可能有害的输出
但是,正如我提到的,这些都不能保证不会出现幻觉。
前面说的大部分都是和文本数据相关的。但是,如果您有大量数字和表格,并且需要能够进行计算作为答案的一部分,该怎么办?事情变得很棘手,因为法学硕士不能很好地计数。即使是最好的人在简单的数学方面也很糟糕,抛开任何复杂的事情不谈。最常见的计算方法是为 LLM 提供一个工具来进行计算,例如,旧的 Elastic 或 SQL 数据库。
因此,您要做的就是使用 LLM 生成 Elastic Search 的查询,并使用它进行计算,然后使用结果生成最终输出。
例如,用户问题可能是:“北美第一季度的总销售收入是多少?”。 LLM 将为 Elasticsearch 生成一个查询,如下所示:
{
“询问”: {
“布尔”:{
“必须”: [
{"term": {"region": "北美"}},
{“范围”:{“日期”:{“gte”:“2024-01-01”,“lte”:“2024-03-31”}}}
]
}
},
“阿格斯”:{
“总收入”:{
“总和”:{
“字段”:“销售收入”
}
}
}
}
Elasticsearch 响应可以是:
{
“聚合”:{
“总收入”:{
“值”:4520000.0
}
}
}
LLM 输出将为:“北美第一季度的总销售收入为 4,520,000 美元。”
Elastic 适合中等复杂的计算,如果你有一些非常复杂的东西 – 你可能必须将其委托给 NumPy 或 Pandas 脚本。
玩得开心!
版权声明
本文为本站原创内容,转载需注明文章来源(https://www.eiefun.com),另:文中部分素材可能会引用自其他平台,如有侵权或其它,请联系 admin@eiefun.com,我们会第一时间配合删除