引言
只需30分鐘,一個能夠無限生成練習題、即時智慧批改的西班牙語AI助理便成功上線。它的後端並非運行在昂貴的中心雲端上,而是完全依賴Gonka這個新興的去中心化AI運算網路。以下是完整的實戰記錄、核心代碼與線上Demo。
去中心化AI計算的新範式
Gonka是一個基於工作量證明的AI計算網絡,透過在經過驗證的硬體供應商之間實現類OpenAI推理任務的負載平衡,建構了一個全新的去中心化AI服務生態。 Gonka網路採用GNK代幣進行支付激勵,並透過隨機抽查機制有效防範詐欺行為。對開發者而言,只要掌握OpenAI API的呼叫方式,就能快速接取Gonka網路部署應用程式。
實戰案例:智慧西班牙語學習應用
我們將建構一個持續生成個人化練習的西班牙語學習應用。想像這樣一個使用場景:
- 使用者點擊"開始新練習"後,AI生成包含單一空白處的完形填空句子
- 使用者輸入答案並點擊"檢查",AI立即給出評分和個人化解析
- 系統自動進入下一個練習,形成沉浸式學習循環
線上示範: carrera.gonka.ai
技術架構解析
應用採用經典的前後端分離架構:
- React前端:基於Vite構建,完全相容OpenAI介面標準
- Node代理層:僅50行核心程式碼,負責請求簽章與轉發
與傳統OpenAI整合的唯一區別在於增加了服務端簽章環節,這確保了金鑰安全,其他所有操作都保持與標準OpenAI聊天補全呼叫一致。

快速開始指南
環境需求:Node.js 20+
克隆程式碼庫
git clone git@github.com:product-science/carrera.git
cd carrera
建立Gonka 帳戶並設定環境變量
# 使用inferenced CLI 建立帳戶
# 查看快速入門文件了解CLI 下載方式:
# https://gonka.ai/developer/quickstart/#2-create-an-account
# ACCOUNT_NAME 可為任意本地唯一名稱,作為帳戶密鑰對的可讀標識
ACCOUNT_NAME="carrera-quickstart"
NODE_URL=http://node2.gonka.ai:8000
inferenced create-client "$ACCOUNT_NAME" \
--node-address "$NODE_URL"
# 匯出私鑰(僅限服務端使用)
export GONKA_PRIVATE_KEY=$(inferenced keys export "$ACCOUNT_NAME" --unarmored-hex --unsafe)
啟動代理服務
cd gonka-proxy
npm install && npm run build
NODE_URL=http://node2.gonka.ai:8000 ALLOWED_ORIGINS=http://localhost:5173 PORT=8080 npm start
健康檢查
curl http://localhost:8080/healthz
# 預期回傳:{"ok":true,"ready":true}
運行前端應用
cd web
npm install
VITE_DEFAULT_API_BASE_URL=http://localhost:8080/v1 npm run dev
在應用程式中開啟"設定"→基礎URL 已預先填寫。選擇模型(例如Qwen/Qwen3-235B-A22B-Instruct-2507-FP8,可造訪https://node1.gonka.ai:8443/api/v1/models查看目前可用模型清單),點選"測試連線"。
核心技術實現
Gonka 代理服務是與Gonka 整合的核心。代理服務使用金鑰對請求進行簽名,然後將類別OpenAI 呼叫轉送至網路。開發者為自己的應用程式部署此類代理程式後,即可開始在Gonka 上處理推理任務。實際使用時建議新增身份驗證機制,確保僅授權使用者可要求推理。
代理服務使用的環境變數:
// gonka-proxy/src/env.ts
export const env = {
PORT: num("PORT", 8080),
GONKA_PRIVATE_KEY: str("GONKA_PRIVATE_KEY"),
NODE_URL: str("NODE_URL"),
ALLOWED_ORIGINS: (process.env.ALLOWED_ORIGINS ?? "*")
.split(",")
.map((s) => s.trim())
.filter(Boolean),
};
使用Gonka OpenAI TypeScript SDK (gonka-openai) 建立客戶端(Go 和Python 版本也已提供,更多語言支援持續更新中,請關注程式碼庫):
// gonka-proxy/src/gonka.ts
import { GonkaOpenAI, resolveEndpoints } from "gonka-openai";
import { env } from "./env";
export async function createGonkaClient() {
const endpoints = await resolveEndpoints({ sourceUrl: env.NODE_URL });
return new GonkaOpenAI({ gonkaPrivateKey: env.GONKA_PRIVATE_KEY, endpoints });
}
暴露與OpenAI 相容的聊天補全端點(/v1/chat/completions):
// gonka-proxy/src/server.ts
app.get("/healthz", (_req, res) => res.json({ ok: true, ready }));
app.post("/v1/chat/completions", async (req, res) => {
if (!ready || !client) return res.status(503).json({ error: { message: "代理未就緒" } });
const body = req.body as ChatCompletionRequest;
if (!body || !body.model || !Array.isArray(body.messages)) {
return res.status(400).json({ error: { message: "必須提供'model' 和'messages' 參數" } });
}
try {
const streamRequested = Boolean(body.stream);
const { stream: _ignored, ...rest } = body;
if (!streamRequested) {
const response = await client.chat.completions.create({ ...rest, stream: false });
return res.status(200).json(response);
}
// …
server.ts 中還包含了串流(SSE)的透傳支持,開發者可以在支援串流處理的用戶端中透過設定stream: true 來啟用。 Gonka 也提供了Dockerfile確保可重現的建置和便利的部署:
# gonka-proxy/Dockerfile
# ---- 建置階段----
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json tsconfig.json ./
COPY src ./src
RUN npm ci && npm run build
# ---- 運行階段----
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/package*.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
EXPOSE 8080
CMD ["node", "dist/server.js"]
技術解析:前端(供應商無關設計)
React 應用程式始終保持與OpenAI 的兼容性,無需了解Gonka 的具體實作細節。它只需呼叫類別OpenAI 端點並渲染前述的練習循環介面。
所有後端互動均在web/src/llmClient.ts 中完成,其中對聊天補全端點發起單次呼叫:
// web/src/llmClient.ts
const url = `${s.baseUrl.replace(/\/+$/, "")}/chat/completions`;
const headers: Record<string, string> = { "Content-Type": "application/json" };
if (s.apiKey) headers.Authorization = `Bearer ${s.apiKey}`; // 可選參數
const res = await fetch(url, {
method: "POST",
headers,
body: JSON.stringify({ model: s.model, messages, temperature }),
signal,
});
if (!res.ok) {
const body = await res.text().catch(() => "");
throw new Error(`LLM 錯誤${res.status}: ${body}`);
}
const data = await res.json();
const text = data?.choices?.[0]?.message?.content ?? "";
return { text, raw: data };
要指定API 服務供應商,只需在頂部的"設定"彈跳窗中配置基礎URL,也可以在此設定模型,預設使用Qwen/Qwen3-235B-A22B-Instruct-2507-FP8。如需在無網路環境下進行本機測試,可將基礎URL 設為mock:;實際呼叫時則設定為開發者的代理位址(快速開始中已預先填入):
// web/src/settings.ts
export function getDefaultSettings(): Settings {
const prodBase = (import.meta as any).env?.VITE_DEFAULT_API_BASE_URL || "";
const baseUrlDefault = prodBase || "mock:";
return { baseUrl: baseUrlDefault, apiKey: "", model: "Qwen/Qwen3-235B-A22B-Instruct-2507-FP8" };
}
應用的提示與評分機制
我們使用兩種提示模板:
產生提示: "你是西班牙文老師...只輸出嚴格JSON 格式...產生包含剛好一個空白(____)的完形填空句子,需包含答案、說明和難度等級"
評分提示: "你是批改作業的西班牙語老師...輸出嚴格JSON 格式,包含通過/未通過狀態和解析說明"
產生流程的範例程式碼片段:
// web/src/App.tsx
const sys: ChatMsg = {
role: "system",
content: `你是設計互動練習的西班牙文老師。
僅輸出嚴格JSON 格式(無說明文本,無程式碼標記)。物件必須包含以下鍵:
{
"type": "cloze",
"text": "<包含恰好一個用____ 標記的空白處的西班牙文句子>",
"answer": "<空白處的唯一正確答案>",
"instructions": "<清晰的說明>",
"difficulty": "beginner|intermediate|advanced"
}
內容規範:
- 使用自然的生活場景
- 只保留一個空白(在句子中精確使用____ 標記)
- 句子長度控制在8-20 個單字
- 句子部分僅使用西班牙語,說明部分可使用英語
- 多元練習重點:ser/estar、過去式與未完成式、虛擬語氣、por/para、一致性、常用介詞、核心詞彙`
};
我們新增了幾個少樣本範例幫助模型理解輸出格式,然後解析JSON 並渲染練習。評分環節同樣採用嚴格的JSON 模式輸出通過/未通過結果及簡單解析。
解析機制具備容錯性-會自動清理程式碼標記並在需要時擷取首個JSON 資料塊:
// web/src/App.tsx
// 容錯JSON 擷取器,適配可能包含說明文字或程式碼標記的模型輸出
function extractJsonObject<TExpected>(raw: string): TExpected {
const trimmed = String(raw ?? "").trim();
const fence = trimmed.match(/```(?:json)?\s*([\s\S]*?)\s*```/i);
const candidate = fence ? fence[1] : trimmed;
const tryParse = (s: string) => {
try {
return JSON.parse(s) as TExpected;
} catch {
return undefined;
}
};
const direct = tryParse(candidate);
if (direct) return direct;
const start = candidate.indexOf("{");
const end = candidate.lastIndexOf("}");
if (start !== -1 && end !== -1 && end > start) {
const block = candidate.slice(start, end + 1);
const parsed = tryParse(block);
if (parsed) return parsed;
}
throw new Error("無法從模型回應解析JSON");
}
對開發者的後續建議:
• 新增自訂練習類型和評分規則
• 啟用串流UI(代理程式已支援SSE)
• 為Gonka 代理程式新增身份驗證和速率限制
• 將代理程式部署至開發者的基礎設施,並為Web 應用程式建置時設定VITE_DEFAULT_API_BASE_URL
總結與展望
為什麼選擇Gonka?
- 成本優勢:相較於傳統雲端服務,去中心化運算顯著降低推理成本
- 隱私保護:請求透過代理簽名,密鑰永不暴露
- 相容性:完全相容OpenAI生態,遷移成本極低
- 可靠性:分散式網路確保服務高可用性
Gonka為AI開發者提供了通往去中心化計算時代的平滑過渡方案。透過本文介紹的整合方式,開發者能夠在保持現有開發習慣的同時,享受去中心化網路帶來的成本優勢和技術紅利。隨著去中心化AI基礎設施的不斷完善,這種開發模式有望成為下一代AI應用的標準實踐。同時,Gonka也將上線更多實用功能,並與開發者一同探索更多AI應用場景,包括但不限於智慧教育應用、內容產生平台、個人化推薦系統、自動化客服解決方案等。
原文連結: https://what-is-gonka.hashnode.dev/build-a-productionready-ai-app-on-gonka-endtoend-guide
關於Gonka.ai
Gonka 是一個旨在提供高效AI 算力的去中心化網絡,其設計目標是最大限度地利用全球GPU 算力,完成有意義的AI 工作負載。透過消除中心化守門人,Gonka 為開發者和研究人員提供了無需許可的算力資源訪問,同時透過其原生代幣GNK 獎勵所有參與者。
Gonka 由美國AI 開發商Product Science Inc. 孵化。該公司由Web 2 產業資深人士、前Snap Inc. 核心產品總監Libermans 兄妹創立,並於2023 年成功融資1,800 萬美元,投資者包括OpenAI 投資方Coatue Management、Solana 投資方Slow Ventures、K 5、Insight and Benchmark 合夥人等。計畫的早期貢獻者包括6 blocks、Hard Yaka、Gcore 和Bitfury 等Web 2-Web 3 領域的知名領導企業。
- 核心观点:Gonka去中心化AI网络可低成本部署应用。
- 关键要素:
- 兼容OpenAI API,迁移成本极低。
- 采用GNK代币激励计算节点。
- 30分钟快速部署西班牙语学习应用。
- 市场影响:降低AI应用开发门槛与成本。
- 时效性标注:中期影响



