欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人

 更新時(shí)間:2023年12月25日 11:21:53   作者:jiuyee?低配全棧  
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人實(shí)現(xiàn)過(guò)程詳解,本文將通過(guò)最新的gemini?go?sdk來(lái)實(shí)現(xiàn)命令行聊天機(jī)器人

gemini go sdk實(shí)現(xiàn)命令行聊天機(jī)器人

最近Google 如期發(fā)布Gemini Pro API,目前為免費(fèi)使用,Go的SDK也已經(jīng)在github上發(fā)布了

具體地址見(jiàn):https://github.com/google/generative-ai-go

本文將通過(guò)最新的gemini go sdk來(lái)實(shí)現(xiàn)命令行聊天機(jī)器人。

Go語(yǔ)言實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤(pán)輸入

reader := bufio.NewReader(os.Stdin)
// 讀取輸入直到遇到第一個(gè)換行符
input, err := reader.ReadString('\n')

reader對(duì)象的ReadString方法即可實(shí)現(xiàn)我們需要的監(jiān)聽(tīng)鍵盤(pán)的方法,這里設(shè)置為當(dāng)監(jiān)聽(tīng)到回車輸入的時(shí)候,則讀取用戶輸入的內(nèi)容。

整合Gemini SDK

前提條件

  • 確保Go SDK版本為1.20+

  • 去Gemini SDK 后臺(tái)(https://makersuite.google.com/app/apikey?hl=zh-cn)申請(qǐng)api key。

安裝SDK

go get github.com/google/generative-ai-go

實(shí)例化一個(gè)gemini Client

func getGeminiClient() *genai.Client {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, option.WithAPIKey("YOUR-API-KEY"))
  if err != nil {
    log.Fatal(err)
  }
  return client
}

根據(jù)用戶輸入向gemini 服務(wù)器發(fā)請(qǐng)求。

func handleChat(ctx context.Context, client *genai.Client, cs *genai.ChatSession, content string) error {
  if cs == nil {
    return errors.New("chat session is nil")
  }
  return geminiPro(ctx, cs, content)
}
func geminiPro(ctx context.Context, cs *genai.ChatSession, content string) error {
  prompt := genai.Text(content)
  iter := cs.SendMessageStream(ctx, prompt)
  fmt.Print("[Gemini]:")
  for {
    resp, err := iter.Next()
    if err == iterator.Done {
      break
    }
    if err != nil {
      fmt.Print("Something wrong, please try again later. \n")
      return err
    }
    printChatResponse(resp)
  }
  return nil
}
func printChatResponse(resp *genai.GenerateContentResponse) {
  for _, c := range resp.Candidates {
    for _, p := range c.Content.Parts {
      fmt.Printf("%v", p)
    }
  }
  fmt.Println()
}

這里就是整個(gè)Gemini SDK調(diào)用的核心代碼了,每次使用ChatSession對(duì)象(geminiPro方法中的cs變量)發(fā)送消息,這里使用的的是流式子消息傳輸,所以,在geminiPro方法里面,需要啟動(dòng)一個(gè)for循環(huán),等待消息的全部輸出。

我們整個(gè)會(huì)話使用的都是同一個(gè)ChatSession對(duì)象,并且,在發(fā)送消息之后,內(nèi)容會(huì)自動(dòng)加到ChatSession對(duì)象的History里面,History也就是歷史會(huì)話,Gemini SDK一樣可以根據(jù)上下文來(lái)實(shí)現(xiàn)問(wèn)答的實(shí)現(xiàn)。

如何實(shí)現(xiàn)ChatSession只實(shí)例化一次

前面已經(jīng)說(shuō)過(guò),一個(gè)會(huì)話需要使用同一個(gè)ChatSession對(duì)象,我們自然而然就想到Go里面的sync.Once對(duì)象,但在使用Gemini Go SDK的過(guò)程中發(fā)現(xiàn),經(jīng)常會(huì)遇到請(qǐng)求出錯(cuò)的情況,一旦請(qǐng)求出錯(cuò),就需要重新去創(chuàng)建一個(gè)會(huì)話對(duì)象,所以,Go語(yǔ)言提供的sync.Once并不能滿足這個(gè)需求,所以,需要自己實(shí)現(xiàn)一個(gè)可以重置的Once對(duì)象,這里命名為ResetOnce對(duì)象,代碼如下:

// ResettableOnce 結(jié)構(gòu)體包含一個(gè)互斥鎖和一個(gè)標(biāo)記是否已執(zhí)行的布爾值
type ResettableOnce struct {
  m    sync.Mutex
  done bool
}
// Do 方法類似于 sync.Once 的 Do,但可以通過(guò)調(diào)用 Reset 來(lái)重置
func (o *ResettableOnce) Do(f func()) {
  o.m.Lock()
  defer o.m.Unlock()
  if !o.done {
    defer func() { o.done = true }()
    f()
  }
}
// Reset 方法重置 Once,允許再次調(diào)用 Do
func (o *ResettableOnce) Reset() {
  o.m.Lock()
  defer o.m.Unlock()
  o.done = false
}

如何實(shí)現(xiàn)用戶ChatSession重新創(chuàng)建之后,保持之前的History?

在實(shí)際的項(xiàng)目中,我們肯定會(huì)對(duì)History做持久化,但這里這里,僅使用一個(gè)全局的history來(lái)模擬持久化。

當(dāng)ChatSession對(duì)象被新建之后,需要將全局history的內(nèi)容復(fù)制給新創(chuàng)建的ChatSession對(duì)象,這里為了模擬這個(gè)過(guò)程,在用戶輸入內(nèi)容的時(shí)候,添加一個(gè)檢測(cè)內(nèi)容是否為reset字符串的操作,當(dāng)檢測(cè)用戶輸入為reset字符串的時(shí)候,則主動(dòng)新建一個(gè)ChatSession,同時(shí)將新的ChatSession的History賦值為之前的history內(nèi)容,這樣即使新建立一個(gè)ChatSession它還能保持之前的會(huì)話記錄。

代碼如下:

func handleReset(client *genai.Client, cs **genai.ChatSession, history *[]*genai.Content) {
  fmt.Println("[System]", "Resetting chat session.")
  once.Reset()
  once.Do(func() {
    *cs = startChatSession(client, *history)
  })
}
func startChatSession(client *genai.Client, history []*genai.Content) *genai.ChatSession {
  model := client.GenerativeModel("gemini-pro")
  cs := model.StartChat()
  if len(history) > 0 {
    cs.History = history
  }
  return cs
}

總結(jié)

如果在實(shí)際中使用這個(gè)SDK進(jìn)行商業(yè)化開(kāi)發(fā),那么比如需要處理用戶多會(huì)話的管理,其實(shí)這個(gè)過(guò)程也不麻煩,只要維護(hù)好用戶以及它對(duì)應(yīng)的history的關(guān)系,在用戶每次開(kāi)始登錄進(jìn)入系統(tǒng),并且選擇會(huì)話的時(shí)候,將對(duì)應(yīng)的history給設(shè)好即可。但要注意的是,目前pro版本支持的最大的32K的上下文。另外SDK中還提供了gemini-pro-vision模型的使用,你們有興趣的可以自己去探索。

以上就是Go使用Google Gemini Pro API創(chuàng)建簡(jiǎn)單聊天機(jī)器人的詳細(xì)內(nèi)容,更多關(guān)于go創(chuàng)建聊天機(jī)器人的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Golang中Context的原理和使用技巧

    詳解Golang中Context的原理和使用技巧

    Golang?的?Context?包,中文可以稱之為“上下文”,是用來(lái)在?goroutine?協(xié)程之間進(jìn)行上下文信息傳遞的,這些上下文信息包括?kv?數(shù)據(jù)、取消信號(hào)、超時(shí)時(shí)間、截止時(shí)間等。本文主要介紹了Context的原理和使用技巧,希望對(duì)大家有所幫助
    2022-11-11
  • 詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫(kù)

    詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫(kù)

    mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫(kù)的相關(guān)使用,希望對(duì)大家有所幫助
    2023-09-09
  • 對(duì)Go語(yǔ)言中的context包源碼分析

    對(duì)Go語(yǔ)言中的context包源碼分析

    這篇文章主要對(duì)Go語(yǔ)言中的context包源碼進(jìn)行分析,context包析是1.15,context包定義了一個(gè)Context類型過(guò)這個(gè)Context接口類型,?就可以跨api邊界/跨進(jìn)程傳遞一些值,下面我們就來(lái)對(duì)context包源碼進(jìn)行分析,需要的小伙伴可以參考一下
    2022-02-02
  • 詳解Go 語(yǔ)言中的比較操作符

    詳解Go 語(yǔ)言中的比較操作符

    這篇文章專注于 6 個(gè)操作符,==,!=,<,<=,> 和 >=。我們將深入探討它們的語(yǔ)法和用法的細(xì)微差別,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • Go map發(fā)生內(nèi)存泄漏解決方法

    Go map發(fā)生內(nèi)存泄漏解決方法

    這篇文章主要介紹了Go map發(fā)生內(nèi)存泄漏解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹

    Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹

    在本篇文章里小編給大家整理的是一篇關(guān)于Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Golang使用Docker進(jìn)行集成測(cè)試的示例詳解

    Golang使用Docker進(jìn)行集成測(cè)試的示例詳解

    集成測(cè)試需要解決外部依賴問(wèn)題,如?MySQL、Redis、網(wǎng)絡(luò)等依賴,本文就來(lái)聊聊?Go?程序如何使用?Docker?來(lái)解決集成測(cè)試中外部依賴問(wèn)題吧
    2023-07-07
  • Go語(yǔ)言中關(guān)閉帶緩沖區(qū)的頻道實(shí)例分析

    Go語(yǔ)言中關(guān)閉帶緩沖區(qū)的頻道實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言中關(guān)閉帶緩沖區(qū)的頻道,實(shí)例分析了帶緩沖區(qū)頻道的原理與用法,以及關(guān)閉帶緩沖區(qū)頻道的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言中的iota關(guān)鍵字的使用

    Go語(yǔ)言中的iota關(guān)鍵字的使用

    這篇文章主要介紹了Go語(yǔ)言中的iota關(guān)鍵字的使用的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • 解讀unsafe.Pointer和uintptr的區(qū)別

    解讀unsafe.Pointer和uintptr的區(qū)別

    這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論