風險提示:防範以"虛擬貨幣""區塊鏈"名義進行非法集資的風險。——銀保監會等五部門
資訊
發現
搜索
登錄
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
查看行情
從0到1:在Gonka上部署你的第一個AI應用
Gonka_ai
特邀专栏作者
@gonka_ai
2025-10-29 04:00
本文約7406字,閱讀全文需要約11分鐘
Gonka為AI開發者提供了通往去中心化計算時代的平滑過渡方案。

引言

只需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?

  1. 成本優勢:相較於傳統雲端服務,去中心化運算顯著降低推理成本
  2. 隱私保護:請求透過代理簽名,密鑰永不暴露
  3. 相容性:完全相容OpenAI生態,遷移成本極低
  4. 可靠性:分散式網路確保服務高可用性

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 領域的知名領導企業。

官網| Github | X | Discord |白皮書|經濟模型|使用手冊

開發者
技術
AI
AI總結
返回頂部
  • 核心观点:Gonka去中心化AI网络可低成本部署应用。
  • 关键要素:
    1. 兼容OpenAI API,迁移成本极低。
    2. 采用GNK代币激励计算节点。
    3. 30分钟快速部署西班牙语学习应用。
  • 市场影响:降低AI应用开发门槛与成本。
  • 时效性标注:中期影响
下載Odaily星球日報app
讓一部分人先讀懂 Web3.0
IOS
Android