使用 Go 語言打造專屬的 Gemini AI 聊天應(yīng)用
在人工智能領(lǐng)域,大型語言模型(LLM)正掀起一場技術(shù)革命。其中,Google 最新推出的 Gemini 模型以其強(qiáng)大的性能和多模態(tài)處理能力備受矚目。本文將引領(lǐng)你使用 GoLang 語言,結(jié)合 Redis 緩存,構(gòu)建一個(gè)基于 Gemini Pro 的 AI 聊天應(yīng)用。
項(xiàng)目概覽
本項(xiàng)目旨在創(chuàng)建一個(gè)能夠與用戶進(jìn)行自然語言交互的聊天應(yīng)用。它利用 Gemini Pro 模型理解用戶輸入,并生成相應(yīng)的回復(fù)。為了提升用戶體驗(yàn),我們還將引入 Redis 緩存,用于存儲(chǔ)用戶的歷史對話,打造更加個(gè)性化的聊天體驗(yàn)。
技術(shù)棧
- GoLang: 以其簡潔、高效和并發(fā)性著稱,是構(gòu)建高性能應(yīng)用的理想選擇。
- Gin: 輕量級 Web 框架,提供路由、中間件等功能,簡化 Web 應(yīng)用開發(fā)流程。
- Gemini Pro: Google 最新推出的 LLM,具備強(qiáng)大的自然語言理解和生成能力。
- Redis: 高性能內(nèi)存數(shù)據(jù)庫,用作緩存以存儲(chǔ)用戶歷史對話。
項(xiàng)目結(jié)構(gòu)
app
|-- .gitignore
|-- Dockerfile
|-- config.yml
|-- docker-compose.yml
|-- go.mod
|-- go.sum
|-- main.go
|-- handlers
| |-- index.go
| |-- run.go
|-- models
| |-- models.go
|-- routers
| |-- router.go
|-- service
| |-- redis.go
|-- static
| |-- app.js
| |-- autosize.min.js
| |-- index.html
| |-- logo-black.svg
| |-- share.png
| |-- styles.css
|-- utils
| |-- env.go
核心功能實(shí)現(xiàn)
1. 接收用戶輸入并調(diào)用 Gemini Pro 生成回復(fù)
func Run(c *gin.Context) {
// ... (綁定請求數(shù)據(jù)) ...
ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(prompt.APIKey))
// ... (錯(cuò)誤處理) ...
defer client.Close()
model := client.GenerativeModel("gemini-pro")
resp, err := model.GenerateContent(ctx, genai.Text(prompt.Input))
// ... (錯(cuò)誤處理) ...
formattedContent := formatResponse(resp)
// ... (存儲(chǔ)歷史記錄) ...
c.JSON(http.StatusOK, gin.H{
"input": prompt.Input,
"response": formattedContent,
"history": history,
})
}
這段代碼展示了如何接收用戶輸入,并調(diào)用 Gemini Pro API 生成回復(fù)。首先,我們使用 genai.NewClient 創(chuàng)建一個(gè) Gemini 客戶端,然后指定要使用的模型為 gemini-pro。接著,調(diào)用 model.GenerateContent 方法,傳入用戶輸入,即可獲得模型生成的回復(fù)。
2. 使用 Redis 緩存存儲(chǔ)用戶歷史對話
func StoreHistory(userID, input, response string) {
// ... (計(jì)算哈希值) ...
historyKey := fmt.Sprintf("history:%s", hashedUserID)
// ... (日志記錄) ...
maxHistoryLength := 10
entry := fmt.Sprintf(`{"input": "%s", "response": "%s"}`, input, response)
rdb.LPush(context.Background(), historyKey, entry)
rdb.LTrim(context.Background(), historyKey, 0, int64(maxHistoryLength-1))
expiration := time.Hour * 24
rdb.Expire(context.Background(), historyKey, expiration)
}
為了實(shí)現(xiàn)個(gè)性化聊天體驗(yàn),我們使用 Redis 存儲(chǔ)用戶的歷史對話。StoreHistory 函數(shù)首先計(jì)算用戶 ID 的哈希值,然后將用戶的輸入和模型的回復(fù)拼接成 JSON 字符串,存儲(chǔ)到 Redis 列表中。同時(shí),我們限制了歷史記錄的最大長度,并設(shè)置了 24 小時(shí)的過期時(shí)間。
3. 檢索歷史對話并返回給用戶
func GetHistory(userID string) []string {
// ... (計(jì)算哈希值) ...
historyKey := fmt.Sprintf("history:%s", hashedUserID)
result, err := rdb.LRange(context.Background(), historyKey, 0, -1).Result()
// ... (錯(cuò)誤處理) ...
return result
}
GetHistory 函數(shù)用于檢索用戶的歷史對話。它首先計(jì)算用戶 ID 的哈希值,然后從 Redis 列表中獲取所有歷史記錄,并將其返回給用戶。
API 接口設(shè)計(jì)
router.GET("/", handlers.Index)
router.POST("/run", handlers.Run)
router.POST("/fetchHistory", handlers.HandleFetchHistory)
我們定義了三個(gè) API 接口:
- /: 根路徑,用于展示應(yīng)用首頁。
- /run: 接收用戶輸入并返回模型生成的回復(fù)。
- /fetchHistory: 獲取用戶的歷史對話記錄。
總結(jié)
本文介紹了如何使用 GoLang 語言,結(jié)合 Gemini Pro 和 Redis 緩存,構(gòu)建一個(gè)功能完善的 AI 聊天應(yīng)用。通過合理的技術(shù)選型和架構(gòu)設(shè)計(jì),我們實(shí)現(xiàn)了高效的對話生成和個(gè)性化的用戶體驗(yàn)。相信隨著 LLM 技術(shù)的不斷發(fā)展,未來將涌現(xiàn)出更多基于此類技術(shù)的創(chuàng)新應(yīng)用。