正如我在上一篇文章中提到的,事实证明开发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。 正如在上一篇文章中提到的,我将对所提出的问题进行审查,以完善知识库中的不足之处。 我还希望最终能推出一个互动版本,它看起来和听起来都像我,你可以和它对话。