类功能
功能描述
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