跳到主要內容

發表文章

目前顯示的是有「Azure Cosmos DB」標籤的文章

【Azure OpenAI】o1 模型與 2024-09-01-preview API

距離上篇在 Early Access Playground 試用 o1 模型後又過了兩週,今天終於等到 API 開放使用啦!本篇將紀錄如何使用 Python SDK 存取 o1 模型。 系列文章 【Azure OpenAI】快速試用 o1 模型 模型佈署 在先前開放的 Early Access Playground 中使用 o1 是不需要另外佈署模型的,不過回到使用 API 來存取 o1 模型,就需要像之前的模型一樣先進行佈署才能使用,相信大家都很熟悉了。 使用 Python SDK 一樣使用熟悉的 openai 套件: 2024-09-01-preview 初始化的方式與先前模型都一樣,需要注意的是 o1 模型目前只能使用最新的 API 版本 2024-09-01-preview 來訪問。 Chat Completions 將 model 填入 o1-preview ,或是你的模型佈署名稱, messages 也一樣是歷史對話堆疊的 List。 回應如下: 查看 Token 使用量 內建 Chain of Thought 的 o1 比起過往的模型會消耗較多的 Token,因此我們特別把 Token 使用量拉出來看。 回應如下: 其中 prompt_tokens 、 completion_tokens 、 total_tokens 在先前的 API 就已經存在了,分別代表Token 的 Input、Output 與總使用量,而在新的 completion_tokens_details 中可以看到  reasoning_tokens 使用了 320 個 Tokens,居然佔了總輸出 Token 的 80% 以上! 控制 Token 成本 已往我們可以使用  max_tokens 參數來控制 Token 的用量,但在 o1 模型中棄用了 max_tokens ,取而代之的是使用  max_completion_tokens 參數,來看看這段程式碼: 回應如下: 沒東西?那再看一次 Token 量。 回應如下: Token 居然是有被使用的! 這表示 max_completion_tokens 並不像過往使用  max_tokens 這麼簡單,先前在回應遇到...

【Azure Cosmos DB】使用 Python FastAPI 在 Cosmos DB 上的 CRUD 操作(下)

在上一篇文章中,我們建立了免費的 Azure Cosmos DB,並將 FastAPI 服務運行在 GitHub Codespaces 中,還沒看過上一篇的朋友建議從以下連結開始觀看。 而在本篇文章中,將會介紹使用 Python SDK 連線 Cosmos DB,並且整合 FastAPI 進行基本的 CRUD 操作,完整程式碼歡迎參考下方 GitHub 連結。 相關連結: 【Azure Cosmos DB】使用 Python FastAPI 在 Cosmos DB 上的 CRUD 操作(上) 相關連結: https://github.com/charliewei0716/python-fastapi-azure-cosmos-db-todo-list 與 Azure Cosmos DB 建立連線 首先我們必須與 Azure Cosmos DB 帳戶建立連線,在程式碼中,我們將使用套件 dotenv 來管理連線資訊,切記絕對不要將敏感資訊直接寫在程式碼中。 透過 FastAPI 的生命週期管理機制,確保在應用啟動時順帶實例化 CosmosClient ,以留做後續程式使用這個物件,這個寫法並不是必要的,但是一個建議的做法。 再者有賴於 FastAPI 直接支援非同步寫法,在 SDK 的選擇上就能盡量使用像  azure.cosmos.aio 的非同步版本,在後面的程式碼中也可以注意 async 與 await 的出現。 這邊使用的 create_database_if_not_exists 與 create_container_if_not_exists 都是 SDK 內建的功能,算是非常好用的設計。 ToDoItem 使用 FastAPI 與 pydantic 先定義好資料模型有很多好處,除了後續可以以物件的方式來存取資料,還附帶了 API 呼叫時的自動格式驗證與生成 API 文件等功能,我們依照情境定義了如下欄位。 CRUD 完成以上後就可以進入重點的 CRUD 操作了,首先第一個 Create 操作可以直接對應到 SDK 的 create_item 方法。 而 Read All 則是使用 SDK 中的 read_all_items 方法,並透過 async for 逐一打印出。 Update 操作是 CRUD 中較...

【Azure Cosmos DB】使用 Python FastAPI 在 Cosmos DB 上的 CRUD 操作(上)

Azure Cosmos DB 具備現今應用程式都要求的快速回應能力,完全受控的 NoSQL、開箱即用的低延遲與高可用性,這些特性幾乎讓 Cosmos DB 成為新式應用程式的首選資料庫。而做為與資料庫的溝通介面,在 Python 中非常熱門 FastAPI 框架,讓開發者簡單快速地建構出高效能、高穩定的 RESTful API。 本篇將結合 Azure Cosmos DB 與 Python FastAPI 在一個簡單的 Todo-list 範例上實作基本的 CRUD 操作,完整程式碼歡迎參考下方 GitHub 連結。 相關連結: https://github.com/charliewei0716/python-fastapi-azure-cosmos-db-todo-list 免費建立 Azure Cosmos DB 秉持「能免費就決不花一毛錢」的精神,免費建立的 Cosmos DB 肯定是我們的首選,而這次 Azure 非常佛心推出的免費試用版,通過以下連結進入,甚至連信用卡都不用綁就能免費試用 30 天。 免費建立 Azure Cosmos DB 建立完成就能進入 Portal 畫面: 建立完成 上方可以看到免費倒數的 30 天,時間倒數結束時也能再重新建立一個新的  Cosmos DB,又可以再次免費 30 天 ,這不是我認識的 Azure 😍 相關連結: https://cosmos.azure.com/try/ 開啟 GitHub Codespaces 我不會在這邊對 GitHub Codespaces 有太多的解釋,因為這並不是本篇的重點,但對於建置一致的開發環境來說,GitHub Codespaces 是一項值得花時間了解的服務。 使用 GitHub Codespaces 的方式非常簡單,先進到下方 GitHub 連結,在登入 GitHub 後點擊 README.md 中的「Open in GitHub Codespaces 」。 相關連結: https://github.com/charliewei0716/python-fastapi-azure-cosmos-db-todo-list Open in GitHub Codespaces 進入 Codespaces 時不用做任何動作,它會在啟動時自動安裝所需的 Pyt...

【Azure Cosmos DB】如何在手動佈建輸送量時計算實體分割區數量

最近有個專案需要使用到 Azure Cosmos DB,並且在 POC 階段需要測試其寫入效能,當時使用相同的一包資料分別在以下環境寫入: 容器 A:初始建立時直接設定 10000 RU 容器 B:初始建立時設定 5000 RU 再手動修改至 10000 RU 表面上看起來容器 A 與容器 B 具有一樣的 10000 RU 效能,但實際的實驗結果卻是在寫入時的效能差了近一倍,原來是實體分割區在背後搞鬼。 基本概念 為了繼續討論這個問題,先快速理解幾個在 Azure Cosmos DB 中的基本概念。 RU 要求單位:衡量 Azure Cosmos DB 的效能單位,理論上配備越高的 RU 具有越好的效能,同時也是帳單的計費單位。 Azure Cosmos DB RU 邏輯分割區:由分割區索引鍵決定,具有相同分割區索引鍵的資料會存在在同一個邏輯分割區中。 實體分割區:由微軟維護的底層實際運算資源,相同邏輯分割區的資料會存放在同一個實體分割區中。 實體分割區與邏輯分割區的一對多關係 問題重現 為了快速重現環境,我們使用 Azure Cosmos DB 在 Portal 中的「資料總管」,透過 UI 點擊的方式來建立單獨的資料庫與容器。 首先建立稍早情境描述中的容器 A:建立名為 db_A 的資料庫,並在其中建立名為 container_A 的容器。 初始設定 10000 RU 建立完成後,任意寫一筆資料進到 container_A 中。 任意寫一筆資料 這時切換到左側「監視」→「深入解析」,上方的下拉選單選到剛剛建立的資料庫 db_A,再切換到「輸送量」頁籤,就會看到以下畫面: 其中的 partitionkeyrangeid 代表的是實體分割區,嗯..有兩個實體分割區? 問題分析 Azure Cosmos DB 中的實體分割區是由微軟維護,且無法觸及到的層級,但實際上在建立容器的當下,後台會自動判斷每 6000 RU 分配一個實體分割區到這個新建立的容器中,這代表我們使用 10000 RU 建立的 container_A  會被分配到兩個實體分割區,且每個分割區會平均拿到 5000 RU 的運算效能。 回想一下前面提到的實體分割區與邏輯分割區的一對多關係,所以當資料內的分割鍵不夠分散,亦或是未經過「洗牌」,這會造成資料是同時寫入同一...