LLama-指南:概述和高级概念

Image generated using Deepai

在不断变化的人工智能世界中,大型语言模型(LLMs)在自然语言处理方面引起了轰动。公司急于利用这些强大的模型来完成各种任务。

然而,一些任务,特别是那些需要专业知识和领域特定数据的任务,需要提供LLM初始学习过程中所使用的公开数据所无法满足的信息。传统的解决方案是使用新数据对LLM进行重新训练 - 这不仅需要大量资源,而且需要频繁更新以保持相关性。

这里是LLama-index的步骤,它是一个简化LLM应用程序构建并通过Retrieval-Augmented Generation(RAG)解决此挑战的工具。这种方法消除了大量重新训练的需要,可以动态地在不同的数据领域使用LLMs。

理解评估标准

RAG运作分为三个步骤:

  1. 检索:从各种可用来源收集相关数据。
  2. 上下文添加:将此数据作为上下文添加到初始查询中。
  3. LLM互动:向LLM呈现改进的查询。

简单来说,RAG涉及向LLM提供必要的知识来回答查询。

说明性用例:

案例1:想象一下被要求撰写一篇关于最近推出的产品的文章。如果求助于ChatGPT,您可能会最初遇到一个回复,表明它对该特定产品并不熟悉。

为了克服这个问题,使用RAG逻辑:

  • 检索数据:在Google上搜索产品,从文章和博客中收集相关信息。
  • 将检索到的数据融入查询:在您的ChatGPT提示中结构化地包含已收集的详细信息。例如,您可以以以下方式开始您的提示:“写一篇关于‘产品’的论文,考虑以下信息”,接着是检索到的数据。
  • 为ChatGPT提供全面查询:将您的精炼查询提交给ChatGPT。这样,ChatGPT就具备了上下文和具体信息,提高了生成更准确和知情的回答的可能性。

案例2:考虑构建一个应用程序,利用LLM来回答从一堆法律文件中获取的法律专业问题。而不是重新训练LLM以理解法律术语,可以使用LLama索引,无缝连接LLM并使用RAG来克服这个挑战。

考虑以下法律查询为例:“提供有关科技行业知识产权争议的最新案例的见解。”回答的逻辑将按照以下步骤进行:

  • 检索:从数据源中获取最近的与技术知识产权纠纷相关的法律文件。
  • 上下文增加:将此法律数据整合到查询中以获得更全面的提示。
  • LLM互动:向LLM呈现丰富的提示,生成详细的见解。

采用这种方法,对LLM应用程序来说,各种各样的用例变得明显。

现在,具备了对RAG的理解,接下来的部分将深入探讨RAG中的高级概念和关键阶段。其中包括使用llama-index对Twitter上的维基百科文章进行实施示范(可以通过此链接访问笔记本)。重要的是要注意,此示例的目标是提供它是如何工作的思路,因此在代码上重视理解概念,并且代码将是我即将发布的文章的重点。

RAG 阶段

RAG中的阶段包括数据加载、索引和存储,然后进行查询和评估。

加载中:这个阶段涉及从不同的数据源(例如文本文件,PDF,Excel或PowerPoint…)获取数据,准备数据,然后将其集成到您的数据流中。为了简化这个过程,Llama-index提供了广泛的连接器来支持不同类型的数据。

在以下单元格中,将下载和保存维基百科文章为.txt文件。随后,使用SimpleDirectoryReader加载该文件,该函数返回一个文档对象列表。

# Downloading the article and saving it in the `/data` directory.
from pathlib import Path
import requests
response = requests.get(
"https://en.wikipedia.org/w/api.php",
params={
"action": "query",
"format": "json",
"titles": 'Twitter',
"prop": "extracts",
# 'exintro': True,
"explaintext": True,
},
).json()
page = next(iter(response["query"]["pages"].values()))
wiki_text = page["extract"]

data_path = Path("data")
if not data_path.exists():
Path.mkdir(data_path)

with open(data_path / f"Twitter.txt", "w") as fp:
fp.write(wiki_text)
#  Loading files in `/data` directory. 
from llama_index import SimpleDirectoryReader

# this function will return a list of Document objects
documents = SimpleDirectoryReader("data").load_data()

索引:它指的是给各种数据提供一种演示方式,使其可以被搜索并快速访问相关信息。换句话说,它涉及创建一个允许查询数据的数据结构。

通过使用Llama-index,利用VectorStoreIndex可以实现这一点,如下面的代码片段所示。

from llama_index import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)

存储:在源数据是静态的并且在每次查询之前不需要更新的情况下,应该将生成的索引保存起来,以避免重新建立索引,这在某些情况下可能是耗时的。

在下面的代码片段中,生成的索引已经存储在数据目录中,然后重新加载以进行演示。

from llama_index import (
StorageContext,
load_index_from_storage,
)

index.storage_context.persist('data/index')
storage_context = StorageContext.from_defaults(persist_dir='data/index')
index = load_index_from_storage(storage_context)

查询:数据涉及将索引数据与大型语言模型(LLM)连接起来。这使用户可以通过提示模型与数据进行交互。随后,模型根据索引数据的信息生成回应。

在这个演示中,使用了OpenAI GPT-3.5-turbo模型。最初在没有索引的情况下进行提示,稍后再使用生成的索引,模型在第一次尝试中难以识别X。然而,在带有索引的第二次尝试中,它提供了准确的回答。

在下面的代码片段中,使用了OpenAI GPT-3.5-turbo模型。如示例所示,初始时没有提供索引,模型无法识别X。然而,在第二次尝试中,再次提供了索引,模型准确地作出了回应。

from llama_index.llms import OpenAI
llm=OpenAI(model='gpt-3.5-turbo')
from llama_index.llms import ChatMessage

messages = [
ChatMessage(role="user", content="tell me about the social media X"),
]
resp = llm.chat(messages)
print(resp)

输出:“社交媒体X是一个不存在于现实中的想象社交媒体平台。因此,关于它的特点、目的或用户群体,目前没有具体的信息可用…”

query_engine = index.as_query_engine(llm=llm)
response = query_engine.query("tell me about the soacial media X")
print(response)

输出:"X是一个之前被称为Twitter的社交媒体网站。它位于美国,是世界上最大的社交网络之一,拥有超过5亿用户。用户可以在平台上分享文本消息、图片和视频,称为“推文”..."

最后一阶段是评估它,这是衡量语言模型对查询的准确、忠实和迅捷响应的关键过程,从而为改进提供见解。

结论

本文旨在全面介绍LLama指数和检索增强生成(RAG)周围关键概念,展示这些方法如何简化基于大语言模型(LLM)的应用程序的开发。

预计下一步,即将发布的文章将深入探讨LLama-Index每个阶段的技术复杂性。从加载数据到查询和评估,深入研究实践方面将更加细致地了解如何在真实场景中实现这些概念。

如果您有任何问题或需要更多细节,请随时联系我或留下评论。您的反馈和咨询非常重要,我将提供任何您可能需要的额外信息或澄清。敬请期待下一篇文章,并感谢您与我一同探索这个旅程!

参考资料

Llama-index 文档:https://docs.llamaindex.ai/zh_CN/stable/

演示笔记本:https://github.com/iron8kid/llama-index-serie/

2024-01-02 04:18:24 AI中文站翻译自原文