我们正处于一个激动人心的时代,人工智能的进步正在改变专业实践。
然而,2022年底ChatGPT的推出引发了创建人工智能助手的运动。
到2023年底,OpenAI推出GPT,将指令、附加知识和任务执行结合起来。
GPT为个人助理的梦想铺平了道路,现在看来这一梦想已经可以实现。对话式法学硕士代表了一种理想的人机界面形式。
要开发强大的人工智能助手,必须解决许多问题:模拟推理、避免幻觉以及增强使用外部工具的能力。
过去几个月里,我和我的两位长期合作伙伴Guillaume和Thomas一直在研究这个课题。
我在这里介绍我们的第一个原型SEO助手的开发过程。
我们的目标是创建一个能够实现以下功能的助手:
对于第一个任务,只要我们能够约束它们使用准确的信息,LLM就已经相当先进了。
关于规划的最后一点很大程度上仍然属于科幻小说的范畴。
因此,我们专注于使用RAG和GraphRAG方法以及外部API将数据集成到助手中。
我们将首先创建一个基于检索增强生成(RAG)方法的助手。
图片来自作者,2024年6月
为了构建此助手,我们将使用矢量数据库。有许多可用的数据库:Redis、Elasticsearch、OpenSearch、Pinecone、Milvus、FAISS等等。我们选择了LlamaIndex提供的矢量数据库作为我们的原型。
我们还需要一个语言模型集成(LMI)框架。该框架旨在将LLM与数据库(和文档)链接起来。这里也有很多选择:LangChain、LlamaIndex、Haystack、NeMo、Langdock、Marvin等。我们在项目中使用了LangChain和LlamaIndex。
一旦您选择了软件堆栈,实施就相当简单了。我们提供框架将其转换为对内容进行编码的向量的文档。
有许多技术参数可以改善结果。不过,像LlamaIndex这样的专业搜索框架本身表现就相当不错。
为了我们的概念验证,我们提供了一些法语SEO书籍和一些来自著名SEO网站的网页。
使用RAG可以减少幻觉并提高答案的完整性。您可以在下图中看到来自母语法学硕士和使用我们RAG的同一法学硕士的答案示例。
我们在这个例子中看到RAG给出的信息比单独LLM给出的信息更完整一些。
如果一个答案需要结合来自多个文档的多个信息,RAG方法可能就不奏效了。为了解决这个问题,我们对文本信息进行预处理,以提取其底层结构,即承载语义的结构。
这意味着要创建一个知识图谱,这是一种对图中实体之间的关系进行编码的数据结构。这种编码以主题-关系-对象三元组的形式完成。
在下面的例子中,我们有几个实体及其关系的表示。
图中描绘的实体有“水獭鲍勃”(命名实体),还有“河流”、“水獭”、“毛皮宠物”和“鱼”。关系在图的边缘上标明。
数据是结构化的,表明水獭鲍勃是一只水獭,水獭生活在河里,吃鱼,是毛皮宠物。知识图谱非常有用,因为它们允许推理:我可以从这张图中推断出水獭鲍勃是一只毛皮宠物!
构建知识图谱是一项使用NLP技术长期完成的任务。然而,LLM凭借其处理文本的能力,促进了此类图谱的创建。因此,我们将请LLM创建知识图谱。
当然,LMI框架可以有效地指导LLM完成这项任务。我们在项目中使用了LlamaIndex。
此外,当使用graphRAG方法时,我们的助手的结构变得更加复杂(见下图)。
我们稍后会回到工具API的集成,但对于其余部分,我们将看到RAG方法的元素以及知识图谱。请注意“提示处理”组件的存在。
这是助手代码的一部分,它首先将提示转换为数据库查询。然后,它通过从知识图谱输出中制作出人类可读的响应来执行逆向操作。
下图展示了我们用于提示处理的实际代码。您可以在此图中看到我们使用了NebulaGraph,这是首批部署GraphRAG方法的项目之一。
可以看出,题目相当简单。事实上,大部分工作都是由LLM完成的。LLM越好,结果就越好,但即使是开源LLM也能给出高质量的结果。
我们已将用于RAG的相同信息输入知识图谱。答案的质量是否更好?让我们看看同一个例子。
我让读者判断这里提供的信息是否比以前的方法更好,但我认为它更结构化和完整。然而,GraphRAG的缺点是获取答案的延迟(我稍后会再次谈论这个UX问题)。
至此,我们拥有了一个可以更准确地编写和传递知识的助手。但我们还希望让助手能够传递来自SEO工具的数据。为了实现这一目标,我们将使用LangChain使用自然语言与API进行交互。
这是通过向LLM解释如何使用给定API的函数来实现的。对于我们的项目,我们使用了工具babbar.tech的API(完整披露:我是开发该工具的公司的首席执行官。)
上图显示了助手如何收集有关给定URL的链接指标的信息。然后,我们在框架级别(此处为LangChain)指示该功能可用。
tools=[StructuredTool.from_function(get_babbar_metrics)]agent=initialize_agent(tools,ChatOpenAI(temperature=0.0,model_name="gpt-4"),agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,verbose=False,memory=memory)这三行代码将从上面的函数中设置一个LangChain工具,并初始化一个聊天室,用于根据数据制作答案。请注意,温度为零。这意味着GPT-4将输出直截了当的答案,没有任何创意,这更适合从工具中传递数据。
同样,LLM在这里完成了大部分工作:它将自然语言问题转换为API请求,然后从API输出返回自然语言。
您可以下载带有分步说明的JupyterNotebook文件,并在本地环境中构建GraphRAG对话代理。
实现上述代码后,您可以在Jupyter笔记本中使用下面的Python代码与新创建的代理进行交互。在代码中设置您的提示并运行它。
它使我们能够顺利地访问我们领域的所有知识,并且可以轻松地与最复杂的工具进行交互(谁从未抱怨过即使最好的SEO工具的GUI?)。
只剩下两个问题需要解决:答案的延迟和与机器人讨论的感觉。
这个问题只有几个解决方案:更多的硬件或等待我们正在使用的各种软件模块的改进。
第二个问题比较棘手。虽然LLM模拟了真人的语气和写作,但界面专有这一事实说明了一切。
这两个问题都可以通过一个巧妙的技巧来解决:使用一个众所周知的、主要由人类使用且通常存在延迟的文本界面(因为人类以异步方式使用)。
我们选择WhatsApp作为与SEO助理沟通的渠道。这是我们工作中最简单的部分,通过Twilio的消息传递API使用WhatsApp业务平台完成。
最终我们得到了一款名为VictorIA(这个名字结合了法国著名作家维克多·雨果的名字Victor和法语缩写IA,即人工智能)的SEO助手,如下图所示。
我们的工作只是一段激动人心的旅程的第一步。助手可以塑造我们领域的未来。GraphRAG(+API)推动了LLM的发展,使公司能够建立自己的LLM。
这些助手可以帮助新的初级合作者加入(减少他们向高级职员询问简单问题的需要)或为客户支持团队提供知识库。
我们已为有足够经验的人提供了源代码,可以直接使用。此代码的大多数元素都很简单,有关Babbar工具的部分可以跳过(或用其他工具的API替换)。
但是,了解如何设置Nebula图形存储实例(最好在本地设置)至关重要,因为在Docker中运行Nebula会导致性能不佳。此设置有文档说明,但乍一看似乎很复杂。
对于初学者,我们正在考虑很快制作一个教程来帮助您入门。