AI 資料觀 | TapData Cloud + MongoDB Atlas:大模型與 RAG 技術有機結合,落地實時工單處理智慧化解決方案

Tapdata钛铂数据發表於2024-05-07

本篇為「AI 資料觀」系列文章第二彈,在這裡,我們將進一步探討 AI 行業的資料價值。以 RAG 的智慧工單應用場景為例,共同探索如何使用 Tapdata Cloud + MongoDB Atlas 實現具備實時更新能力的向量資料庫,為企業工單處理的智慧化和自動化需求,提供準實時的新鮮資料。完整分佈教程指引,詳見正文。
>>> 前篇回顧

人工智慧是第四次工業革命的核心。大家都聽說過“所有產品都值得用大模型重新做一遍”類似的觀點,沒錯現在就正在發生。從去年OpenAI 的Chat GPT取得令人難以置信的成功後,AI正在加速落地各行各業,傳媒遊戲、機器人、辦公軟體、醫藥、自動駕駛、音樂、語音、廣告、社交平臺等等,呈現出百花齊放的景象。

大型語言模型(LLM)是基於大量資料預先訓練的大型深度學習模型,可以生成使用者查詢的響應內容,例如回答使用者問題或者根據文字的提示建立影像等等,在通識領域表現的很好。但大型語言模型(LLM)仍存在一些顯著的侷限性,特別是在處理特定領域或者高度專業化的查詢時,一個常見的問題是產生錯誤的資訊,或者稱之為“幻覺”,特別是在查詢超出模型的預訓練資料集或者需要最新的資訊時。
解決這些問題的一種比較有效且流行的方法就是檢索增強(Retrieval Augmented Generation,簡稱RAG),它將外部資料檢索整合到生成回答的過程中,這個過程不僅為後續的生成階段提供資訊,還確保基於檢索到的資料生成回答,從而顯著提高了模型輸出回答的準確性和問題相關性。目前幾乎大部分企業都在使用這一方式來整合通用大模型能力到自己的產品中,為使用者提供具有AI生成能力的產品體驗。

接下來我們以企業內部工單資料為例,展示使用 Tapdata Coud + MongoDB Atlas 準備實時向量資料並實現根據使用者提的問題檢索出最接近的工單及解決方案。

本篇文章我們重點關注上圖中 Mongo DB Atlas 及右側資料準備階段的處理過程,工單的向量資料準備過程如下:

  1. 登入 Tapdata Cloud 執行以下操作
  2. 建立 Tapdata Agent
  3. 登入 MongoDB Atlas 控制檯建立 MongoDB Atlas 資料庫
  4. 建立源庫(企業私有資料庫,MySQL、Oracle或者SQLServer)連線
  5. 建立目標庫(MongoDB Atlas)連線
  6. 建立 源庫=>目標庫 的資料同步任務並新增資料向量化處理節點
  7. 登入 MongoDB Atlas 控制檯建立MongoDB Atlas Vector Index
  8. 使用 Python 執行執行向量查詢,返回我們期望得到的最匹配歷史工單及解決方案

準備

開始之前我們需要先準備幾個賬號: Tapdata Cloud 賬號、MongoDB Atlas 賬號、Huggingface 賬號:

  • Tapdata Cloud:實時採集業務庫中的增量資料,支援常用的MySQL、SQLServer、Oracle、PostgreSQL、Mongo DB等常見的20多種RDBMS 或 NoSQL 資料庫,可做到秒級資料延遲。
  • Mongo DB Atlas:MongoDB是一款開發者友好的開源文件資料庫,以其靈活性和易用性而聞名。在MongoDB Atlas(v6.0.11、v7.0.2)提供了向量查詢,為生成式AI應用提供友好支援。
  • HuggingFace Access Token: 本示例使用 HuggingFace 提供的 Embedding Model 服務將文字向量化,您也可以使用其他平臺提供的模型或者本地部署的模型。

建立 Tapdata Agent

  1. 登入 Tapdata Cloud 控制檯,第一次登入控制檯時根據新手指引操作即可
  2. 第一步選擇你的應用場景,這裡選擇第一個“遷移資料到 MongoDB Atlas”,點選下一步

  1. 第二步選擇部署方式,這裡需要根據您的資料來源所在位置來判斷選擇全託管或者半托管:

    a. 全託管:任務執行在雲端,需要使用公網連線您的資料庫,如果您的資料庫有開放公網訪問許可權,這種全託管模式更便捷。
    b. 半托管:將執行任務的Agent部署在您資料庫所在區域網或者VPC內,並且提供公網訪問許可權使得 Agent 與Tapdata Cloud 能夠正確連線。執行的任務使用區域網連線您的資料庫。

我這裡使用本地私有資料庫,所以選擇半托管例項,然後點選下一步

  1. 第三步選擇例項規格,我們這裡選擇免費例項即可,點選下一步

  1. 第四步安裝部署 Agent,我們這裡使用 Docker 容器部署Agent,點選“Copy”按鈕複製啟動命令貼上到本地電腦執行(需要提前安裝 Docker 軟體,安裝方式請檢視:Docker Desktop

  1. 本地執行啟動部署命令後,需要等幾分鐘,直到例項狀態為“Running”狀態後再繼續操作

到這裡,我們已經準備好了執行資料同步任務的Agent。如果您之前已經完成新手引導流程,再次登入時它就不會自動彈出了,這時您只需要切換到“訂閱” -> "新增訂閱",然後選擇您的部署方式和規格建立例項並完成部署即可。

建立 MongoDB Atlas 資料庫

  1. 登入 Mongo DB Atlas 後,點選“New Project”先建立專案,根據引導直接下一步,然後建立專案即可,過程比較簡單

  1. 第二步在剛建立的專案中,點選“+Create” 建立 MongoDB Database

  1. 規格選擇 M0,叢集名稱就使用預設名稱:Cluster-0,供應商選擇 Google Cloud,地區選擇 Taiwan,點選“Create Deployment”

  1. 新增訪問資料庫賬號

  1. 選擇使用“Drivers”連線MongoDB Database

  1. 選擇 使用Java,然後複製 連線字串,並儲存下來

  1. 新增網路訪問白名單,點選新增 IP地址

  1. 我們這裡演示目的,設定為任意地址都可以訪問

到這裡我們已經成功的在 MongoDB Atlas 上執行起來一個Mongo DB 3節點副本叢集,接下來我們回到 Tapdata Cloud 建立連線和資料同步任務。

建立源庫連線

源庫通常是指您的業務資料庫

  1. 登入Tapdata Cloud 控制檯,開啟“Connections”連線管理介面,點選“Create” 建立資料來源

  1. 根據您的源庫型別(通常是指您的業務系統使用的資料庫軟體)選擇要建立的資料來源,我這裡選擇MongoDB

  1. 輸入資料來源名稱、連線資訊(不同型別的源庫,需要填寫的連線資訊也不一樣)等,點選 “Test” 測試連線配置正確,然後點選“Save”儲存連線

建立目標庫連線

  1. 開啟 “Connections”,點選“Create”按鈕,選擇 “MongoDB Atlas”

  2. 填寫名稱“MongoDB Atlas”,連線型別選擇 “Target”即可,然後複製我們剛才在 Atlas 上建立的MongoDB Database 連線字串,填寫到 “Database URI”,點選“Test”測試連線,點選“Save”儲存連線(注意:連線字串中需要在/後面新增資料庫名稱,我們這邊填寫 test )

建立資料同步處理任務

  1. 在 Tapdata Cloud 控制檯上,開啟“Data Transformation”,點選“Create”,建立一個任務

  1. 拖拽我們剛才建立的源庫、目標庫連線到畫布區域,然後在新增一個 “Enhanced JS” 處理節點,並將它們連線在一起,箭頭方向表示資料流方向,如下,當我們啟動任務時,資料將會從 Source Database 流向 MongoDB Atlas

  1. 配置源庫,選擇待處理工單資料表: customer_support_tickets

{ _id: ObjectId("65fd324baa464c7697ecf123"), 'Ticket ID': 1, 'Customer Name': 'Marisa Obrien', 'Customer Email': 'carrollallison@example.com', 'Customer Age': 32, 'Customer Gender': 'Other', 'Product Purchased': 'GoPro Hero', 'Date of Purchase': '2021-03-22', 'Ticket Type': 'Technical issue', 'Ticket Subject': 'Product setup', 'Ticket Description': "I'm having an issue with the {product_purchased}. Please assist.\n" + '\n' + 'Your billing zip code is: 71701.\n' + '\n' + 'We appreciate that you have requested a website address.\n' + '\n' + "Please double check your email address. I've tried troubleshooting steps mentioned in the user manual, but the issue persists.", 'Ticket Status': 'Pending Customer Response', Resolution: '', 'Ticket Priority': 'Critical', 'Ticket Channel': 'Social media', 'First Response Time': '2023-06-01 12:15:36', 'Time to Resolution': '', 'Customer Satisfaction Rating': '' }

  1. 我們將在 Enhanced JS 處理器中加工處理源庫讀到的資料,將工單描述轉為向量,然後寫入到目標庫,如下:

程式碼如下:
`

    if (record["Ticket Description"]) {
      
      var embedding_url = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2";
      var headers = new HashMap();
      headers.put("Authorization", "Bearer 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");
      headers.put("Content-Type", "application/json");
      
      var data = new HashMap();
      data.put("inputs", record["Ticket Description"]);
      
      var result = rest.post(embedding_url, data, headers, "array");
      if (result.code === 200) {
        record["ticket_description_embedding"] = result.data;
      }
    }
    
    
    return record;`

源庫中讀取到的每一行資料,經過上面JavaScript指令碼,都增加了一個 ticket_description_embedding 的欄位,用來儲存向量化資料,後續語義查詢將會基於此欄位實現,此時的資料模型如下:

{ _id: ObjectId("65fd324baa464c7697ecf123"), 'Ticket ID': 1, 'Customer Name': 'Marisa Obrien', 'Customer Email': 'carrollallison@example.com', 'Customer Age': 32, 'Customer Gender': 'Other', 'Product Purchased': 'GoPro Hero', 'Date of Purchase': '2021-03-22', 'Ticket Type': 'Technical issue', 'Ticket Subject': 'Product setup', 'Ticket Description': "I'm having an issue with the {product_purchased}. Please assist.\n" + '\n' + 'Your billing zip code is: 71701.\n' + '\n' + 'We appreciate that you have requested a website address.\n' + '\n' + "Please double check your email address. I've tried troubleshooting steps mentioned in the user manual, but the issue persists.", 'Ticket Status': 'Pending Customer Response', Resolution: '', 'Ticket Priority': 'Critical', 'Ticket Channel': 'Social media', 'First Response Time': '2023-06-01 12:15:36', 'Time to Resolution': '', 'Customer Satisfaction Rating': '' 'ticket_description_embedding': [ -0.0897391065955162, 0.038192421197891235, 0.012088424526154995, -0.06690243631601334, -0.013889848254621029, 0.011662089265882969, 0.10687699168920517, 0.010783190838992596, -0.0018359378445893526, -0.03207595646381378, 0.06700573861598969, 0.02220674231648445, -0.038338553160429, -0.04949694499373436, -0.034749969840049744, 0.11390139162540436, 0.0035523029509931803, -0.011036831885576248, ... ] }

注意:我們這裡使用 Huggingface 免費服務,免費服務會受到速率限制,因此我們這裡需要限制一下源庫中讀取資料行數,操作方法如下,在源庫節點新增一個過濾條件,避免頻繁呼叫 Huggingface API,您也可以升級為付費使用者來規避API呼叫限制。如下圖,只讀取id 小於等於 65fd324baa464c7697ecf12c 的工單記錄

  1. 配置目標庫寫入資料表,此時目標庫還不存在表,我們在這裡填寫一個新的表名稱即可

  1. 配置任務執行模式:預設為全量 +增量,行為如下:
  • 全量:任務只讀取源庫中的現有資料並寫入目標資料庫
  • 增量:任務只讀取啟動任務之後(或者指定開始時間)新增、修改過的資料,並寫入目標資料庫
  • 全量+增量:任務會先讀取源庫中現有的資料寫入目標庫,然後再讀取啟動任務之後新增或者修改的資料寫入到目標庫
    我們這裡預設選擇全量+增量,啟動任務後,會先將源庫中的存量資料同步到目標庫,然後自動讀取並處理新增或修改的資料。

  1. 啟動任務,並檢查目標庫資料是否正確

查詢目標庫資料,欄位 ticket_description_embedding 儲存的向量資料,如下:

建立MongoDB Atlas Vector Index

  1. 登入 MongoDB Atlas 控制檯,開啟 “Database”,然後點選 “Create Index”

  1. 依次點選“Create Search Index” -> “Atlas Vector Search - JSON Editor” -> “Next”

選擇我們的剛同步過來目標庫表** test.customer_support_tickets**
, 索引名稱填寫 vector_index,索引配置如下

{ "fields": [ { "type": "vector", "path": "ticket_description_embedding", "numDimensions": 384, "similarity": "cosine" } ] }

  • type:vector - 建立 vector search 索引
  • path:ticket_description_embedding - 我們在 JavaScript 中增加的儲存向量資料的欄位名稱
  • numDimensions:向量維度 1-2048,執行向量查詢的維度數量
  • similarity:相似性演算法,可選值:euclidean-歐氏距離演算法、cosine-餘弦相似性演算法、dotProduct-點積演算法
  1. 點選 “Next” -> “Create Index”,向量索引建立完成後,我們就可以執行語義查詢了

使用 Python 執行執行向量查詢

  1. 我們在 Python 中實現語義查詢,程式碼如下:

`import requests
from bson import ObjectId
from pymongo.mongo_client import MongoClient

if name == "main":

mongodb_atlas_connection_string = "mongodb+srv://root:mYS4tk78YE1JDtTo@cluster0.twrupie.mongodb.net/test?retryWrites=true&w=majority&appName=Cluster0"
embedding_uri = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"
huggingface_token = "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"

question = "My computer is making strange noises and not functioning properly"

headers = {"Authorization": f"Bearer {huggingface_token}"}
data = {"inputs": question}
response = requests.post(embedding_uri, headers=headers, json=data)
if response.status_code == 200:
    query_vector = response.json()

    client = MongoClient(mongodb_atlas_connection_string)
    db = client["test"]
    result = db.customer_support_tickets.aggregate([
        {
            "$vectorSearch": {
                "queryVector": query_vector,
                "path": "ticket_description_embedding",
                "numCandidates": 10,
                "limit": 2,
                "index": "vector_index"
            }
        }
    ])
    cases = ''
    for doc in result:
        print(f"Ticket Status: {doc['Ticket Status']},\nTicket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n")
        cases += f"Ticket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n\n"

`

  1. 查詢結果如下:

`Ticket Description: I'm having an issue with the computer. Please assist.
The seller is not responsible for any damages arising out of the delivery of the battleground game. Please have the game in good condition and shipped to you I've noticed a sudden decrease in battery life on my computer. It used to last much longer. ,
Resolution: West decision evidence bit.

Ticket Description: My computer is making strange noises and not functioning properly. I suspect there might be a hardware issue. Can you please help me with this?
} If we can, please send a "request" to dav The issue I'm facing is intermittent. Sometimes it works fine, but other times it acts up unexpectedly.
Resolution: Please check if the fan is clogged, if so, please clean it
`

查詢到相關最高的結果後,我們就可以根據使用者的問題和歷史工單及解決方案組裝為Prompt's 提交給LLM生成回答,如下使用 Google Gemma 模型生成回答
`import requests
from pymongo.mongo_client import MongoClient

if name == "main":

mongodb_atlas_connection_string = "mongodb+srv://root:mYS4tk78YE1JDtTo@cluster0.twrupie.mongodb.net/test?retryWrites=true&w=majority&appName=Cluster0"
embedding_uri = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"
huggingface_token = "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"

question = "My computer is making strange noises and not functioning properly"

headers = {"Authorization": f"Bearer {huggingface_token}"}
data = {"inputs": question}
response = requests.post(embedding_uri, headers=headers, json=data)
if response.status_code == 200:
    query_vector = response.json()

    client = MongoClient(mongodb_atlas_connection_string)
    db = client["test"]
    result = db.customer_support_tickets.aggregate([
        {
            "$vectorSearch": {
                "queryVector": query_vector,
                "path": "ticket_description_embedding",
                "numCandidates": 10,
                "limit": 2,
                "index": "vector_index"
            }
        }
    ])
    cases = ''
    for doc in result:
        print(f"Ticket Status: {doc['Ticket Status']},\nTicket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n")
        cases += f"Ticket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n\n"

    # generator answer by llm
    prompt = f'''
             ### Case:{cases}
             Please answer the questions based on the above cases: {question}
             '''
    llm_model_url = "https://api-inference.huggingface.co/pipeline/feature-extraction/google/gemma-1.1-7b-it"
    headers = {"Authorization": f"Bearer {huggingface_token}"}
    data = {"inputs": prompt}
    response = requests.post(llm_model_url, headers=headers, json=data)
    if response.status_code == 200:
        print(response.json()[0].get("generated_text"))`

結果如下:
`

Case:

Ticket Description: I'm having an issue with the computer. Please assist.
The seller is not responsible for any damages arising out of the delivery of the battleground game. Please have the game in good condition and shipped to you I've noticed a sudden decrease in battery life on my computer. It used to last much longer. ,
Resolution: West decision evidence bit. 

Ticket Description: My computer is making strange noises and not functioning properly. I suspect there might be a hardware issue. Can you please help me with this?
} If we can, please send a "request" to dav The issue I'm facing is intermittent. Sometimes it works fine, but other times it acts up unexpectedly. 
Resolution:  Please check if the fan is clogged, if so, please clean it

Please answer the questions based on the above cases: My computer is making strange noises and not functioning properly

  • What is the initial request of the customer?
  • What information does the customer provide about the issue?

Answer:

1. Initial request of the customer:
The customer requests assistance with a hardware issue causing their computer to make strange noises and malfunction.

2. Information provided by the customer:
The customer suspects a hardware issue and notes that the problem is intermittent, working fine sometimes and acting up unexpectedly at other times.
`
這篇文章展示了使用 Tapdata Cloud + MongoDB Atlas 實現根據使用者提問問題搜尋工單資料的示例,在實際構建AI應用時還有很多細節,如果您遇到任何問題,歡迎隨時聯絡我們。

在當今數字化時代,企業內部工單處理的效率和準確性對於業務的順暢執行至關重要。傳統的人工處理方式可能會面臨資訊不準確、響應速度慢等問題,而藉助大型語言模型(LLM)和檢索增強技術的結合,企業可以實現工單處理的智慧化和自動化,極大地提升了工作效率和使用者體驗。

透過使用 Tapdata Cloud 和 MongoDB Atlas,企業可以充分利用先進的向量化技術和實時檢索功能,構建出一個強大的工單處理系統。這個系統不僅能夠快速地檢索出與使用者問題最相關的工單和解決方案,還能夠不斷學習和最佳化,適應不斷變化的業務需求。

遷移資料到 MongoDB Atlas 後,利用 Tapdata Cloud 的強大功能,我們能夠輕鬆實現工單資料的向量化處理,並透過 MongoDB Atlas 的高效儲存和檢索能力,為企業提供穩定可靠的資料支援。這種結合大型語言模型(LLM)和檢索增強RAG技術的創新應用,不僅提高了工單處理的效率和準確性,還為企業帶來了全新的智慧化解決方案。

因此,隨著人工智慧技術的不斷髮展和應用,我們有信心,藉助 Tapdata Cloud 和 MongoDB Atlas 的支援,企業內部工單處理將會變得更加高效、準確,為企業的發展和使用者的需求提供更加穩定可靠的支援。透過 Tapdata Cloud 和 MongoDB Atlas 的無縫整合,我們為企業提供了一體化的解決方案,以提高企業工單處理的智慧化水平和業務效率,為企業發展賦能。

相關文章