跳转到内容

为 RAG 生成测试集

这份简单的指南将帮助您使用自己的文档为评估 RAG 管道生成一个测试集。

快速入门

让我们通过一个快速示例来演示如何为 RAG 管道生成测试集。之后,我们将探讨测试集生成管道的主要组成部分。

加载示例文档

在本教程中,我们将使用来自此代码仓库的示例文档。您可以将其替换为您自己的文档。

git clone https://hugging-face.cn/datasets/vibrantlabsai/Sample_Docs_Markdown

加载文档

现在,我们将使用 DirectoryLoader 从示例数据集中加载文档,这是 langchain_community 的文档加载器之一。您也可以使用 llama_index 的任何加载器。

pip install langchain-community
from langchain_community.document_loaders import DirectoryLoader

path = "Sample_Docs_Markdown/"
loader = DirectoryLoader(path, glob="**/*.md")
docs = loader.load()

选择您的 LLM

您可以选择使用任何您选择的 LLM

安装 langchain-openai 包

pip install langchain-openai

然后确保您已准备好 OpenAI 密钥并在您的环境中可用。

import os
os.environ["OPENAI_API_KEY"] = "your-openai-key"

将 LLM 包装在 LangchainLLMWrapper 中,以便它可以与 ragas 一起使用。

from ragas.llms import LangchainLLMWrapper
from langchain_openai import ChatOpenAI
from ragas.embeddings import OpenAIEmbeddings
import openai

generator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
openai_client = openai.OpenAI()
generator_embeddings = OpenAIEmbeddings(client=openai_client)

安装 langchain-aws 包

pip install langchain-aws

然后您必须设置您的 AWS 凭证和配置。

config = {
    "credentials_profile_name": "your-profile-name",  # E.g "default"
    "region_name": "your-region-name",  # E.g. "us-east-1"
    "llm": "your-llm-model-id",  # E.g "anthropic.claude-3-5-sonnet-20241022-v2:0"
    "embeddings": "your-embedding-model-id",  # E.g "amazon.titan-embed-text-v2:0"
    "temperature": 0.4,
}

定义您的 LLM 并将它们包装在 LangchainLLMWrapper 中,以便它们可以与 ragas 一起使用。

from langchain_aws import ChatBedrockConverse
from langchain_aws import BedrockEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper

generator_llm = LangchainLLMWrapper(ChatBedrockConverse(
    credentials_profile_name=config["credentials_profile_name"],
    region_name=config["region_name"],
    base_url=f"https://bedrock-runtime.{config['region_name']}.amazonaws.com",
    model=config["llm"],
    temperature=config["temperature"],
))
generator_embeddings = LangchainEmbeddingsWrapper(BedrockEmbeddings(
    credentials_profile_name=config["credentials_profile_name"],
    region_name=config["region_name"],
    model_id=config["embeddings"],
))

如果您想了解有关如何使用其他 AWS 服务的更多信息,请参阅 langchain-aws 文档。

Google 提供两种方式访问其模型:Google AI 和 Google Cloud Vertex AI。Google AI 只需要一个 Google 账户和 API 密钥,而 Vertex AI 则需要一个具有企业功能的 Google Cloud 账户。

首先,安装所需的包

pip install langchain-google-genai langchain-google-vertexai

然后根据您选择的 API 设置您的凭证

对于 Google AI

import os
os.environ["GOOGLE_API_KEY"] = "your-google-ai-key"  # From https://ai.google.dev/

对于 Vertex AI

# Ensure you have credentials configured (gcloud, workload identity, etc.)
# Or set service account JSON path:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path/to/service-account.json"

定义您的配置

config = {
    "model": "gemini-1.5-pro",  # or other model IDs
    "temperature": 0.4,
    "max_tokens": None,
    "top_p": 0.8,
    # For Vertex AI only:
    "project": "your-project-id",  # Required for Vertex AI
    "location": "us-central1",     # Required for Vertex AI
}

初始化 LLM 并将其包装起来以便与 ragas 一起使用

from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper

# Choose the appropriate import based on your API:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_google_vertexai import ChatVertexAI

# Initialize with Google AI Studio
generator_llm = LangchainLLMWrapper(ChatGoogleGenerativeAI(
    model=config["model"],
    temperature=config["temperature"],
    max_tokens=config["max_tokens"],
    top_p=config["top_p"],
))

# Or initialize with Vertex AI
generator_llm = LangchainLLMWrapper(ChatVertexAI(
    model=config["model"],
    temperature=config["temperature"],
    max_tokens=config["max_tokens"],
    top_p=config["top_p"],
    project=config["project"],
    location=config["location"],
))

您可以选择性地配置安全设置

from langchain_google_genai import HarmCategory, HarmBlockThreshold

safety_settings = {
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
    # Add other safety settings as needed
}

# Apply to your LLM initialization
generator_llm = LangchainLLMWrapper(ChatGoogleGenerativeAI(
    model=config["model"],
    temperature=config["temperature"],
    safety_settings=safety_settings,
))

初始化嵌入(embeddings)并将其包装起来以便与 ragas 一起使用

# Google AI Studio Embeddings
from langchain_google_genai import GoogleGenerativeAIEmbeddings

generator_embeddings = LangchainEmbeddingsWrapper(GoogleGenerativeAIEmbeddings(
    model="models/embedding-001",  # Google's text embedding model
    task_type="retrieval_document"  # Optional: specify the task type
))
# Vertex AI Embeddings
from langchain_google_vertexai import VertexAIEmbeddings

generator_embeddings = LangchainEmbeddingsWrapper(VertexAIEmbeddings(
    model_name="textembedding-gecko@001",  # or other available model
    project=config["project"],  # Your GCP project ID
    location=config["location"]  # Your GCP location
))

有关可用模型、功能和配置的更多信息,请参阅:Google AI 文档 - Vertex AI 文档 - LangChain Google AI 集成 - LangChain Vertex AI 集成

安装 langchain-openai 包

pip install langchain-openai

确保您已准备好 Azure OpenAI 密钥并在您的环境中可用。

import os
os.environ["AZURE_OPENAI_API_KEY"] = "your-azure-openai-key"

# other configuration
azure_config = {
    "base_url": "",  # your endpoint
    "model_deployment": "",  # your model deployment name
    "model_name": "",  # your model name
    "embedding_deployment": "",  # your embedding deployment name
    "embedding_name": "",  # your embedding name
}

定义您的 LLM 并将它们包装在 LangchainLLMWrapper 中,以便它们可以与 ragas 一起使用。

from langchain_openai import AzureChatOpenAI
from langchain_openai import AzureOpenAIEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
generator_llm = LangchainLLMWrapper(AzureChatOpenAI(
    openai_api_version="2023-05-15",
    azure_endpoint=azure_configs["base_url"],
    azure_deployment=azure_configs["model_deployment"],
    model=azure_configs["model_name"],
    validate_base_url=False,
))

# init the embeddings for answer_relevancy, answer_correctness and answer_similarity
generator_embeddings = LangchainEmbeddingsWrapper(AzureOpenAIEmbeddings(
    openai_api_version="2023-05-15",
    azure_endpoint=azure_configs["base_url"],
    azure_deployment=azure_configs["embedding_deployment"],
    model=azure_configs["embedding_name"],
))

如果您想了解有关如何使用其他 Azure 服务的更多信息,请参阅 langchain-azure 文档。

如果您正在使用其他 LLM 提供商并通过 LangChain 与其交互,您可以将您的 LLM 包装在 LangchainLLMWrapper 中,以便它可以与 ragas 一起使用。

from ragas.llms import LangchainLLMWrapper
generator_llm = LangchainLLMWrapper(your_llm_instance)

有关更详细的指南,请查看关于自定义模型的指南

如果您正在使用 LlamaIndex,您可以使用 LlamaIndexLLMWrapper 来包装您的 LLM,以便它可以与 ragas 一起使用。

from ragas.llms import LlamaIndexLLMWrapper
generator_llm = LlamaIndexLLMWrapper(your_llm_instance)

有关如何使用 LlamaIndex 的更多信息,请参阅 LlamaIndex 集成指南

如果您仍然无法将 Ragas 与您喜欢的 LLM 提供商一起使用,请在此 问题中评论告知我们,我们将为其添加支持 🙂。

生成测试集

现在我们将使用加载的文档和 LLM 设置来运行测试生成。如果您使用 llama_index 来加载文档,请改用 generate_with_llama_index_docs 方法。

from ragas.testset import TestsetGenerator

generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings)
dataset = generator.generate_with_langchain_docs(docs, testset_size=10)

分析测试集

一旦您生成了测试集,您会希望查看它并选择您认为适合包含在最终测试集中的查询。您可以将测试集导出为 pandas DataFrame 并对其进行各种分析。

dataset.to_pandas()

输出 testset

注意

生成合成测试数据可能令人困惑且困难,但如果您需要,我们很乐意为您提供帮助。我们已经为各种用例构建了生成测试数据的管道。如果您需要帮助,请通过预订时段与我们交谈,或给我们发邮件:founders@vibrantlabs.com

深入了解

现在我们已经了解了如何生成测试集,让我们仔细看看测试集生成管道的主要组成部分以及如何快速自定义它。

核心有两个主要操作用于生成测试集。

  1. 知识图谱创建:我们首先使用您提供的文档创建一个知识图谱(KnowledgeGraph),并使用各种转换(Transformations)来丰富知识图谱,增加额外信息,以便我们用于生成测试集。您可以从核心概念部分了解更多相关信息。
  2. 测试集生成:我们使用知识图谱(KnowledgeGraph)来生成一组场景(scenarios)。这些场景用于生成测试集(testset)。您可以从核心概念部分了解更多相关信息。

现在让我们看一个例子,看看这些组件是如何协同工作来生成测试集的。

创建知识图谱

让我们首先使用我们之前加载的文档创建一个知识图谱(KnowledgeGraph)

from ragas.testset.graph import KnowledgeGraph

kg = KnowledgeGraph()
输出
KnowledgeGraph(nodes: 0, relationships: 0)

然后将文档添加到知识图谱中。

from ragas.testset.graph import Node, NodeType

for doc in docs:
    kg.nodes.append(
        Node(
            type=NodeType.DOCUMENT,
            properties={"page_content": doc.page_content, "document_metadata": doc.metadata}
        )
    )
输出
KnowledgeGraph(nodes: 10, relationships: 0)

现在,我们将使用转换(Transformations)为知识图谱丰富额外信息。在这里,我们将使用 default_transforms 来创建一组默认的转换,并应用您选择的 LLM 和嵌入模型。但您也可以根据需要混合搭配转换或构建自己的转换。

from ragas.testset.transforms import default_transforms, apply_transforms


# define your LLM and Embedding Model
# here we are using the same LLM and Embedding Model that we used to generate the testset
transformer_llm = generator_llm
embedding_model = generator_embeddings

trans = default_transforms(documents=docs, llm=transformer_llm, embedding_model=embedding_model)
apply_transforms(kg, trans)

现在我们有了一个包含额外信息的知识图谱。您也可以保存该知识图谱。

kg.save("knowledge_graph.json")
loaded_kg = KnowledgeGraph.load("knowledge_graph.json")
loaded_kg

输出

KnowledgeGraph(nodes: 48, relationships: 605)

测试集生成

现在我们将使用 loaded_kg 来创建TestsetGenerator

from ragas.testset import TestsetGenerator

generator = TestsetGenerator(llm=generator_llm, embedding_model=embedding_model, knowledge_graph=loaded_kg)

我们还可以定义我们想要生成的查询的分布。这里我们使用默认分布。

from ragas.testset.synthesizers import default_query_distribution

query_distribution = default_query_distribution(generator_llm)

输出

[
    (SingleHopSpecificQuerySynthesizer(llm=llm), 0.5),
    (MultiHopAbstractQuerySynthesizer(llm=llm), 0.25),
    (MultiHopSpecificQuerySynthesizer(llm=llm), 0.25),
]

现在我们可以生成测试集了。

testset = generator.generate(testset_size=10, query_distribution=query_distribution)
testset.to_pandas()
输出 testset