为检索器比较 Embeddings
检索器的表现是决定 Retrieval Augmented Generation(RAG)系统整体效果的关键且有影响力的因素。尤其是所用 embeddings 的质量,在决定检索内容质量方面起着核心作用。
本教程 notebook 逐步说明如何用 Ragas 库比较并为你自己的数据选择最合适的 embeddings。
比较 Embeddings
创建合成测试数据
提示
Ragas 也可以使用你的数据集。参见 数据准备,了解如何将你的数据集与 ragas 一起使用。
Ragas 提供独特的测试生成范式,能够创建专门针对你的检索与生成任务的评测数据集。与传统 QA 生成器不同,Ragas 可以从你的文档语料中生成各种各样有挑战性的测试用例。
提示
参见 testset generation 了解其工作原理。
在本教程 notebook 中,我使用 Semantic Scholar 上与 large language models 相关的论文来构建 RAG。
from llama_index.core import download_loader
from ragas.testset.evolutions import simple, reasoning, multi_context
from ragas.testset.generator import TestsetGenerator
from langchain_openai import ChatOpenAI
from ragas.embeddings import OpenAIEmbeddings
import openai
SemanticScholarReader = download_loader("SemanticScholarReader")
loader = SemanticScholarReader()
query_space = "large language models"
documents = loader.load_data(query=query_space, limit=100)
# generator with openai models
generator_llm = ChatOpenAI(model="gpt-4o-mini")
critic_llm = ChatOpenAI(model="gpt-4o")
openai_client = openai.OpenAI()
embeddings = OpenAIEmbeddings(client=openai_client)
generator = TestsetGenerator.from_langchain(
generator_llm,
critic_llm,
embeddings
)
distributions = {
simple: 0.5,
multi_context: 0.4,
reasoning: 0.1
}
# generate testset
testset = generator.generate_with_llamaindex_docs(documents, 100,distributions)
test_df = testset.to_pandas()
测试输出
test_questions = test_df['question'].values.tolist()
test_answers = [[item] for item in test_df['answer'].values.tolist()]
构建你的 RAG
这里我用 llama-index 和我的文档构建一个基础 RAG 流水线。目标是为流水线中的每个测试问题收集检索到的上下文和生成的答案。Ragas 与多种 RAG 框架有集成,用 ragas 评测它们会更容易。
注意
参见 langchain-tutorial 了解如何用 langchain 进行评测
import nest_asyncio
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from langchain.embeddings import HuggingFaceEmbeddings
from ragas.embeddings import OpenAIEmbeddings
import openai
import pandas as pd
nest_asyncio.apply()
def build_query_engine(embed_model):
vector_index = VectorStoreIndex.from_documents(
documents, service_context=ServiceContext.from_defaults(chunk_size=512),
embed_model=embed_model,
)
query_engine = vector_index.as_query_engine(similarity_top_k=2)
return query_engine
从 ragas 导入指标
这里我们导入评测检索器组件所需的指标。
from ragas.metrics import (
context_precision,
context_recall,
)
metrics = [
context_precision,
context_recall,
]
评测 OpenAI embeddings
from ragas.llama_index import evaluate
openai_model = OpenAIEmbedding()
query_engine1 = build_query_engine(openai_model)
result = evaluate(query_engine1, metrics, test_questions, test_answers)
{'context_precision': 0.2378, 'context_recall': 0.7159}
评测 Bge embeddings
from ragas.llama_index import evaluate
flag_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en-v1.5")
query_engine2 = build_query_engine(flag_model)
result = evaluate(query_engine2, metrics, test_questions, test_answers)
{'context_precision': 0.2655, 'context_recall': 0.7227}
比较分数
根据评测结果,在我自己的数据集上,BGE 模型的 context_precision 和 context_recall 指标在我的 RAG 流水线中略优于 OpenAI-Ada 模型。
若要进一步分析分数,可以将结果导出到 pandas
result_df = result.to_pandas()
result_df.head()
比较 Embeddings 结果