字节笔记本

2026年2月22日

Breeze:使用 Go 语言构建的简单 ChatGPT 克隆项目

本文介绍 Breeze,一个使用 Go 语言和 langchaingo 库构建的简单 ChatGPT 克隆项目。该项目由 Sau Sheong Chang 开发,展示了如何使用 Go 语言快速构建基于 OpenAI API 的聊天应用。

项目简介

Breeze 是一个简洁的 ChatGPT 克隆应用,使用 Go 语言开发。它利用 OpenAI 的 GPT 模型作为后端 LLM,通过 langchaingo 库与 OpenAI API 进行交互。项目代码开源在 GitHub 上,目前获得了 39+ stars。

作者 Sau Sheong Chang 在文章中提到,由于 Python 拥有丰富的 LLM 开发生态(如 LangChain、LlamaIndex、HuggingFace),他之前一直使用 Python 编写 LLM 应用。但在发现 langchaingo 这个全面的 Go 语言 LLM 库后,他决定尝试用 Go 构建一个 ChatGPT 克隆版。

核心特性

  • 简洁的 Web 界面:基于 Bootstrap 5 构建的响应式聊天界面
  • OpenAI 集成:使用 langchaingo 与 OpenAI API 无缝集成
  • 代码高亮:支持 Markdown 格式和代码语法高亮
  • 轻量级:代码简洁,易于理解和扩展

技术栈

技术用途
Go 1.20后端编程语言
langchaingoGo 语言的 LangChain 实现
go-chi/chiHTTP 路由和中间件
godotenv环境变量管理
Bootstrap 5前端 UI 框架
Highlight.js代码语法高亮
Showdown.jsMarkdown 渲染

安装指南

前置要求

  • Go 1.20 或更高版本
  • OpenAI API Key

安装步骤

  1. 克隆仓库
bash
git clone https://github.com/sausheong/breeze.git
cd breeze
  1. 安装依赖
bash
go mod download
  1. 配置环境变量
bash
cp .env.example .env

编辑 .env 文件,填入你的 OpenAI API Key:

text
OPENAI_API_KEY=your-api-key-here
OPENAI_MODEL=gpt-3.5-turbo
PORT=1100
  1. 启动应用
bash
go run main.go

应用将在 http://localhost:1100 启动。

代码解析

后端实现 (main.go)

go
package main

import (
	"context"
	"encoding/json"
	"log"
	"net/http"
	"os"
	"text/template"

	"github.com/go-chi/chi"
	"github.com/go-chi/chi/middleware"
	"github.com/joho/godotenv"
	"github.com/tmc/langchaingo/llms/openai"
	"github.com/tmc/langchaingo/schema"
)

func init() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}
}

func main() {
	r := chi.NewRouter()
	r.Use(middleware.Logger)
	r.Handle("/static/*", http.StripPrefix("/static", http.FileServer(http.Dir("./static"))))
	r.Get("/", index)
	r.Post("/run", run)
	log.Println("\033[93mBreeze started. Press CTRL+C to quit.\033[0m")
	http.ListenAndServe(":"+os.Getenv("PORT"), r)
}

func index(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("static/index.html")
	t.Execute(w, nil)
}

func run(w http.ResponseWriter, r *http.Request) {
	prompt := struct {
		Input string `json:"input"`
	}{}
	err := json.NewDecoder(r.Body).Decode(&prompt)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}
	llm, err := openai.NewChat(openai.WithModel(os.Getenv("OPENAI_MODEL")))
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	chatmsg := []schema.ChatMessage{
		schema.SystemChatMessage{Content: "Hello, I am a friendly AI assistant."},
		schema.HumanChatMessage{Content: prompt.Input},
	}
	aimsg, err := llm.Call(context.Background(), chatmsg)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}

	response := struct {
		Input    string `json:"input"`
		Response string `json:"response"`
	}{
		Input:    prompt.Input,
		Response: aimsg.GetContent(),
	}
	json.NewEncoder(w).Encode(response)
}

关键代码说明

  1. 环境加载:使用 godotenv.env 文件加载配置
  2. 路由设置:使用 chi 路由库,配置静态文件服务和两个路由
  3. LLM 调用:使用 langchaingo/openai 创建聊天会话
  4. 消息格式:使用 schema.ChatMessage 定义系统消息和用户输入

前端界面

前端使用 Bootstrap 5 构建,主要包含:

  • 聊天消息显示区域
  • 输入框和发送按钮
  • Markdown 渲染和代码高亮

使用示例

启动应用后,在浏览器中访问 http://localhost:1100,即可看到简洁的聊天界面。输入问题(如 "How to use channels in Go?"),应用会调用 OpenAI API 并显示回答。

扩展建议

  • 对话历史:添加数据库支持,保存对话历史
  • 多用户支持:添加用户认证和会话管理
  • 本地模型:参考作者的后续文章,集成 Llama-2 等本地模型
  • 流式响应:实现 SSE (Server-Sent Events) 支持流式输出

项目链接

总结

Breeze 是一个优秀的入门项目,展示了如何使用 Go 语言和 langchaingo 构建 LLM 应用。代码简洁清晰,适合作为学习 Go 语言 LLM 开发的起点。

分享: