
如何用 trulens_eval 评估 RAG 应用的答案相关性、上下文相关性与 groundedness【免费下载链接】llm-cookbook面向开发者的 LLM 入门教程吴恩达大模型系列课程中文版项目地址: https://gitcode.com/GitHub_Trending/ll/llm-cookbook在 llm-cookbook 的选修课程《Building and Evaluating Advanced RAG Applications》第三章中课程给出了一条完整的操作路径对一个基于 LlamaIndex 句子窗口检索的 RAG 应用使用 trulens_eval 框架批量运行评估问题得到 RAG 三元组的三个指标——Answer Relevance回答与问题的相关性、Context Relevance召回上下文与问题的相关性、Groundedness回答是否由召回上下文支撑并通过记录表、Leaderboard 和 dashboard 查看结果。适用前提是你的评估对象是一个 LlamaIndex 的 query engine如句子滑窗检索引擎并且能调用 OpenAI或兼容第三方接口作为评估 LLM。准备环境与 API 密钥评估框架的安装命令已安装可跳过pip install trulens_eval课程目录下的 requirements.txt 锁定了配套版本其中与本教程直接相关的是trulens-eval0.18.1、llama-index0.9.8、openai1.3.5、nest-asyncio1.6.0、streamlit1.32.0。课程使用的 utils.py 还依赖python-dotenv文件头注释给出的安装方式是pip install python-dotenv。API 密钥有三种设置方式文档中均给出在环境变量中设置OPENAI_API_KEY然后用 utils 的get_openai_api_key()获取该函数通过load_dotenv(find_dotenv())读取.env显式赋值openai.api_key使用第三方服务时同时自定义openai.api_key和openai.api_base。评估用的问题与文档也放在课程目录中中文问题 data/eval_questions.txt5 个、英文问题 data/eval_questions_en.txt10 个对应语料为 data/人工智能.pdf 和data/eBook-How-to-Build-a-Career-in-AI.pdf。评估问题可以手写也可以按文档说明用 prompt seed 方法生成更多问题覆盖更多场景。搭建待评估的 RAG 应用trulens_eval 评估的是某个具体应用的调用链路所以先要有一个可运行的 RAG 引擎。课程用SimpleDirectoryReader读取 PDF再用\n\n把多页内容合并为一个Document而不是每页一个文档from llama_index import SimpleDirectoryReader, Document documents SimpleDirectoryReader( input_files[./data/人工智能.pdf] ).load_data() document Document(text\n\n.join([doc.text for doc in documents]))中文语料有一个必须做的预处理把全角标点替换为半角。文档给出的原因是SimpleDirectoryReader默认参数适合英文文档不处理中文标点会导致无法正确切分句子、影响 sentence_window 大小最终可能使输入长度超过 gpt-3.5-turbo 的最大限制。英文文档可跳过这一步document.text document.text.replace(。, . ) document.text document.text.replace(, ! ) document.text document.text.replace(, ? )然后建立句子窗口索引并生成检索引擎。这里有两处模型选择来自文档评估与生成用大模型gpt-3.5-turbotemperature0.1文档特别提醒该版本上下文窗口为 4096需要注意输入长度embedding 模型中文选local:BAAI/bge-small-zh-v1.5、英文选local:BAAI/bge-small-en-v1.5文档说明可根据场景需要和计算资源取舍模型大小与语种国内使用可切换 huggingface 镜像站。from utils import build_sentence_window_index, get_sentence_window_query_engine from llama_index.llms import OpenAI llm OpenAI(modelgpt-3.5-turbo, temperature0.1) sentence_index build_sentence_window_index( document, llm, embed_modellocal:BAAI/bge-small-zh-v1.5, save_dirsentence_index ) sentence_window_engine get_sentence_window_query_engine(sentence_index)build_sentence_window_index内部使用SentenceWindowNodeParser.from_defaults(window_size3, window_metadata_keywindow, original_text_metadata_keyoriginal_text)save_dir已存在时会直接从存储加载索引而不是重建重复运行可省去索引开销。get_sentence_window_query_engine的默认参数是similarity_top_k6、rerank_top_n2重排模型为BAAI/bge-reranker-base。跑单个问题做调试确认检索链路正常output sentence_window_engine.query(AI的核心问题和长远目标是什么) output.metadata文档示例的output.metadata会返回若干节点每个节点包含window句子窗口和original_text命中的原始句子两个字段文档说明在实际开发中可以通过查看 metadata 进行 debug。初始化 Tru 数据库并定义三个 feedback function先初始化 Tru 并重置数据库。该数据库之后用于存储问题、中间召回结果、答案以及评估结果from trulens_eval import Tru tru Tru() tru.reset_database()文档示例输出为 Tru initialized with db url sqlite:///default.sqlite . Secret keys may be written to the database. See the database_redact_keys option of Tru to prevent this.接下来初始化评估用的 provider。nest_asyncio.apply()是 dashboard 步骤的前置保证后续可以用 streamlit 做评估结果管理和可视化import nest_asyncio nest_asyncio.apply() from trulens_eval import OpenAI as fOpenAI # provider 用来辅助评估 answer relevance、context relevance、groundedness provider fOpenAI()Answer Relevance评估 RAG 输出是否与问题相关使用provider.relevance_with_cot_reasons作为评估函数即调用 LLM 以 chain of thought 方式评估on_input_output()表示在输入和输出上评估from trulens_eval import Feedback f_qa_relevance Feedback( provider.relevance_with_cot_reasons, nameAnswer Relevance ).on_input_output()运行后文档示例会打印两行自动绑定信息✅ In Answer Relevance, input prompt will be set to __record__.main_input or Select.RecordInput . ✅ In Answer Relevance, input response will be set to __record__.main_output or Select.RecordOutput .Context Relevance先选择评估对象——召回的上下文from trulens_eval import TruLlama import numpy as np context_selection TruLlama.select_source_nodes().node.text f_qs_relevance ( Feedback(provider.qs_relevance, nameContext Relevance) .on_input() .on(context_selection) .aggregate(np.mean) )aggregate(np.mean)的含义文档明确给出对context_selection中的每个句子分别评估然后取平均值作为最终结果。文档同时给出了一个可对比的替代评估方式——把provider.qs_relevance换成provider.qs_relevance_with_cot_reasons其余链式调用不变用于对比两种评估方式的效果。Groundedness评估输出是否基于召回的上下文使用Groundedness对象from trulens_eval.feedback import Groundedness grounded Groundedness(groundedness_providerprovider) f_groundedness ( Feedback(grounded.groundedness_measure_with_cot_reasons, nameGroundedness) .on(context_selection) .on_output() .aggregate(grounded.grounded_statements_aggregator) )运行后文档示例打印source 绑定到__record__.app.query.rets.source_nodes[:].node.textstatement 绑定到__record__.main_output与上面两个 feedback 的自动绑定信息一致。用 TruLlama 记录器批量评估把 query engine、应用 ID 和三个 feedback 交给TruLlama记录器from trulens_eval import TruLlama tru_recorder TruLlama( sentence_window_engine, app_idApp_1, feedbacks[ f_qa_relevance, f_qs_relevance, f_groundedness ] )app_id用于标识应用Leaderboard 中按它分组展示。然后读取评估问题并逐条请求 RAG 系统每次查询都会被记录并计算指标eval_questions [] with open(./data/eval_questions.txt, r) as file: for line in file: item line.strip() eval_questions.append(item) # 对于每个评估问题进行评估并记录结果 # 注意该过程可能会比较耗时请耐心等待 for question in eval_questions: with tru_recorder as recording: sentence_window_engine.query(question)课程为节约时间和 API 成本只放了 5 个中文问题并额外append了一个问题如何在人工智能领域获得成功。英文分支是可选路径为英文语料建立sentence_index_enembedding 用local:BAAI/bge-small-en-v1.5、创建tru_recorder_enapp_idApp_2然后用sentence_window_engine_en.query(question)循环评估eval_questions_en。查看评估结果三个入口记录表、Leaderboard、dashboard。记录表每个问题的输入、输出与三个指标records, feedback tru.get_records_and_feedback(app_ids[]) # 将记录中的unicode转换成中文方便查看 def decode_unicode(s): return s.encode(ascii).decode(unicode-escape) records[input] records[input].apply(decode_unicode) records[output] records[output].apply(decode_unicode) import pandas as pd pd.set_option(display.max_colwidth, None) display(records[[input, output]] feedback)文档示例输出的记录表中每条记录一行包含问题、答案以及Answer Relevance、Context Relevance、Groundedness三列分数例如第一行示例为 0.8 / 0.85 / 1.000000以上均为文档示例数值不代表固定预期。表中还会出现NaN文档示例里有若干记录的 Context Relevance 或 Groundedness 为空表示该条评估未产生分数记录表还附带Answer Relevance_calls、Context Relevance_calls、Groundedness_calls等调用明细列可用于追溯每个分数对应的评估调用。Leaderboard按应用汇总tru.get_leaderboard(app_ids[])文档示例输出按app_id分组汇总每个应用的三项指标平均分以及latency、total_cost例如App_1的示例汇总为 Groundedness 0.779167、Answer Relevance 0.916667、Context Relevance 0.766667文档示例数值。dashboard 中的 App Leaderboard 页面即基于同一份数据展示Dashboard交互式查看# 注意请检查端口是否被占用如果被占用请修改端口号 tru.run_dashboard()文档示例输出为Starting dashboard ...随后 dashboard 在本地地址启动。限制与注意点中文语料必须先做全角转半角处理否则句子窗口切分会受影响可能超出 gpt-3.5-turbo4096 上下文窗口的输入限制。评估过程逐条调用 LLM 计算指标文档明确提示该过程可能会比较耗时请耐心等待问题数量直接决定成本与时间。索引目录如sentence_index一旦生成会被持久化再次运行时直接加载已有索引不会重建。tru.reset_database()会重置存储问题、召回结果与评估结果的数据库重复实验前调用可以清空历史。评估结果由 LLM 打分得到文档的表述是人工打分最准确但成本高使用 gpt-3.5-turbo 自动评估可以快速低成本地评估但结果可能不如人工打分准确。完整可运行代码见 3.评估RAG应用的指标 RAG Traid of Metrics.ipynb评估与检索封装函数见 utils.py。【免费下载链接】llm-cookbook面向开发者的 LLM 入门教程吴恩达大模型系列课程中文版项目地址: https://gitcode.com/GitHub_Trending/ll/llm-cookbook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考