learn from https://learn.deeplearning.ai/langchain
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
自己编造的数据
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)
loader = CSVLoader(file_path=file)
data = loader.load()
examples = [
{
"query": "小米平衡车只适合短途出行",
"answer": "是"
},
{
"query": "阿迪达斯休闲鞋防水性能很好",
"answer": "否"
}
]
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)
自动添加了一些问题
{'query': '这款小米平衡车的特点有哪些?', 'answer': '简洁大方的造型,铝合金材质车身,稳定性不错的大车轮,20公里左右的电池续航里程,高精度的转向,上手学习难度小。'}
{'query': '这双阿迪达斯休闲鞋的鞋身采用了什么材质?', 'answer': '鞋身采用轻量 Mesh材质,保证通风性。'}
{'query': '这款保温杯的保温性能如何?', 'answer': '这款保温杯的保温性能非常好,一天下来冷饮依然冰冷,热饮也很滚烫。'}
{'query': '这双耐克跑步鞋的底部有什么特点?', 'answer': '底部反弹力很好,提供足够的缓冲效果。'}
{'query': '这款华为手表有哪些优点?', 'answer': '屏幕显示效果清晰,色彩还原度高,表带和表扣设计考究,戴着舒适,可以准确测量心率和血氧,支持手机控制播放音乐和相机,续航能力强,表盘样式丰富。'}
{'query': '这款ThinkPad笔记本的外观如何?', 'answer': '外观设计简洁大方,不会很容易沾灰指纹。'}
{'query': '这款手机的屏幕采用了什么材质? ', 'answer': '屏幕采用了Amoled材质。 '}
{'query': '这款联想笔记本电脑的屏幕表现如何?', 'answer': '屏幕视野角度很够,色彩表现还算不错。'}
{'query': '这款微波炉有哪些特点?', 'answer': '微波炉选材考究,微波炉门关闭严密,能够隔绝微波辐射。智能程序设定种类较多,操作简便。可以通过旋转盘调节火力大小。内部容积大,够一个大碗。设有除味功能。烹饪食物的效果不错。使用过程中安全可靠,没有出现过故障。'}
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 那行,报错了
Retrying langchain.embeddings.openai.embed_with_retry.<locals>._embed_with_retry
in 4.0 seconds as it raised RateLimitError: exceeded quota for this month.
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.
意思就是资源不够用。。。不能同时对多个文档进行操作,换了个账号,可以了
import langchain
langchain.debug = True
qa.run(examples[0]["query"])
输出:'是的,根据评论,小米平衡车适合城市短途出行使用。它的电池续航里程约为20公里左右,所以对于长途旅行可能不太方便。但对于日常的短途出行,它是一个很好的选择。'
对比 输出
和 answer
是否一致
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()
输出:
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
使用模型进行了批量评估