❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发非常感兴趣,我会每日跟你分享最新的 AI 资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!

🥦 微信公众号|搜一搜:蚝油菜花 🥦

原文链接:https://mp.weixin.qq.com/s/MJJ662U3I0nIXiK36C_6_Q


🚀 快速阅读

  • 功能:自动优化 RAG 管道,支持多种模块组合评估。
  • 应用场景:适用于各种需要 RAG 管道优化的场景。
  • 优势:简化了 RAG 管道的评估和优化过程,提高了效率。

正文(附运行示例)

AutoRAG 是什么

AutoRAG-website.png

AutoRAG 是一款自动优化 RAG(Retrieval-Augmented Generation)管道的工具。RAG 管道结合了检索和生成模型,用于提高自然语言处理任务的性能。然而,找到适用于特定数据和用例的最佳 RAG 管道是一个复杂且耗时的过程。

AutoRAG 通过自动化评估各种 RAG 模块组合,帮助用户快速找到最优的 RAG 管道。

AutoRAG 的主要功能

  • 数据创建:支持解析、切分和生成 QA 数据集。
  • RAG 优化:自动评估和优化不同的 RAG 模块组合。
  • 部署:提供多种方式部署优化后的 RAG 管道,包括 API 服务器和 Web 界面。

AutoRAG 的技术原理

  • 数据创建
    • 解析:将原始文档转换为可处理的格式。
    • 切分:将解析后的文档切分成小片段。
    • 生成 QA:生成问题和答案对,用于评估 RAG 管道。
  • RAG 优化
    • 节点和模块:支持多种 RAG 模块,如检索器、提示生成器和生成器。
    • 评估指标:使用多种评估指标,如 F1 分数、召回率、MRR 和 ROUGE 等。
  • 部署
    • API 服务器:将优化后的 RAG 管道部署为 API 服务器。
    • Web 界面:提供用户友好的 Web 界面,方便用户使用。

如何运行 AutoRAG

安装 AutoRAG

我们推荐使用 Python 3.10 或更高版本。

pip install AutoRAG

如果你需要使用 GPU 版本:

pip install "AutoRAG[gpu]"

或者,如果你需要解析功能:

pip install "AutoRAG[gpu,parse]"

创建数据集

解析

设置 YAML 文件:

modules:
  - module_type: langchain_parse
    parse_method: pdfminer

开始解析:

from autorag.parser import Parser

parser = Parser(data_path_glob="your/data/path/*")
parser.start_parsing("your/path/to/parse_config.yaml")
切分

设置 YAML 文件:

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

开始切分:

from autorag.chunker import Chunker

chunker = Chunker.from_parquet(parsed_data_path="your/parsed/data/path")
chunker.start_chunking("your/path/to/chunk_config.yaml")
生成 QA

生成 QA 数据集:

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')

优化 RAG 管道

设置 YAML 文件

设置配置 YAML 文件:

node_lines:
- node_line_name: retrieve_node_line  # Set Node Line (Arbitrary Name)
  nodes:
    - node_type: retrieval  # Set Retrieval Node
      strategy:
        metrics: [retrieval_f1, retrieval_recall, retrieval_ndcg, retrieval_mrr]  # Set Retrieval Metrics
      top_k: 3
      modules:
        - module_type: vectordb
          vectordb: default
        - module_type: bm25
        - module_type: hybrid_rrf
          weight_range: (4,80)
- node_line_name: post_retrieve_node_line  # Set Node Line (Arbitrary Name)
  nodes:
    - node_type: prompt_maker  # Set Prompt Maker Node
      strategy:
        metrics:   # Set Generation Metrics
          - metric_name: meteor
          - metric_name: rouge
          - metric_name: sem_score
            embedding_model: openai
      modules:
        - module_type: fstring
          prompt: "Read the passages and answer the given question. \n Question: {query} \n Passage: {retrieved_contents} \n Answer : "
    - node_type: generator  # Set Generator Node
      strategy:
        metrics:  # Set Generation Metrics
          - metric_name: meteor
          - metric_name: rouge
          - metric_name: sem_score
            embedding_model: openai
      modules:
        - module_type: openai_llm
          llm: gpt-4o-mini
          batch: 16
运行 AutoRAG

评估 RAG 管道:

from autorag.evaluator import Evaluator

evaluator = Evaluator(qa_data_path='your/path/to/qa.parquet', corpus_data_path='your/path/to/corpus.parquet')
evaluator.start_trial('your/path/to/config.yaml')

或者使用命令行接口:

autorag evaluate --config your/path/to/default_config.yaml --qa_data_path your/path/to/qa.parquet --corpus_data_path your/path/to/corpus.parquet

运行仪表板

查看结果:

autorag dashboard --trial_dir /your/path/to/trial_dir

部署优化后的 RAG 管道

作为代码运行

从试验文件夹中使用优化后的 RAG 管道:

from autorag.deploy import Runner

runner = Runner.from_trial_folder('/your/path/to/trial_dir')
runner.run('your question')
作为 API 服务器运行

将优化后的 RAG 管道部署为 API 服务器:

import nest_asyncio
from autorag.deploy import ApiRunner

nest_asyncio.apply()

runner = ApiRunner.from_trial_folder('/your/path/to/trial_dir')
runner.run_api_server()

或者使用命令行:

autorag run_api --trial_dir your/path/to/trial_dir --host 0.0.0.0 --port 8000
作为 Web 界面运行

将优化后的 RAG 管道部署为 Web 界面:

autorag run_web --trial_path your/path/to/trial_path

资源


❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发非常感兴趣,我会每日跟你分享最新的 AI 资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!

🥦 微信公众号|搜一搜:蚝油菜花 🥦