
Ethan P • 2024-01-26
Tonic Validate x LlamaIndex: 为 LlamaIndex 实现集成测试
在此技术演练中,我们将重点介绍 Tonic Validate 的功能及其与 LlamaIndex 的集成。开始之前,请在此注册免费账户。
引言
随着企业持续采用生成式 AI 技术,公司正转向检索增强生成 (RAG) 系统,以将其大型语言模型 (LLM) 的应用扩展到私有数据(例如,一个可以基于内部技术文档回答问题的聊天机器人)。传统软件工程高度重视实现持续集成测试,以确保系统在更新后仍能保持高性能。最近,这些相同的原则也应用于生产环境中的机器学习模型。
然而,RAG 作为一项新兴技术,目前缺乏集成测试的最佳实践,以确保不会引入破坏性的更改到生产系统。在本文中,我们将演示如何使用 Tonic Validate 的 RAG 性能监控能力、LlamaIndex 和 GitHub Actions 创建新颖的集成测试,当 RAG 系统性能发生变化时向您发出警报。为简化操作,Tonic Validate 已原生集成到 LlamaIndex 的核心库中——您可以在此处阅读更多相关信息。
什么是 Tonic Validate?
Tonic Validate 是一个 RAG 基准测试和评估平台,用于监控生产环境中 RAG 系统的性能。它提供了衡量 RAG 系统每个组件性能的综合指标、用于比较系统随时间变化性能的可视化图表,以及创建基准问答集和审查 LLM 回复的工作流程。Tonic Validate 清楚地揭示了您的 RAG 系统的真实表现,从而实现对生产 RAG 系统进行持续的性能监控。您可以了解更多信息并注册免费账户。
设置 LlamaIndex
首先,让我们创建一个示例 RAG 系统进行测试。在这种情况下,LlamaIndex 提供了一个名为 create-llama
的工具,可以为我们生成一个全栈 RAG 应用。要安装它,我们需要确保已安装 Node.JS 并运行以下命令
npx create-llama@latest
此命令将引导您完成一系列提示。以下是每个提示的选项选择:
What is your project named? » llama-validate-demo
Which template would you like to use? » Chat without streaming
Which framework would you like to use? » FastAPI (Python)
Would you like to install dependencies automatically? » No
Which model would you like to use? » gpt-4–1106-preview
Which data source would you like to use? » Use an example PDF
Would you like to use a vector database? » No, just store the data in the file system
选择这些选项后,您的项目应在名为 llama-validate-demo
的文件夹中创建。对于此演示,我们将用我们自己的大型数据集替换 create-llama
提供的示例 PDF。该数据集包含 Paul Graham 博客上的随笔集合。这应该更接近公司在更大的内部数据集上运行 RAG 的真实场景。要添加这些随笔,请从我们的 Github 下载并将其解压缩到您创建的项目根文件夹中。确保解压后的文件夹名为 data
。请务必在复制新数据集之前删除文件夹中任何现有文件。
将随笔放入正确目录后,您可以通过设置环境变量 OPENAI_API_KEY
来设置您的 OpenAI API 密钥。您可以通过系统范围设置环境变量,或在 create-llama
项目的根文件夹中创建一个 .env
文件来实现。然后,您可以在 create-llama
项目的根文件夹中运行以下命令
poetry install
poetry shell
python app/engine/generate.py
这将安装依赖项并为 Paul Graham 的随笔生成 RAG 嵌入。之后,您可以使用以下命令运行聊天机器人:
python main.py
要测试聊天机器人,您可以通过 curl 发送请求:
curl - location 'localhost:8000/api/chat' \
- header 'Content-Type: application/json' \
- data '{ "messages": [{ "role": "user", "content": "In the early days, how were the Airbnb founders financing their startup?" }] }'
LlamaIndex 将返回一个响应:
{
"result": {
"role": "assistant",
"content": "In the early days, the Airbnb founders financed their startup by creating and selling themed breakfast cereals. They created limited-edition cereal boxes, such as \"Obama O's\" and \"Cap'n McCain's,\" during the 2008 U.S. presidential election, which became a collectible and helped them raise funds for their company. This creative approach to funding allowed them to sustain the business in its initial phase before securing more traditional forms of investment."
}
}
最后,在 llama-validate-demo/app/api/routers/chat.py
中,我们将聊天函数末尾的 return _Result
行替换为以下代码。
return _Result(
result=_Message(
role=MessageRole.ASSISTANT,
content=response.response,
context=[x.text for x in response.source_nodes]
)
)
这允许 LlamaIndex API 返回用于回答所提问的 RAG 上下文。现在,我们可以继续设置 Tonic Validate!
设置 Tonic Validate
要设置 Tonic Validate,首先通过 poetry 安装它
poetry add tonic-validate
现在,我们可以为 Tonic Validate 创建测试了。首先,在 llama-validate-demo/tests
文件夹中创建一个名为 validate_test.py
的文件。我们还需要创建测试问答对列表,您可以在此处找到。或者,您也可以使用 Tonic Validate UI 创建测试集并通过 SDK 调用它——我们将添加一个功能来帮助使用合成数据生成这些基准,使此过程更加简单。从链接下载 qa_pairs.json
文件并将其粘贴到 llama-validate-demo/tests
中。一旦我们有了这两个文件,就可以将以下代码添加到 validate_test.py
中。
import json
import os
from tonic_validate import ValidateApi
from tonic_validate.metrics import AnswerSimilarityMetric, RetrievalPrecisionMetric, AugmentationPrecisionMetric, AnswerConsistencyMetric
from llama_index.evaluation import TonicValidateEvaluator
import requests
from dotenv import load_dotenv
load_dotenv()
def get_llm_response(prompt):
url = "http://localhost:8000/api/chat"
payload = json.dumps({
"messages": [
{
"role": "user",
"content": prompt
}
]
})
headers = { 'Content-Type': 'application/json' }
response = requests.request("POST", url, headers=headers, data=payload).json()
result = response['result']
return result['content'], result['context']
此代码设置了依赖项导入,并指定了一个 get_llm_response
函数,该函数向我们之前设置的 LlamaIndex API 服务器发送请求以获取响应。现在,让我们创建一个函数来获取用于测试的 LlamaIndex 问题列表。
def get_q_and_a():
# Load qa_pairs.json
qa_pairs = json.load(open('./tests/qa_pairs.json'))
return ([x['question'] for x in qa_pairs], [x['answer'] for x in qa_pairs])
此函数从我们的 json 文件中获取问答对。问题是我们将向 RAG 系统提出的问题,答案是这些问题的正确答案。例如,如果问题是“法国的首都是哪里?”,那么答案将是“巴黎”。
接下来,我们可以添加查询 LlamaIndex 的代码
def get_responses(questions):
llm_answers = []
context_lists = []
for item in questions:
llm_answer, llm_context_list = get_llm_response(item)
llm_answers.append(llm_answer)
context_lists.append(llm_context_list)
return (llm_answers, context_lists)
此代码迭代问题,查询 LlamaIndex,并将每个响应记录到一个数组中。我们有两个数组。一个是来自 LlamaIndex 的实际答案。另一个是 LlamaIndex 提供的文本片段列表(称为上下文列表)列表,以帮助 LLM 回答问题。
现在我们有了从测试问题列表中生成的 LLM 响应列表。接下来对其进行评分:
def score_run(questions, context_lists, reference_answers, llm_answers):
metrics = [
AnswerSimilarityMetric(),
RetrievalPrecisionMetric(),
AugmentationPrecisionMetric(),
AnswerConsistencyMetric()
]
scorer = TonicValidateEvaluator(metrics, model_evaluator="gpt-4-1106-preview")
run = scorer.evaluate_run(
questions, llm_answers, context_lists, reference_answers
)
return run, metrics
我们首先需要定义要使用的 Tonic Validate 中的指标。您可以在此处找到可用指标及其定义的列表。创建指标后,我们可以利用 Tonic Validate 与 LlamaIndex 的集成。由于 Tonic Validate 作为评估器内置于 LlamaIndex 的评估框架中,我们只需创建一个 TonicValidateEvaluator
,它根据选定的指标对 LlamaIndex 的响应进行评分。然后,我们返回结果和指标。
最后,我们可以为 pytest 创建一个用于评估 LlamaIndex 的测试函数。
def test_llama_index():
questions, reference_answers = get_q_and_a()
llm_answers, context_lists = get_responses(questions)
run, metrics = score_run(questions, context_lists, reference_answers, llm_answers)
# Upload results to web ui
validate_api = ValidateApi()
# Get project id from env
project_id = os.getenv("PROJECT_ID")
validate_api.upload_run(project_id, run)
这会运行我们编写的所有代码以获取分数,然后将它们发送到 Tonic Validate 的 API 以在 UI 中进行可视化。为了将每次运行的指标发送到 UI,您需要注册一个免费账户,您可以在此处注册。我强烈建议利用 UI 来轻松可视化和监控性能变化。注册后,您将经历一个简短的入门过程,在此过程中您会创建 API 密钥和项目。API 密钥应存储在一个名为 TONIC_VALIDATE_API_KEY
的环境变量中,项目 ID 存储在一个名为 PROJECT_ID
的环境变量中。
设置好账户并配置好环境变量后,您可以通过以下命令运行测试:
poetry shell
pytest
如果指标得分过低,您还可以让测试失败。如果您想避免将破坏性更改引入生产 RAG 系统,这是一个很重要的步骤;例如,如果您更新了模型版本,并且答案相似度得分突然低于某个阈值,您可以让测试失败并发出警告以进行调试。
# Check none of the metrics scored too low
for metric in metrics:
if metric.name == AnswerSimilarityMetric.name:
assert run.overall_scores[metric.name] >= 3.5
else:
assert run.overall_scores[metric.name] >= 0.7
设置 GitHub Actions
配置好 LlamaIndex 和 Tonic Validate 后,我们能够将数据连接到 LLM 并测量 LLM 响应的准确性。您可以将此设置投入生产并获得一个功能齐全的聊天机器人。正如现代软件开发实践中常见的,您可能会继续修复 bug、进行改进以及向 RAG 系统添加新的数据或功能。在推送到生产环境之前,会进行 QA 测试来捕获任何可能引入意外影响的代码更改。例如,添加新的数据集或将 LLM 更新到新版本可能会导致响应质量发生变化。一种方法,也是我们推荐的方法,是使用 GitHub Actions 为您的 RAG 系统添加 QA 测试,通过 Tonic Validate 建立一个集成测试来检查您的 RAG 系统的 LLM 响应质量,使您能够在性能下降推送到生产环境之前捕获并纠正。
要设置 Tonic Validate 在 GitHub Actions 中运行,我们可以创建一个名为 llama-validate-demo/.github/workflows
的文件夹,并在其中创建一个名为 python-app.yml
的文件。在该文件中,我们将包含以下定义集成测试工作流的代码配置:
# This workflow will install Python dependencies and run tests with LlamaIndex
name: Python application
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
environment: Actions
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.11
uses: actions/setup-python@v3
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry
poetry config virtualenvs.create false
poetry install --no-root --no-dev --no-directory
- name: Set PYTHONPATH
run: echo "PYTHONPATH=$GITHUB_WORKSPACE" >> $GITHUB_ENV
- name: Set up vector index
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
python app/engine/generate.py
- name: Start up test server
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
MODEL: gpt-4-1106-preview
run: |
python main.py &
sleep 10
- name: Test with pytest
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
TONIC_VALIDATE_API_KEY: ${{ secrets.TONIC_VALIDATE_API_KEY }}
PROJECT_ID: ${{ secrets.PROJECT_ID }}
run: |
pytest
这配置了 GitHub 在每次提交时运行 Tonic Validate 中定义的测试。GitHub Actions 配置会下载仓库、设置依赖项、生成嵌入,然后启动测试服务器并运行测试。
设置好此文件后,我们只需在 GitHub 中设置密钥。在 GitHub 中,转到您仓库的 Settings > Secrets and variables > Actions
,创建一个名为 OPENAI_API_KEY
、TONIC_VALIDATE_API_KEY
和 PROJECT_ID
的密钥。这些值将与您之前设置的值相同。现在您的 GitHub Actions 设置已完成,您可以在开发过程中和推向生产环境之前主动监控您的 RAG 系统的变化。
尝试推送一些提交并观察其运行!要查看结果,请访问Tonic Validate 的 Web 应用并导航到您的项目。您应该会看到这样的视图,显示最近的指标及其随时间的演变:
现在您和您的团队可以跟踪您的 RAG 系统随时间的性能,以确保性能不会出现下滑!感谢您的阅读,请务必查看 Tonic Validate!
有关 Tonic Validate 的更多信息,请访问我们的网站并立即注册免费账户。您还可以访问我们的 GitHub页面,查看本文中使用的所有代码以及我们 SDK 的其余部分。我们的 LlamaIndex 集成可在此处获取。