# [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資訊去進行改善。