类功能
功能描述
RAGEvaluator 类为检索增强生成(RAG)系统评测提供了统一接口,支持自定义评估指标,并可根据不同语言(如英文或中文)对评测提示词进行适配。
函数原型
from mx_rag.evaluate import RAGEvaluator RAGEvaluator(llm: LLM, embeddings: Embeddings)
输入参数说明
参数名 |
数据类型 |
可选/必选 |
说明 |
|---|---|---|---|
llm |
LLM |
必选 |
llm模块主要用于和大模型进行对话。 |
embeddings |
Embeddings |
必选 |
词嵌入模块评估时需要对用户问题进行向量化,必须是TextEmbedding或者TEIEmbedding的实例之一。 |
调用示例
from paddle.base import libpaddle
from langchain.text_splitter import TextSplitter
from langchain_community.document_loaders import TextLoader
from datasets import Dataset
from mx_rag.chain import SingleText2TextChain
from mx_rag.document import LoaderMng
from mx_rag.knowledge import KnowledgeDB
from mx_rag.knowledge.knowledge import KnowledgeStore
from mx_rag.retrievers import Retriever
from mx_rag.storage.document_store import SQLiteDocstore
from mx_rag.storage.vectorstore import MindFAISS
from mx_rag.knowledge.handler import upload_files
from mx_rag.evaluate import RAGEvaluator
from mx_rag.llm import Text2TextLLM, LLMParameterConfig
from mx_rag.utils import ClientParam
from mx_rag.embedding.local import TextEmbedding
class DoubleNewlineSplitter(TextSplitter):
"""Splitter that splits text by double newlines."""
def split_text(self, text):
return [chunk.strip() for chunk in text.split("\n") if chunk.strip()]
# 1. Register document loaders and splitters
loader_mng = LoaderMng()
loader_mng.register_loader(loader_class=TextLoader, file_types=[".txt"])
loader_mng.register_splitter(DoubleNewlineSplitter, [".txt"])
# 2. Initialize embedding, vector store, and databases
npu_device_id = 0
embeddings = TextEmbedding(
model_path="/path/to/bge-m3",
dev_id=npu_device_id,
)
vector_store = MindFAISS(
1024,
[npu_device_id],
load_local_index="./faiss.index",
)
chunk_store = SQLiteDocstore(db_path="./sql.db")
knowledge_store = KnowledgeStore(db_path="./sql.db")
# 3. Create knowledge base and upload documents
knowledge_store.add_knowledge(
knowledge_name="test",
user_id="Default",
role="admin",
)
knowledge_db = KnowledgeDB(
knowledge_store=knowledge_store,
chunk_store=chunk_store,
vector_store=vector_store,
knowledge_name="test",
user_id="Default",
white_paths=["/workspace"],
)
# 在sample_docs.txt中写入以下内容:
# 阿尔伯特·爱因斯坦提出了相对论,这一理论改变了我们对时间、空间和引力的理解。
# 玛丽·居里是一位物理学家和化学家,她进行了关于放射性的开创性研究,并两次获得诺贝尔奖。
# 艾萨克·牛顿阐述了运动定律和万有引力定律,为经典力学奠定了基础。
# 查尔斯·达尔文在其著作《物种起源》中介绍了通过自然选择进化的理论。
# 艾达·洛夫莱斯因其在查尔斯·巴贝奇的早期机械计算机“分析机”上的工作,而被认为是第一位计算机程序员。
upload_files(
knowledge=knowledge_db,
files=["/path/to/sample_docs.txt"],
loader_mng=loader_mng,
embed_func=embeddings.embed_documents,
force=True,
)
# 4. Setup retriever and LLM chain
text_retriever = Retriever(
vector_store=vector_store,
document_store=chunk_store,
embed_func=embeddings.embed_documents,
k=1,
score_threshold=0.3,
)
llm = Text2TextLLM(
base_url="https://ip:port/v1/chat/completions",
model_name="Llama3-8B-Chinese-Chat",
llm_config=LLMParameterConfig(temperature=0.1, top_p=0.8),
client_param=ClientParam(use_http=False),
)
text2text_chain = SingleText2TextChain(
llm=llm,
retriever=text_retriever,
)
# 5. Query and evaluate
sample_queries = [
"谁提出了相对论?",
"谁是第一位计算机程序员?",
"艾萨克·牛顿对科学有什么贡献?",
"谁因对放射性的研究而两次获得诺贝尔奖?",
"什么是自然选择进化论?"
]
expected_responses = [
"阿尔伯特·爱因斯坦提出了相对论,这一理论改变了我们对时间、空间和引力的理解。",
"艾达·洛夫莱斯因其在查尔斯·巴贝奇的早期机械计算机“分析机”上的工作,而被认为是第一位计算机程序员。",
"艾萨克·牛顿阐述了运动定律和万有引力定律,为经典力学奠定了基础。",
"玛丽·居里是一位物理学家和化学家,她进行了关于放射性的开创性研究,并两次获得诺贝尔奖。",
"查尔斯·达尔文在其著作《物种起源》中介绍了通过自然选择进化的理论。"
]
dataset = []
for query, reference in zip(sample_queries, expected_responses):
result = text2text_chain.query(query)
dataset.append(
{
'user_input': query,
'response': result['result'],
'retrieved_contexts': [doc["page_content"] for doc in result["source_documents"]],
'reference': reference
}
)
evaluation_dataset = Dataset.from_list(dataset)
evaluator = RAGEvaluator(llm=llm, embeddings=embeddings)
metrics = ["faithfulness","answer_relevancy", "context_precision", "context_recall"]
result = evaluator.evaluate(
metrics=metrics,
dataset=evaluation_dataset.to_dict(),
language="chinese"
)
print(result)
父主题: RAGEvaluator