接续上一篇,用 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开发中更加得心…