跳转到主要内容

介绍

LlamaIndex(GPT Index)提供了一个将大型语言模型(LLM)与外部数据连接起来的接口。LlamaIndex提供了各种数据结构来索引数据,如列表索引、向量索引、关键字索引和树索引。它提供了高级API和低级API——高级API允许您仅用五行代码构建问题解答(QA)系统,而低级API允许您定制检索和合成的各个方面。

然而,将这些系统投入生产需要仔细评估整个系统的性能,即给定输入的输出质量。检索增强生成的评估可能具有挑战性,因为用户需要针对给定的上下文提出相关问题的数据集。为了克服这些障碍,LlamaIndex提供了问题生成和无标签评估模块。

在本博客中,我们将讨论使用问题生成和评估模块的三步评估过程:

  • 从文档生成问题
  • 使用LlamaIndex QueryEngine抽象生成问题的答案/源节点,该抽象管理LLM和数据索引之间的交互。
  • 评估问题(查询)、答案和源节点是否匹配/内联

1.问题生成

应该注意的是,这种方法不需要地面实况标签。问题生成的目的是生成上下文输入的初始数据集,该数据集可用于评估问答系统。

LlamaIndex提供了DataGenerator类,该类使用ListIndex从给定文档中生成问题。默认情况下,它使用OpenAI ChatGPT(get-3.5-turbo)生成问题。

from llama_index.evaluation import DatasetGenerator
from llama_index import SimpleDirectoryReader

# Load documents
reader = SimpleDirectoryReader("./data")
documents = reader.load_data()

# Generate Question
data_generator = DatasetGenerator.from_documents(documents)
question = data_generator.generate_questions_from_nodes()

2.生成答案/源节点(上下文)

使用List Index,我们为响应对象中生成的问题生成答案和源节点。

from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, load_index_from_storage, StorageContext

# load documents
documents = SimpleDirectoryReader('./data').load_data()

# Create Index
index = GPTVectorStoreIndex.from_documents(documents)

# save index to disk
index.set_index_id("vector_index")
index.storage_context.persist('storage')

# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir='storage')
# load index
index = load_index_from_storage(storage_context, index_id="vector_index")

# Query the index
query_engine = index.as_query_engine(similarity_top_k=3)
response = query_engine.query(<Query>)

# Response object has both response and source nodes.

3.评估

评估模块可用于回答以下三个问题:

  1. 生成的响应和源节点(上下文)是否匹配?-响应+源节点(上下文)
  2. 是否生成响应、源节点(上下文)和查询匹配?-查询+响应+源节点(上下文)
  3. 检索到的源节点中的哪些源节点用于生成响应?-查询+响应+单个源节点(上下文)

评估可以通过查询、上下文和响应的某种组合来完成,并将它们与LLM调用相结合。

响应+源节点(上下文)

此函数回答了以下问题:生成的响应和源节点(上下文)是否匹配?

给定查询的响应对象返回响应和生成响应的源节点(上下文)。我们现在可以根据检索到的源来评估响应,而无需考虑查询!这允许您测量幻觉-如果响应与检索到的来源不匹配,这意味着模型可能“产生幻觉”了一个答案,因为它没有将答案植根于提示中提供给它的上下文中。

结果是一个二进制响应——“是/否”。

  • 是-响应节点和源节点(上下文)匹配。
  • 否-响应节点和源节点(上下文)不匹配。
from llama_index.evaluation import ResponseEvaluator

# build service context
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-4"))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

# Build index and get response object
...

# define evaluator
evaluator = ResponseEvaluator(service_context=service_context)

# evaluate using the response object
eval_result = evaluator.evaluate(response)

查询+响应+源节点(上下文)

此函数回答了以下问题:是否生成响应、源节点(上下文)和查询匹配?

通常使用“响应+源节点(上下文)”方法,生成的响应与源节点一致,但可能不是查询的答案。因此,将查询与响应和源节点一起考虑是进行更准确分析的好方法。

目标是确定响应+源上下文是否回答了查询。结果是一个二进制响应——“是/否”。

  • 是-查询、响应和源节点(上下文)匹配。
  • 否-查询、响应和源节点(上下文)不匹配。
from llama_index.evaluation import QueryResponseEvaluator

# build service context
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-4"))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

# Build index and get response object
...

# define evaluator
evaluator = QueryResponseEvaluator(service_context=service_context)

# evaluate using the response object
eval_result = evaluator.evaluate(query, response)

查询+响应+单个源节点(上下文)

此函数回答以下问题:检索到的源节点中的哪些源节点用于生成响应?

通常在现实世界中,源节点可以是来自不同文档的节点。在这些情况下,重要的是要了解哪些源节点是相关的,并向用户显示这些文档。这种评估模式将查看每个源节点,看看每个源节点是否包含查询的答案。

from llama_index.evaluation import QueryResponseEvaluator

# build service context
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-4"))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

# build index and get response object 
...

# define evaluator
evaluator = QueryResponseEvaluator(service_context=service_context)

# evaluate using the response object
eval_result = evaluator.evaluate_source_nodes(response)

谷歌Colab笔记本电脑,用于使用LlamaIndex评估QA系统-

结论

LlamaIndex为构建和评估QA系统提供了一个全面的解决方案,而无需地面实况标签。通过使用问题生成和评估模块,您可以确保您的系统准确可靠,使其适合生产环境。