源文本的中文翻译如下:
关于项目
Tonic Validate 是一个用于评估LLM输出(如检索增强生成(RAG)管道)的框架。Validate 使得评估、跟踪和监控您的LLM和RAG应用变得容易。Validate 通过我们提供的指标,评估从答案正确性到LLM幻觉的一切。此外,Validate 还提供一个可选的UI,便于可视化您的评估结果,以便轻松跟踪和监控。
为RAG准备数据
高性能RAG系统的基础是高质量和安全的数据。高质量的数据确保检索和生成的信息准确、相关且可靠,从而提升系统的整体性能和用户信任。而安全性则保护这些宝贵数据免受泄露,确保敏感信息保持机密且不可篡改。两者共同构成了一个强大的RAG系统的基石,促进高效、可信的检索和生成。
我们很高兴地介绍 Tonic Textual,这是Tonic Validate的强大伴侣,能够帮助提升您的RAG系统性能。我们创建了Tonic Textual,以简化和增强RAG系统的数据预处理。只需几分钟,您就可以构建自动化的非结构化数据管道,从非结构化数据中提取文本,检测和去识别敏感信息,并将数据转换为优化RAG系统的格式。我们还通过文档元数据和上下文实体标签来丰富您的数据,构建语义实体图,确保您的RAG系统根植于真实,防止幻觉,并改善生成输出的整体质量。
您可以在此处了解更多信息并免费试用该工具。我们很想听听您的意见!
(返回顶部)
快速开始
这是一个关于如何在本地设置项目的示例。 要让本地副本启动并运行,请按照以下简单示例步骤操作。
-
安装 Tonic Validate
pip install tonic-validate
-
使用以下代码片段开始使用。
from tonic_validate import ValidateScorer, Benchmark import os os.environ["OPENAI_API_KEY"] = "your-openai-key" # 模拟从您的LLM获取响应和上下文的函数 # 用您的实际函数调用替换此处 def get_llm_response(question): return { "llm_answer": "巴黎", "llm_context_list": ["巴黎是法国的首都。"] } benchmark = Benchmark(questions=["法国的首都是哪里?"], answers=["巴黎"]) # 为每个问题和答案对评分 scorer = ValidateScorer() run = scorer.score(benchmark, get_llm_response)
此代码片段创建了一个包含一个问题和参考答案的基准测试,然后为答案打分。 提供参考答案并不是大多数指标所必需的(参见下方的指标表)。
(返回顶部)
CI/CD
许多用户发现在代码评审/pull request过程中运行评估非常有价值。 您可以使用上面的代码片段以及在我们的文档和此readme中找到的知识创建自己的自动化流程,或者您可以利用我们在Github Marketplace中提供的完全免费的Github Action。 列表在此处。 设置非常简单,但如果您有任何问题,只需在相应的仓库中创建一个问题即可。
(返回顶部)
用法
Tonic Validate 指标
指标用于评估您的LLM表现。Validate 提供了许多适用于大多数RAG系统的不同指标。您还可以通过提供您自己的 metric.py 实现来创建自己的指标。 要计算指标,您必须为其提供来自RAG应用程序的数据。下表显示了我们在Tonic Validate中提供的几个指标。有关我们指标的更多详细说明,请参阅我们的文档。
指标名称 | 输入 | 分数范围 | 它测量什么? |
---|---|---|---|
答案相似度分数 | 问题 参考答案 LLM答案 | 0到5 | 参考答案与LLM答案的匹配程度。 |
检索精度 | 问题 检索到的上下文 | 0到1 | 检索到的上下文是否与回答问题相关。 |
增强精度 | 问题 检索到的上下文 LLM答案 | 0到1 | 相关的上下文是否在LLM答案中。 |
增强准确度 | `检索到的上下文 |
参考答案
是什么:一个预先写好的答案,作为RAG应用程序回答问题的标准答案。
如何使用:您可以通过answers
参数将参考答案传递给Benchmark
。每个参考答案必须对应一个特定的问题。因此,如果参考答案是questions
列表中的第三个问题的答案,那么参考答案也必须是answers
列表中的第三项。 唯一需要参考答案的指标是答案相似度得分。
from tonic_validate import Benchmark
benchmark = Benchmark(
questions=["What is the capital of France?", "What is the capital of Germany?"]
answers=["Paris", "Berlin"]
)
LLM答案
是什么:RAG应用程序/LLM对问题的回答。
如何使用:您可以通过提供给Validate评估器的回调函数提供LLM答案。答案是元组响应中的第一个项目。
# 模拟从您的LLM获取响应和上下文的函数
# 将其替换为您的实际函数调用
def get_rag_response(question):
return {
"llm_answer": "Paris",
"llm_context_list": ["Paris is the capital of France."]
}
# 评估响应
scorer = ValidateScorer()
run = scorer.score(benchmark, ask_rag)
如果您不使用回调函数手动记录答案,也可以在创建LLMResponse
时通过llm_answer
提供LLM的答案。
from tonic_validate import LLMResponse
# 将响应保存到一个数组中以供评分
responses = []
for item in benchmark:
# llm_answer是LLM给出的答案
llm_response = LLMResponse(
llm_answer="Paris",
benchmark_item=item
)
responses.append(llm_response)
# 评估响应
scorer = ValidateScorer()
run = scorer.score_responses(responses)
检索到的上下文
是什么:RAG应用程序在回答特定问题时检索到的上下文。RAG应用程序将此上下文放入提示中,以帮助LLM回答问题。
如何使用:您可以通过提供给Validate评估器的回调函数提供LLM的检索上下文列表。上下文是元组响应中的第二个项目。检索到的上下文始终是一个列表。
# 模拟从您的LLM获取响应和上下文的函数
# 将其替换为您的实际函数调用
def get_rag_response(question):
return {
"llm_answer": "Paris",
"llm_context_list": ["Paris is the capital of France."]
}
# 评估响应
scorer = ValidateScorer()
run = scorer.score(benchmark, ask_rag)
如果您手动记录答案,也可以在创建LLMResponse
时通过llm_context_list
提供LLM的上下文列表。
from tonic_validate import LLMResponse
# 将响应保存到一个数组中以供评分
responses = []
for item in benchmark:
# llm_answer是LLM给出的答案
# llm_context_list是LLM用来回答问题的上下文列表
llm_response = LLMResponse(
llm_answer="Paris",
llm_context_list=["Paris is the capital of France."],
benchmark_item=item
)
responses.append(llm_response)
# 评估响应
scorer = ValidateScorer()
run = scorer.score_responses(responses)
运行时间
是什么:用于延迟指标,以测量LLM响应所花费的时间。
如何使用:如果您使用Validate评估器的回调函数,则此指标会自动为您计算。如果您手动创建LLM响应,则需要通过run_time
参数自己提供LLM的响应时间。
from tonic_validate import LLMResponse
# 将响应保存到一个数组中以供评分
responses = []
for item in benchmark:
run_time = # 表示LLM响应所花费的时间(秒)的浮点数
# llm_answer是LLM给出的答案
# llm_context_list是LLM用来回答问题的上下文列表
llm_response = LLMResponse(
llm_answer="Paris",
llm_context_list=["Paris is the capital of France."],
benchmark_item=item
run_time=run_time
)
responses.append(llm_response)
# 评估响应
scorer = ValidateScorer()
run = scorer.score_responses(responses)
(返回顶部)
使用指标进行评分
大多数指标是借助LLM进行评分的。Validate支持OpenAI和Azure OpenAI,但其他LLM也可以轻松集成(只需在此存储库中提交一个github issue请求)。
重要:设置OpenAI API Key进行评分
为了使用OpenAI,您必须提供一个OpenAI API Key。
import os
os.environ["OPENAI_API_KEY"] = "put-your-openai-api-key-here"
如果您已经在系统的环境变量中设置了OPENAI_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
使用Azure
如果您使用Azure,则需要设置AZURE_OPENAI_API_KEY
和AZURE_OPENAI_ENDPOINT
,而不是设置OPENAI_API_KEY
环境变量。AZURE_OPENAI_ENDPOINT
是您的Azure OpenAI部署的终端URL,AZURE_OPENAI_API_KEY
是您的API Key。
import os
os.environ["AZURE_OPENAI_API_KEY"] = "put-your-azure-openai-api-key-here"
os.environ["AZURE_OPENAI_ENDPOINT"] = "put-your-azure-endpoint-here"
使用Gemini
如果您已经在系统的环境变量中设置了GEMINI_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["GEMINI_API_KEY"] = "put-your-gemini-api-key-here"
注意:要使用Gemini,您的Python版本必须是3.9或更高。
使用Claude
如果您已经在系统的环境变量中设置了ANTHROPIC_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["ANTHROPIC_API_KEY"] = "put-your-anthropic-api-key-here"
使用Mistral
如果您已经在系统的环境变量中设置了MISTRAL_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["MISTRAL_API_KEY"] = "put-your-mistral-api-key-here"
使用Cohere
如果您已经在系统的环境变量中设置了COHERE_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["COHERE_API_KEY"] = "put-your-cohere-api-key-here"
使用Together AI
如果您已经在系统的环境变量中设置了TOGETHERAI_API_KEY
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["TOGETHERAI_API_KEY"] = "put-your-togetherai-api-key-here"
使用AWS Bedrock或AWS Sagemaker
如果您已经在系统的环境变量中设置了"AWS_SECRET_ACCESS_KEY
, AWS_ACCESS_KEY_ID
和AWS_REGION_NAME
,则可以跳过此步骤。否则,请在继续之前设置环境变量。
import os
os.environ["AWS_ACCESS_KEY_ID"]="put-your-aws-access-key-id-here"
os.environ["AWS_SECRET_ACCESS_KEY"]="put-your-aws-secret-access-key-here"
os.environ["AWS_REGION_NAME"]="put-your-aws-region-name-here"
设置Tonic Validate评估器
要使用指标,实例化一个ValidateScorer实例。
from tonic_validate import ValidateScorer
scorer = ValidateScorer()
默认的评分模型是GPT 4 Turbo。如需更换OpenAI模型,请将OpenAI模型名称传递给ValidateScorer
的model_evaluator
参数。您还可以通过一个指标数组传入自定义指标。
from tonic_validate import ValidateScorer
from tonic_validate.metrics import AnswerConsistencyMetric, AnswerSimilarityMetric
scorer = ValidateScorer([
AnswerConsistencyMetric(),
AugmentationAccuracyMetric()
], model_evaluator="gpt-3.5-turbo")
您还可以通过设置model_evaluator
参数为模型名称传入其他模型,如Google Gemini、Claude、Mistral、Cohere、Together AI和AWS Bedrock,具体如下:
scorer = ValidateScorer(model_evaluator="gemini/gemini-1.5-pro-latest")
scorer = ValidateScorer(model_evaluator="claude-3")
scorer = ValidateScorer(model_evaluator="mistral/mistral-tiny")
scorer = ValidateScorer(model_evaluator="command-r")
scorer = ValidateScorer(model_evaluator="together_ai/togethercomputer/Llama-2-7B-32K-Instruct")
scorer = ValidateScorer(model_evaluator="bedrock/your-bedrock-model")
如果在评分某项指标时发生错误,该指标的得分将被设为None
。如果您希望在评分时出现错误时让Tonic Validate抛出异常,请在构造函数中将fail_on_error
设置为True
。
scorer = ValidateScorer(fail_on_error=True)
重要:在Azure上使用评估器
如果您使用的是Azure,您必须将model_evaluator
参数设置为您的部署名称,具体如下:
scorer = ValidateScorer(model_evaluator="your-deployment-name")
重要:在AWS Sagemaker上使用评估器
如果您使用的是AWS Bedrock,您必须将model_evaluator
参数设置为您的终端名称,并将model_id
参数设置为您的模型名称,具体如下:
scorer = ValidateScorer(model_evaluator="your-endpoint-name", model_id="your-model-name")
运行评估器
在您用期望的指标实例化ValidateScorer
后,可以使用之前定义的回调函数对指标进行评分。
<SOURCE_TEXT>
from tonic_validate import ValidateScorer, ValidateApi
# 模拟从你的LLM获取响应和上下文的函数
# 将此替换为你的实际函数调用
def get_rag_response(question):
return {
"llm_answer": "巴黎",
"llm_context_list": ["巴黎是法国的首都。"]
}
# 评分响应
scorer = ValidateScorer()
run = scorer.score(benchmark, ask_rag)
使用手动日志记录运行评分器
如果你不想使用回调,你可以通过迭代基准手动记录你的答案,然后对答案进行评分。
from tonic_validate import ValidateScorer, LLMResponse
# 将响应保存到一个数组中以便评分
responses = []
for item in benchmark:
llm_response = LLMResponse(
llm_answer="巴黎",
llm_context_list=["巴黎是法国的首都"],
benchmark_item=item
)
responses.append(llm_response)
# 评分响应
scorer = ValidateScorer()
run = scorer.score_responses(responses)
(返回顶部)
查看结果
有两种方法查看运行结果。
选项1:打印输出结果
你可以通过如下的Python代码手动打印结果
print("总体评分")
print(run.overall_scores)
print("------")
for item in run.run_data:
print("问题: ", item.reference_question)
print("答案: ", item.reference_answer)
print("LLM答案: ", item.llm_answer)
print("LLM上下文: ", item.llm_context)
print("评分: ", item.scores)
print("------")
其输出如下
总体评分
{'answer_consistency': 1.0, 'augmentation_accuracy': 1.0}
------
问题: 法国的首都是哪里?
答案: 巴黎
LLM答案: 巴黎
LLM上下文: ['巴黎是法国的首都。']
评分: {'answer_consistency': 1.0, 'augmentation_accuracy': 1.0}
------
问题: 西班牙的首都是哪里?
答案: 马德里
LLM答案: 巴黎
LLM上下文: ['巴黎是法国的首都。']
评分: {'answer_consistency': 1.0, 'augmentation_accuracy': 1.0}
------
选项2:使用Tonic Validate UI(推荐,免费使用)
你可以通过将运行结果上传到我们的免费使用UI来轻松查看运行结果。这种方法的主要优势在于Tonic Validate UI为你的结果提供图表以及其他可视化功能。要注册UI,请访问这里。
一旦你注册了UI,你将通过一个入门教程来创建API Key和项目。
从入门教程中复制API Key和项目ID并将其插入到以下代码中
from tonic_validate import ValidateApi
validate_api = ValidateApi("your-api-key")
validate_api.upload_run("your-project-id", run)
这将把你的运行结果上传到Tonic Validate UI,你可以在那里查看结果。在主页上(如下所示),你可以查看随时间变化的评分变化。
你也可以在UI中查看单个运行的结果。
(返回顶部)
遥测
Tonic Validate收集最少的遥测数据,以帮助我们了解用户的需求以及他们如何使用产品。我们没有使用任何现有的遥测框架,而是创建了我们自己的隐私专注设置。仅追踪以下信息
- 运行中使用了哪些指标
- 运行中问题的数量
- 评估一个运行所花费的时间
- 基准中的问题数量
- 使用的SDK版本
我们不会追踪诸如问题/答案内容、你的分数或任何其他敏感信息。为了检测CI/CD,我们仅检查不同CI/CD环境中的常见环境变量。我们不记录这些环境变量的值。
我们还生成了一个随机的UUID,帮助我们了解有多少用户在使用该产品。该UUID仅与您的Validate帐户关联,以帮助追踪谁在同时使用SDK和UI,并获取用户数量。如果你想了解我们如何实现遥测,你可以在tonic_validate/utils/telemetry.py
文件中查看。
如果你希望退出遥测,只需将TONIC_VALIDATE_DO_NOT_TRACK
环境变量设置为True
。
(返回顶部)
常见问题
我可以使用哪些模型作为LLM评估器?
我们目前允许使用来自Open AI、Google、Anthropic等的聊天补全模型系列。我们一直在努力添加更多的模型到我们的评估器中。如果你有希望添加的模型,请对这个库提出问题。
我们希望添加更多的模型作为LLM评估器的选择,而不增加包的复杂性。
默认用于评分指标的模型是GPT 4 Turbo。要更改模型,请将模型名称传递给ValidateScorer
的model
参数
scorer = ValidateScorer([
AnswerConsistencyMetric(),
AugmentationAccuracyMetric()
], model_evaluator="gpt-3.5-turbo")
(返回顶部)
贡献
贡献使得开源社区成为一个令人惊叹的地方,在这里学习、激发和创造。你所做的任何贡献都将受到极大的感谢。
如果你有改进建议,请fork这个库并创建一个pull request。你也可以简单地打开一个带有“增强”标签的问题。 不要忘记为项目点赞!再次感谢!
- Fork该项目
- 创建你的功能分支 (
git checkout -b feature/AmazingFeature
) - 提交你的更改 (
git commit -m 'Add some AmazingFeature'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 打开一个Pull Request
(返回顶部)
许可证
根据MIT许可证分发。有关更多信息,请参阅LICENSE.txt
。
(返回顶部)
联系方式
(返回顶部)
</SOURCE_TEXT>