---
# System prepended metadata

title: 筆記：Building Systems with the ChatGPT API

---

# 筆記：Building Systems with the ChatGPT API

課程連結：
https://learn.deeplearning.ai/chatgpt-building-system/lesson/4/moderation

主題：使用LLM建立完整系統的步驟
## 建立LLM系統四步驟
1. 確認使用者input內容沒有問題（Moderation）
2. 辨識與分類input類型
3. 針對input類型，撈取資料或產生output
4. 確認模型output內容沒有問題

## 語言模型原理、Tokens、格式
### 原理
- LLM核心是使用supervised learning訓練而成
- 重複使用相同的句子預測每一段接龍
- 兩種LLM: Base-LLM（純接龍）、Instruction Tuned-LLM（以額外指令微調過）
- Instruction tuned-LLM 訓練流程：
1. 微調 - 放入許多input/output來確保輸出符合要求
2. 人類評價 - 讓人類幫output做評價，如答案是否有幫助、誠實、沒有傷害
3. 依評價微調 - 增強好評結果的輸出（常用增強式學習）

### Token
- 我們發現其實接龍不是接「下一個字」而是「下一個Token」
- 英文中，1個token大概等於4個字母，或四分之三個字
- input (context) + output (completion) 經常會有token數的限制
- 例如 GPT3.5 turbo 一次只能有4000個tokens（input + ouput）

### 格式
- LLM的對答有三個腳色設定
1. System: 設定與規範此語言模型工作範圍
2. Assistant: 實際於System規範內與使用者對答
3. User: 系統使用者

Tip 1: 查看Token使用量
```python
reponse['usage']['prompt_tokens'] # input token
reponse['usage']['completion_tokens'] # output token
reponse['usage']['total_tokens'] # total token
```

Tip 2: 不要把API key寫在你的JupyterNB（防止key外流）
可用兩行code呼叫local file
```python
load_dotenv(find_dotenv())
open.api_key = os.getenv('OPPENAI_API_KEY') 
```

## 第一階段：Classification
需先分類input類型，才能判斷是否有問題
- 方法：使用prompt定義如何辨識不同類型，並輸出類型做下一階段指令
- Tip 1：使用 `####` 作為delimiter，通常會被認定為1個token
- Tip 2：分類完後將答案格式化（例如json）可方便餵到程式下一階段

## 第二階段：Moderation
需確認使用者沒有不正當地使用系統
- 方法1：使用 Moderation API 來確認這件事
- 方法2：使用另一個prompt作為helper function來檢查
1. Moderation API: 確保內容符合OpenAI安全規範（偵測gate, self-harm, sexual and violence）
指令： open.Moderation.create
- 會偵測是否違反任何規範類型，以及此類型違反指數
- 也可以加入自定義的規範
- 還會有一個flagged參數，吐出True/False指示是否任一規範被違反
?? 我們可以自行調高閥值，how?
2.  Injections and strategies
- 防止使用者意圖控制我們的語言模型，確保模型負責任且cost-effective
- 方法1: 使用delimiters強調指示
Tip: 多加一行code移除user給delimiter，防止他們在prompt中加入我們定義的delimiter混淆我們的語言模型
```python
input_user_message = input_user_message.replace(delimiter, "")
```
- 將規範指示加在每一次user input前，強調我們的規範
（GPT4比較會聽從system的指示，所以未來可能就不需要再做額外加強）
- 方法2: 使用額外的helper_function指示確認是否使用者意圖做injection
- 在system_message中指示若發現使用者意圖inject，則直接輸出二元答案指示是否ignore (Y/N)
Tip: 因為我們只需要二元答案，可以使用max_tokens=1來限制output的token數

## 第三階段 Chain of Thought Reasoning
- 處理較複雜的工作，可讓模型先依特定步驟思考再給最終答案（過程就叫CoT）
- 為隱藏思考過程，可將output格式化：使用delimiter分離思考過程/最終解答，取最終答案並使用except block處理預期外的答案
```python
try:
    final_response = response.split(delimiter)[-1].strip()
except Exception as e:
    final_response = "Sorry, I'm having trouble right now, please try asking another question."
    
print(final_response)
```

## 第四階段 Chain Prompts
- 將複雜的任務由一個巨大的promt拆解成次任務的小prompt
- 