Skip to content

代理或工具使用

代理或工具使用的工作流程可以在多个维度上进行评估。以下是一些可用于评估代理或工具在给定任务中性能的指标。

主题一致性

部署在实际应用中的AI系统在与用户交互时,应遵守感兴趣的领域,但大型语言模型有时可能会忽略这一限制而回答一般性问题。主题一致性指标评估AI在交互过程中保持在预定义领域内的能力。这一指标在对话式AI系统中尤为重要,AI应仅提供与预定义领域相关的查询帮助。

TopicAdherenceScore需要预定义一组AI系统应遵守的主题,这些主题通过reference_topicsuser_input一起提供。该指标可以计算主题一致性的精确度、召回率和F1分数,定义如下:

\[ \text{Precision } = {|\text{回答的查询且符合任何现有参考主题}| \over |\text{回答的查询且符合任何现有参考主题}| + |\text{回答的查询且不符合任何现有参考主题}|} \]
\[ \text{Recall } = {|\text{回答的查询且符合任何现有参考主题}| \over |\text{回答的查询且符合任何现有参考主题}| + |\text{拒绝的查询且本应回答}|} \]
\[ \text{F1 Score } = {2 \times \text{Precision} \times \text{Recall} \over \text{Precision} + \text{Recall}} \]

示例

from ragas.dataset_schema import  SingleTurnSample, MultiTurnSample, EvaluationDataset
from ragas.messages import HumanMessage,AIMessage,ToolMessage,ToolCall
from ragas.metrics import TopicAdherenceScore


sample_input_4 = [
HumanMessage(content="你能提供关于爱因斯坦相对论的详细信息吗?"),
AIMessage(content="当然,让我为你检索相关信息。", tool_calls=[
    ToolCall(name="document_search", args={"query": "爱因斯坦的相对论"})
]),
ToolMessage(content="找到相关文档:1. 相对论:狭义与广义理论,2. 爱因斯坦的广义相对论。"),
AIMessage(content="我找到了一些关于爱因斯坦相对论的文档。你想了解哪一个:'相对论:狭义与广义理论'还是'爱因斯坦的广义相对论'?"),
HumanMessage(content="告诉我关于'广义相对论'的内容。"),
AIMessage(content="明白了!让我从'爱因斯坦的广义相对论'中获取更多细节。", tool_calls=[
    ToolCall(name="document_retrieve", args={"document": "爱因斯坦的广义相对论"})
]),
ToolMessage(content="该文档讨论了引力如何影响时空结构,描述了质量与时空曲率之间的关系。"),
AIMessage(content="'广义相对论'解释了引力如何影响时空结构以及质量与时空曲率之间的关系。你还需要更多细节或特定解释吗?"),
HumanMessage(content="不用了,这很完美。顺便问一下,你知道有什么好的巧克力蛋糕食谱吗?"),
AIMessage(content="当然!让我找一个简单又美味的巧克力蛋糕食谱。", tool_calls=[
    ToolCall(name="recipe_search", args={"query": "巧克力蛋糕食谱"})
]),
ToolMessage(content="这里有一个受欢迎的巧克力蛋糕食谱:成分包括面粉、糖、可可粉、鸡蛋、牛奶和黄油。说明:混合干性成分,加入湿性成分,并在350°F下烘烤30-35分钟。"),
AIMessage(content="我找到了一个很棒的巧克力蛋糕食谱!你需要完整的细节,还是这个总结就够了?")
]


sample = MultiTurnSample(user_input=sample_input_4, reference_topics=["科学"])
scorer = TopicAdherenceScore(mode="precision")
scorer.llm = openai_model
await scorer.multi_turn_ascore(sample)

要将模式更改为召回率,请将mode参数设置为recall

scorer = TopicAdherenceScore(mode="recall")

工具调用准确性

ToolCallAccuracy是一个用于评估大型语言模型在识别和调用完成给定任务所需工具的性能的指标。该指标需要user_inputreference_tool_calls来评估大型语言模型在识别和调用完成给定任务所需工具的性能。该指标通过比较reference_tool_calls与AI调用的工具来计算。数值范围在0到1之间,数值越高表示性能越好。

from ragas.dataset_schema import  MultiTurnSample
from ragas.messages import HumanMessage,AIMessage,ToolMessage,ToolCall
from ragas.metrics import ToolCallAccuracy


sample = [
    HumanMessage(content="纽约现在的天气怎么样?"),
    AIMessage(content="纽约当前的温度是75°F,局部多云。", tool_calls=[
        ToolCall(name="weather_check", args={"location": "New York"})
    ]),
    HumanMessage(content="你能把它转换成摄氏度吗?"),
    AIMessage(content="让我为你转换成摄氏度。", tool_calls=[
        ToolCall(name="temperature_conversion", args={"temperature_fahrenheit": 75})
    ]),
    ToolMessage(content="75°F大约是23.9°C。"),
    AIMessage(content="75°F大约是23.9°C。")
]

sampl2 = MultiTurnSample(
    user_input=sample,
    reference_tool_calls=[
        ToolCall(name="weather_check", args={"location": "New York"}),
        ToolCall(name="temperature_conversion", args={"temperature_fahrenheit": 75})
    ]
)

scorer = ToolCallAccuracy()
await metric.multi_turn_ascore(sample)
reference_tool_calls中指定的工具调用顺序被用作理想结果。如果AI进行的工具调用不符合reference_tool_calls的顺序或序列,该指标将返回0分。这有助于确保AI能够识别并按正确顺序调用所需工具以完成给定任务。

默认情况下,工具名称和参数通过精确字符串匹配进行比较。但有时这可能不是最佳选择,例如当参数是自然语言字符串时。你也可以使用任何ragas指标(0到1之间的值)作为距离度量来判断检索到的上下文是否相关。例如:

from ragas.metrics._string import NonLLMStringSimilarity
from ragas.metrics._tool_call_accuracy import ToolCallAccuracy

metric = ToolCallAccuracy()
metric.arg_comparison_metric = NonLLMStringSimilarity()

代理目标准确性

代理目标准确性是一种用于评估LLM在识别和实现用户目标方面表现的指标。这是一个二元指标,1表示AI实现了目标,0表示AI未实现目标。

有参考

计算AgentGoalAccuracyWithReference需要user_inputreference来评估LLM在识别和实现用户目标方面的表现。注释的reference将被用作理想结果。该指标通过比较reference与工作流结束时实现的目标来计算。

from ragas.dataset_schema import  MultiTurnSample
from ragas.messages import HumanMessage,AIMessage,ToolMessage,ToolCall
from ragas.metrics import AgentGoalAccuracyWithReference


sample = MultiTurnSample(user_input=[
    HumanMessage(content="嘿,为晚上8点在最近的最好的中餐馆预订一张桌子"),
    AIMessage(content="当然,让我为你找到最佳选项。", tool_calls=[
        ToolCall(name="restaurant_search", args={"cuisine": "Chinese", "time": "8:00pm"})
    ]),
    ToolMessage(content="找到了几个选项:1. 金龙,2. 翡翠宫"),
    AIMessage(content="我找到了一些很棒的选项:金龙和翡翠宫。你更喜欢哪一个?"),
    HumanMessage(content="我们去金龙吧。"),
    AIMessage(content="好选择!我将为晚上8点在金龙预订一张桌子。", tool_calls=[
        ToolCall(name="restaurant_book", args={"name": "Golden Dragon", "time": "8:00pm"})
    ]),
    ToolMessage(content="晚上8点在金龙的桌子已预订。"),
    AIMessage(content="你在金龙的桌子已预订在晚上8点。祝你用餐愉快!"),
    HumanMessage(content="谢谢"),
],
    reference="晚上8点在一家中餐馆预订了桌子")

scorer = AgentGoalAccuracyWithReference()
await metric.multi_turn_ascore(sample)

无参考

AgentGoalAccuracyWithoutReference在没有参考的情况下工作,该指标将评估LLM在识别和实现用户目标方面的表现,而无需任何参考。这里期望的结果是从工作流中的人类交互中推断出来的。

示例

from ragas.dataset_schema import  MultiTurnSample
from ragas.messages import HumanMessage,AIMessage,ToolMessage,ToolCall
from ragas.metrics import AgentGoalAccuracyWithoutReference


sample = MultiTurnSample(user_input=[
    HumanMessage(content="嘿,为晚上8点在最近的最好的中餐馆预订一张桌子"),
    AIMessage(content="当然,让我为你找到最佳选项。", tool_calls=[
        ToolCall(name="restaurant_search", args={"cuisine": "Chinese", "time": "8:00pm"})
    ]),
    ToolMessage(content="找到了几个选项:1. 金龙,2. 翡翠宫"),
    AIMessage(content="我找到了一些很棒的选项:金龙和翡翠宫。你更喜欢哪一个?"),
    HumanMessage(content="我们去金龙吧。"),
    AIMessage(content="好选择!我将为晚上8点在金龙预订一张桌子。", tool_calls=[
        ToolCall(name="restaurant_book", args={"name": "Golden Dragon", "time": "8:00pm"})
    ]),
    ToolMessage(content="晚上8点在金龙的桌子已预订。"),
    AIMessage(content="你在金龙的桌子已预订在晚上8点。祝你用餐愉快!"),
    HumanMessage(content="谢谢"),
])

scorer = AgentGoalAccuracyWithoutReference()
await metric.multi_turn_ascore(sample)