最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

具體地址見:https://github.com/google/generative-ai-go

本文將通過最新的gemini go sdk來實現(xiàn)命令行聊天機器人。

Go語言實現(xiàn)監(jiān)聽鍵盤輸入

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

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

整合Gemini SDK

前提條件

  • 確保Go SDK版本為1.20+

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

安裝SDK

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

實例化一個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 服務器發(fā)請求。

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()
}

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

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

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

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

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

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

在實際的項目中,我們肯定會對History做持久化,但這里這里,僅使用一個全局的history來模擬持久化。

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

代碼如下:

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
}

總結

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

以上就是Go使用Google Gemini Pro API創(chuàng)建簡單聊天機器人的詳細內容,更多關于go創(chuàng)建聊天機器人的資料請關注腳本之家其它相關文章!

相關文章

  • 快速上手GO的net/http包

    快速上手GO的net/http包

    本文主要介紹了快速上手GO的net/http包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Go語言聲明一個多行字符串的變量

    Go語言聲明一個多行字符串的變量

    這篇文章主要介紹了Go語言聲明一個多行字符串的變量的方法和示例,非常簡單實用,有需要的小伙伴可以參考下。
    2015-04-04
  • Golang中的信號(Signal)機制詳解

    Golang中的信號(Signal)機制詳解

    Signal 是一種操作系統(tǒng)級別的事件通知機制,進程可以響應特定的系統(tǒng)信號,這些信號用于指示進程執(zhí)行特定的操作,如程序終止、掛起、恢復等,Golang 的標準庫 os/signal 提供了對信號處理的支持,本文將詳細講解 Golang 是如何處理和響應系統(tǒng)信號的,需要的朋友可以參考下
    2024-01-01
  • Go 語言下基于Redis分布式鎖的實現(xiàn)方式

    Go 語言下基于Redis分布式鎖的實現(xiàn)方式

    本篇文章將詳細介紹如何正確地實現(xiàn)Redis分布式鎖,下面通過一個項目基于 Redis 的分布式鎖能夠提供哪些分布鎖特性,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • Go語言中函數(shù)的參數(shù)傳遞與調用的基本方法

    Go語言中函數(shù)的參數(shù)傳遞與調用的基本方法

    這篇文章主要介紹了Go語言中函數(shù)的參數(shù)傳遞與調用的基本方法,是golang入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • 基于Go語言編寫一個能在Windows上錄音的小程序

    基于Go語言編寫一個能在Windows上錄音的小程序

    這篇文章主要為大家詳細介紹了如何基于Go語言編寫一個能在Windows上錄音的小程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-03-03
  • Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    在現(xiàn)代高并發(fā)系統(tǒng)中,緩存技術是提升性能和降低數(shù)據(jù)庫壓力的關鍵手段,本文將為大家介紹一下Redis緩存與本地內存緩存的具體應用,需要的可以了解下
    2025-03-03
  • Go打包附件內容到執(zhí)行文件的方法

    Go打包附件內容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內容以附件的形式出現(xiàn), 有沒有什么辦法能夠將附件內容直接打包進可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • go語言標準庫expvar監(jiān)控工具的實現(xiàn)

    go語言標準庫expvar監(jiān)控工具的實現(xiàn)

    Go語言的expvar標準庫是專為暴露程序內部指標設計的輕量級監(jiān)控工具,支持通過HTTP接口以JSON格式實時查看運行狀態(tài),本文就來詳細的介紹一下go語言標準庫expvar監(jiān)控工具的實現(xiàn),感興趣的可以了解一下
    2026-04-04
  • go語言文件正則表達式搜索功能示例

    go語言文件正則表達式搜索功能示例

    這篇文章主要介紹了go語言文件正則表達式搜索功能,涉及Go語言文件目錄的遍歷及正則操作相關技巧,需要的朋友可以參考下
    2017-01-01

最新評論

延寿县| 曲松县| 藁城市| 二连浩特市| 孝昌县| 永仁县| 宁津县| 天镇县| 稻城县| 丽水市| 黄龙县| 德化县| 剑河县| 土默特右旗| 广南县| 睢宁县| 平陆县| 友谊县| 三明市| 忻州市| 吉木萨尔县| 灵寿县| 凯里市| 张家界市| 涟源市| 宁晋县| 清水县| 双城市| 措美县| 古丈县| 静海县| 宜州市| 石首市| 进贤县| 绵阳市| 龙江县| 平乐县| 博爱县| 佛学| 淄博市| 错那县|