在Go语言中实现AI聊天窗口需要结合前端界面、后端服务以及AI模型调用。以下是一个分步实现的详细方案,包含关键代码示例和架构设计:
一、整体架构设计
- 前端:使用HTML/CSS/JavaScript构建Web界面,通过WebSocket与后端通信。
- 后端:Go语言服务(推荐Gin框架)处理WebSocket连接和HTTP API请求。
- AI模型:调用外部API(如OpenAI GPT、百度文心等)或本地部署模型(如Ollama)。
- 数据库(可选):存储对话历史(如SQLite、PostgreSQL)。
二、前端实现(HTML+JS)
<!DOCTYPE html>
<html>
<head><title>AI聊天窗口</title><style>.chat-container { width: 400px; height: 500px; border: 1px solid #ccc; }#messages { height: 450px; overflow-y: scroll; }#input { width: 300px; }</style>
</head>
<body><div class="chat-container"><div id="messages"></div><input type="text" id="input" placeholder="输入消息..."><button onclick="sendMessage()">发送</button></div><script>const ws = new WebSocket("ws://localhost:8080/ws");ws.onmessage = (event) => {const message = JSON.parse(event.data);const msgDiv = document.createElement("div");msgDiv.textContent = message.content;document.getElementById("messages").appendChild(msgDiv);};function sendMessage() {const input = document.getElementById("input").value;ws.send(JSON.stringify({ role: "user", content: input }));document.getElementById("input").value = "";}</script>
</body>
</html>
三、后端实现(Go语言)
1. 依赖安装
go get github.com/gin-gonic/gin
go get github.com/gorilla/websocket
2. 后端代码
package mainimport ("encoding/json""fmt""net/http""os""github.com/gin-gonic/gin""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true },
}type Message struct {Role string `json:"role"`Content string `json:"content"`
}func main() {r := gin.Default()// WebSocket端点r.GET("/ws", func(c *gin.Context) {conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {return}defer conn.Close()for {// 读取客户端消息_, msg, err := conn.ReadMessage()if err != nil {break}// 调用AI模型response := callAIAPI(string(msg))// 回传响应err = conn.WriteJSON(Message{Role: "assistant", Content: response})if err != nil {break}}})// 启动HTTP服务r.Run(":8080")
}// 调用AI模型的伪代码
func callAIAPI(prompt string) string {// 实际开发中替换为真实API调用// 示例:使用OpenAI APIapiKey := os.Getenv("OPENAI_API_KEY")url := "https://api.openai.com/v1/chat/completions"payload := map[string]interface{}{"model": "gpt-4","messages": []map[string]string{{"role": "user", "content": prompt},},}// 使用net/http发送请求并解析响应// 伪代码:resp, _ := http.Post(url, "application/json", bytes.NewBuffer(jsonData))// 返回AI生成的响应return "AI响应:" + prompt
}
四、AI模型集成
1. 使用外部API(以OpenAI为例)
func callOpenAI(prompt string) (string, error) {apiKey := os.Getenv("OPENAI_API_KEY")url := "https://api.openai.com/v1/chat/completions"payload := map[string]interface{}{"model": "gpt-4-turbo","messages": []map[string]string{{"role": "user", "content": prompt},},}jsonData, _ := json.Marshal(payload)req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))req.Header.Set("Content-Type", "application/json")req.Header.Set("Authorization", "Bearer "+apiKey)client := &http.Client{}resp, err := client.Do(req)if err != nil {return "", err}defer resp.Body.Close()var result map[string]interface{}json.NewDecoder(resp.Body).Decode(&result)response := result["choices"].([]interface{})[0].(map[string]interface{})["message"].(map[string]interface{})["content"].(string)return response, nil
}
2. 本地模型集成(如Ollama)
func callOllama(prompt string) (string, error) {cmd := exec.Command("ollama", "run", "mistral", prompt)output, err := cmd.CombinedOutput()return string(output), err
}
五、扩展功能
- 会话管理:使用内存或数据库(如SQLite)存储对话历史。
- 安全性:
- 验证用户输入(防XSS攻击)
- 保护API密钥(通过环境变量)
- 错误处理:WebSocket连接断开重试、API超时处理。
- 前端优化:消息自动滚动、加载状态提示。
六、部署运行
- 启动后端服务:
go run main.go
- 打开前端页面(如
index.html
),通过WebSocket连接到ws://localhost:8080/ws
。
七、注意事项
- 跨域问题:开发时需配置CORS(Gin可通过
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
解决)。 - 性能优化:高并发场景下考虑使用连接池或限制最大连接数。
- 模型选择:根据需求选择合适的模型(如本地轻量模型或云端高性能模型)。
通过以上步骤,即可实现一个基于Go语言的AI聊天窗口,支持实时交互和智能回复。