评估数据创建教程

概述

为了评估RAG系统,我们需要数据,但在大多数情况下,我们拥有很少或没有令人满意的数据。

然而,随着大语言模型(LLM)的出现,生成合成数据已成为解决这一问题的有效方案之一。

以下指南介绍如何使用LLM生成AutoRAG可用的数据格式。


Data Creation

1. 解析

设置YAML文件

modules:
  - module_type: langchain_parse
    parse_method: pdfminer

您也可以同时使用多个解析模块。 不过在这种情况下,您需要为每个解析结果返回一个新的处理流程。

开始解析

只需几行代码即可解析您的原始文档。

from autorag.parser import Parser

parser = Parser(data_path_glob="your/data/path/*", project_dir="./parse_project_dir")
parser.start_parsing("your/path/to/parse_config.yaml")

然后你可以在./parse_project_dir目录中查看解析结果。

有关解析的更多详情,请参阅此处

2. 分块处理

设置YAML文件

modules:
  - module_type: llama_index_chunk
    chunk_method: Token
    chunk_size: 1024
    chunk_overlap: 24
    add_file_name: en

您也可以同时使用多个Chunk模块。 在这种情况下,您需要使用一个语料库创建问答数据,然后将其他语料库映射到问答数据集。

如果分块方法不同,retrieval_gt也会不同,因此我们需要将其重新映射到QA数据集。

开始分块处理

只需几行代码即可对解析结果进行分块处理。

from autorag.chunker import Chunker

chunker = Chunker.from_parquet(parsed_data_path="your/parsed/data/path", project_dir="./chunk_project_dir")
chunker.start_chunking("your/path/to/chunk_config.yaml")

然后你可以在./chunk_project_dir目录中查看分块结果。

有关分块的更多详情,请参阅此处

3. 问答生成

开始创建问答之前

语料库与问答集是一一对应的。 如果使用多种分块方法创建了多个语料库,每个语料库都需要有自己对应的问答数据集。

因此,如果您有多个语料库,需要先使用一个语料库创建初始问答集,然后为其余语料库重新映射问答集,从而创建多个问答集-语料库组合。

第3章(问答创建)描述了如何基于单一语料库创建初始问答集。 第4章(问答-语料库映射)描述了如何为剩余语料库重新映射问答集。

如果您仅使用一种分块方法创建语料库,则无需阅读第4章。 但如果您使用了多种分块方法创建语料库并希望进行分块优化,则应参考第4章。

开始创建问答

只需几行代码即可创建问答数据集。

import pandas as pd
from llama_index.llms.openai import OpenAI

from autorag.data.qa.filter.dontknow import dontknow_filter_rule_based
from autorag.data.qa.generation_gt.llama_index_gen_gt import (
    make_basic_gen_gt,
    make_concise_gen_gt,
)
from autorag.data.qa.schema import Raw, Corpus
from autorag.data.qa.query.llama_gen_query import factoid_query_gen
from autorag.data.qa.sample import random_single_hop

llm = OpenAI()
raw_df = pd.read_parquet("your/path/to/parsed.parquet")
raw_instance = Raw(raw_df)

corpus_df = pd.read_parquet("your/path/to/corpus.parquet")
corpus_instance = Corpus(corpus_df, raw_instance)

initial_qa = (
    corpus_instance.sample(random_single_hop, n=3)
    .map(
        lambda df: df.reset_index(drop=True),
    )
    .make_retrieval_gt_contents()
    .batch_apply(
        factoid_query_gen,  # query generation
        llm=llm,
    )
    .batch_apply(
        make_basic_gen_gt,  # answer generation (basic)
        llm=llm,
    )
    .batch_apply(
        make_concise_gen_gt,  # answer generation (concise)
        llm=llm,
    )
    .filter(
        dontknow_filter_rule_based,  # filter don't know
        lang="en",
    )
)

initial_qa.to_parquet('./qa.parquet', './corpus.parquet')

4. 问答 - 语料库映射

如果您拥有多个语料数据集,可以将剩余语料映射到问答数据集。

在分块优化方面,您可以使用不同的语料数据评估RAG性能。 您已经从初始问答数据中获得了最优流程, 因此可以利用该流程来评估不同语料数据下的RAG表现。

在此之前,您必须使用新的语料数据更新所有问答数据。 该方法使用update_corpus方法。

强烈建议您保留初始的QA实例。 如果不这样做,您需要从初始原始(已解析)数据和语料库数据重新构建QA实例。

from autorag.data.qa.schema import Raw, Corpus, QA

raw = Raw(initial_raw_df)
corpus = Corpus(initial_corpus_df, raw)
qa = QA(initial_qa_df, corpus)

new_qa = qa.update_corpus(Corpus(new_corpus_df, raw))

现在 new_qa 已为新语料库准备了新的 retrieval_gt 数据。

现在有了新的语料数据和新的问答数据集,您可以使用不同的语料数据评估RAG性能。