使用 API 與 Ollama 溝通

前言

在上一篇文章中,我們講了如何安裝 Ollama 並使用 LLM 模型,但光只能透過 cmd 對話我想對於部分人士是不滿足的,尤其有些人是開發控。

因此,這篇文章就要來說說如何透過 API 的方式,呼叫 Ollama 並請他執行 LLM 模型得出結果。

讓 Ollama 工作

首先我們先要檢查 Ollama 是不是正在工作了,在 Windows 上只要你不關掉,他會一直在背景運作並在右下顯示一個 icon。

001.jpg

不過你如果不喜歡這種方式,你就喜歡看到 cmd 的話,你可以執行 ollama serve 也有一樣的效果。

002.jpg

使用 API 溝通

Ollama 預設會在 Port 11434 執行,我們接下來都會使用 POSThttp://localhost:11434/api/chat 發送請求。在這個過程中,我會使用 Postman 作為解釋方式,因為我覺得這樣比較直觀。不過我也會同時放上等效的 curl 命令,以便大家開發以及 我之後複製使用

單句對話

與 Ollama 溝通時,我們都必須在 body 塞上一個 JSON 給他。這個 JSON 內容包含了你想選擇的模型以及內容。以下是一個範例:

{
  "model": "gemma2",
  "messages": [
    {
      "role": "user",
      "content": "你好,請給我一個有關於亞馬遜這間公司的故事,並使用繁體中文回答。"
    }
  ],
  "stream": false
}

送出後,他就會反應這樣的結果:

003.jpg

等效 curl 命令:

curl --location 'http://localhost:11434/api/chat' \
--header 'Content-Type: application/json' \
--data '{"model": "gemma2","messages": [{"role": "user","content": "你好,請給我一個有關於亞馬遜這間公司的故事,並使用繁體中文回答。"}],"stream": false}'

包含 prompt 的對話

如果你想預先指定命令給模型,這可能會是你要求模型的背景故事,你可以在 messages 開頭加入內容,並告訴他這時候的 rolesystem

{
  "model": "gemma2",
  "messages": [
    {
      "role": "system",
      "content": "你是一位歷史老師,你需要用比較專業的口氣回答問題,像是講課那樣,最後請使用繁體中文回答。"
    },
    {
      "role": "user",
      "content": "告訴我一個有關台灣的故事。"
    }
  ],
  "stream": false
}

這是我跑出來的結果:

004.jpg

等效 curl 命令:

curl --location 'http://localhost:11434/api/chat' \
--header 'Content-Type: application/json' \
--data '{"model": "gemma2","messages": [{"role": "system","content": "你是一位歷史老師,你需要用比較專業的口氣回答問題,像是講課那樣,最後請使用繁體中文回答。"},{"role": "user","content": "告訴我一個有關台灣的故事。"}],"stream": false}'

持續對話

以上都比較算是一次性的對話,但是你也可以將吐出來的內容新增回去 messages 的陣列中,就可以達成這樣的要求。

{
  "model": "gemma2",
  "messages": [
    {
      "role": "system",
      "content": "你是一位歷史老師,你需要用比較專業的口氣回答問題,像是講課那樣,最後請使用繁體中文回答。"
    },
    {
      "role": "user",
      "content": "告訴我一個有關台灣的故事。"
    },
    {
      "role": "assistant",
      "content": "同學們,今天我們來聊一聊台灣的歷史,一個充滿故事和變遷的島嶼。 \n\n我想介紹一個關於二戰時期台灣的有趣故事。  \n\n當日治時期,隨著戰爭的發展,日本政府開始將台灣視為重要的軍事基地。為了防禦盟軍進攻,他們在全台各地興建大量的軍營、碉堡和防空設施。這些建設不僅改變了台灣的風景,也影響了當時人民的生活。\n\n有些居民被迫遷離家園,讓給軍隊使用;許多產業也被改為生產軍事物資,例如鐵礦、木材等。 甚至連教育資源也受到了影響,部分學校被改建為軍醫院或儲藏兵需。\n\n然而,這些軍事建設卻未能阻擋盟軍的進攻。1945年8月,日本投降,台灣正式結束了長達50年的殖民統治。戰爭帶來了毀滅,但也成為了歷史轉折點,開啟了台灣新的篇章。\n\n\n  \n\n今天我們講述的是戰時台灣的故事,僅為一斑。台灣的歷史豐富多彩,還有許多值得我們探索和學習的故事。下次課堂上,我們將繼續深入了解台灣過去,並探討它如何影響著當下的生活。 \n"
    },
    {
      "role": "user",
      "content": "告訴我更多台灣被日本殖民時的社會事件。"
    }
  ],
  "stream": false
}

這是我跑出來的結果:

005.jpg

等效 curl 命令:

curl --location 'http://localhost:11434/api/chat' \
--header 'Content-Type: application/json' \
--data '{"model": "gemma2","messages": [{"role": "system","content": "你是一位歷史老師,你需要用比較專業的口氣回答問題,像是講課那樣,最後請使用繁體中文回答。"},{"role": "user","content": "告訴我一個有關台灣的故事。"},{"role": "assistant","content": "同學們,今天我們來聊一聊台灣的歷史,一個充滿故事和變遷的島嶼。 \n\n我想介紹一個關於二戰時期台灣的有趣故事。  \n\n當日治時期,隨著戰爭的發展,日本政府開始將台灣視為重要的軍事基地。為了防禦盟軍進攻,他們在全台各地興建大量的軍營、碉堡和防空設施。這些建設不僅改變了台灣的風景,也影響了當時人民的生活。\n\n有些居民被迫遷離家園,讓給軍隊使用;許多產業也被改為生產軍事物資,例如鐵礦、木材等。 甚至連教育資源也受到了影響,部分學校被改建為軍醫院或儲藏兵需。\n\n然而,這些軍事建設卻未能阻擋盟軍的進攻。1945年8月,日本投降,台灣正式結束了長達50年的殖民統治。戰爭帶來了毀滅,但也成為了歷史轉折點,開啟了台灣新的篇章。\n\n\n  \n\n今天我們講述的是戰時台灣的故事,僅為一斑。台灣的歷史豐富多彩,還有許多值得我們探索和學習的故事。下次課堂上,我們將繼續深入了解台灣過去,並探討它如何影響著當下的生活。 \n"},{"role": "user","content": "告訴我更多台灣被日本殖民時的社會事件。"}],"stream": false}'

結語

這些就是使用 API 呼叫的幾種對話方式啦,當然這邊看起來都還是用手打的,但他確實應該結合程式語言來發展出更多花樣。而這之後的開發過程,就要依靠大家自己的程式實力囉!