如何在 LlamaIndex 中使用 UpTrain¶
问题:主要有两个问题
- 大多数大型语言模型训练所使用的数据并不能代表它们实际使用的数据。这导致训练和测试分布不匹配,可能导致性能不佳。
- 大型语言模型生成的结果并非总是可靠的。响应可能与提示不相关,可能与期望的语气或上下文不符,或者可能具有冒犯性等。
解决方案:以上两个问题由两种不同的工具解决,我们将向您展示如何将它们结合使用
- LlamaIndex 通过允许您使用根据自己的数据微调过的检索器来执行检索增强生成 (RAG),解决了第一个问题。这使您可以使用自己的数据微调检索器,然后使用该检索器执行 RAG。
- UpTrain 通过允许您对生成的响应进行评估,解决了第二个问题。这有助于您确保响应与提示相关,与期望的语气或上下文一致,并且不具有冒犯性等。
安装 UpTrain 和 LlamaIndex¶
%pip install -qU uptrain llama-index
Note: you may need to restart the kernel to use updated packages.
导入所需库¶
import httpx
import os
import openai
import pandas as pd
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from uptrain import Evals, EvalLlamaIndex, Settings as UpTrainSettings
/Users/dhruvchawla/Work/llama_index/venv/lib/python3.11/site-packages/lazy_loader/__init__.py:185: RuntimeWarning: subpackages can technically be lazily loaded, but it causes the package to be eagerly loaded even if it is already lazily loaded.So, you probably shouldn't use subpackages with this lazy feature. warnings.warn(msg, RuntimeWarning)
为查询引擎创建数据集文件夹¶
您可以使用您拥有的任何文档来执行此操作。在本教程中,我们将使用从维基百科提取的关于纽约市的数据。我们只会在文件夹中添加一个文档,但您可以根据需要添加任意数量的文档。
url = "https://uptrain-assets.s3.ap-south-1.amazonaws.com/data/nyc_text.txt"
if not os.path.exists("nyc_wikipedia"):
os.makedirs("nyc_wikipedia")
dataset_path = os.path.join("./nyc_wikipedia", "nyc_text.txt")
if not os.path.exists(dataset_path):
r = httpx.get(url)
with open(dataset_path, "wb") as f:
f.write(r.content)
创建查询列表¶
在生成响应之前,我们需要创建一个查询列表。由于查询引擎是基于纽约市的数据训练的,我们将创建一个与纽约市相关的查询列表。
data = [
{"question": "What is the population of New York City?"},
{"question": "What is the area of New York City?"},
{"question": "What is the largest borough in New York City?"},
{"question": "What is the average temperature in New York City?"},
{"question": "What is the main airport in New York City?"},
{"question": "What is the famous landmark in New York City?"},
{"question": "What is the official language of New York City?"},
{"question": "What is the currency used in New York City?"},
{"question": "What is the time zone of New York City?"},
{"question": "What is the famous sports team in New York City?"},
]
本 Notebook 使用 OpenAI API 生成提示文本并创建向量存储索引。因此,请将 openai.api_key 设置为您的 OpenAI API 密钥。
openai.api_key = "sk-************************" # your OpenAI API key
使用 LlamaIndex 创建查询引擎¶
让我们使用 LlamaIndex 创建一个向量存储索引,然后将其用作查询引擎来检索文档中的相关部分。
Settings.chunk_size = 512
documents = SimpleDirectoryReader("./nyc_wikipedia/").load_data()
vector_index = VectorStoreIndex.from_documents(
documents,
)
query_engine = vector_index.as_query_engine()
设置¶
UpTrain 为您提供
- 具有高级下钻和过滤选项的仪表板
- 对失败案例的见解和常见主题
- 可观测性和生产数据的实时监控
- 通过与您的 CI/CD 管道无缝集成进行回归测试
您可以使用以下两种方式通过 UpTrain 进行评估
方式 1:使用 UpTrain 开源软件 (OSS) 进行评估¶
您可以使用开源评估服务来评估您的模型。在这种情况下,您需要提供一个 OpenAI API 密钥。您可以在这里获取。
为了在 UpTrain 仪表板中查看您的评估结果,您需要在终端中运行以下命令进行设置
git clone https://github.com/uptrain-ai/uptrain
cd uptrain
bash run_uptrain.sh
这将在您的本地机器上启动 UpTrain 仪表板。您可以通过 http://localhost:3000/dashboard
访问它。
注意:project_name
将作为项目名称显示在 UpTrain 仪表板中进行评估的结果。
settings = UpTrainSettings(
openai_api_key=openai.api_key,
)
创建 EvalLlamaIndex 对象¶
现在我们已经创建了查询引擎,我们可以使用它来创建一个 EvalLlamaIndex 对象。该对象将用于为查询生成响应。
llamaindex_object = EvalLlamaIndex(
settings=settings, query_engine=query_engine
)
results = llamaindex_object.evaluate(
project_name="uptrain-llama-index",
evaluation_name="nyc_wikipedia", # adding project and evaluation names allow you to track the results in the UpTrain dashboard
data=data,
checks=[Evals.CONTEXT_RELEVANCE, Evals.RESPONSE_CONCISENESS],
)
100%|██████████| 10/10 [00:02<00:00, 3.94it/s] 100%|██████████| 10/10 [00:03<00:00, 3.12it/s]
pd.DataFrame(results)
问题 | 响应 | 上下文 | 上下文相关性得分 | 上下文相关性解释 | 响应简洁性得分 | 响应简洁性解释 | |
---|---|---|---|---|---|---|---|
0 | 纽约市的人口是多少? | 纽约市的人口是 8,804,190 ... | === 人口密度 ===\n\n2020 年,该市... | 无 | 无 | 无 | 无 |
1 | 纽约市的面积是多少? | 纽约市总面积为 468.484 平方... | 部分自然地形起伏已经... | 无 | 无 | 无 | 无 |
2 | 纽约市最大的行政区是哪个? | 皇后区是纽约市最大的行政区。 | ==== 布鲁克林 ====\n布鲁克林(国王县),或者... | 无 | 无 | 无 | 无 |
3 | 纽约市的平均气温是多少? | 纽约市的平均气温是 33... | 同样,读数 0 °F (−18 °C) 也... | 无 | 无 | 无 | 无 |
4 | 纽约市的主要机场是什么? | 约翰·F·肯尼迪国际机场 | 沿着东北走廊,以及长途... | 无 | 无 | 无 | 无 |
5 | 纽约市著名的地标是什么? | 纽约市著名的地标是... | 该定居点被命名为新阿姆斯特丹(荷兰语:...) | 无 | 无 | 无 | 无 |
6 | 纽约市的官方语言是什么? | 纽约市使用了多达 800 种语言... | === 口音和方言 ===\n\n纽约地区... | 无 | 无 | 无 | 无 |
7 | 纽约市使用什么货币? | 纽约市使用的货币是美元... | === 房地产 ===\n\n房地产是主要的... | 无 | 无 | 无 | 无 |
8 | 纽约市的时区是什么? | 东部标准时间 (EST) | 根据纽约市审计长的说法,世界... | 无 | 无 | 无 | 无 |
9 | 纽约市著名的运动队是什么? | 纽约市著名的运动队是... | ==== 足球 ====\n在足球方面,纽约市是... | 无 | 无 | 无 | 无 |
方式 2:使用 UpTrain 托管服务和仪表板进行评估¶
另外,您可以使用 UpTrain 的托管服务来评估您的模型。您可以在此处创建一个免费的 UpTrain 账户并获得免费试用积分。如果您想要更多试用积分,请在此处与 UpTrain 维护者预约通话。
使用托管服务的好处包括
- 无需在本地机器上设置 UpTrain 仪表板。
- 无需 LLMs 的 API 密钥即可访问许多 LLMs。
执行评估后,您可以在 UpTrain 仪表板 https://dashboard.uptrain.ai/dashboard
中查看结果
注意:project_name
将作为项目名称显示在 UpTrain 仪表板中进行评估的结果。
UPTRAIN_API_KEY = "up-**********************" # your UpTrain API key
# We use `uptrain_access_token` parameter instead of 'openai_api_key' in settings in this case
settings = UpTrainSettings(
uptrain_access_token=UPTRAIN_API_KEY,
)
创建 EvalLlamaIndex 对象¶
现在我们已经创建了查询引擎,我们可以使用它来创建一个 EvalLlamaIndex 对象。该对象将用于为查询生成响应。
llamaindex_object = EvalLlamaIndex(
settings=settings, query_engine=query_engine
)
results = llamaindex_object.evaluate(
project_name="uptrain-llama-index",
evaluation_name="nyc_wikipedia", # adding project and evaluation names allow you to track the results in the UpTrain dashboard
data=data,
checks=[Evals.CONTEXT_RELEVANCE, Evals.RESPONSE_CONCISENESS],
)
2024-01-23 18:36:57.815 | INFO | uptrain.framework.remote:log_and_evaluate:507 - Sending evaluation request for rows 0 to <50 to the Uptrain server
pd.DataFrame(results)
问题 | 响应 | 上下文 | 上下文相关性得分 | 上下文相关性解释 | 响应简洁性得分 | 响应简洁性解释 | |
---|---|---|---|---|---|---|---|
0 | 纽约市的人口是多少? | 纽约市的人口是 8,804,190 ... | 纽约,通常被称为纽约市或 NYC,是... | 1.0 | 问题询问纽约市的人口... | 1.0 | 问题询问纽约市的人口... |
1 | 纽约市的面积是多少? | 纽约市的面积为 468.484 平方英里... | 纽约,通常被称为纽约市或 NYC,是... | 1.0 | 步骤 1:问题询问纽约的面积... | 1.0 | 问题询问纽约市的面积... |
2 | 纽约市最大的行政区是哪个? | 皇后区是纽约市最大的行政区。 | ==== 布鲁克林 ====\n布鲁克林(国王县),或者... | 0.5 | 步骤 1:问题询问的是最大的... | 1.0 | 问题询问纽约市最大的行政区... |
3 | 纽约市的平均气温是多少? | 纽约市的平均气温是 57... | 同样,读数 0 °F (−18 °C) 也... | 0.5 | 问题询问平均气温... | 1.0 | 问题询问平均气温... |
4 | 纽约市的主要机场是什么? | 纽约市的主要机场是约翰·F·肯... | 沿着东北走廊,以及长途... | 1.0 | 问题是“纽约的主要机场是什么...” | 1.0 | 问题询问纽约的主要机场... |
5 | 纽约市著名的地标是什么? | 纽约市著名的地标是帝国大厦... | 创纪录的 6660 万游客访问了纽约... | 1.0 | 问题询问纽约著名的地标... | 1.0 | 问题询问纽约著名的地标... |
6 | 纽约市的官方语言是什么? | 纽约市的官方语言不是... | === 口音和方言 ===\n\n纽约地区... | 0.0 | 问题询问官方语言... | 0.0 | 问题询问纽约市的官方语言... |
7 | 纽约市使用什么货币? | 纽约市使用的货币是美元... | === 房地产 ===\n\n房地产是主要的... | 0.0 | 问题是“使用什么货币在... | 1.0 | 问题特别询问了货币... |
8 | 纽约市的时区是什么? | 东部标准时间 (EST) | 根据纽约市审计长的说法,世界... | 0.0 | 问题是“纽约的时区是什么... | 1.0 | 问题询问纽约的时区... |
9 | 纽约市著名的运动队是什么? | 纽约市著名的运动队是... | ==== 棒球 ====\n纽约被描述为... | 1.0 | 问题询问纽约著名的运动队... | 1.0 | 问题询问纽约著名的运动队... |