# [LangChain] 範例-餐廳評論標記
日期:2023/09/22
## 敘述
- 主題:create_tagging_chain()
- 使用情境:顧客會對於消費體驗進行評論,可能是正面或負面或中立的,也可能對於各種不同的點進行評論,總體來說其實評論的內容可能會是各式各樣,非常繁雜。透過此範例程式,將可自動地對顧客留言進行標記,透過這樣便可快速地掌握留言的資訊,也以便後續進行更多的處理。
- 輸入:餐廳顧客留言。
- 輸出:輸出將對留言進行標記,確認留言正負種類、回饋類型。
## 目錄
- [1. 主程式](#1-主程式)
- [2. 輸入輸出](#2-輸入輸出)
____________________
## 1. 主程式
導入套件
```python=
from dotenv import load_dotenv
load_dotenv()
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0)
```
```python=
from langchain.chains import create_tagging_chain
```
實現此範例功能主要為透過create_tagging_chain()物件。
此物件使用方法與create_extraction_chain()很相似,不過兩者處理輸入文字的方式有明顯的不同。前者處理的是例如以下幾種狀況,語言種類、文字情緒、敘述類型等等;後者則是偏向於直接從輸入中抓出對應的文字。
schema用於定義輸出的格式,其中的各個label則代表著希望輸出具有的個個資訊。以`sentiment`label來說,代表希望輸出可以標記輸入文字的評價分類。另外其中的`enum`和`description`則用於讓模型更能清楚的理解輸出的方式。
```python=
schema = {
"properties": {
"sentiment": {
"type": "integer",
"enum": [-1, 0, 1],
"description": "正面、負面、中立三種餐廳評價分類。-1表示負面;0表示中立;1表示正面。",
},
"feedback type": {
"type": "string",
"enum": ["爐子", "服務態度", "個別店員", "食材","其他"],
"description": "確認輸入的關於enum中的甚麼類型。補充:1.飲食相關敘述都可歸類在食材。",
}
},
"required": ["sentiment", "feedback type"],
}
chain = create_tagging_chain(schema, llm)
```
## 2. 輸入輸出
以下將多個不同的文字提供程式去進行處理。
**輸入一**
```python=
input_list = [
'王姓店員真的讓我感到很火大!',
'服務態度很差,東西都用丟的',
'店員臉很臭,向他問問題時,都愛理不理',
'服務態度很親切,會主動上前關心我們遇到的問題。',
'牛小排的口感很棒,非常推薦!',
'食材有些變質。',
'大白菜的邊邊都有點黑黑的',
'泡菜有點鹹',
'用餐過程電磁爐一直跳電,導致鍋子加熱很慢。'
]
for n in input_list:
output = chain.run(n)
print("Q: ",n)
print("A: ",output)
```
:::success
Q: 王姓店員真的讓我感到很火大!
A: {'sentiment': -1, 'feedback type': '個別店員'}
Q: 服務態度很差,東西都用丟的
A: {'sentiment': -1, 'feedback type': '服務態度'}
Q: 店員臉很臭,向他問問題時,都愛理不理
A: {'sentiment': -1, 'feedback type': '服務態度'}
Q: 服務態度很親切,會主動上前關心我們遇到的問題。
A: {'sentiment': 1, 'feedback type': '服務態度'}
Q: 牛小排的口感很棒,非常推薦!
A: {'sentiment': 1, 'feedback type': '食材'}
Q: 食材有些變質。
A: {'sentiment': -1, 'feedback type': '食材'}
Q: 大白菜的邊邊都有點黑黑的
A: {'sentiment': 0, 'feedback type': '食材'}
Q: 泡菜有點鹹
A: {'sentiment': 0, 'feedback type': '食材'}
Q: 用餐過程電磁爐一直跳電,導致鍋子加熱很慢。
A: {'sentiment': -1, 'feedback type': '爐子'}
:::
**輸入二**
```python=
input_list = [
'食物的味道不好說',
'涼麵口感很微妙',
'卡片被重複刷卡,讓人還必須打去銀行確認。',
'偶爾吃吃還可以',
'上菜上很慢',
'服務生需要重新訓練,很兩光'
]
```
:::success
Q: 食物的味道不好說
A: {'sentiment': 0, 'feedback type': '食材'}
Q: 涼麵口感很微妙
A: {'sentiment': 0, 'feedback type': '食材'}
Q: 卡片被重複刷卡,讓人還必須打去銀行確認。
A: {'sentiment': -1, 'feedback type': '服務態度'}
Q: 偶爾吃吃還可以
A: {'sentiment': 0, 'feedback type': '其他'}
Q: 上菜上很慢
A: {'sentiment': -1, 'feedback type': '服務態度'}
Q: 服務生需要重新訓練,很兩光
A: {'sentiment': -1, 'feedback type': '服務態度'}
:::
可發現輸入一中幾個句子的執行結果有問題:
1. 大白菜的邊邊都有點黑黑的
2. 泡菜有點鹹
3.
兩者的正負標記不準確。原因可能為:錯誤的幾個輸入,其正或負面的態度可能不是很明顯。
後續,這些問題將可透過修改schema中的label資訊去進行改善。