---
# System prepended metadata

title: '[LangChain] 範例－衣服購買需求萃取'
tags: [LangChain_samples]

---

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





