使用 Azure Cosmos DB Go SDK 的 AI 应用程序聊天记录

這篇部落格文章介紹了如何使用Azure Cosmos DB進行NoSQL Go SDK和LangChainGo建立聊天歷史實現。如果您是Go SDK的新手,部落格中提供的示例聊天機器人應用程式可作為實用介紹,涵蓋基本操作如讀取、upsert等。它還演示了如何使用Azure Cosmos DB基於Linux的模擬器(在撰寫時仍處於預覽階段)進行與Testcontainers for Go的整合測試。

Go開發人員希望構建AI應用程式可以使用LangChainGo,這是一個針對LLM驅動應用程式的框架。它為向量存儲、嵌入、加載文件、鏈(用於組合多個操作)、聊天歷史等組件提供可插拔的API。


在深入研究之前,讓我們退一步來了解基礎知識。

什麼是聊天歷史,以及對於現代AI應用程式而言為什麼重要?

對話式AI應用程式的常見要求是能夠存儲和檢索作為對話的一部分交換的消息。這通常被稱為“聊天歷史”。如果您曾使用過像ChatGPT(順便說一句,它也使用Azure Cosmos DB!)這樣的應用程式,您可能對這個概念很熟悉。

當用戶登錄時,他們可以開始聊天,作為對話的一部分交換的消息將被保存。當他們再次登錄時,他們可以看到他們之前的對話,並可以從他們離開的地方繼續。

聊天記錄顯然對應用程序終端用戶很重要,但我們不要忘記LLM!盡管LLM可能看起來很聰明,但由於缺乏內置記憶(至少目前如此),它們無法回想起過去的互動。使用聊天記錄彌補了這一差距,提供以前的對話作為額外的上下文,使LLM能夠生成更相關和高質量的回應。這增強了對話的自然流動,顯著改善了用戶體驗。

一個簡單的例子說明了這一點:假設您通過API問一個LLM,“告訴我關於 Azure Cosmos DB”,它回答了一個冗長的段落。如果您然後再進行另一個API調用,說“將這段文字轉換為項目符號以便更容易閱讀”,LLM可能會感到困惑,因為它缺乏來自先前互動的上下文。

然而,如果您在第二個API調用的上下文中包含先前的消息,LLM更有可能提供準確的回應(雖然不能保證,因為LLM的輸出在本質上是非確定性的)。

如何運行聊天機器人

正如我之前提到的,示例應用程式是一種有用的方式,讓您探索 langchaingo,Azure Cosmos DB 聊天記錄實作,以及 Go SDK

在探索實作細節之前,看看應用程式運作是一個好主意。請參考 GitHub 存儲庫的README 部分提供了有關如何配置、運行和開始與聊天機器人對話的說明。

應用程式概述

聊天應用程式遵循一個簡單的領域模型: 用戶可以啟動多個對話,每個對話可以包含多條消息。該應用程式是使用 Go 構建的,包括後端和前端組件。

後端

它有多個子部分:

  • Azure Cosmos DB 聊天記錄實作。
  • 通過 REST API 公開的核心操作,如開始聊天、發送/接收消息和檢索對話歷史。
  • REST API 利用 langchaingo 鏈來處理使用者訊息。 該鏈自動將聊天歷史納入,以確保過去的對話被發送到 LLM。 langchaingo 處理所有的管弦樂 – LLM 呼叫、聊天歷史納入,以及更多,而無需手動實現。

前端

它使用 JavaScript、HTML 和 CSS 構建。 它作為 Go web 伺服器的一部分進行打包(使用 embed 套件),並在用戶互動時調用後端 REST API。

使用 Azure Cosmos DB 實現聊天歷史記錄

LangChainGo 是一個可插入的框架,包括其聊天歷史(或記憶)組件。 要集成 Azure Cosmos DB,您需要實現 schema.ChatMessageHistory 介面,該介面提供管理聊天歷史的方法:

  • AddMessage 以將訊息添加到對話(或開始新對話)。
  • Messages 以檢索對話的所有訊息。
  • Clear 以刪除對話中的所有訊息。

當您可以直接實例化一個CosmosDBChatMessageHistory實例並使用這些方法時,建議的方法是將其整合到langchaingo應用程序中。以下是使用 Azure Cosmos DB 聊天歷史記錄與LLMChain的示例:

Go

 

// 創建一個聊天歷史實例
cosmosChatHistory, err := cosmosdb.NewCosmosDBChatMessageHistory(cosmosClient, databaseName, containerName, req.SessionID, req.UserID)
if err != nil {
    log.Printf("Error creating chat history: %v", err)
    sendErrorResponse(w, "Failed to create chat session", http.StatusInternalServerError)
    return
}

// 使用聊天歷史記錄創建一個內存
chatMemory := memory.NewConversationBuffer(
    memory.WithMemoryKey("chat_history"),
    memory.WithChatHistory(cosmosChatHistory),
)

// 創建一個 LLM 鏈
chain := chains.LLMChain{
    Prompt:       promptsTemplate,
    LLM:          llm,
    Memory:       chatMemory,
    OutputParser: outputparser.NewSimple(),
    OutputKey:    "text",
}

從 Azure Cosmos DB 的角度來看,請注意,此示例中的實現只是許多可能選項中的一個。此處所示的基於將用戶 ID 作為分區鍵和對話 ID(有時也稱為會話 ID)作為唯一鍵(Azure Cosmos DB 項目的id)的組合。

這使應用程序能夠:

  • 獲取該對話的所有消息。這是使用唯一 ID(對話 ID)和分區鍵(用戶 ID)進行的點讀取
  • 添加一條新訊息到對話中。它使用一個upsert操作(而不是創建)以避免在寫入之前需要讀取
  • 刪除特定對話。它使用刪除操作來移除一個對話(以及其所有訊息)。

儘管langchaingo界面並未公開此功能,當將其集成為應用程序的一部分時,您也可以發出單獨的查詢以獲取用戶的所有對話。這也是有效的,因為它僅限於單個分區。

使用 Azure Cosmos DB 模擬器和 Testcontainers 簡化測試

該示例應用程序包括 Azure Cosmos DB 聊天記錄和主應用程序的基本測試案例。值得一提的是使用 testcontainers-go 來集成 Azure Cosmos DB 基於 Linux 的模擬器 Docker 容器。

這對於集成測試來說非常好,因為數據庫可以在本地使用,測試運行速度更快(別忘了節省成本!)。最棒的地方在於你不需要手動管理 Docker 容器的生命周期。這是測試套件的一部分,感謝 testcontainers-go API,它方便地在測試運行之前啟動容器並在完成後終止它。

你可以參考示例應用程序中的測試案例以獲取更多細節。這裡是如何使用 testcontainers-go 的片段:

Go

 

func setupCosmosEmulator(ctx context.Context) (testcontainers.Container, error) {
    req := testcontainers.ContainerRequest{
        Image:        emulatorImage,
        ExposedPorts: []string{emulatorPort + ":8081", "1234:1234"},
        WaitingFor:   wait.ForListeningPort(nat.Port(emulatorPort)),
    }

    container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
        ContainerRequest: req,
        Started:         true,
    })
    if err != nil {
        return nil, fmt.Errorf("failed to start container: %w", err)
    }

    // 為模擬器提供更多時間來完全初始化
    time.Sleep(5 * time.Second)

    return container, nil
}

如果你有興趣在 CI 流水線中使用 Azure Cosmos DB 模擬器,請查看 部落格文章

結束

能夠存儲聊天記錄是對話型 AI 應用程序的重要組成部分。它們可以作為現有技術(如檢索增強生成)的絕佳補充。試用一下聊天機器人應用程序,並讓我們知道您的想法!

儘管示例應用程序中的實現相對簡單,但您如何對聊天歷史數據進行建模取決於需求。已經提出的一個這樣的情景是這篇優秀的博客文章,介紹了 Microsoft Copilot 如何通過使用Azure Cosmos DB為數百萬用戶提供服務。

您可能的一些需求包括:

  • 存儲元數據,例如反應(除了消息)
  • 顯示前 N 個最近的消息
  • 考慮聊天歷史數據保留期限(使用 TTL)
  • 根據聊天歷史數據進行更多用戶交互的附加分析等。

無論實施方式如何,始終確保納入最佳的數據建模實踐。請參考這裡以獲取指南。

您是否已經在使用或計劃為您的 Go 應用程序利用 Azure Cosmos DB?我們很樂意聽取您的意見!請將您的問題和反饋發送給我們。

Source:
https://dzone.com/articles/chat-history-ai-applications-azure-cosmos-db-go-sdk