法布里斯人工智能:当前的技术实现

在上一篇文章《Fabrice AI:技术之旅》中,我介绍了我们构建 Fabrice AI整个过程。 一开始,我使用 Chat GPT 3 和 3.5。 由于对结果感到失望,我尝试使用Langchain Framework在其基础上构建自己的人工智能模型,后来他们开始使用向量数据库,并使用 4o 大幅提高了结果,于是我又回到了 Chat GPT。

以下是当前训练 Fabrice AI 的流程:

  • 训练数据(博客文章、Youtube URL、播客 URL、PDF URL 和图片 URL)存储在我们的WordPress数据库中。
  • 我们提取数据并对其进行结构化处理。
  • 我们将结构化数据提供给 Open AI,供其使用Assistants API 进行训练。
  • 然后,Open AI 会创建一个矢量存储数据库并进行存储。

下面是一个结构化数据的示例。 每个内容都有自己的 JSON 文件。 我们确保不会超过 32,000 个代币的上限。

{

“id”:”1”,

“日期”:” “,

“link”:”https://fabricegrinda.com/”、

“标题”:{

“呈现”:”法布里斯人工智能是什么?”

  },

“类别”:”关于法布里斯

“featured_media”(特色媒体):”https://fabricegrinda.com/wp-content/uploads/2023/12/About-me.png”、

“other_media”(其他媒体):””,

“知识类型”:”博客”、

“contentUpdated”(内容更新):”法布里斯人工智能是法布里斯思想的数字化呈现,基于他的博客文章以及使用 ChatGPT 转录的部分播客和访谈。鉴于许多转录内容并不完善,而且博客只是法布里斯个人的有限呈现,我们对不准确和遗漏的信息表示歉意。尽管如此,这是了解法布里斯对许多话题看法的良好起点”。

}

这是目前的技术实施情况:

  • 面向消费者的网站由AWS Amplify 托管。
  • 公共网站与 Open AI 之间的集成是通过 API 层完成的,该层作为 Python API 服务器托管在 AWS 上。
  • 我们使用MongoDB作为日志,存储公众提出的所有问题、聊天 GPT 给出的答案以及来源的 URL。
  • 我们使用各种脚本对来自博客、YouTube 等的数据进行结构化处理,然后传递给开放人工智能进行训练。
  • 我们使用React 语音识别技术将语音询问转换为文本。
  • 我们还使用 Google Analytics 跟踪网站流量。

值得注意的是,我们使用了两名助手:

  • 一个用于回答问题。
  • 一个用于获取元数据 URL,即在答案底部显示来源的具有原始内容的博客 URL。

下一步怎么办?

  1. 语音转文本改进

Open AI 的Whisper 文本语音模型比 React 更准确。 它还支持多种语言,并且擅长处理混合语言语音、口音和方言。 因此,我很有可能在未来几个月内转用它。 不过,它的设置比较复杂,可能需要一段时间。 你需要处理模型、管理依赖关系(如 Python、库),并确保有足够的硬件来实现高效性能。 此外,Whisper 并不是为直接在浏览器中使用而设计的。 在构建网络应用时,您需要创建一个后台服务来处理转录,这就增加了复杂性。

  • 法布里斯人工智能头像

我想创建一个法布里斯人工智能头像,它的外形和声音都很像我,你可以与它进行对话。 我评估了D-iD,但发现它太贵了,不符合我的要求。Eleven Labs只支持语音。Synthesia很不错,但目前还不能实时创建视频。 最后我决定使用HeyGen,因为它的价格和功能都更合适。

我猜想,Open AI 迟早会推出自己的解决方案,这样我们的工作就白费了。 我对此很满意,如果开放式人工智能解决方案推出,我将转而使用它。 在现阶段,整个工作的重点是了解人工智能的可能性,以及需要做多少工作才能帮助我更好地了解这个领域。

  • 自定义仪表板

现在,我需要运行 MongoDB 查询来获取当天的问答摘要。 我正在建立一个简单的仪表板,在这里我可以获得提取信息和简单的统计数据,如每种语言的查询次数、语音转文本请求的次数等。

  • 其他数据来源

我们刚刚将FJ Labs 投资组合上传到 Fabrice AI。 现在,您可以询问某家公司是否属于投资组合的一部分。 Fabrice AI 会给出简短的公司介绍和网站链接。

鉴于 Fabrice AI 收到的许多个人问题都没有答案,我花了很多时间手动标记了我50 岁生日视频中的每一位发言人,以提供它所需的内容。

结论

在过去的十二个月里,我做了大量与人工智能相关的工作,似乎得出了一个明确的普遍结论:你等得越多,它就会变得越便宜、越简单、越好,开放人工智能也就越有可能提供它! 同时,如果您有任何问题,请告诉我。

法布里斯-人工智能:技术之旅

正如我在上一篇文章中提到的,事实证明开发Fabrice AI比想象的要复杂得多,迫使我探索了许多不同的方法。

初始方法:骆驼索引–矢量搜索

在增强 Fabrice AI 的检索能力方面,我的第一次尝试是使用 Llama 索引进行矢量搜索。 这个概念很简单:从我的博客中获取内容,将其转换为 Langchain 文档,然后将其转换为 Llama 文档。 然后,这些 Llama 文档将存储在一个矢量索引中,使我能够通过该索引查询相关信息。

然而,当我开始测试该系统时,发现这种方法并没有产生我所希望的结果。 具体来说,当我向系统询问 “市场创始人犯的最大错误是什么?”这样的情境性问题时,人工智能无法提供有意义的答案。 它没有检索到我所知道的蕴含在数据中的细微内容,而是返回了不相关或不完整的回答。

最初的失败让我重新考虑了我的方法。 我意识到,仅仅将内容存储在矢量索引中是不够的;检索机制需要了解所提问题的上下文和细微差别。 这一认识是 Fabrice AI 发展过程中的第一课。

存储知识:MongoDB 文档存储与检索

考虑到 Llama 索引方法的局限性,我接下来探索将 Llama 文档存储在 MongoDB 中。 MongoDB 灵活的模式和面向文档的结构对于管理我多年来积累的各种类型的内容似乎是一个很有前途的解决方案。

我们的计划是创建一个更动态、反应更灵敏的搜索体验。 然而,这种方法很快就遇到了问题。 我本以为搜索功能会更加强大,但结果却不尽如人意。 本应返回相关文档的查询却没有结果,或者返回的是不相关的内容。

这次挫折令人沮丧,但也彰显了一个重要的教训:存储方法与检索策略同样重要。 我开始考虑其他方案,比如利用 MongoDB Atlas 进行矢量搜索,它有可能提供我所需要的精确性和可扩展性。 不过,在采用这种替代方案之前,我想探索一下其他方法,以确定是否有更有效的解决方案。

元数据检索器和矢量存储:寻求特殊性

我探索的下一个途径是使用元数据检索器与向量存储相结合。 这种方法背后的想法是对 Fabrice AI 中的大量信息进行分类,然后根据这些类别检索答案。 通过使用元数据来构建数据,我希望能提高人工智能提供具体、有针对性答案的能力。

然而,这种方法也有其局限性。 虽然表面上看起来很有希望,但人工智能却很难对所有类型的询问做出准确的回答。 例如,当我问 “作者是否乐观? 系统未能结合相关内容来解释这个问题。 它没有根据元数据提供有见地的分析,而是返回了模糊的答案或没有答案。

这种方法给我上了宝贵的一课,让我认识到语境在人工智能中的重要性。 仅仅对信息进行分类是不够的;人工智能还必须了解这些类别如何相互作用和重叠,从而形成对内容的连贯理解。 如果没有这种深度理解,即使是最复杂的检索方法也会落空。

构建知识结构:摘要树索引

在继续完善 Fabrice AI 的过程中,我尝试创建了一个 SummaryTreeIndex。 这种方法旨在将所有文档总结成树状格式,让人工智能能够浏览这些总结,并根据内容结构检索相关信息。

我们的想法是,通过总结文件,人工智能可以快速识别关键点,并以简洁、准确的信息回答询问。 然而,这种方法也面临着巨大的挑战。 人工智能很难为复杂的查询提供有意义的答案,例如 “如何在生活中做出重要决定?” 人工智能并没有从摘要中存储的丰富、细致的内容中汲取养分,其回答往往很肤浅或不完整。

这一经历凸显了在人工智能领域平衡广度和深度的难度。 虽然摘要可以提供高层次的概述,但它们往往缺乏回答更复杂问题所需的详细背景。 我意识到,任何有效的解决方案都需要将详细内容和高级摘要结合起来,让人工智能能够在需要时利用这两者。

这就是为什么在目前上线的法布里斯人工智能版本中,我让人工智能先给出答案摘要,然后再详细说明。

拓展视野:知识图谱索引

认识到之前方法的局限性后,我转向了一种更复杂的方法:知识图谱索引。 这种方法包括从非结构化文本中构建知识图谱,使人工智能能够进行基于实体的查询。 这样做的目的是建立对内容更动态、更相互关联的理解,让 Fabrice AI 能够更有效地回答复杂、上下文繁重的问题。

尽管知识图谱索引大有可为,但它也面临着巨大的障碍。 人工智能难以提供准确的结果,尤其是对于需要深入理解上下文的查询。 例如,当被问及 “什么是公平的种子期和 A 轮估值?”时,人工智能再次未能提供相关答案,这凸显了将非结构化文本整合到一个连贯的知识图谱中的难度。

这种方法虽然最终没有成功,但却为人工智能中使用知识图谱所面临的挑战提供了重要启示。 数据的复杂性和对精确上下文的需求意味着,即使是精心构建的知识图谱也很难提供所需的结果。 知识图谱索引的另一个缺点是速度慢。 与向量存储索引相比,获取相关文档的响应时间非常长。

重新评估数据双子座

在经历了几次挫折之后,我决定利用谷歌的人工智能Gemini 来另辟蹊径。 我的想法是从 JSON-CSV 文件创建数据集,然后使用这些数据训练一个自定义模型 LLM。 我希望通过使用结构化数据和强大的训练模型,可以克服一些困扰之前尝试的难题。

然而,这种方法也遇到了困难。 由于数据格式不正确,模型无法得到有效训练,训练过程被迫中止。 这一挫折凸显了数据完整性在人工智能训练中的重要性。 如果没有格式正确、结构合理的数据,即使是最先进的模型也可能无法达到预期效果。

这一经历让我开始考虑使用 BigQuery 存储 JSON 数据的潜力,从而为管理有效训练 Fabrice AI 所需的大型数据集提供一个更具可扩展性和可靠性的平台。

强强联合:使用松果软件制作兰彻恩文档

尽管迄今为止面临着种种挑战,但我决心找到一种解决方案,让 Fabrice AI 能够有效地存储和检索知识。 这种决心促使我尝试使用 Langchain 文档和 Pinecone。 这种方法包括使用 Langchain 文档和 OpenAI 嵌入创建一个 Pinecone 向量存储,然后根据查询检索最相似的文档。

这种方法很有前途,尤其是当查询包含文档标题时。 例如,当被问到 “幸福的关键是什么?”时,人工智能能够准确地检索和总结相关内容。 然而,这种方法仍然存在局限性,尤其是当查询缺乏特定的关键词或标题时。

这种方法展示了结合不同技术提高人工智能性能的潜力。 通过将 Langchain 文档与 Pinecone 的矢量存储相结合,我能够提高人工智能响应的相关性和准确性,尽管还存在一些局限性。

实现一致性:GPT 生成器 OpenAI

在探索了各种方法和技术之后,我转而使用 Open AI 的GPT 生成器来整合和完善 Fabrice AI 中存储的知识。 通过将所有内容上传到 GPT 知识库中,我的目标是创建一个更一致、更可靠的平台,用于检索和交互我的知识。

这种方法被证明是最成功的方法之一,人工智能能够在一系列查询中提供更好的结果。 成功的关键在于将所有知识整合到了一个单一的、有凝聚力的系统中,使人工智能能够在回答问题时利用所有广泛的内容。

正如我在上一篇文章中提到的,我无法让它在我的网站上运行,而且只有 Chat GPT 的付费订阅者才能使用,我觉得这太局限了。 此外,虽然它的质量有所提高,但我仍然不喜欢它的答案质量,也不愿意将它公之于众。

最终完善:使用模型 4o 的 GPT 助手

开发 Fabrice AI 的最后一块拼图是使用 Model 4o 引入GPT 助手。 这种方法是我在整个项目中学到的所有知识的结晶。 通过使用矢量数据库和改进提示,我的目标是让人工智能的回答尽可能达到最高的准确性和语境理解水平。

这种方法包括将我积累的所有知识上传到一个矢量数据库,然后将其作为人工智能互动的基础。 矢量数据库允许人工智能执行更复杂的搜索,根据查询的语义检索信息,而不是仅仅依靠关键词匹配。 这标志着与以往方法相比取得了重大进步,使人工智能能够更好地理解和回答复杂、细微的问题。

这种方法的关键创新之一是对提示语进行了细致的改进。 通过精心设计和测试不同的提示,我能够引导人工智能提供更准确、更相关的答案。 这不仅包括调整提示语的措辞,还包括尝试不同的查询结构,以获得最佳可能的回答。

结果令人印象深刻。 现在,人工智能能够高精度地处理各种查询,即使是开放式问题或需要深入了解背景的问题。 例如,当被问及 “如何做出人生中最重要的决定? 人工智能提供了全面而深刻的回答,利用各种来源和视角提供了全面的答复。

这一成功是数百小时工作和无数次实验的结晶。 它表明,通过技术和改进的正确结合,有可能创造出一种不仅能有效存储和检索信息,还能以有意义的方式与信息互动的人工智能。 使用 Model 4o 开发 GPT 助手标志着 Fabrice 人工智能真正发挥了自己的作用,达到了我从一开始就设想的复杂度和准确度。 GPT 助手应用程序接口随后被集成到我的博客中,使最终用户能够以您现在在博客上看到的方式与 Fabrice AI 进行交互。

回顾旅程

开发 Fabrice 人工智能的过程凸显了人工智能工作的复杂性,尤其是在理解信息并将其与上下文联系起来方面。 它告诉我,人工智能开发没有捷径可走–每一步、每一次迭代和每一次实验都是创造真正有效的东西的必经之路。

展望未来,我很高兴能继续完善和扩展 Fabrice AI。 正如在上一篇文章中提到的,我将对所提出的问题进行审查,以完善知识库中的不足之处。 我还希望最终能推出一个互动版本,它看起来和听起来都像我,你可以和它对话。

>