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
}
五、扩展功能
- 会话管理:使用内存或数据库(如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聊天窗口,支持实时交互和智能回复。