為 Go-llm-cpp 接入 Web API 接口,創建 Chatbot 聊天機器人

接續上一篇,用 Go 打造本地 LLM 聊天機器人:整合 llm-go 與 go-llama.cpp,此篇開始建構前端與 API 接口

執行環境需求
? ? Go 1.20+
? ? C++ toolchain(macOS: Xcode Command Line Tools / Linux: g++)
? ? GGUF 格式模型(如:Gemma-2B.gguf, Llama2-7B.gguf)
? ? 可選:make 工具簡化編譯

一、專案整合架構更新

llama-chatbot-go/
├── cmd/
│   ├── main.go          # CLI 主程式
│   └── main_web.go      # 啟動 HTTP Server
├── llm/
│   ├── model.go         # 封裝模型邏輯
│   └── chat.go          # 管理 prompt 歷史
├── web/
│   ├── handler/
│   │   └── chat.go      # 處理 POST /api/chat
│   ├── routes/
│   │   └── router.go    # gin 路由
│   └── ui/
│       └── index.html   # Web 前端頁面
├── config/
│   └── persona.yaml     # 角色設定
├── go.mod
└── docs/                # Swagger 文檔生成目錄

二、Swagger 接口文檔

go install github.com/swaggo/swag/cmd/swag@latest
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

新增註解至 web/routes/router.go:

// @title LLaMA ChatBot API
// @version 1.0
// @description 基于 go-llama.cpp 與 llm-go 的本地語言模型聊天機器人  API
// @host localhost:8080
// @BasePath /// @contact.name 開發者支援
// @contact.email dev@example.com

在 main_web.go 中加入 Swagger 路由:

import ("github.com/swaggo/gin-swagger""github.com/swaggo/files"_ "your_project/docs" // docs 是 swag init 成的目錄
)r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

在專案根目錄執行

swag init

瀏覽 http://localhost:8080/swagger/index.html 即可查看中文接口文檔。

三、Web 前端介面(純 HTML)

在 web/ui/index.html 建立:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>LLaMA Chat</title>
</head>
<body><h2>LLaMA 聊天介面</h2><div><textarea id="input" rows="3" cols="60" placeholder="輸入你的問題..."></textarea><br><button onclick="send()">發送</button></div><pre id="response"></pre><script>async function send() {const input = document.getElementById('input').value;const res = await fetch('/api/chat', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ message: input })});const data = await res.json();document.getElementById('response').innerText = data.response || JSON.stringify(data);}</script>
</body>
</html>

并在你的 main_web.go 中加入靜態檔案伺服:

r.Static("/ui", "./web/ui")

四、Swagger 集成步驟

改寫 main.go
以下是具 Swagger 支援的 main.go,加入 /chat 路由文檔與 /swagger/index.html 的瀏覽功能:

package mainimport ("net/http""github.com/gin-gonic/gin""github.com/go-skynet/go-llama.cpp"_ "llama-chat/docs" // swagger 文件註冊swaggerFiles "github.com/swaggo/files"ginSwagger "github.com/swaggo/gin-swagger"
)// ChatRequest 用戶輸入
type ChatRequest struct {Message string `json:"message" example:"你好,請介紹你自己"`
}// ChatResponse 模型回應
type ChatResponse struct {Reply string `json:"reply" example:"你好,我是部署在本地的語言模型。"`
}// @title Gemma LLM Chatbot API
// @version 1.0
// @description 使用 Llama.cpp 驅動的本地 LLM 聊天接口
// @host localhost:8080
// @BasePath /
func main() {r := gin.Default()model := llama.LoadModel("path/to/gemma-2b.gguf", llama.Params{Threads: 4})defer model.Close()// swagger 文檔路由r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))// 聊天接口// @Summary 啟動聊天// @Description 提交一段文字并取得回應// @Accept  json// @Produce  json// @Param   message  body  ChatRequest  true  "用戶輸入"// @Success 200 {object} ChatResponse// @Router /chat [post]r.POST("/chat", func(c *gin.Context) {var req ChatRequestif err := c.ShouldBindJSON(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}resp := model.Predict(llama.PredictOptions{Prompt:    req.Message,MaxTokens: 128,Stream:    false,})c.JSON(http.StatusOK, ChatResponse{Reply: resp.Content})})r.Run(":8080")
}

瀏覽與測試
打開你的瀏覽器進入:

http://localhost:8080/swagger/index.html

補充說明
? 所有 @XXX 是 Swagger 的注解標簽。
? 如果你日后有多模型、多任務接口,可以用 @Tag 區分模組。
? 所有 example: 設定會在 Swagger UI 預填樣例值,便于測試。

下一步將會
? Swagger + Swagger UI(開發者介面)

使用技術:Swagger YAML + Swagger UI

特征:
? 適合 API 測試、技術人員驗證用
? 具備 POST /chat、GET /healthz 等接口說明
? 支援 request/response 模擬

? 美化版 Chat Web App(推薦給公開展示用)

使用技術::Vue.js / React + Tailwind + WebSocket Streaming

特征:
? 支援上下文顯示
? 支援多輪對話
? 支援多角色選擇與人格切換
? UI 類似 ChatGPT 界面

?
參考鏈接:
?
本項目 README

🧾 GitCode 開源項目地址:

👉 GitCode - 全球開發者的開源社區,開源代碼托管平臺

我是一位獨立開發者,加入使用者社群,一起討論私有化 LLM 與 RAG 架構實踐,歡迎 Star、Fork、Issue 交流。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88344.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker筆記-Docker Compose

Docker筆記-Docker Compose Compose 是用于定義和運行多容器 Docker 應用程序的工具&#xff0c;通過 Compose 您可以使用 YML 文件來配置應用 程序需要的所有服務。然后&#xff0c;使用一個命令&#xff0c;就可以從 YML 文件配置中創建并啟動所有服務。 Compose 使用的三個步…

n1 armbian 安裝桌面環境并啟用xrdp遠程登錄

armbian-config armbian-software201frpcrootarmbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: ubuntu/noble ]... ──────────────────────────────────────────────────────────…

從傳統到智能:地質災害風險評估、易發性分析與災后重建;AI大語言模型DeepSeek、ChatGPT、GIS、Python和機器學習深度融合

地質災害是指全球地殼自然地質演化過程中&#xff0c;由于地球內動力、外動力或者人為地質動力作用下導致的自然地質和人類的自然災害突發事件。在降水、地震等自然誘因的作用下&#xff0c;地質災害在全球范圍內頻繁發生。我國不僅常見滑坡災害&#xff0c;還包括崩塌、泥石流…

便捷的電腦自動關機輔助工具

軟件介紹 本文介紹的軟件是一款電腦上實用的倒計時和關機助手。 軟件特性 這款關機助手十分貼心&#xff0c;它是一款無需安裝的小軟件&#xff0c;體積僅60KB&#xff0c;不用擔心占用電腦空間&#xff0c;打開即可直接使用。 操作方法 你只需設置好對應的關機時間&#x…

Fiddler-關于抓取Android手機包,安裝證書后頁面加載失敗,提示當前證書不可信存在安全風險的問題

Fiddler-關于抓取Android手機包&#xff0c;安裝證書后頁面加載失敗&#xff0c;提示當前證書不可信存在安全風險的問題Fiddler-關于抓取Android手機包&#xff0c;安裝證書后頁面加載失敗&#xff0c;提示當前證書不可信存在安全風險的問題原因解決方法Fiddler-關于抓取Androi…

Apache Spark 4.0:將大數據分析提升到新的水平

Apache Spark 4.0 帶來了 PySpark 畫圖、多態 UDTF、改進的 SQL 腳本和 Python API 更新&#xff0c;以增強實時分析和可用性。 Apache Spark 4.0 于 2025 年發布&#xff0c;它通過增強性能、可訪問性和開發者生產力的創新&#xff0c;重新定義了大數據處理。在 Databricks、A…

手機解壓軟件 7z:高效便捷的解壓縮利器

在當今數字化時代&#xff0c;手機已經成為人們生活和工作中不可或缺的工具。隨著文件傳輸和存儲需求的不斷增加&#xff0c;7z 文件格式因其高效的壓縮比而備受青睞。在手機上處理 7z 文件變得越來越重要&#xff0c;合適的解壓軟件能帶來諸多便利。首先&#xff0c;7z 文件格…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第六課——測試圖案的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

Solidity——修改狀態變量注意事項和簡單優化建議

你的問題非常關鍵&#xff0c;涉及到 Solidity 合約部署時的初始化 gas 成本 和 運行時的存儲操作 gas 消耗。我們來詳細解答&#xff1a; &#x1f6a8; 首先&#xff0c;你的代碼是非法的&#xff1a; contract MyContract {uint public myNumber;myNumber 1; // ? 不允許…

2023年全國青少年信息素養大賽Python編程小學組復賽真題+答案解析-海南賽區

2023年全國青少年信息素養大賽Python編程小學組復賽真題+答案解析-海南賽區 編程題 第1題 整數加8 題目描述 輸入一個整數,輸出這個整數加8的結果。 輸入描述 輸入一行一個正整數。 輸出描述 輸出求和的結果。 樣例1 輸入: 5 輸出: 13 題目解析 這是最基礎的輸入輸出與…

Qt基本組件詳解:按鈕、輸入框與容器控件

Qt基本組件詳解&#xff1a;按鈕、輸入框與容器控件目錄 按鈕類組件 QPushButtonQRadioButtonQCheckBox 輸入框組件 QLineEditQTextEdit 容器組件 QGroupBox 綜合應用示例思維導圖總結1. 按鈕類組件 1.1 QPushButton&#xff08;普通按鈕&#xff09; 功能&#xff1a;基礎交互…

Unity Universal Render Pipeline/Lit光照材質介紹

文章目錄前言參數介紹1、表面選項1.1 Worflow Mode工作流模式1.2 Surface Type 表面類型1.3 Blending Mode 混合模式1.4 Preserve Specular 保留鏡面光照&#xff08;高光&#xff09;1.5 Render Face 渲染面1.6 Alpha Clipping 透明度剪裁1.7 Receive Shadows 是否接收陰影2、…

uni-app ios離線推送,推送后點擊推送的鏈接進入程序后再次回到桌面,無法消除app的角標問題

問題現象&#xff1a; 解決方案&#xff1a; 1、用h5方法清理 h5地址&#xff1a;HTML5 API Reference 廢話不多說上代碼 /*** 清除應用角標&#xff08;支持iOS和Android&#xff09;* 使用H5方法清理推送角標*/clearAppBadge() {// #ifdef APP-PLUStry {plus.runtime.setBad…

遷移Oracle SH 示例 schema 到 PostgreSQL

接著上一篇文章&#xff1a;遷移Oracle HR 示例 schema 到 PostgreSQL中&#xff0c;本文做Oracle SH&#xff08;Sales History&#xff09;示例 schema的遷移&#xff0c;SH schema比HR schema更大更復雜&#xff0c;本次遷移的重點是&#xff1a; 分區表外部數據加載 使用…

1.1 ARMv8/ARMv9安全擴展

目錄1.1.1 ARM架構安全演進1.1.2 ARMv8安全特性異常級別(EL)安全模型關鍵安全擴展1.1.3 ARMv9安全創新機密計算架構(CCA)增強的隔離機制1.1.4 安全擴展的TF-A支持1.1.5 安全擴展配置示例1.1.1 ARM架構安全演進 ARM架構從v7到v9的安全演進路線&#xff1a; ARMv7&#xff1a;引…

更新用戶隱私協議后還是 ail api scope is not declared in the privacy agreement怎么辦??!

saveImageToPhotosAlbum:fail api scope is not declared in the privacy agreement昨天明明可以了&#xff0c;開了個會出來&#xff0c;又不行了&#xff0c;真要命啊啊啊啊啊啊啊啊啊啊(現在回想起來可能是因為我把發布的那個版本刪了&#xff0c;因為那個只是用來測試用的e…

練習:對象數組 5

定義一個長度為 3 的數組&#xff0c;數組存儲 1~3 名學生對象作為初始數據&#xff0c;學生對象的學號&#xff0c;姓名各不相同。學生的屬性&#xff1a;學號&#xff0c;姓名&#xff0c;年齡。要求 1&#xff1a;再次添加一個學生對象&#xff0c;并在添加的時候進行學號的…

Linux 中的 .bashrc 是什么?配置詳解

如果你使用過 Linux 終端&#xff0c;那么你很可能接觸過 .bashrc 文件。這個功能強大的腳本是個性化命令行環境并使其更高效運行的關鍵。 在本文中&#xff0c;我們將向你介紹這個文件是什么&#xff0c;在哪里可以找到它&#xff0c;以及如何安全地編輯它。你還將學到一些實…

JVM運行時數據區深度解析

&#x1f4be; JVM運行時數據區深度解析 文章目錄&#x1f4be; JVM運行時數據區深度解析&#x1f3af; 引言&#x1f4da; 方法區&#x1f4cb; 方法區存儲內容&#x1f504; 從永久代到元空間的演進永久代時期&#xff08;JDK 8之前&#xff09;元空間時期&#xff08;JDK 8及…

.NET nupkg包的深度解析與安全防護指南

在.NET開發領域&#xff0c;nupkg包是開發者們不可或缺的工具。它不僅是代碼分發和資源共享的核心載體&#xff0c;還貫穿了開發、構建、部署的全流程。今天&#xff0c;我們將深入探討nupkg包的核心功能、打包發布流程以及安全防護措施&#xff0c;幫助你在.NET開發中更加得心…