iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
佛心分享-SideProject30

RAG 和 MongoDB Vector Search系列 第 8

MongoDB Vector Search 前置作業

  • 分享至 

  • xImage
  •  

在第二天的時候有分享MongoDB Atlas作為這次主題的向量資料庫,或許你可能會想說MongoDB 原始設計本就不是專用於向量和進行向量資料查找而設計的資料庫。但是近幾年MongoDB 推出了Vector Search服務,就算儲存架構不是專門設計於儲存向量,但是能在這種非結構化結構儲存向量並且擁有向量查詢的功能勢必擁有一定的優勢。

因此今天將要來介紹如何在MongoDB Atlas當中透過Compass建置Vector Search。因為目前我已經沒有OpenAI 的資源去進行Embedding,所以這邊我著重分享過去使用的方法。主要有以下步驟:

  1. 將document當中的content取出
  2. 傳送給Embedding model去進行向量轉換
  3. 將轉換後結果儲存回原本的document,並且使用embedding欄位儲存

先進行資源的載入

import os
from dotenv import load_dotenv
from pymongo import MongoClient

#通常會將所有endpoint 或者API_KEY額外儲存在電腦中的.env檔案
#主要是為了不要讓連線資訊外流,同時也是為了方便管理

load_dotenv('.env')

api_key=os.getenv("AZURE_OPENAI_API_KEY")
api_version="2024-02-01"
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
print('api_key:', api_key)
print('azure_endpoint:', azure_endpoint)
#因為當時我們在開發測試時主要都是用LangChain架構去撰寫,所以這邊也直接使用LangChain提供的AOAI連接套件
from langchain_openai import AzureChatOpenAI, AzureOpenAIEmbeddings
from pymongo import MongoClient

# AOAI resources
aoai_embeddings = AzureOpenAIEmbeddings(
    api_key=api_key,
    azure_endpoint=azure_endpoint,
    openai_api_version=api_version,
    azure_deployment="text-embedding-ada-002",
    disallowed_special=()
)
#MongoDB resource
connecting_string = "your_connection_string"
client = MongoClient(connecting_string)

db = client['practice_CRUD']
collection = db['contexts'] #我們將chunks開立一個新的collection儲存

接著就是取出document當中的content資料,然後傳遞給embedding model 去轉換。

# 遍歷每個文件,嵌入並更新
for document in collection.find():
    content = document['content']
    
    # 獲取嵌入向量
    embedding = aoai_embeddings.embed(content)
    
    # 更新文件,新增 'embedding' 字段
    collection.update_one(
        {'_id': document['_id']},
        {'$set': {'embedding': embedding}}
    )

最後就是到Compass當中建立好Search Index就準備好Vector Search的前置作業了!(假設經過上面步驟就完成了每一個document的 content embedding的動作)

{
  "_id": {
    "$oid": "66eecfb8c1540b40d68a46ad"
  },
  "chunk_id": 1,
  "content": "Fed降息影響有哪些?Q4投資布局一次看 | 遠見雜誌 訂閱 成為遠見會員 免費瀏覽更多專題好文 快速註冊 已是會員,立即登入 為您推薦 加入會員獨享優惠 最新 最新專題報導 話題 政治 時事 人物 總經 國際 全球焦點 兩岸 金融 投資理財 保險規劃 退休理財",
	"embedding": [
    0.123456, 0.654321, ..., 0.789012
  ]
}

https://ithelp.ithome.com.tw/upload/images/20240922/20167359VgI2vLFWk5.png
切換到Indexes分頁中,並且切換到Search Indexes模式。然後建立如下設定。這裡為什麼指定numDimensions是1536? 因為我們是使用OpenAI 的text-embedding-ada-002模型去將文字轉換成向量,所以需要告知說我們轉換後的向量維度為多少。

https://ithelp.ithome.com.tw/upload/images/20240922/201673594DrTnSlLRw.png

https://ithelp.ithome.com.tw/upload/images/20240922/20167359CyO9zkFuhk.png

建立好之後,稍等一下並且Refresh一下Compass。最後就會看到這項Indexes已經Ready啦!所有的Vector Search前置作業就結束了,接下來就即將要開始使用RAG技術來開發我們的聊天機器人!


上一篇
使用LangChain模組來進行Chunk切割
下一篇
RAG Embedding intro
系列文
RAG 和 MongoDB Vector Search11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言