成对评估器¶
这本 notebook 使用 PairwiseEvaluator
模块来查看评估 LLM 是否会偏好一个查询引擎而不是另一个。
In [ ]
已复制!
%pip install llama-index-llms-openai
%pip install llama-index-llms-openai
In [ ]
已复制!
# attach to the same event-loop
import nest_asyncio
nest_asyncio.apply()
# 附加到同一个事件循环 import nest_asyncio nest_asyncio.apply()
In [ ]
已复制!
# configuring logger to INFO level
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
# 配置 logger 为 INFO 级别 import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
In [ ]
已复制!
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Response
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import PairwiseComparisonEvaluator
from llama_index.core.node_parser import SentenceSplitter
import pandas as pd
pd.set_option("display.max_colwidth", 0)
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Response from llama_index.llms.openai import OpenAI from llama_index.core.evaluation import PairwiseComparisonEvaluator from llama_index.core.node_parser import SentenceSplitter import pandas as pd pd.set_option("display.max_colwidth", 0)
这里使用 GPT-4 进行评估
In [ ]
已复制!
# gpt-4
gpt4 = OpenAI(temperature=0, model="gpt-4")
evaluator_gpt4 = PairwiseComparisonEvaluator(llm=gpt4)
# gpt-4 gpt4 = OpenAI(temperature=0, model="gpt-4") evaluator_gpt4 = PairwiseComparisonEvaluator(llm=gpt4)
In [ ]
已复制!
documents = SimpleDirectoryReader("./test_wiki_data/").load_data()
documents = SimpleDirectoryReader("./test_wiki_data/").load_data()
In [ ]
已复制!
# create vector index
splitter_512 = SentenceSplitter(chunk_size=512)
vector_index1 = VectorStoreIndex.from_documents(
documents, transformations=[splitter_512]
)
splitter_128 = SentenceSplitter(chunk_size=128)
vector_index2 = VectorStoreIndex.from_documents(
documents, transformations=[splitter_128]
)
# 创建向量索引 splitter_512 = SentenceSplitter(chunk_size=512) vector_index1 = VectorStoreIndex.from_documents( documents, transformations=[splitter_512] ) splitter_128 = SentenceSplitter(chunk_size=128) vector_index2 = VectorStoreIndex.from_documents( documents, transformations=[splitter_128] )
In [ ]
已复制!
query_engine1 = vector_index1.as_query_engine(similarity_top_k=2)
query_engine2 = vector_index2.as_query_engine(similarity_top_k=8)
query_engine1 = vector_index1.as_query_engine(similarity_top_k=2) query_engine2 = vector_index2.as_query_engine(similarity_top_k=8)
In [ ]
已复制!
# define jupyter display function
def display_eval_df(query, response1, response2, eval_result) -> None:
eval_df = pd.DataFrame(
{
"Query": query,
"Reference Response (Answer 1)": response2,
"Current Response (Answer 2)": response1,
"Score": eval_result.score,
"Reason": eval_result.feedback,
},
index=[0],
)
eval_df = eval_df.style.set_properties(
**{
"inline-size": "300px",
"overflow-wrap": "break-word",
},
subset=["Current Response (Answer 2)", "Reference Response (Answer 1)"]
)
display(eval_df)
# 定义 jupyter 显示函数 def display_eval_df(query, response1, response2, eval_result) -> None: eval_df = pd.DataFrame( { "查询": query, "参考响应 (答案 1)": response2, "当前响应 (答案 2)": response1, "得分": eval_result.score, "原因": eval_result.feedback, }, index=[0], ) eval_df = eval_df.style.set_properties( **{ "inline-size": "300px", "overflow-wrap": "break-word", }, subset=["当前响应 (答案 2)", "参考响应 (答案 1)"] ) display(eval_df)
要运行评估,您可以在查询返回的 Response
对象上调用 .evaluate_response()
函数。让我们评估 vector_index 的输出。
In [ ]
已复制!
# query_str = "How did New York City get its name?"
query_str = "What was the role of NYC during the American Revolution?"
# query_str = "Tell me about the arts and culture of NYC"
response1 = str(query_engine1.query(query_str))
response2 = str(query_engine2.query(query_str))
# query_str = "纽约市的名字是怎么来的?" query_str = "纽约市在美国独立战争期间扮演了什么角色?" # query_str = "告诉我纽约市的艺术和文化" response1 = str(query_engine1.query(query_str)) response2 = str(query_engine2.query(query_str))
默认情况下,我们在成对比较中强制执行“一致性”。
我们尝试输入候选对和参考对,然后交换两者的顺序,并确保结果仍然一致(否则返回 TIE)。
In [ ]
已复制!
eval_result = await evaluator_gpt4.aevaluate(
query_str, response=response1, reference=response2
)
eval_result = await evaluator_gpt4.aevaluate( query_str, response=response1, reference=response2 )
INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=5536 request_id=8a8f154ee676b2e86ea24b7046e9b80b response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=5536 request_id=8a8f154ee676b2e86ea24b7046e9b80b response_code=200 INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=9766 request_id=dfee84227112b1311b4411492f4c8764 response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=9766 request_id=dfee84227112b1311b4411492f4c8764 response_code=200
In [ ]
已复制!
display_eval_df(query_str, response1, response2, eval_result)
display_eval_df(query_str, response1, response2, eval_result)
查询 | 参考响应 (答案 1) | 当前响应 (答案 2) | 得分 | 原因 | |
---|---|---|---|---|---|
0 | 纽约市在美国独立战争期间扮演了什么角色? | 在美国独立战争期间,纽约市是英军重要的军事和政治行动基地。在 1776 年的长岛战役(美军战败)后,英军将该市作为其在北美行动的中心。该市于 1673 年被荷兰人收复,但在 1674 年被重新命名为纽约。从 1785 年到 1790 年,它成为美国的首都。此外,纽约市也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军以获得自由。英军将数千名自由民运往新斯科舍省和其他地点(包括英格兰和加勒比地区)进行重新安置。 | 在美国独立战争期间,纽约市是英军在北美的军事和政治行动基地。它也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军寻求自由。该市在战争中扮演了重要角色,长岛战役是美国独立战争期间在其今布鲁克林区内进行的最大规模战役。战后,英军撤离时,将自由民运往新斯科舍省、英格兰和加勒比地区进行重新安置。 | 0.500000 | 不清楚哪个答案更好。 |
注意:默认情况下,我们通过翻转响应/参考的顺序并确保答案相反来强制达成一致。
我们可以禁用此功能 - 这可能会导致更多不一致!
In [ ]
已复制!
evaluator_gpt4_nc = PairwiseComparisonEvaluator(
llm=gpt4, enforce_consensus=False
)
evaluator_gpt4_nc = PairwiseComparisonEvaluator( llm=gpt4, enforce_consensus=False )
In [ ]
已复制!
eval_result = await evaluator_gpt4_nc.aevaluate(
query_str, response=response1, reference=response2
)
eval_result = await evaluator_gpt4_nc.aevaluate( query_str, response=response1, reference=response2 )
INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=6714 request_id=472a1f0829846adc1b4347ba4b99c0dd response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=6714 request_id=472a1f0829846adc1b4347ba4b99c0dd response_code=200
In [ ]
已复制!
display_eval_df(query_str, response1, response2, eval_result)
display_eval_df(query_str, response1, response2, eval_result)
查询 | 参考响应 (答案 1) | 当前响应 (答案 2) | 得分 | 原因 | |
---|---|---|---|---|---|
0 | 纽约市在美国独立战争期间扮演了什么角色? | 在美国独立战争期间,纽约市是英军重要的军事和政治行动基地。在 1776 年的长岛战役(美军战败)后,英军将该市作为其在北美行动的中心。该市于 1673 年被荷兰人收复,但在 1674 年被重新命名为纽约。从 1785 年到 1790 年,它成为美国的首都。此外,纽约市也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军以获得自由。英军将数千名自由民运往新斯科舍省和其他地点(包括英格兰和加勒比地区)进行重新安置。 | 在美国独立战争期间,纽约市是英军在北美的军事和政治行动基地。它也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军寻求自由。该市在战争中扮演了重要角色,长岛战役是美国独立战争期间在其今布鲁克林区内进行的最大规模战役。战后,英军撤离时,将自由民运往新斯科舍省、英格兰和加勒比地区进行重新安置。 | 0.000000 | 1 答案 1 更好,因为它提供了关于纽约市在美国独立战争期间作用的更详细信息。它不仅提到了该市作为英军基地以及忠诚派难民和逃亡奴隶避难所的作用,还提供了额外的历史背景信息,例如该市的重新命名和成为美国的首都。 |
In [ ]
已复制!
eval_result = await evaluator_gpt4_nc.aevaluate(
query_str, response=response2, reference=response1
)
eval_result = await evaluator_gpt4_nc.aevaluate( query_str, response=response2, reference=response1 )
INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=9252 request_id=b73bbe6b10d878ed8138785638232866 response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=9252 request_id=b73bbe6b10d878ed8138785638232866 response_code=200
In [ ]
已复制!
display_eval_df(query_str, response2, response1, eval_result)
display_eval_df(query_str, response2, response1, eval_result)
查询 | 参考响应 (答案 1) | 当前响应 (答案 2) | 得分 | 原因 | |
---|---|---|---|---|---|
0 | 纽约市在美国独立战争期间扮演了什么角色? | 在美国独立战争期间,纽约市是英军在北美的军事和政治行动基地。它也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军寻求自由。该市在战争中扮演了重要角色,长岛战役是美国独立战争期间在其今布鲁克林区内进行的最大规模战役。战后,英军撤离时,将自由民运往新斯科舍省、英格兰和加勒比地区进行重新安置。 | 在美国独立战争期间,纽约市是英军重要的军事和政治行动基地。在 1776 年的长岛战役(美军战败)后,英军将该市作为其在北美行动的中心。该市于 1673 年被荷兰人收复,但在 1674 年被重新命名为纽约。从 1785 年到 1790 年,它成为美国的首都。此外,纽约市也是忠诚派难民和逃亡奴隶的避难所,他们投奔英军以获得自由。英军将数千名自由民运往新斯科舍省和其他地点(包括英格兰和加勒比地区)进行重新安置。 | 0.000000 | 1 答案 1 更好,因为它直接回答了用户关于纽约市在美国独立战争期间作用的查询。它提供了对该市作用更详细和准确的描述,包括其作为英军基地、忠诚派难民和逃亡奴隶避难所的地位,以及长岛战役的发生地。答案 2 包含了一些无关的信息,例如该市被荷兰人收复和重新命名(发生在美国独立战争之前),以及其作为美国首都的地位(发生在美国独立战争之后)。 |
运行更多查询¶
In [ ]
已复制!
query_str = "Tell me about the arts and culture of NYC"
response1 = str(query_engine1.query(query_str))
response2 = str(query_engine2.query(query_str))
query_str = "告诉我纽约市的艺术和文化" response1 = str(query_engine1.query(query_str)) response2 = str(query_engine2.query(query_str))
In [ ]
已复制!
eval_result = await evaluator_gpt4.aevaluate(
query_str, response=response1, reference=response2
)
eval_result = await evaluator_gpt4.aevaluate( query_str, response=response1, reference=response2 )
INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=6053 request_id=749fdbde59bf8d1056a8be6e211d20d9 response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=6053 request_id=749fdbde59bf8d1056a8be6e211d20d9 response_code=200 INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=7309 request_id=ba09bb38320b60cf09dbebb1df2c732b response_code=200 message='OpenAI API response' path=https://api.openai.com/v1/chat/completions processing_ms=7309 request_id=ba09bb38320b60cf09dbebb1df2c732b response_code=200
In [ ]
已复制!
display_eval_df(query_str, response1, response2, eval_result)
display_eval_df(query_str, response1, response2, eval_result)
查询 | 参考响应 (答案 1) | 当前响应 (答案 2) | 得分 | 原因 | |
---|---|---|---|---|---|
0 | 告诉我纽约市的艺术和文化 | 纽约市以其充满活力的艺术和文化景观而闻名。它是 2,000 多个艺术和文化组织以及 500 多个艺术画廊的所在地。该市拥有丰富的文化机构历史,例如卡内基音乐厅和大都会艺术博物馆,这些机构享誉国际。百老汇音乐剧这种流行的舞台形式起源于 19 世纪 80 年代的纽约市。该市也是犹太裔美国文学的中心,是各种文化运动的发源地,包括哈莱姆文艺复兴、抽象表现主义和嘻哈。纽约市被认为是世界舞蹈之都,并拥有繁荣的戏剧场景。该市也因其博物馆而闻名,包括古根海姆博物馆和大都会艺术博物馆,它们都参与年度博物馆大道节。此外,纽约市举办了一些世界上最赚钱的艺术品拍卖会。林肯表演艺术中心是一个主要的文化中心,汇集了大都会歌剧院和纽约爱乐乐团等有影响力的艺术组织。总的来说,纽约市通常被认为是世界文化之都。 | 纽约市以其充满活力的艺术和文化景观而闻名。它拥有众多有影响力的艺术组织,包括大都会歌剧院、纽约市歌剧院、纽约爱乐乐团和纽约市芭蕾舞团。该市还有一个繁荣的剧院区,百老汇演出的门票每季销售额达数十亿美元。此外,该市还有 2,000 多个艺术和文化组织以及 500 多个艺术画廊。纽约市拥有丰富的文化机构历史,例如卡内基音乐厅和大都会艺术博物馆,这些机构享誉国际。该市的艺术和文化深受其多元化移民人口的影响,许多戏剧和音乐剧的背景设定在纽约市或受其启发。 | 0.000000 | 1 答案 1 为用户关于纽约市艺术和文化的查询提供了更全面和详细的响应。它不仅提到了该市主要的文化机构和组织,还讨论了该市在各种文化运动中的作用、其作为世界舞蹈之都的地位、其博物馆和艺术品拍卖。它还提到了答案 2 没有提及的年度博物馆大道节。 |