# [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的身高推算出來的。從輸出可發現程式是可以做到這件事的。