快速打造一個 OpenAI 工具
生成式 AI 幾個月快速席捲世界,但不是每個人每個公司都有能力訓練自己的 LLM,目前最快的方式就是直接串接 OpenAI 的 API。
本文講解一下如何用 OpenAI API 快速打造自己的工具,本文以網路文章的摘要與翻譯產生器為例。原本這個是用來解決我自己的問題,但我想透過同樣的方式,你也快速打造自己的 OpenAI 工具。
先來看看最後成果長什麼樣子:
一開始先讓使用者輸入自己的 OpenAI API Key,再來是輸入文章網址,程式會自動抓取網頁的內文,透過 OpenAI 產生摘要。
整個 app 是透過 Streamlit 打造,Streamlit 原本是打造給深度學習AI 的一個工具,很類似 JupiterNotebook。透過它,你不需要了解前後端技術,只要會寫 Python,就可以寫出類似的 App,並且在 Streamlit 上執行完全不需要費用。
程式本身也不複雜,可以參考原始程式碼:
只有約一百行程式左右。不過有點要注意的是,由於 GPT3 有 Token的上限,最高只允許 4096 個 Token,但是我們在分析一些長文時,很容易就超過這個上限,目前 OpenAI 建議的做法也是將文章拆成數個片段,依序去執行。
所以要拆文章時,可以用 pretrained 的 GPT2 切 Token 的方式來做估算,以兩千個 Token 為單位拆開,再個別丟給 OpenAI 就好。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
def text_to_chunks(text, chunk_size=2000, overlap=100):
tokens = tokenizer.encode(text)
num_tokens = len(tokens)
chunks = []
for i in range(0, num_tokens, chunk_size - overlap):
chunk = tokens[i:i + chunk_size]
chunks.append(chunk)
return chunks
因為是切出多個 Chunk,所以每個 Chunk 之間也保留 100 個 Token 的 overlap ,來避免有些資訊不見了。
OpenAI API 呼叫方式可以參考官方文件,但它是 Restful API,透過 SDK 使用很簡單:
def callOpenAI(prompt_request, max_tokens=500):
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt_request,
temperature=.5,
max_tokens=max_tokens,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].text
GPT 模型都是用 Prompt 去控制你要的結果,所以只要在文字前給予正確的指令就好,例如: Summarize text: <your article text>
兜在一起要做文章摘要程式會像這樣:
def summarize_text(full_text):
chunks = text_to_chunks(full_text)
summaries = []
for i, chunk in enumerate(chunks):
text = tokenizer.decode(chunks[i])
summary = callOpenAI(f"Summarize: {text}")
summaries.append(summary)
if len(summaries) > 0:
final_summary = callOpenAI(f"Consolidate the summaries with paragraphs: {str(summaries)}", max_tokens=2000)
return final_summary
每個 Chunk 個摘要組合起來,再請 OpenAI 做個最後總結就好了。
最後用 Streamlit 來控制程式執行流程,至於 Streamlit 怎麼用,可以參考一些網路上的中文說明,例如這篇。
你可以先在本機端跑 Streamlit 測試,測試好了,註冊 Streamlit 帳號,連結 Github ,然後就可以部署到 Streamlit 上去給別人用了。
記得不要隨便把 OpenAI API 直接放在程式裡讓別人使用,要不然你的 Quota 很快就爆了。