绘制ChatGCV的航线:AI、机器学习及更多的探索之旅

从PDF到RAG,从OpenAI到向量数据库:我在Crafting Chat George的职业之旅中的历程

ChatGPT中文站

介绍

你好👋我是George —— 一名经验丰富的软件工程师、领导者、区块链专家和技术爱好者。我在技术领域已经从事了大约13年的职业生涯,涉猎了许多技术领域。从虚拟机到容器,再到无服务器应用。从数据中心的本地部署,到家庭中的树莓派,再到多个云供应商。我也与许多数据存储和其他技术领域进行了合作。

在2019年(交易几年后),我决定成为区块链领域的专家。因此,我开始研究智能合约,了解区块链技术生态系统以及加密货币的世界。

今年,有件新事引起了我的兴趣。之前我只是出于娱乐而研究了一下神经网络,但是并没有什么结果。如果没有适应于训练的硬件,自己训练模型的成本就太高了。但OpenAI发布的ChatGPT真正重新激发了我对人工智能和机器学习的兴趣,并且让我开始思考一切是如何相互关联的。

我决定以我自己的方式建立一个ChatGPT的版本来理解这个问题,唯有如此才能更好地明白是否正确地做事。这个版本将是以目标驱动的,它将了解关于我(George)的一切。我的意思是,有什么比向一个人工智能询问自身事物以验证它是否根据你的训练数据知道所有该知道的更好的方式呢?

因此,ChatGCV的开始

思维过程

我有一个简单的用例。使用现有的关于我的文件(简历、求职信、完成的项目等),为任何人创建一个界面,以便询问有关乔治的事情。

这为我提供了一个基本的需求列表:

  • 一个现代技术(React.js)中的用户界面
  • 必须托管在云平台(Azure)上
  • 后端必须坚固且安全(.NET 6)
  • 应该进行容器化以实现可扩展性(Azure容器应用)
  • 应通过CI/CD流水线(Azure DevOps)自主进行交付。
  • 必须使用OpenAI。

挑战

尽管我有多年的经验,但我从未真正坐下来理解人工智能和机器学习的复杂性,以及它们是如何相互关联的,我的挑战纯粹是缺乏理解。

学习人工智能/机器学习

它是通过要求ChatGPT表现得好像我是一个希望涉足人工智能/机器学习领域的解决方案架构师开始的,然后给出了这个提示。

“您能为我创建一门课程,并提供一些材料,帮助我成为最出色的AI/ML架构师吗?”

它蹦出了一堆我不理解的术语,而我已经知道在我深入代码之前,我需要花很多时间研究和理解。#打好基础

ChatGPT中文站

花费了数百个中等篇幅的故事、优酷视频、在优达学城上的一门短期课程和两个星期的深夜,我终于能够说——好吧。我有点理解这个世界了。

ChatGPT中文站

在我认为我已经理解了AI/ML的世界之后,我决定深入研究OpenAI平台文档中提供的API。这让我对一些可供使用的服务有了一些了解。因此,当然,我开始使用Postman发出一些补全请求,以查看我需要理解哪些参数以及我可以期望什么样的响应。这非常直接明了。

嵌入和向量数据库

为了让我能够理解如何以非传统方式使用自己的数据,即仅传递一小段信息给OpenAI以获得背景,我看到了一些建议,建议使用矢量数据库和语义搜索来查询所需内容,并将其作为请求OpenAI的一部分。因此,我草拟了一个简单的序列图(没有什么特别的)。

ChatGPT中文站
Embedding Store

因此,您现在可能会问自己,这些东西是什么?让我们来解释一下:

嵌入

以简单的术语来说,嵌入是一种以空间中的点(通常是高维空间)来表示复杂数据(如单词或物品)的方法。想象一下,你有一个杂乱无序的大衣柜,里面放满了不同的物品:鞋子、衬衫、帽子等等。嵌入就像是以一种方式整理那个衣柜,使得相似的物品被放在靠近一起的地方。因此,所有的运动鞋可能放在一个架子上,而正式鞋子则在另一个架子上。

在机器学习的背景下,例如,单词可以嵌入到一个空间中,其中相似的单词彼此靠近。因此,在这个空间中,单词“king”可能靠近“queen”,但离“apple”远。这使得计算机能够基于单词或项在该空间中的接近程度来理解它们之间的关系。— ChatGPT

嵌入的表示方法是使用数字数组进行优化查询的一种方式,比如语义搜索。

那么你如何对它们进行结构化?

我在嵌入式方面花了很多时间来回思考,从最初使用LangChain的PDFLoader来从目录中提取PDF文件(我的简历),然后提取文本,分块处理(将其分割成较小的文档),然后使用OpenAI的ADA嵌入模型进行嵌入,并将它们存储在我的向量数据库中。

这种方法起作用了,当我从向量数据库中提取数据时,它具有上下文,问题是文档几乎总是整个简历,我的意思是,它起了作用,但语义搜索的意义在哪里呢?

我需要采取不同的方法。真正精炼我的数据,以使其在问题(搜索)的上下文中有意义,并将其嵌入其中,使用"回答"作为内容注入到Open AI请求中。

我通过构建有意义的文档(自动执行)将我的向量数据库中的索引数量从约4个增加到约40个。这也将我的请求的标记数量从约400个降低到仅有60-100个,从而降低了成本并使响应更有意义。

语义搜索

语义搜索是一种搜索方法,它关注的是理解用户查询背后的含义或意图,而不仅仅是匹配关键词。它旨在通过考虑上下文、同义词以及词语之间的关系,提供更相关准确的结果。

在本质上,语义搜索超越了仅仅的单词匹配,深入挖掘单词背后的含义,从而提供更相关的搜索结果。

语义搜索还为我们带来了“评分”的概念-当使用它时,它基本上返回按相似度和相关性从高到低排名的x个结果。

矢量数据库

我们需要一种存储这些嵌入向量并对其进行查询的方法。有许多可用的向量数据库,包括ChromaDB、Redis、一些postgress扩展,但我决定选择Pinecone。

一個向量數據庫基本上只是嵌入的數據存儲庫,其中還包括一些包含嵌入信息的元數據。

根据“嵌入式存储”图像,一旦我们将数据(在我这里是文本)转换为嵌入式,我们将该数据及其嵌入式表示存储在向量数据库中,以备日后使用。

那么我们如何将所有这些东西结合起来呢?我们如何在与OpenAI一起使用我们的信息,返回与乔治相关的信息呢?

RAG和Fine-Tuning

我们研究了两种主要方法:RAG(检索增强生成)和微调。

取回增强生成(RAG):

ChatGPT中文站
  • 目的:RAG 模型是为涉及从大型外部知识源(如数据库或互联网)中生成文本和检索相关信息的任务而设计的。这些模型将生成性语言模型(如 GPT-3)与检索机制相结合,以提高它们提供上下文相关信息的能力。
  • 建筑:在RAG模型中,有两个主要组成部分:一个检索器和一个生成器。检索器从知识源中找到相关信息,生成器根据检索到的信息生成文本。检索过程帮助模型访问特定信息以回答问题或提供上下文感知的回应。
  • 用途:无论是回答问题任务、信息检索还是内容摘要,RAG模型在这些领域都特别有用。它们的关键在于能够获取外部知识。

精细调整:

  • 目的:微调是一个过程,其中预训练的语言模型(如GPT-3)在特定数据集或任务上进行进一步训练,以使其适应特定的应用或领域。它使模型能够在不需要从头开始进行训练的情况下专注于特定任务。
  • 过程:微调涉及使用与目标应用相关的新数据及其标签或任务来接触预训练模型。在此过程中,调整模型的权重,使其在特定的微调任务上表现更好。
  • 使用案例:微调通常用于各种自然语言处理任务,包括情感分析、命名实体识别、机器翻译、文本分类等等。它可以使模型适应特定领域或任务的要求。

在本质上,根据你的需求,你可以通过创建一个很好的查询方式来获取相关数据,然后使用取得的数据查询OpenAI;或者你可以使用一个预训练的,甚至是全新的模型来扩展你自己的知识库。

后者需要更深入的研究和额外的成本开销,因为训练模型需要大量的GPU计算,并且可能会变得很昂贵。

RAG另一方面,仅仅是一种高级的数据检索方式,您可以使用传统的数据库查询或API来“丰富”您的提示,或者像我一样,使用语义搜索覆盖一个向量数据库来获取我关心的内容。

用户界面

我们对所有的组成部分有基本了解,现在我需要一个好的方式以简洁易懂的方式展示所有的组成部分。我倾向于将自己称为后端工程师,而不是前端工程师,CSS 是我最头痛的地方。

我需要创建一个类似于ChatGPT的界面,但显然只用于一个目的,即接收提示,将请求发送到我的API以返回与提示相关的有关George的信息。在搜索互联网时,我发现了一些可怕的开源实现“ChatGPT”界面的项目,但其中一个引起了我的注意。Chatpad。它具有更多我所需的功能,因此需要我做一些改动,不过基本上体现了我寻求的与我的NLP进行对话的简单界面的要求。

ChatGPT中文站

它甚至拥有暗模式,这是一个真正的工程师所必需的重要主题。 😎

应用程序逻辑设计

ChatGPT中文站

请求的流程是:

  1. 用户输入一个问题并通过ChatGCV客户端(React.js前端)提交。
  2. 请求被发送到 ChatGCV 服务器(.NET 6)。
  3. 请求发送到松鼠语义搜索以检索匹配的文件
  4. 注入匹配文档至OpenAI完整请求
  5. 响应流返回给ChatGCV客户端

主要观点

在构建ChatGCV之后,我得出了以下几点要点:

  • AI/ML(人工智能/机器学习)实际上并不可怕——花些时间,了解其过程,研究你能够的一切,并利用ChatGPT和众多可用的资源来学习关于人工智能/机器学习世界的知识。
  • 保持HTML结构不变,将以下英文文本翻译为简体中文: 干净的数据非常重要 - 在多次尝试正确的结构以将我的文档作为嵌入式加载到我的Pinecone向量数据库中后,存储在Pinecone DB中的简单问答结构最终被证明是在ChatGCV方面最好的结构。
  • 记录你的学习 - 无论你做什么,我建议随身带着一本小笔记本,写下一些你想进一步探索或一般性的关键笔记。
  • 不要重复造轮子 — 对于ChatGCV来说,我不需要自己创建一个只提供周围信息的LLM,我利用了70亿参数的GPT-4模型和我自己的数据,使用了RAG方法来实现我所需的准确结果。
  • 道德在你的人工智能之旅中至关重要——我计划写一篇关于人工智能伦理的博客,但在对ChatGCV进行负面测试时,我发现了一些有趣的方法来“影响”OpenAI让它给出美妙的回答,即使是不真实的。所以,在构建任何东西和提示结果时,请保持理性。

未来

我将在不久的将来发布更多关于人工智能/机器学习/区块链和普通工程方面的故事和博客。

暂时,ChatGCV将继续是我进行人工智能学习的场所。

如果你还有其他想让我谈论的内容,或是对上述博客有任何问题,请告诉我。

在应用程序本身添加一些内容后,我将会分享 ChatGCV 的链接。

谢谢阅读!

2023-10-20 17:20:54 AI中文站翻译自原文