# [LangChain] 範例-衣服購買需求萃取 日期:2023/09/21 ## 敘述 - 主題:create_extraction_chain() - 使用情境:假設買家透過文字訊息與店家聯絡,希望店家推薦給自己衣服,此時店家便可透過此程式整理買家的敘述,可產出清晰易讀的資訊,以便後續進行處理,例如:將顧客資訊交給下個部門、儲存顧客喜好。 - 輸入:買家希望購買的衣服的相關敘述。 - 輸出:以結構化格式整理衣服相關敘述。 ## 目錄 - [1. 主程式](#1-主程式) - [2. 輸入輸出](#2-輸入輸出) ____________________ ## 1. 主程式 導入套件 ```python= from dotenv import load_dotenv load_dotenv() from langchain.chat_models import ChatOpenAI llm = ChatOpenAI(temperature=0) llm_model = "gpt-3.5-turbo" ``` ```python= from langchain.chains import create_extraction_chain ``` 此程式可自動的幫忙整理、分類文字敘述。schema為定義期望的輸出格式,以此範例來說,其中包含了人名、人物身高、胸圍等等資訊,程式使用這些label整理輸入的文字,將相關的文字敘述對應到這些label。 實現此功能主要透過create_extraction_chain()物件實現,若想換成其他不同的輸出格式,則可修改schema的內容,並提供給create_extraction_chain()。 補充: 在官方文件中,有使用到extra_info的label,用於捕捉不屬於當前定義的label的重要資訊。在此範例中使用『額外資訊』替換。 ```python= # Schema schema = { "properties": { "人名": {"type": "string"}, "身高": {"type": "integer"}, "胸圍": {"type": "integer"}, "腰圍": {"type": "integer"}, "衣服種類": {"type": "string"}, "衣服顏色": {"type": "string"}, "額外資訊": {"type": "string"}, }, "required": ["人名"], } # chain chain = create_extraction_chain(schema, llm) ``` ## 2. 輸入輸出 ```python= input_text = '''你好我是Alex,我想幫我朋友Anne推薦一件洋裝。他的身高163,胸圍89公分,腰圍27公分。他想要的衣服主要色系是藍綠色的。 我想了想,也順便推薦我一件上衣好了,我希望是純白色,我的身高比他高17公分,胸圍比他粗一點。順便說一下我的肚子比較大,可能要找大的衣服。''' chain.run(input_text) ``` :::success [{'人名': 'Anne', '身高': 163, '胸圍': 89, '腰圍': 27, '衣服顏色': '藍綠色'}, {'人名': 'Alex', '身高': 180, '胸圍': 90, '腰圍': 27, '衣服種類': '上衣', '衣服顏色': '純白色', '額外資訊': '肚子比較大'}] ::: 觀察: 1. 輸入分別提到了兩個人,程式幫忙整理出兩人各自的衣服需求。 2. 可發現到並不是所有schema的label都一定會使用到,而是程式會根據輸入中是否有對應的資訊,若沒有的話則輸出不會出現那個label。例如:並沒有提到Alex的腰圍,因此輸出沒有腰圍數值。 3. 對於不屬於特定label的資訊,可使用'extra_info' label作存放。 4. 輸入中,Alex的身高是需要從Anne的身高推算出來的。從輸出可發現程式是可以做到這件事的。