banner
VrianCao

VrianCao's Blog

Hi~ Welcome to the blockchain version of VrianCao's blog site, welcome to Web3! All articles and resources here are stored on the blockchain and verified by signatures; this is the future of blogging!

一個 CF Workers AI 的簡單實例

前言 / 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)

感謝您的閱讀

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。