OpenAI API
GPT-4
GPT-3.5 Turbo 旗艦模型
Token? 比word(單字)更小粒度的wordpieces (字根,字尾)
wordpieces
Fine-tuning(微調) models
Fine-tuning?
特定領域知識
微調(監督式學習)
原始訓練資料
預訓練
基礎模型
微調模型
前往 https://openai.com/ 登入 或 註冊後登入
登入
註冊後登入
前往 https://openai.com/ 登入 或 註冊後登入
產生API Key
建立密鑰Create new secret key
為密鑰取名字
提供信用卡號碼
if necessary
前往 https://openai.com/ 登入 或 註冊後登入
API KEY應妥善保存?怎麼做?
角色
指令
百分比
機率分佈
輸出
輸入1
GPT運作原理:預測下一個token的機率分佈
編碼
輸入2
python -m venv openai-env
➊ 創建「虛擬環境」(optional, 可選)
openai-env\Scripts\activate
source openai-env/bin/activate
➋ 啟動虛擬環境: 後續套件僅安裝在此環境內
Windows
Unix / macOS
set OPENAI_API_KEY "你的API_KEY"
❸ 設定「環境變數」OPEN_API_KEY
一次性作法: 開啟cmd,或VSCode的終端機輸入:
一次性作法: 開啟cmd,或VSCode的終端機輸入:
永久作法: 新增「環境變數」OPEN_API_KEY
echo %OPENAI_API_KEY%
確認設定值。重新開啟cmd,輸入:
❸ 設定「環境變數」OPEN_API_KEY
export OPENAI_API_KEY='你的API_KEY'
編輯環境變數:開啟Terminal
nano ~/.bash_profile 或 nano ~/.zshrc
存檔後,source ~/.bash_profile 或 source ~/.zshrc
echo $OPENAI_API_KEY
確認設定值
from openai import OpenAI
import os
client = OpenAI(
# 預設是抓取環境變數 os.environ.get("OPENAI_API_KEY")
api_key= "你的API_KEY" # 申請來的API_KEY
)
response = client.completions.create(
model = "text-davinci-002", # 使用的模型
prompt = "將英文翻譯成法文:'Hello, how are you?'",
max_tokens = 50, # 控制生成文本的最大令牌數
temperature=0.7 # 調整多樣性,較高的值會產生更多變化的輸出
)
print(response.choices[0].text) # 印出GPT的回應
pip install --upgrade openai
from openai import OpenAI
import os
client = OpenAI(
# 預設是抓取環境變數 os.environ.get("OPENAI_API_KEY")
api_key= "你的API_KEY" # 申請來的API_KEY
)
response_top_p = client.completions.create(
model="text-davinci-002",
prompt="將英文翻譯成法文: 'Hello, how are you?'",
max_tokens=50,
temperature=0.7,
top_p=0.8 # 控制選擇性,模型將考慮前80%的詞彙
)
print("Response with top_p:")
print(response_top_p.choices[0].text)
from openai import OpenAI
client = OpenAI(
# 預設是抓取環境變數 os.environ.get("OPENAI_API_KEY")
api_key= "你的API_KEY" # 申請來的API_KEY
)
response_top_p = client.completions.create(
model="text-davinci-002",
prompt="將英文翻譯成法文: 'Hello, how are you?'",
max_tokens=50,
temperature=0.7,
frequency_penalty=0.5 #透過增加頻率懲罰來減少生成文本中常見詞彙的出現
)
print(response_top_p.choices[0].text)
from openai import OpenAI
import os
client = OpenAI(
# 預設是抓取環境變數 os.environ.get("OPENAI_API_KEY")
api_key= "你的API_KEY" # 申請來的API_KEY
)
response_top_p = client.completions.create(
model="text-davinci-002",
prompt="將英文翻譯成法文: 'Hello, how are you?'",
max_tokens=50,
temperature=0.7,
presence_penalty=0.5 #透過增加存在懲罰,增加特定詞彙在生成文本中的出現頻率
)
print(response_top_p.choices[0].text)
client = OpenAI()
client.chat.completions
vs
client.completions
單一訊息
多則訊息
需搭配特定格式
遷移學習:預訓練 + 目標領域資料集收集、訓練
機器學習傳統做法
資料集1
資料集2
資料集3
任務1
任務2
任務3
兩階段: 非監督式、監督式
不同任務、不同資料集
Transfer Learning
來源領域任務
資料集S
目標領域任務
大量
資料集T
小量
預訓練unsupervised
微調supervised
GPT
PaLM
哪些可能的任務?
情感分析 (Sentiment Analysis)
主題分析 (Topic Analysis/ Thematic Analysis)
新聞分類 (News Categorization)
多標籤分類(Multilabel Classification)
問答 (Question Answering)
自然語言推論 (Natural Language Inference )
自動摘要 (automatic Abstracting)
機器翻譯 (Machine Translation)
文本生成 (Text Generation)
情感分析(Sentiment Analysis)
負面評價Negative
這家店的售後服務完全不行
餐點還不錯啦,但是還有改進空間
中性評價neutral
中性評價neutral
正面評價positive
很讚喔,超喜歡你們家的產品
分類問題
情感分析
編碼
輸入層
隱藏層
輸出層
輸出結果分類
真實
政治宣傳
惡搞
反諷
假新聞
帶風向
片面資訊
新聞分類
分類問題
機器翻譯
迴歸問題
Transformer
輸入英文: milk drink I
輸出法文: Je bois du lait <eos>
編碼器
解碼器
編碼器輸出
解碼器輸入
<sos>: 開始符號
<eos>: 結束符號
文本生成
輸入: 一句話
輸出: 一篇短文!
經過多個語言模型...
迴歸問題
擷取
生成
轉換
程式碼
自然語言
結構化資料
文本類型
from openai import OpenAI
import os
client = OpenAI(
api_key= "你的API_KEY"
)
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "你的任務是根據英文文法,修改英文句子"
},
{
"role": "user",
"content": "She no went to the market."
}
],
temperature=0, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=256 # 最多256個token
)
print(response.choices[0].message) # 訊息資料結構
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
client = OpenAI(
api_key= "你的API_KEY"
)
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "你的任務是將一則推文做情感分析為正面、中性或負面。"
},
{
"role": "user",
"content": "I loved the new Batman movie!"
}
],
temperature=0, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=256 # 最多256個token
)
print(response.choices[0].message) # 訊息資料結構
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "你的任務將給你的文章,為小學二年級學生摘錄重點"
},
{
"role": "user",
"content": "木星是距離太陽第五顆行星,也是太陽系中最大的行星。"+
"它是一顆氣態巨行星,質量是太陽的千分之一,但是太陽系中所有其他行星"+
"質量總和的兩倍半。木星是夜空中肉眼可見的最亮天體之一,早在有記載的"+
"歷史之前就為古代文明所知。它以羅馬神朱庇特命名。從地球上觀察時"+
",木星的亮度足以使其反射光投射出可見的陰影,並且平均而言,木星"+
"是夜空中第三亮的自然物體,僅次於月球和金星。"
}
],
temperature=0, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=1024 # 最多1024個token
)
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
import os
_path = os.path.dirname(__file__) #目前程式所在資料夾
file_path = _path + '/' + '05-Hello.py' # 替換成你的Python檔案路徑
with open(file_path, 'r', encoding="utf-8") as file: #檔案可能讀取失敗
code = file.read() # 使用read()讀取整個檔案內容
client = OpenAI()
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "您將獲得一段程式碼,您的任務是以簡潔的方式解釋它。"
},
{
"role": "user",
"content": code # 前面讀取的檔案內容
}
],
temperature=0, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=1024 # 最多256個token
)
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
client = OpenAI(
api_key= "你的API_KEY"
)
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "您將獲得產品描述和種子詞,任務則是產生產品名稱。"
},
{
"role": "user",
"content": "產品描述: A home milkshake maker\n" +
"種子詞: fast, healthy, compact."
}
],
temperature=0.8, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=256 # 最多256個token
)
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
client = OpenAI(
api_key= "你的API_KEY"
)
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": "建立一個包含 8 個問題的清單,用於訪問一位科幻作家。"
}
],
temperature=0.5, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=1024 # 最多1024個token
)
print(response.choices[0].message.content) # 訊息
from openai import OpenAI
client = OpenAI(
api_key= "你的API_KEY"
)
response = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": "建立包含頂級科幻電影以及發行年份的兩列 CSV。"
}
],
temperature=0.5, # 回應變化的多樣性,0:變化最少, 1:變化最多
max_tokens=256 # 最多1024個token
)
print(response.choices[0].message.content) # 訊息
Q & A
圖片來源1
圖片來源2
爬取OpenAI網站內容
2. 擷取內容
3. 輸出結果(至檔案)
1. 遍訪連結
建立待訪堆疊
取得HTML回應碼
解析超連結
資料輸出
資料清理
title
text
Word Embedding
詞彙
維度
建立資料結構
def answer_question(
df,
model="gpt-3.5-turbo",
question="Am I allowed to publish model outputs to Twitter, without a human review?",
max_len=1800,
size="ada",
debug=False,
max_tokens=150,
stop_sequence=None
):
"""
根據最近似的自訂文字內容的context來回答問題
"""
context = create_context(
question, # 問題指令
df, # 自訂文字內容的context
max_len=max_len,
size=size,
)
# If debug, print the raw model response
if debug:
print("Context:\n" + context)
print("\n\n")
try:
# Create a chat completion using the question and context
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "Answer the question based on the context below, and if the question can't be answered based on the context, say \"I don't know\"\n\n"},
{"role": "user", f"content": "Context: {context}\n\n---\n\nQuestion: {question}\nAnswer:"}
],
temperature=0,
max_tokens=max_tokens,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
stop=stop_sequence,
)
return response.choices[0].message.strip()
except Exception as e:
print(e)
return ""
answer_question(df, question="What day is it?", debug=False)
answer_question(df, question="What is our newest embeddings model?")
answer_question(df, question="What is ChatGPT?")
"I don't know."
'The newest embeddings model is text-embedding-ada-002.'
'ChatGPT is a model trained to interact in a conversational way. It is able to answer followup questions, admit its mistakes, challenge incorrect premises, and reject inappropriate requests.'
資料爬蟲
資料爬蟲
資料清理
來源領域任務
資料集S
目標領域任務
大量
資料集T
小量
預訓練unsupervised
微調supervised
PaLM
圖片來源1
圖片來源2
2.1 遍訪連結
建立待訪堆疊
1. 從一個網頁開始
2.2 擷取內容
3. 輸出結果(至檔案)
取得HTML回應碼
解析超連結
解析其他HTML元素
資料輸出
資料清理
能力1: 取得HTML回應碼?了解HTTP協定
網址(http request)
瀏覽器
Web 伺服器
HTML回應碼(http response)
http連線功能
➠
能力2: 解析超連結、其他HTML元素、網頁內容 ➠
HTML Parser(解析器)
以p元素為例
找出超連結元素A,屬性href的值 ➠ 待訪網址
元素
內容
開始標籤
結束標籤
屬性名稱
屬性值
能力2: 解析超連結、其他HTML元素、網頁內容
Parser(解析器)
能力1: 取得HTML回應碼?了解HTTP協定
http連線功能
➠
圖片來源1
能力3: 資料清理、資料輸出 ➠
資料處理工具
2.1 遍訪連結
建立待訪堆疊
1. 從一個網頁開始
2.2 擷取內容
3. 輸出結果(至檔案)
圖片來源1
圖片來源2
取得HTML回應碼
解析超連結
解析其他HTML元素
資料輸出
資料清理
➊ 用不到、不相關
➋ 資料闕漏
刪除一筆、刪除一欄、補遺
刪除欄位
➌ 資料型別錯誤
重填正確型別資料
讀取檔案
Web
●●●
建立資料結構
資料清理
輸出
●●●
資料庫
一張表格
欄位名稱
有無索引
資料闕漏
pip install pandas
pip install numpy
96個Transformer解碼器
句子 ➠ 預測下一個字
需進行編碼:
訓練模型擅長直接處理數值資料
[編碼方法1] One-hot encoding: 一字一編號
<SOS> I played the piano
1
2
3
4
5
6
7
8
編碼
輸入層
隱藏層
輸出層
以向量表示
編號
詞彙
<SOS>
編號
0 0 0 0 0 0 0 0
One-hot encoding問題: 詞彙很多(資料稀疏)、編碼與語意無關...
dog
文本分析的詞彙很多
字詞編碼:向量很長、資料稀疏
向量長度 =詞彙數量(10000)
one-hot encoding
One-hot encoding問題: 詞彙很多(資料稀疏)、編碼與語意無關...
one-hot encoding
字彙語意相近,不一定有比較近的「距離」
近?
遠?
Coffee跟Laptop的距離比Tea近?
[編碼方法2]: Word Embedding(詞嵌入)
字彙語意相近,編碼必須給予比較近的「距離」
[編碼方法2]: 常見的Word Embedding方法—Word2Vec
Word2Vec學習大量詞彙,將字詞對應到100-300維度的空間
100-300
Word Embedding
Word Embedding
詞彙
7D to 2D
7D to 2D
維度
Word2Vec