创建一个具有维基百科知识的LLaMa2代理

2023年09月28日 由 alex 发表 377 0

介绍


大型语言模型(LLM)是人工智能领域最热门的趋势之一。它们展示了令人印象深刻的文本生成能力,从与人类用户进行对话的能力到编写代码的能力。开源LLM的兴起,如LLama、Falcon、Stable Beluga等,使它们的潜力可以为广泛的人工智能社区所利用,这也要归功于它们专注于开发更小、更高效的硬件。


LLM成功的关键因素之一是在革命性的论文“<Attention Is All You Need>”中介绍的著名的Transformer架构。最先进的LLM令人印象深刻的性能是通过将该架构扩展到数十亿个参数并在包含数万亿个令牌的数据集上进行训练来实现的。这种预训练产生了强大的基础模型来理解人类语言,可以进一步微调到特定的用例。


大型语言模型的预训练以自监督的方式进行。它需要大量的文本语料库,但不需要人工标记。这使得将训练扩展到可以以自动化方式创建的大型数据集成为可能。在将输入文本转换为标记序列后,执行预训练,目的是预测序列中每个标记以所有先前标记为条件的概率。这样,在训练之后,模型就能够以迄今为止采样的所有标记为条件,每次采样一个标记来自回归地生成文本。大型语言模型已被证明仅通过这种预训练就能获得令人印象深刻的语言能力。然而,通过根据从训练数据中学习到的条件概率对令牌进行抽样采样。


通过基于人类反馈的强化学习(RLHF),在将LLM生成的文本与人类偏好对齐方面迈出了重要的一步。该技术是ChatGPT等最先进的聊天模型的核心。对于RLHF,在初始的自监督预训练阶段之后,使用强化学习算法对大型语言模型进行进一步微调,以最大化根据人类偏好校准的奖励。为了获得奖励函数,通常训练一个辅助模型来学习反映人类偏好的标量奖励。通过这种方式,强化学习阶段所需的实际人工标记数据量可以保持在最低限度。奖励模型的训练数据由生成的文本组成,这些文本由人类根据他们的偏好进行排名。该模型旨在预测排名较高的文本获得更高的奖励。以最大化反映人类偏好的奖励为目标来训练法学硕士,应该会产生更符合人类意图的文本。事实上,经过人类反馈强化学习的大型语言模型已经被证明可以更好地遵循用户指令,同时毒性更小,更真实。


检索增强生成


大型语言模型的一个典型缺点是它们是离线训练的,因此没有关于训练数据收集后发生的事件的信息。同样,他们不能使用训练数据中不存在的任何特定知识。这对于特定领域来说可能是有问题的,因为用于训练法学硕士的数据通常来自通用领域的语料库。规避这些问题而不需要昂贵的微调的一种方法是检索增强生成(Retrieval Augmented Generation, RAG)。RAG的工作原理是用外部文本信息增加提供给LLM的提示符。这通常是根据与当前提示符的相关性从外部数据源检索的。在实践中,作为第一步,这包括将提示符和外部文本转换为向量嵌入。后者可以通过汇集转换器编码器模型(如BERT)的输出来获得,该模型经过训练,可以根据合适的度量将具有相似含义的文本映射到彼此接近的嵌入。在长文本的情况下,它们可以被分割成单独嵌入的块,从而检索到最相关的段落。接下来,检索嵌入最接近提示嵌入的文本。经过适当的格式化后,提示符和检索到的文本的连接将作为语言模型的输入。


使用检索增强生成,模型可以访问在训练期间不可用的信息,并将其答案基于选定的文本语料库。RAG还可以检查模型用于回答的源,从而允许人类用户对模型输出进行更直接的评估。


在本文中,我将解释如何创建一个简单的代理,能够基于从Wikipedia检索到的内容来给出答案,以演示法学硕士寻找和使用外部信息的能力。根据用户的提示,该模型将在维基百科上搜索合适的页面,并根据页面内容给出答案。


添加了维基百科内容的Llama 2代理


在本节中,我将描述创建一个简单的Llama 2代理所需的步骤,该代理根据从Wikipedia检索到的信息回答问题。


1. 创建适当的查询来搜索维基百科上与用户问题相关的页面。


2. 从维基百科上找到的页面中检索与用户问题最相关的内容。


3. 从检索到的页面中提取与用户提示最相关的段落。


4. 根据页面的摘录回答用户的问题。


请注意,模型可以接收一个包含最相关页面的完整内容的提示,或者根据与用户提示的相关性排序的来自不同顶级页面的多个摘录。虽然这可以提高模型响应的质量,但它将增加所需的内存,因为它将不可避免地导致更长的提示。为了简单起见,并且为了在免费的Google Colab gpu上运行一个最小的示例,我限制代理只使用最相关文章的几个摘录。


现在让我们更详细地研究各个步骤。代理需要执行的第一步是创建一个合适的搜索查询,从Wikipedia检索包含回答用户提示的信息的内容。为了做到这一点,我们将提示Llama 2聊天模型,要求它返回代表用户提示的关键字。在讨论所使用的特定提示之前,我将简要回顾一下Llama 2聊天模型的一般提示格式。


在Llama 2聊天模型的训练过程中使用的模板具有以下结构:


<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]


{{系统提示}}指定聊天模型对后续提示的行为,并且可以用于调整模型响应以适应不同的任务。{{user_message}}是模型需要回答的用户提示。


回到获取维基百科搜索查询的问题,我们的代理将使用Llama 2模型,提示如下:


<s>[INST] <<SYS>>
You are an assistant returning text queries to search Wikipedia articles containing relevant information about the prompt. Write the queries and nothing else.
Example: [prompt] Tell me about the heatwave in Europe in summer 2023 [query] heatwave, weather, temperatures, europe, summer 2023.
<</SYS>>
[prompt] {prompt} [/INST] [query]


{prompt}将在生成之前被用户的输入所替换。作为系统提示的一部分提供的示例旨在利用模型的上下文学习功能。上下文学习指的是模型根据作为提示的一部分提供的几个演示示例解决新任务的能力。通过这种方式,模型可以了解到我们希望它提供与所提供的提示相关的关键字,在文本[query]后面用逗号分隔。后者用作分隔符,以区分示例中的提示和答案,并且对于从模型输出中提取查询也很有用。它已经作为输入的一部分提供,因此模型只需要生成它之后的内容。


从模型输出中获得查询后,将使用它们搜索Wikipedia并检索返回页面的元数据和文本。在本文附带的代码中,我使用了wikipedia包(这是一个简单的Python包,封装了MediaWiki API)来搜索和检索wikipedia中的数据。


从搜索结果中提取文本后,选择与原始用户提示最相关的页面。这将使检索到的信息与原始用户的提示重新对齐,从而潜在地消除由模型生成的搜索查询引起的分歧。为了做到这一点,用户的提示和搜索结果中的页面摘要都被嵌入并存储在矢量数据库中。然后检索与用户提示嵌入最接近的文章。我使用了句子转换器all-MiniLM-L6-v2模型作为嵌入模型,并使用了一个FAISS矢量数据库,由langchain包提供集成。


在从Wikipedia中找到相关页面后,由于将其全文添加到提示中可能需要大量内存(或超过上下文长度的模型令牌限制),我们的代理将找到最相关的摘录来增强提示。这是通过首先将页面的文本分割成块来实现的,然后,像以前一样,将它们嵌入到向量空间中,并检索最接近提示嵌入的文本。我再次使用all-MiniLM-L6-v2模型来嵌入块,并使用FAISS矢量数据库来存储和检索它们。


现在我们已经获得了从文章中检索到的段落,我们可以将它们与用户的提示结合起来,并将它们提供给Llama 2模型以获得答案。用于输入的模板如下所示:


<s>[INST] <<SYS>>
You are a helpful and honest assistant. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content.
You have retrieved the following extracts from the Wikipedia page {title}:
{extracts}.
You are expected to give truthful answers based on the previous extracts. If it doesn't include relevant information for the request just say so and don't make up false information.
<</SYS>>
{prompt} [/INST]


在生成之前,{prompt}被替换为用户提示,{title}被替换为维基百科页面的标题,{extract}被替换为提取的段落。还可以提供一些示例来再次利用模型的上下文学习功能,但这会使提示显着变长,从而增加内存需求。


现在,让我们检查模型是否能够通过从维基百科中提取训练期间不存在的最新信息来回答问题。下面的示例是使用最小的聊天版本LLaMa 2获得的,其中有70亿个参数在Google Colab免费层GPU上运行。


我给了模型如下提示:


prompt: "Tell me about the earthquake in Marrakesh"


该模型创建了以下查询来搜索维基百科:


"earthquake, Marrakesh, Morocco, recent earthquakes, seismic activity."


从最相关的页面中提取段落后,模型返回如下答案:


The earthquake that occurred in Marrakesh on September 8, 2023, was a
devastating event that caused widespread destruction and loss of life in
the region. According to the information provided on Wikipedia, the
earthquake had a moment magnitude of 6.8-6.9 and a maximum Mercalli
intensity of VIII (Severe), making it the strongest instrumentally recorded
earthquake in Morocco and the deadliest since the 1960 Agadir earthquake.
The earthquake's epicentre was located approximately 45 miles (73.4 km)
southwest of Marrakesh, near the town of Ighil and the Oukaïmeden ski
resort in the Atlas Mountains. The earthquake occurred as a result of
shallow oblique-thrust faulting beneath the mountain range. According to
the World Health Organization, around 300,000 people from Marrakesh and the
surrounding areas were affected by the earthquake, including 100,000
children. The earthquake resulted in at least 2,946 deaths, with most
occurring outside of Marrakesh. It is important to note that the
information provided on Wikipedia is based on available data and may not be
exhaustive or up-to-date. If you have any specific questions 


代理还返回元数据和用于其答案的页面摘录,允许用户检查其正确性,并通过阅读原始页面了解更多细节。下面是前一个答案的元数据


RETRIEVED WIKIPEDIA PAGE: 
title: 2023 Marrakesh–Safi earthquake 
url: https://en.wikipedia.org/wiki/2023_Marrakesh%E2%80%93Safi_earthquake
Retrieved extracts: 
Extract_0:Earthquake aftermath in Marrakesh and Moulay Brahim  Extract_1:.
Damage was widespread, and historic landmarks in Marrakesh were destroyed.
The earthquake was also felt in Spain, Portugal, and Algeria.It is the
strongest instrumentally recorded earthquake in Morocco, the deadliest in
the country since the 1960 Agadir earthquake and the second-deadliest
earthquake of 2023 after the Turkey–Syria earthquake. The World Health
Organization estimated about 300,000 people from Marrakesh and the
surrounding areas were affected, including 100,000 children  Extract_2:On 8
September 2023 at 23:11 DST (22:11 UTC), an earthquake with a moment
magnitude of 6.8–6.9 and maximum Mercalli intensity of VIII (Severe) struck
Morocco's Marrakesh–Safi region. The earthquake's epicentre was located
73.4 km (45.6 mi) southwest of Marrakesh, near the town of Ighil and the
Oukaïmeden ski resort in the Atlas Mountains. It occurred as a result of
shallow oblique-thrust faulting beneath the mountain range. At least 2,946
deaths were reported, with most occurring outside Marrakesh


结论


在本文中,我解释了如何创建一个简单的代理,它可以通过在维基百科上搜索来响应用户的提示,并根据检索到的页面给出答案。尽管它很简单,但即使是最小的Llama 27b模型,代理也能提供最新的准确答案。代理还返回用于生成答案的页面的摘录,允许用户检查模型提供的信息的正确性,并通过阅读完整的原始页面来了解更多细节。



文章来源:https://medium.com/towards-data-science/creating-a-llama-2-agent-empowered-with-wikipedia-knowledge-c048c7c63ef8
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消