golang实现ai聊天窗口

在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 main

import (
	"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 API
	apiKey := 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
}

五、扩展功能

  1. 会话管理:使用内存或数据库(如SQLite)存储对话历史。
  2. 安全性
    • 验证用户输入(防XSS攻击)
    • 保护API密钥(通过环境变量)
  3. 错误处理:WebSocket连接断开重试、API超时处理。
  4. 前端优化:消息自动滚动、加载状态提示。

六、部署运行

  1. 启动后端服务:
go run main.go
  1. 打开前端页面(如index.html),通过WebSocket连接到ws://localhost:8080/ws

七、注意事项

  1. 跨域问题:开发时需配置CORS(Gin可通过c.Writer.Header().Set("Access-Control-Allow-Origin", "*")解决)。
  2. 性能优化:高并发场景下考虑使用连接池或限制最大连接数。
  3. 模型选择:根据需求选择合适的模型(如本地轻量模型或云端高性能模型)。

通过以上步骤,即可实现一个基于Go语言的AI聊天窗口,支持实时交互和智能回复。

posted @ 2025-09-27 17:08  jiftle  阅读(31)  评论(0)    收藏  举报