Cracking Down inside Phi-3: รักแรกพบจนอยาก “เทรน” เธอ ❤️

เจาะลึกโมเดล SLM ตัวใหม่ล่าสุดจากทาง Microsoft พร้อมกับการสร้าง Chatbot กับ Ollama และ Streamlit

Boat Charunthon
8 min readMay 11, 2024
Background เรา generate มาจาก Bing Image Creator อีกที ไม่ได้ใช้ในเชิงพาณิชย์ ไม่น่าผิดนะ 😅

สวัสดี Developers นักอ่านทุกท่าน เขียนส่งตรงจากตึก Empire Tower ชั้น 55 ครับ

ก่อนอื่น อาจจะรู้สึกแปลกๆว่า ทำไม story นี้ถึงไม่ได้เขียนเป็นภาษาอังกฤษ … ผมเชื่อมั่นว่าหลายๆคนน่าจะรู้จักหรือเคยดู announcement หรือจะเป็นตัว documentation/technical report ของตัว SLM ที่ผมจะเล่าใน story นี้ เป็นภาษาอังกฤษอยู่พอสมควรครับ และก็ แน่นอนว่า ฝั่งต่างประเทศก็เขียนรีวิวกันไปเยอะแล้ว แต่ว่าถ้าเป็นภาษาไทย ผมว่ายังไม่เจอแพร่หลายครับ ก็เลยขอนำมาเล่าสรุปก่อนก็แล้วกัน 😅

ใดๆ วันนี้จะมาขอเล่าเรื่องประสบการณ์การใช้หรือเล่น ตัว SLM ตัวนี้ที่ชื่อว่า Phi-3 ซึ่งเป็น Small Language Model ตัวใหม่ที่ถูกพัฒนาโดยทางฝั่ง Microsoft และ Model ตัวนี้ ยังเป็น Open Source Model อีกด้วย (ไม่เหมือน OpenAI ที่บอกว่าตัวเอง Open ตามชื่อเลอ😒)ก็เลยมีความอยากลองมาพัฒนาเป็น web app บ้าง อย่างเช่นเป็น chatbot ใดๆ แต่ใน story นี้ อาจจะไม่ได้พาเขียนพวก front end นะครับ แต่ว่าเราจะใช้ Python ในการทำ WebApp กัน ซึ่งในพาร์ทต่อๆไป จากพรีวิว Phi-3 ก็จะมา introduce กับ library ตัวนึง ที่ชื่อว่า Streamlit ที่เอาไว้ใช้ทำ Chatbot WebApp กันครับ

Back to Microsoft Build: AI Day

If you want to read a full blog, please visit it here >> Microsoft Build: AI Day 2024 | EP: 1 — A lot of Things Happening

ผมมั่นใจว่าคนส่วนใหญ่ใน Hallroom น่าจะรู้สึกว้าวกับเรื่อง First Datacenter in Thailand จากสิ่งที่ Satya Nadella ได้กล่าวไว้ แต่ว่านั่นไม่ใช่ประเด็นหลักของ story เราฮะ55555

ประเด็นที่กำลังจะพูดถึงอยู่ ณ ตอนนี้คือสิ่งที่เรียกว่า Foundation Models ที่ Microsoft เองก็ได้ประกาศกลุ่มของ Langugage Model ขึ้นมา มีชื่อว่า Phi-3 เดิมทีตัวโมเดลนี้เคยประกาศเมื่อปลายเดือนเมษายน 2566 (April 2024) ออกแบบมาเพื่อเป็น Multitask Langugae Model ที่สามารถทำงานได้หลายประเภท ต่อมา Satya เอง ได้มา introduce กับพวกเรานประเทศไทยในวันแรงงาน (1st May 2024) พร้อมทั้ง มี Model ย่อยๆ ตามมาให้เราได้รู้จัก ซึ่งชื่อของแต่ละตัว ต่างก็มี label ท้าย Phi-3 เป็นของตัวเอง ไม่ว่าจะเป็น mini, small, หรือ medium ครับ ซึ่งในพาร์ทต่อไปนี้เราจะมา in-depth กันว่า ตัวไหน มีขนาดเท่าไหร่ และมี performance ประมาณไหน เดี๋ยวมาดูกันครับ

เอาเข้าจริงๆแล้ว จุดประสงค์ของ Phi-3 เอง ไม่ออกแบบแค่เฉพาะเป็น General Usage เพียงอย่างเดียว แต่ว่ายังสามารถที่จะช่วยเราในด้านวิทยาศาสตร์อีกด้วยครับ ซึ่งมันจะมาในนามของ AI for Science ที่ผสานองค์ความรู้จาก เคมี ฟิสิกส์ และ ชีววิทยาศาสตร์ (Life Science ที่เจาะกลุ่มลึกกว่า ชีววิทยา-Biology นะครับ) มาผสมผสาน เพื่อสร้างเสริมให้โมเดล มีการตอบแบบใช้หลักการและเหตุผล (Scientific Reasoning), นำข้อมูลมาเสนอ (Scientific Data), และรวมทั้ง การจำลองสถานการณ์ จากการใช้ Simulation Agents อีกด้วย

Misha Bilenko — Corporate Vice President, Microsoft GenAI

จนกระทั่ง Misha Bilenko จากทางทีม GenAI ของ Microsoft เองได้มาเขียน Technical Blog และก็เหมือนกับ hype ตัวโมเดลนี้ว่าเปรียบเสมือนเป็น Textbooks Are All You Need ที่เราจะ Query ถามมัน แล้วได้ผลลัพธ์ที่แม่นยำชัดเจนมากว่า Model ตัวอื่นๆคับบ

สามารถลองไปอ่านดูเพิ่มเติมได้ที่ > Introducing Phi-3: Redefining what’s possible with SLMs | Microsoft Azure Blog ได้เลยคับบ

Performance and Benchmark

ตัว Phi-3 ทั้งตระกูลเองเป็น Open SLM ที่มีขนาดเล็กกระทัดรัด storage ที่ใช้ไม่ใหญ่มาก แต่มีประสิทธิภาพสูง เนื่องจากมี 3.8 พันล้านพารามิเตอร์อยู่ข้างในโมเดลที่จะทำให้ AI เข้าใจรูปแบบความสัมพันธ์ของภาษา นี่น่าเป็น main reason ที่ SLM ตระกูลนี้ สามารถสร้างข้อความ แปลภาษา ตอบคำถามต่างๆนานาได้คับบ

ใดๆแล้วจำนวนพารามิเตอร์ประมาณ 3.8B มันแค่เป็นจำนวนเริ่มต้นเท่านั้น สำหรับสองโมเดล ไม่ว่าจะเป็น mini-4k หรือ จะเป็น mini-128k แต่ว่า ยังมี อีกสองตัวที่ยังไม่ได้ mention ซึ่งมีทั้ง Phi-3-Small กับ Phi-3-Medium ซึ่งทั้งคู่ยังเป็น Preview Version อยู่ แต่คิดว่าอีกไม่นาน เราได้ใช้ทุกตัวผ่าน Microsoft Azure ทำ chatbot หรือพวก RAG ได้ (ซึ่งสองตัวแรกใช้ไปทำแล้วคับบ)

พอผมมาดูมาตัว Technical Report จากแหล่งอื่น บางทีก็ไม่ได้คิดจะเข้าข้างทาง Phi-3 เท่าไหร่ แต่ก็ต้องเข้าใจว่า Model แต่ละตัว เทรนมาต่างกัน และ using purpose ก็แตกต่างกันด้วย บางเทส ของ Phi-3 ก็ fail อยู่เหมือนกันคับบ เช่น พวกโจทย์ปัญหาที่ใช้ตรรกะ หรือว่าจะเป็นโจทย์ทางคณิตศาสตร์ที่มีความซับซ้อนเป็นต้น คิดว่าในพาร์ท Demo เดี๋ยวจะมาให้ดูว่า Response ของฝั่ง Phi-3 จะตอบว่าอะไรบ้าง พอมาเห็น Result แต่ละอัน เราเองก็อึ้งเหมือนกันนะ 🥲

Used Platform

ณ ตอนนี้มีซอฟท์แวร์เพียงไม่กี่ platform ที่เราสามารถเล่นกับตัว Phi-3 ได้ ก็จะมีพวก Microsof Azure AI Service ที่เราจะเอามันมาใช้ทำ Chatbot Playground กับ งานพวกใช้ RAG หรือ Retrieval Augmented Generation และถ้าใครอยากเล่นแค่นิดเดียว สามารถไปเล่นโมเดลโดยตรงแบบออนไลน์ได้ที่ Hugging face ได้เช่นเดียวกันคับบ

สำหรับคนสายรัน local บนเครื่องคอมของเราเองก็ ก็ทำได้เหมือนกัน โดยสามารถโหลดตัวโมเดลมาจาก Ollama จุดศูนย์รวมโมเดลยอดนิยมไม่ว่าจะเป็น Llama, Gemma, Mistral และอื่นๆอีกมามายได้ ที่เราสามารถ install ตัวโมเดลเราเข้าเครื่องได้เลย 👍

มีคำถามอยู่ว่า พอเรา install ทั้งตัว Ollama กับ Phi-3 ไปในเครื่องแล้ว มันจะกินพื้นที่เครื่องเยอะรึป่าว บอกเลยครับว่า กินพื้นที่ไม่เยอะคับบ เพราะตัว Ollama เองเป็นแค่ตัว Application ส่วน Phi-3 จะใช้พื้นที่อยู่ประมาณ 2.3 GB สำหรับทั้ง mini-128k และ mini-4k ซึ่งเป็นขนาดที่เราพอรับมือได้คับบ

Installation and Run the Model

  1. เริ่มต้นโดยเข้าไปที่ ollama.com และกดที่คำว่า “Download” เพื่อเริ่มทำการดาวน์โหลดและติดตั้งแพล็ตฟอร์ม Ollama

2. จากนั้นให้เราเข้าไปที่ Command Prompt หรือ Terminal และพิมพ์คำว่า ollama run phi3 เพื่อทำการติดตั้ง Model Phi-3 mini ภายในเครื่อง

Courtersy of Nerd’s Chalk

3. ทำการเช็คว่า Model ของเราได้โหลดลงเครื่องแล้วหรือยัง โดยการพิมพ์ ollama list เพื่อ print ลิสต์ของ model ที่เราโหลดไว้

นอกเหนือจากที่เราลงตัว Phi-3 mini เสร็จแล้ว แนะนำว่า ลง nomic-embed-text ไปด้วย ในกรณีที่เราจะใช้มันทำ Text Generation ที่มี Token ที่ยาวกว่า ซึ่งจะมีหลักการทำงานที่คล้ายคึงกับ OpenAI’s GPT โดยที่ nomic เองมี purpose หลักๆคือ Text Embedding แต่โชคดีที่ว่าเป็นโมเดลที่เป็น open source คับบ ซึ่งหลักๆ model ตัวนี้ เราจะเอาไปใช้ในการทำ Chatbot ในลำดับต่อไปนั่นเองครับ 👍

Intelligent Chatbot with Phi-3 SLM and Streamlit Library

Phi3 Chatbot Web Application ทั้งแบบ Light และ Dark

ล่าสุดได้ลองทำเป็น Chatbot webapp ขึ้นมาคับบ แต่ว่าตัวเราเองก็ไม่ได้ถนัด front-end เยอะเท่าไหร่ แบบว่า อาจจะต้องใส่ JavaScript นู่นนั่นนี่ ตอนแรกกว่าจะว่าใช้บริการ GitHub Copilot นิดนึง แต่ไม่ดีกว่าคับบ 😅 ใดๆแล้ว ไปเจอ Library ตัวนึงที่น่าสนใจ แล้วสามารถเขียนแค่เฉพาะภาษา Python ได้ Library ตัวนั้นมีชื่อว่า Streamlit คับบ

Streamlit เป็น “Library + Repository” นึง ที่เราสามารถใช้ภาษา Python เพียงภาษาเดียวในการทำ web app ขึ้นมา โดยไม่จำเป็นต้องพึ่งพวก HTML, JavaScript, และ CSS ครับ โดย streamlit เองนั้น สามารถรวม Python libraries ต่างๆ ที่เราเคยเขียนเช่น Numpy, Pandas, Scipy, Matplotlib ต่างๆนานา มา deploy ขึ้น web app ได้เช่นเดียวกันคับบ

และที่พิเศษไปกว่านั้นคือ เราสามารถทำ Interactive Panel ได้แค่โค้ดเพียง line เดียวเท่านั้น ซึ่งมันสามารถเป็นไปได้หลายอย่างเช่น File Uploader, Calendar, Selection, Graph Visualizer เป็นต้นคับบ

สำหรับใครที่อยากจะไปลองทำ ChatBot ง่ายๆ กับ SLM/LLM ที่มันเป็น OpenSource ไม่ว่าจะเป็นตัว Phi3, Mistral, หรือ Llama สามารถไปลองทำกัน โดย Follow ขั้นตอนการทำของเรา ในแต่ละพาร์ท หรือจะ Clone Repo ที่ GitHub ด้านล่างนี้ได้เลยนะคับบ

ใดๆ เราจะมาเล่าคร่าวๆกันว่า ส่วนประกอบของหน้า Chatbot กันครับว่ามีอะไรกันบ้าง…👍มาดูกันครับ

มาเริ่มกันที่ import library กันคับบ โดยเราจะอิมพอร์ทั้งตัวของ Streamlit ที่เป็น web app และก็ ollama ที่จะเป็นช่องทางการ pull ตัวโมเดลเข้ามาใช้ใน chatbot ของเรา จากนั้น ตั้งชื่อเว็บของเราว่าเป็น Phi3 Chatbot คับบ

## the imports ##
import streamlit as st
import ollama

## the title
st.title("💬 Phi3 Chatbot")

จากนั้นเราจะทำ Welcome Message ให้กับผู้ใช้งาน เช่น Hello เราจะใช้คำสั่ง st.session_state[“messages”] ในการปริ้นข้อความออกมาทุกครั้งเมื่อเราเข้ามาใน web app ใหม่

## the first message of the AI assisstant ##
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "Hello there! How can I help you today?"}]

หลังจากที่เราทำ welcome message เสร็จ เราจะทำสิ่งที่เรียกว่า chat history หรือว่า พาร์ทที่เราสามารถกลับไปดู message ข้างบนที่เราเคยพิมพ์ถามมันไว้ โดยเราจะแยก Role ของ User และ Chatbot ออกจากกันอย่างชัดเจนคับบ

### Message History ##
for msg in st.session_state.messages:
if msg["role"] == "user":
st.chat_message(msg["role"], avatar="🧑‍💻").write(msg["content"])
else:
st.chat_message(msg["role"], avatar="🤖").write(msg["content"])

อีกพาร์ทนึงที่สำคัญที่สุด และขาดไปไม่ได้ นั่นก็คือพาร์ท import ตัวของ Phi 3 เข้ามาใน web app ของเรานั่นเองครับ และก็ทำฟังก์ชั่นที่นำมา Generate Text ออกมาครับ

## Configure the model to use (in our case, the Phi-3)
def generate_response():
response = ollama.chat(model='phi3', stream=True, messages=st.session_state.messages)
for partial_resp in response:
token = partial_resp["message"]["content"]
st.session_state["full_message"] += token
yield token

if prompt := st.chat_input():
st.session_state.messages.append({"role": "user", "content": prompt})
st.chat_message("user", avatar="🧑‍💻").write(prompt)
st.session_state["full_message"] = ""
st.chat_message("assistant", avatar="🤖").write_stream(generate_response)
st.session_state.messages.append({"role": "assistant", "content": st.session_state["full_message"]})

ในส่วนของ prompt หรือจิงๆมันคือ int main() / driver code แล้วแต่เราจะเรียก 🤣 มันเป็น procedure ปรกติที่เราคุ้นชินจากการถาม GPT แบบว่า “เราถาม-เข้าตอบ” อะไรประมาณนั้นครับ 😅👍 แบบว่า Start with user, and then end by assistant จากนั้นเราก็รัน activate environment ที่เราเก็บไฟล์เราไว้ และก็ streamlit run app.py เพื่อเช็คว่า web app ของเรารันเหมือนภาพข้างบนได้หรือไม่ เพียงแค่นี้ เราก็มี Chatbot เป็นของตัวเองฟรีๆติดเครื่องแล้วครับ 🥳🎉👏

Testing Questions

Mathematics

เริ่มต้น ผมได้ลองถามมัน ให้มันลองหา square root กับ log ซึ่งผลลัพธ์ที่ออกมาคือถูกต้อง และก็มีให้วิธีคิดมาด้วย (Reasoning) ถือว่าโอเครในระดับที่เป็น simple question คับบ

ต่อมา ผมอยากจะให้มันหา mean หรือ average ของเลขเซทๆนึงขึ้นมา ให้มันคำนวณ ผลออกมากลายเป็นดังภาพครับ

ปรากฎว่า answer ของมันที่ตอบมาเป็น ∑X = 150 ผมก็เลยให้มัน Recheck ตัวเองว่ามันคำนวณถูกหรือไม่ ต่อมา ผมมานั่งบวกเองกับมือ ปรากฏว่าผมบวกด้วยตัวเอง (บวกแบบเต่าคลานหลายรอบด้วยนะ) ได้ ∑X = 153 …. ผมเริ่มเจอ Hallucination ใน Phi 3 แล้วหล่ะคับบ 😭

ต่อมา ผมมาลองถามโจทย์แนวเดียวกัน คือให้หาค่าเฉลี่ย เปลี่ยนแค่ตัวเลขในเซ็ทเป็น 3, 11, 4, 6, 8, 9, 6 และก็มาคิดในเครื่องคิดเลขอีกรอบนึง

ปรากฏว่ามันได้ค่าตรงกันคับบ จนแบบเรามานั่งคิด “อิหยังว่ะ” กับมัน จนแบบ อ่าา เข้าใจล่ะ มันเป็น Hallucination ที่เกิดขึ้นใน Phi-3 และเข้าใจว่าเป็น SLM ด้วยก็เลยคิดว่า data ที่ Train มาอาจจะไม่พอกับ efficient performance คับบ

Coding Question

ผมลองนั่งคิดคำถามเล่นๆ เกี่ยวกับ Coding ตอนแรกกะจะถามว่า Hello World มันเขียนยังงัย แต่ว่าไม่ดีกว่า ให้มันเขียน Bubble Sort เป็นภาษา Python กันดีกว่าคับบ ผลลัพธ์จากการถาม ก็จะเป็นประมาณนี้คับบ

To implement a Bubble Sort algorithm in Python, follow the steps below. This sorting technique repeatedly steps
through the list, compares adjacent elements, and swaps them if they are in the wrong order. The pass through the
list is repeated until no more swaps are needed, indicating that the list is sorted. Here's an example of how to
write it:

```python
def bubble_sort(arr):
n = len(arr)

# Traverse through all array elements
for i in range(n-1):

# Last i elements are already in place, so the inner loop can avoid looking at the last i elements
for j in range(0, n-i-1):

# Swap if the element found is greater than the next element
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr_j

return arr

# Example usage:
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("Sorted array is:", sorted_arr)
```

This implementation follows the traditional Bubble Sort algorithm with a time complexity of O(n^2), which makes it
inefficient for large datasets. However, its simplicity and ease of understanding make it useful for educational
purposes or when dealing with small arrays where performance isn't critical.

หลังจากที่ได้ผลลัพธ์ออกมาแล้ว ผมก็เอาโค้ดมาลองรันใน Online GDB เพื่อตรวจสอบว่าโค้ดนั้นรันได้หรือไม่ สรุปแล้วผลลัพธ์ถือว่าผ่านครับ 👍

Logic Question

นอกเหนือจากการถามมันด้วยเรื่องคณิตและ Coding เรามานั่งตัดสินใจมาลองถามคำถามแนวใช้ Logic กับมันดูครับ ซึ่งเซ็ทของคำถามเราเอามาจากที่ 25 Logic Puzzles (with Answers) for Adults — Parade หรือว่าจะเป็นเว็บไซท์อื่นก็ได้ครับ

คำถามที่ผมเลือกเอามาถาม Phi-3 ก็จะมีอย่างเช่น

  • There are two ducks in front of a duck, two ducks behind a duck and a duck in the middle. How many ducks are there? (1 Duck)
  • Five people were eating apple, A finished before B, but behind C. D finished before E, but behind B. What was the finishing order? (CABDE)

เรามาดู Result กันว่าจะเป็นยังไงครับ

เราว่ามันก็ถูกอยู่นะ และก็มีอธิบายวิธีคิดด้วย ก็ถือว่าโอเคร (ในระดับนึง)นะคับบ แต่ว่ากำลังตั้งข้อสังเกตอยู่ว่า ถ้าเกิดว่าเราถามมันแบบยากๆ มันอาจจะตอบถูกหรือตอบผิด กลายเป็น Hallucination ก็เป็นได้คับบ

Conclusion and Responsible AI

เมื่อจากที่เราเทียบ Result กับตัว Benchmark ด้านบน ก็ทำข้อสรุปได้ว่า ในบางครั้ง Phi-3 เองอาจจะเวิร์คและไม่เวิร์คสำหรับคำถามทางคณิตศาสตร์และแนวเชิงตรรกะ แต่ใดๆแล้วเราก็คงคิดว่า เราอาจจะได้เห็น พัฒนาการที่ดีขึ้นจากตัว Phi-3 ในครั้งต่อๆไป หรือ อาจจะมาใน phi-4 ก็เป็นได้คับบ

อีกอย่างก็คือ Phi-3 เป็น model ที่ค่อนข้างที่จะมี safety ในระดับนึงและ sentiment ในการ generate ข้อมูลก็ neutral ถือว่าตอบโจทย์ในเรื่องของ Responsible AI ซึ่งเป็น guideline หลักที่ Microsoft เคยให้กับเราไว้ตั้งแต่ทำ Azure OpenAI หรือ Azure AI service นั่นเองคับบ

สุดท้ายก็ไม่มีอะไรจะฝากครับ นอกเหนือจากอยากจะให้ไปลองใช้ Phi-3 กันคับบประสิทธิภาพของโมเดลเองก็ถือว่าใช้ได้ในระดับนึง และก็เราสามารถโหลดติดเครื่องรัน offline มาเทสมารันได้เช่นเดียวกันคับบ

ขอบคุณทุกๆคนที่เข้ามาอ่าน story นี้นะครับ ครั้งต่อไปได้กลับมาเขียน English แน่นอน ไว้เจอกันใหม่ครับ 👋

--

--

Boat Charunthon

Hi, I'm just technology enthusiastic kid and Microsoft Learn Student Ambassadors. Visit linktr.ee/boatchrnthn to know me more