昇腾社区首页
中文
注册

类功能

功能描述

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)