前言 / Introduction#
都說 Cloudflare 是賽博佛祖,是實際推動 serverless 的慈善企業,這句話在 Workers AI 發布後再次得到了印證,個人搭建 AI 應用、跑 AI 模型從未如此簡單過,接下來讓我們通過一個簡單的實例,親身搭建一個基於 CF Workers AI 的 LLM 來看看開發流程究竟有多麼低,有多麼簡單🤯
前期準備 / Preparations#
- 一個 Cloudflare 帳號
- 一個 Python 開發環境
- 需安裝 requests 庫
- 可選裝 jsonpath
教程 / Tutorial#
獲取 Cloudflare Workers AI API Token#
與其他 API 類似,你需要先獲取一個 API Token,以便計費和驗明身份
進入Cloudflare 控制台,登錄你的 Cloudflare 賬戶,接著點擊側邊欄中的AI選項卡,進入 Workers AI 主界面,接著依次選擇 使用 REST API -> 獲取 API 令牌,進入一個新的頁面,什麼都不用管,直接滑到底,點擊繼續以顯示摘要即可,創建令牌,隨後複製生成的令牌並妥善保存
請注意,生成的令牌只會顯示這一次,且持有令牌可以直接訪問你的 Workers AI 資源,請保存在一個安全的地方
初階代碼#
修改模型和 Token#
返回 “使用 Workers AI REST API” 頁面,在下方代碼區選擇第三個 python,其應該類似下面這樣
import requests
API_BASE_URL = "https://api.cloudflare.com/client/v4/accounts/{id}/ai/run/"
headers = {"Authorization": "Bearer {API_TOKEN}"}
# 已隱去我的 account id,其本應填充{id}
def run(model, inputs):
input = { "messages": inputs }
response = requests.post(f"{API_BASE_URL}{model}", headers=headers, json=input)
return response.json()
inputs = [
{ "role": "system", "content": "You are a friendly assistan that helps write stories" },
{ "role": "user", "content": "Write a short story about a llama that goes on a journey to find an orange cloud "}
];
output = run("@cf/meta/llama-2-7b-chat-int8", inputs)
print(output)
將代碼複製,打開準備好的 Python 環境,複製進去,接下來我們需要將模型改為更適合中國寶寶體質的 qwen1.5-7b-chat-awq,在代碼中找到
output = run("@cf/meta/llama-2-7b-chat-int8", inputs)
將其中的@cf/meta/llama-2-7b-chat-int8
修改為@cf/qwen/qwen1.5-7b-chat-awq
,接著找到
headers = {"Authorization": "Bearer {API_TOKEN}"}
將剛剛生成的 API Token 替換掉{API_TOKEN}
即可
讓我們試著運行一下程序,此時如果一切正常,程序應該已經可以正常運行並返回相應的結果了
修改 Prompt#
接下來我們需要修改 system prompt 和問題以做到提問的作用,讓我們在程序中找到
inputs = [
{ "role": "system", "content": "You are a friendly assistan that helps write stories" },
{ "role": "user", "content": "Write a short story about a llama that goes on a journey to find an orange cloud "}
];
其中的"role": "system", "content":
後面的內容對應的是 LLM 中的 system prompt,將其修改為 "你是一位優秀的中文助手" (可以自由發揮,按需求修改)
而"role": "user", "content":
後面則是你向 AI 提的問題,這裡可以修改為你想說的話,例如 "你好,請介紹一下你自己"
至此,你其實已經完成了一個基礎的實例,就是這麼簡單,接下來我們將實現用戶輸入和輸出優化
進階代碼#
實現用戶輸入#
毫無難度的一部分,只需要對 inputs 開刀稍作修改即可,直接展示結果
userinput = input("請輸入要提的問題:")
inputs = [
{ "role": "system", "content": "你是一位優秀的中文助手" },
{ "role": "user", "content": userinput}
];
output = run("@cf/qwen/qwen1.5-7b-chat-awq", inputs)
此處將原本固定的 prompt 修改為了一個讀取用戶輸入的 userinput,便實現了用戶輸入的功能
輸出優化#
如果你留心注意,不難發現現在的輸出真是醜的要命,是一個裸返回 json,類似
{'result': {'response': '你好!很高興能為你提供幫助。有什麼問題或需要幫助的嗎?'}, 'success': True, 'errors': [], 'messages': []}
我們其實只需要response
中的內容,要實現剝離 response,我們就需要請出選裝的 jsonpath 了,在 output 底下加一行
final = jsonpath(output,"$..response")[0]
再將print(output)
修改為print(final)
即可
這樣,你的輸出就變成了純淨的 "你好!很高興能為你提供幫助。有什麼問題或需要幫助的嗎?"
更進一步?#
其實到剛才為止,作為一個一輪對話的 AI 已經相當完善了,但是我們也可以更進一步,實現多輪對話的功能,具體實現過程見代碼,這裡不多做講解了
Final Code#
import requests
from jsonpath import jsonpath
info = ["你是一位優秀的中文聊天助手,前文的所有聊天為:"]
API_BASE_URL = "https://api.cloudflare.com/client/v4/accounts/{id}/ai/run/"
# Replace with your user id
headers = {"Authorization": "Bearer {API_TOKEN}"}
# Replace with your API_TOKEN
def run(model, inputs):
input = { "messages": inputs }
response = requests.post(f"{API_BASE_URL}{model}", headers=headers, json=input)
return response.json()
userinput = input("請輸入要提的問題:")
waittoaddU = "用戶提問:" + userinput
info.append(waittoaddU)
inputs = [
{ "role": "system", "content": "你是一位優秀的中文助手" },
{ "role": "user", "content": userinput}
];
output = run("@cf/qwen/qwen1.5-7b-chat-awq", inputs)
final = jsonpath(output,"$..response")[0]
waittoaddA = "系統回答:" + final
info.append(waittoaddA)
print(final)
while True:
userinput = input("請輸入要提的問題:")
if userinput == "EXIT":
break
inputs = [
{ "role": "system", "content": "\n".join(info) },
{ "role": "user", "content": userinput}
];
output = run("@cf/qwen/qwen1.5-7b-chat-awq", inputs)
waittoaddU = "用戶提問:" + userinput
info.append(waittoaddU)
final = jsonpath(output,"$..response")[0]
waittoaddA = "系統回答:" + final
info.append(waittoaddA)
print(final)
感謝您的閱讀