LangChain学习:评估

2023-07-21 21:38:27 浏览数 (2)

文章目录

    • 1. 加载数据
    • 2. 硬编码测试样例
    • 3. LLM生成测试样例
    • 4. 评估
      • 手动评估
      • LLM评估

learn from https://learn.deeplearning.ai/langchain

1. 加载数据

代码语言:javascript复制
import os
import pandas as pd
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.vectorstores import DocArrayInMemorySearch

自己编造的数据

代码语言:javascript复制
file = 'goods.csv'
csv_data = '''name,review
小米平衡车,这款小米平衡车的造型简洁大方,携带方便。车身采用铝合金材质,感觉很有质感。车轮较大,站在上面稳定性不错,可以平稳行驶在坚硬路面上。电池续航里程约在20公里左右,符合平衡车的标准配置。转向 precisio较高,控制敏捷,转向灵活。上手学习难度小,很快就可以自如驾驭。但是车身有些重,如果要携带乘坐地铁可能不太方便。总体而言,这款小米平衡车性价比很高,很适合城市短途出行使用。
阿迪达斯休闲鞋,这双阿迪达斯休闲鞋的款式简单大方,很适合日常休闲装扮。鞋身采用轻量 Mesh材质,保证通风性。鞋底较厚,但是轻量弹性,带来舒适的缓冲体验。穿着跑步和长时间行走也不会很疲惫。内部空间较大,不会有束缚感。款式时尚,有多种颜色可选。OEM工艺和品质都有保证。唯一不足可能是防水性能一般,不太适合在雨天长时间穿着。
保温杯,这款保温杯的保温性能非常好,一天下来冷饮依然冰冷,热饮也很滚烫。杯盖设计严密,完全防漏。杯身不透明,不太容易沾污。容量约500ml,带一点开水喝一天没问题。杯口和手柄设计合理,方便口饮。清洗也很方便。杯身磨砂处理,手感不错。比较推荐在办公室中使用。可能唯一的缺点是没有泡茶过滤功能,不太适合放茶叶。
耐克跑步鞋,这双耐克跑步鞋的底部反弹力很好,提供足够的缓冲效果。鞋面采用网眼设计,通气性好。内部空间充足,不会有局促感。全天候跑步都可以,防滑性能也不错。唯一要注意的是,由于是轻薄款式,走路时稍微有点不太稳定。建议专门用作跑步训练使用,不太适合走路或长时间站立。
华为手表,这款华为手表的屏幕显示效果很清晰,色彩还原度高。表带和表扣设计考究,戴着舒适,可以准确测量心率和血氧。支持手机控制播放音乐和相机。续航能力强,正常使用一周左右才需要充电一次。表盘样式也比较丰富。可能的缺点是防水性能一般,只能涉及短时间淋雨或者手洗,不能完全浸水。总体而言,这款手表的外观设计和智能功能表现都比较出色。
ThinkPad笔记本,这款ThinkPad笔记本的外观设计简洁大方,不会很容易沾灰指纹。屏幕视野角度广,颜色还原度高,长时间使用也不会很疲劳。内置的Placketsoft触控板灵敏度高,手感顺滑。键盘手感出色,键行间距宽,打字非常舒适。内部散热性能优异,发热量低。预装Windows系统干净流畅。唯一需要注意的可能是机身较重,不太适合频繁携带外出。
苹果iPhone手机,iPhone的工业设计一如既往的出色,背面玻璃打磨工艺精良。屏幕色彩还原性强,采用Amoled材质,展示效果明亮夺目。iOS系统流畅稳定,各种常用App兼容性强。支持无线充电,电池续航表现不俗。拍照和摄像效果优异,夜景模式拍摄清晰度高。可能唯一的遗憾是已取消耳机插孔,需要另外购买适配器或蓝牙耳机。
联想笔记本电脑,这款联想笔记本电脑的屏幕视野角度很够,色彩表现还算不错。内部散热系统设置得当,发热量低。键盘手感舒适,键位间距合理。机身较轻薄,携带出行不会觉得非常沉重。预装软件不多,比较干净。电池续航能力也可以,日常使用电量基本够用。唯一要注意的是,D盘容量只有256GB,如果存储需要大可以选择在其他位置加装硬盘。
微波炉,这款微波炉选材考究,微波炉门关闭严密,能够隔绝微波辐射。智能程序设定种类较多,操作简便。可以通过旋转盘调节火力大小。内部容积大,够一个大碗。设有除味功能。烹饪食物的效果不错。使用过程中安全可靠,没有出现过故障。'''
rows = csv_data.split('n')
headers = rows[0].split(',')
data_rows = [row.split(',') for row in rows[1:]]
df = pd.DataFrame(data_rows, columns=headers)
print(df)
df.to_csv(file, index=False)
代码语言:javascript复制
loader = CSVLoader(file_path=file)
data = loader.load()

2. 硬编码测试样例

代码语言:javascript复制
examples = [
    {
        "query": "小米平衡车只适合短途出行",
        "answer": "是"
    },
    {
        "query": "阿迪达斯休闲鞋防水性能很好",
        "answer": "否"
    }
]

3. LLM生成测试样例

代码语言:javascript复制
from langchain.evaluation.qa import QAGenerateChain
from langchain.output_parsers import RegexParser
from langchain.prompts import PromptTemplate

template = """请你根据文档,生成一些提问
文档格式:
<文档开始>
...
<文档结束>
QUERY: query here
ANSWER: answer here

提的问题必须是文档中显而易见的,开始!

<文档开始>
{doc}
<文档结束>"""
output_parser = RegexParser(
    regex=r"QUERY: (.*?)n ANSWER: (.*)", output_keys=["query", "answer"]
)
prompt = PromptTemplate(
    input_variables=["doc"], template=template, output_parser=output_parser
)
example_gen_chain = QAGenerateChain.from_llm(llm)
example_gen_chain.prompt = prompt

new_examples = []
for d in data:
    res = example_gen_chain.apply_and_parse([{"doc": d}])
    print(res[0])
    new_examples.append(res[0])
print(new_examples)

自动添加了一些问题

代码语言:javascript复制
{'query': '这款小米平衡车的特点有哪些?', 'answer': '简洁大方的造型,铝合金材质车身,稳定性不错的大车轮,20公里左右的电池续航里程,高精度的转向,上手学习难度小。'}
{'query': '这双阿迪达斯休闲鞋的鞋身采用了什么材质?', 'answer': '鞋身采用轻量 Mesh材质,保证通风性。'}
{'query': '这款保温杯的保温性能如何?', 'answer': '这款保温杯的保温性能非常好,一天下来冷饮依然冰冷,热饮也很滚烫。'}
{'query': '这双耐克跑步鞋的底部有什么特点?', 'answer': '底部反弹力很好,提供足够的缓冲效果。'}
{'query': '这款华为手表有哪些优点?', 'answer': '屏幕显示效果清晰,色彩还原度高,表带和表扣设计考究,戴着舒适,可以准确测量心率和血氧,支持手机控制播放音乐和相机,续航能力强,表盘样式丰富。'}
{'query': '这款ThinkPad笔记本的外观如何?', 'answer': '外观设计简洁大方,不会很容易沾灰指纹。'}
{'query': '这款手机的屏幕采用了什么材质? ', 'answer': '屏幕采用了Amoled材质。 '}
{'query': '这款联想笔记本电脑的屏幕表现如何?', 'answer': '屏幕视野角度很够,色彩表现还算不错。'}
{'query': '这款微波炉有哪些特点?', 'answer': '微波炉选材考究,微波炉门关闭严密,能够隔绝微波辐射。智能程序设定种类较多,操作简便。可以通过旋转盘调节火力大小。内部容积大,够一个大碗。设有除味功能。烹饪食物的效果不错。使用过程中安全可靠,没有出现过故障。'}

4. 评估

代码语言:javascript复制
examples  = new_examples

index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])

llm = ChatOpenAI(temperature = 0.0)
qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=index.vectorstore.as_retriever(), 
    verbose=True,
    chain_type_kwargs = {
        "document_separator": "<<<<>>>>>"
    }
)

执行 index 那行,报错了

代码语言:javascript复制
Retrying langchain.embeddings.openai.embed_with_retry.<locals>._embed_with_retry 
in 4.0 seconds as it raised RateLimitError: exceeded quota for this month.
代码语言:javascript复制
openai.error.InvalidRequestError: Too many inputs. The max number of inputs is 1.  
We hope to increase the number of inputs per request soon. 
Please contact us through an Azure support request at: https://go.microsoft.com/fwlink/?linkid=2213926 for further questions.

意思就是资源不够用。。。不能同时对多个文档进行操作,换了个账号,可以了

手动评估

代码语言:javascript复制
import langchain
langchain.debug = True
qa.run(examples[0]["query"])

输出:'是的,根据评论,小米平衡车适合城市短途出行使用。它的电池续航里程约为20公里左右,所以对于长途旅行可能不太方便。但对于日常的短途出行,它是一个很好的选择。'

对比 输出answer 是否一致

LLM评估

代码语言:javascript复制
predictions = qa.apply(examples)
from langchain.evaluation.qa import QAEvalChain
llm = ChatOpenAI(temperature=0)
eval_chain = QAEvalChain.from_llm(llm)
graded_outputs = eval_chain.evaluate(examples, predictions)

for i, eg in enumerate(examples):
    print(f"Example {i}:")
    print("Question: "   predictions[i]['query'])
    print("Real Answer: "   predictions[i]['answer'])
    print("Predicted Answer: "   predictions[i]['result'])
    print("Predicted Grade: "   graded_outputs[i]['text'])
    print()

输出:

代码语言:javascript复制
Example 0:
Question: 小米平衡车只适合短途出行
Real Answer: 是
Predicted Answer: 是的,根据评论,小米平衡车适合城市短途出行使用。它的电池续航里程约为20公里左右,所以对于长途旅行可能不太方便。但对于日常的短途出行,它是一个很好的选择。
Predicted Grade: CORRECT

Example 1:
Question: 阿迪达斯休闲鞋防水性能很好
Real Answer: 否
Predicted Answer: 不好
Predicted Grade: CORRECT

Example 2:
Question: 这款小米平衡车的特点有哪些?
Real Answer: 简洁大方的造型,铝合金材质车身,稳定性不错的大车轮,20公里左右的电池续航里程,高精度的转向,上手学习难度小。
Predicted Answer: 这款小米平衡车的特点包括:造型简洁大方,携带方便;车身采用铝合金材质,质感好;车轮较大,稳定性好,可以在坚硬路面上平稳行驶;电池续航里程约在20公里左右,符合平衡车的标准配置;转向精准,控制敏捷,转向灵活;上手学习难度小,很快就可以自如驾驭。但是车身有些重,如果要携带乘坐地铁可能不太方便。总体而言,这款小米平衡车性价比很高,很适合城市短途出行使用。
Predicted Grade: CORRECT

Example 3:
Question: 这双阿迪达斯休闲鞋的鞋身采用了什么材质?
Real Answer: 鞋身采用轻量 Mesh材质,保证通风性。
Predicted Answer: 这双阿迪达斯休闲鞋的鞋身采用了轻量的Mesh材质。
Predicted Grade: CORRECT

Example 4:
Question: 这款保温杯的保温性能如何?
Real Answer: 这款保温杯的保温性能非常好,一天下来冷饮依然冰冷,热饮也很滚烫。
Predicted Answer: 这款保温杯的保温性能非常好,一天下来冷饮依然冰冷,热饮也很滚烫。
Predicted Grade: CORRECT

Example 5:
Question: 这双耐克跑步鞋的底部有什么特点?
Real Answer: 底部反弹力很好,提供足够的缓冲效果。
Predicted Answer: 这双耐克跑步鞋的底部具有很好的反弹力,可以提供足够的缓冲效果。
Predicted Grade: CORRECT

Example 6:
Question: 这款华为手表有哪些优点?
Real Answer: 屏幕显示效果清晰,色彩还原度高,表带和表扣设计考究,戴着舒适,可以准确测量心率和血氧,支持手机控制播放音乐和相机,续航能力强,表盘样式丰富。
Predicted Answer: 这款华为手表的优点包括:
1. 屏幕显示效果清晰,色彩还原度高。
2. 设计考究,表带和表扣舒适。
3. 可以准确测量心率和血氧。
4. 支持手机控制播放音乐和相机。
5. 续航能力强,正常使用一周左右才需要充电一次。
6. 表盘样式丰富。
7. 外观设计和智能功能表现出色。
Predicted Grade: CORRECT

Example 7:
Question: 这款ThinkPad笔记本的外观如何?
Real Answer: 外观设计简洁大方,不会很容易沾灰指纹。
Predicted Answer: 这款ThinkPad笔记本的外观设计简洁大方,不会很容易沾灰指纹。
Predicted Grade: CORRECT

Example 8:
Question: 这款手机的屏幕采用了什么材质? 
Real Answer: 屏幕采用了Amoled材质。 
Predicted Answer: 这款手机的屏幕采用了Amoled材质。
Predicted Grade: CORRECT

Example 9:
Question: 这款联想笔记本电脑的屏幕表现如何?
Real Answer: 屏幕视野角度很够,色彩表现还算不错。
Predicted Answer: 这款联想笔记本电脑的屏幕视野角度很够,色彩表现还算不错。
Predicted Grade: CORRECT

Example 10:
Question: 这款微波炉有哪些特点?
Real Answer: 微波炉选材考究,微波炉门关闭严密,能够隔绝微波辐射。智能程序设定种类较多,操作简便。可以通过旋转盘调节火力大小。内部容积大,够一个大碗。设有除味功能。烹饪食物的效果不错。使用过程中安全可靠,没有出现过故障。
Predicted Answer: 这款微波炉的特点包括选材考究、微波炉门关闭严密、能够隔绝微波辐射、智能程序设定种类较多、操作简便、可以通过旋转盘调节火力大小、内部容积大、设有除味功能、烹饪食物的效果不错、使用过程中安全可靠,没有出现过故障。
Predicted Grade: CORRECT

使用模型进行了批量评估

0 人点赞