Tage几个月前写过一篇关于如何预防ChatGPT出现幻觉的文章。然而,我想深入探讨一件特定的事情,这样你就能完全避免AI幻觉。在解释如何避免幻觉之前,我需要解释一下我们在创建自定义ChatGPT聊天机器人时做了一些什么。
我们所做的是基于具备VSS功能的SQL数据库的提示工程。可以说我们越狱了ChatGPT,但我们并没有让ChatGPT完全失控,而是显著限制了它的能力,使其只能回答与我们SQL数据库中的数据相关的问题。为了理解这个过程,可以在下面创建你自己的自定义聊天机器人。
我们的网站爬虫
如果你仔细看创建聊天机器人的过程,你会发现它是从抓取和爬取你的网站开始的。下面是在我们抓取HubSpot网站时创建的一个截图。
当它抓取你的URL时,它会将你的网站分割成“训练片段”。这意味着为你的每个页面上找到的图片创建一个训练片段,为每个找到的“部分”创建一个训练片段。一个部分通常是一个带有所有段落的Hx元素。然后,将这些片段中的每一个插入到一个SQL数据库中。在下面详细了解我们的爬虫。
下面是我们魔术仪表盘上显示的一个训练片段的截图。请注意,下面的训练片段显示为“预览模式”,但我们也有原始模式,您可以编辑每个训练片段的内容。由于训练片段是Markdown格式,这使您可以引用图像、超链接和创建列表等,使其成为聊天机器人体验的一部分。
请注意,当您创建一个免费的演示聊天机器人时,我们的爬虫只会抓取最多25个页面。如果您有更多页面,它将忽略这些页面,只会按URL长度排序后仅抓取前25个页面。后者往往会优先考虑重要页面,因为重要页面通常具有像”/about”这样的URL,而不太重要的页面通常具有更长的URL。
VSS数据库
当我们的爬虫抓取完所有内容之后,它会对每个在抓取和爬取过程中创建的训练片段进行“向量化”。向量化训练片段再次使用OpenAI的嵌入API,创建一个描述每个训练片段的“轨迹”的1520维向量,后续在通过您的VSS/SQL数据库进行AI搜索时可以使用。
稍后,当用户提出一个问题时,我们会创建一个类似问题的“向量”,这样我们就可以计算问题与在SQL数据库中找到的每个训练片段之间的“距离”,后端尝试将问题与您的训练数据匹配。一旦我们为问题和每个训练片段都有一个向量,剩下的就是简单的线性代数,通常在高中或大学教授。这其中大部分的数学知识自从毕达哥拉斯的时代以来就已经被人们熟知了…
这使我们能够将您的训练片段与提问的问题进行匹配,从而知道最终得到的训练数据与用户提问的问题相关。匹配的训练片段再次被连接成一个字符串,并与问题一起发送给OpenAI,同时“指导”ChatGPT使用我们提供的训练片段回答指定的问题。我们将这样的一批训练片段称为“上下文”,因为它为ChatGPT回答问题所需的上下文提供了支持。
实际上,我们并不要求ChatGPT回答问题,我们已经知道答案。我们只是简单地要求ChatGPT将我们已经有的答案“编译”成符合用户提问的句子和短语
我非常确信以上部分中有好几个42的笑话
如何避免AI幻觉
到目前为止,有经验的读者可能已经知道如何避免AI幻觉,甚至不需要我告诉你,但它就像是在ChatGPT中添加一条指令那样简单,指令可以是以下类似的内容:
如果您在指定的上下文中找不到我的问题的答案,请回答我:“对不起,我不知道答案,您能提供一些关键词吗?”
就是这么简单。我们只需礼貌地告诉ChatGPT,在没有包含答案的训练数据上下文中,不要回答。你可以从下图中看到,当我问我们的聊天机器人如何做意大利面时,它拒绝回答我,因为我们的训练数据中没有与烹饪意大利面相关的信息。
上述观点是,如果你询问 ChatGPT 如何煮意大利面,它会很高兴地为你提供数百种不同的食谱。因此,可以说我们的工作如下。
我们将ChatGPT变得更加简单,并教它一些额外的东西,结果就是它对我们未教授的内容一无所知。
这当然有一个好处,让ChatGPT对你希望它了解的任何主题都了如指掌,而对其他任何事情一无所知。这样完全消除了AI幻觉,导致ChatGPT无论你问什么,都不会产生幻觉,甚至不是理论上的……
结论
为了消除AI幻觉,您需要以下内容:
- 一个带有“训练数据”的VSS数据库
- 使用OpenAI的嵌入API将问题与训练片段进行匹配的能力
- 使用指令来约束ChatGPT,除非上下文提供答案,否则不回答问题
就这样。所以当别人告诉我“解决AI幻觉可能是不可能的”,无论那个人是谁,我都会笑一笑。我曾看过几个Sam Altman的采访,他声称AI幻觉无法解决。嗯,我们在6个月前就解决了,Sam…
抱歉,Sam,这里没有幻觉