- เคยใช้งาน Siri และ Google Assistant มาก่อน ซึ่งแม้จะควบคุมอุปกรณ์ได้ แต่ปรับแต่งไม่ได้และต้องพึ่งพาบริการคลาวด์
- อยากเรียนรู้สิ่งใหม่ ๆ และอยากได้ของเจ๋ง ๆ ที่ใช้ได้จริงในชีวิต ผู้ช่วยตัวใหม่นี้ควรมีบุคลิกกวน ๆ และประชดประชัน
- ต้องการให้ทุกอย่างรันแบบโลคัลทั้งหมด โดยไม่มีข้อยกเว้น ไม่มีเหตุผลที่เครื่องชงกาแฟจะต้องคุยกับเซิร์ฟเวอร์ที่อยู่อีกฟากของประเทศ
- ต้องการมากกว่าฟังก์ชันพื้นฐานอย่าง "เปิดไฟ" และอยากให้สามารถเพิ่มความสามารถใหม่ ๆ ได้ในอนาคต
สถาปัตยกรรม
- ใช้ Protectli Vault VP2420 สำหรับไฟร์วอลล์, NIPS และการทำ VLAN routing
- เปิดให้ HomeAssistant เข้าถึงได้จากอินเทอร์เน็ตเพื่อใช้งานจากระยะไกลโดยไม่ต้องใช้ VPN และใช้มาตรการความปลอดภัยแบบเข้มข้นเพื่อทำเช่นนั้น
- เลือกสวิตช์แบบจัดการ TRENDnet TEG-3102WS เพื่อให้ได้ 2.5 กิกะบิตในราคาประหยัด
- ใช้ RTX 4060Ti สองใบในคอมพิวเตอร์ที่ประกอบขึ้นมาให้ถูกที่สุดเท่าที่ทำได้ โดยซื้อชิ้นส่วนส่วนใหญ่จาก eBay เพราะ VRAM สำคัญสำหรับการป้อนคอนเท็กซ์จำนวนมากให้ LLM
- ใช้ Minisforum UM690 เพื่อรัน HomeAssistant (และ WAF) แม้ Raspberry Pi 4 ก็พอใช้ได้ แต่มีการรันบริการหลายอย่างและ Whisper ใช้ CPU ค่อนข้างมาก
- สาย Ethernet ยุ่งเหยิงไปหมด
เอนจินอนุมาน
- เลือก vLLM เพราะต้องการ LLM แบบใช้งานทั่วไปที่ใช้ได้นอก HomeAssistant ด้วย มันเร็วมากและเป็นเอนจินเดียวที่สามารถให้บริการหลายไคลเอนต์พร้อมกันได้
- รองรับเซิร์ฟเวอร์ API ที่เข้ากันได้กับ OpenAI ทำให้ทุกอย่างง่ายขึ้นมาก
- เลือกโมเดล Mixtral ของ Mistral AI เพราะสมดุลระหว่าง VRAM กับประสิทธิภาพลงตัวพอดี
การควอนไทซ์โมเดล
- เนื่องจากไม่สามารถรันโมเดล fp32 แบบเต็มได้ จึงเลือกเวอร์ชันที่ผ่านการควอนไทซ์
- การควอนไทซ์คล้ายกับ MP3 คือคุณภาพลดลงเล็กน้อย แต่ลดความต้องการทรัพยากรได้มาก
- ต้องเลือกระหว่าง GPTQ กับ AWQ และเพราะต้องส่งสถานะสมาร์ตโฮมทั้งหมดเข้าโมเดล จึงเลือก GPTQ
การผสานรวมกับ HomeAssistant
- ใช้แอดออน Whisper และ Piper มาตรฐานของ HomeAssistant OS แต่ดาวน์โหลดโมเดลเสียง GlaDOS แบบกำหนดเองจาก HuggingFace
- แม้ HomeAssistant จะมีการผสานรวม OpenAI อยู่แล้ว แต่ไม่สามารถควบคุมอุปกรณ์ได้ และไม่มีการตั้งค่า base_url ที่ใช้บังคับให้คุยกับเซิร์ฟเวอร์ OpenAI ปลอมแทนเซิร์ฟเวอร์ OpenAI จริง จึงไม่ได้ใช้ความสามารถส่วนขยายทั้งหมด
- เจอการผสานรวมแบบกำหนดเอง แต่ก็รู้อยู่แล้วว่าซอฟต์แวร์ไม่ได้ทำงานแบบนั้น และหลังติดตั้งก็เจอปัญหาเพิ่มอีกสองอย่าง
การแก้ปัญหา
- Mixtral ใช้ chat template ที่แปลก มันไม่ยอมรับ system prompt และจะโยนข้อยกเว้นถ้าพบ
- vLLM ไม่รองรับ API สำหรับ function calling ของ OpenAI และถึงจะรองรับ ก็ต้องรันโมเดลที่ออกแบบมาเฉพาะสำหรับ function calling อยู่ดี
- เพื่อแก้ Mixtral จึงแก้ไข chat template ให้ยอมรับ "system prompt" และใช้ Librechat เป็น UI เพื่อให้ system prompt ทำงานได้ถูกต้อง
เอาต์พุต JSON
- ถึงโมเดลจะเรียกฟังก์ชันไม่ได้ ก็ยังสามารถสั่งให้มันส่ง JSON ออกมาแล้วนำไปประมวลผลต่อได้
- ฟอร์กการผสานรวมแบบกำหนดเองเพื่อเพิ่มความสามารถในการเรียกใช้บริการของ HomeAssistant ผ่าน JSON
พรอมป์ต์ GlaDOS
- ปรับแต่งพรอมป์ต์ GlaDOS เพื่อนำมาใช้กับผู้ช่วยของตัวเอง
- แต่ก็เจอปัญหาที่มันชอบส่ง JSON มากเกินไป จนแม้แต่คำถามง่าย ๆ ก็ยังพยายามส่ง JSON เพื่อเรียกใช้บริการ
วิธีแก้
- ขอให้โมเดลแทรกข้อความที่กำหนดไว้เมื่อผู้ใช้ร้องขอให้ทำงานบางอย่าง โดยเลือกใช้ "$ActionRequired"
- จากนั้นกรองสิ่งนี้ในฟอร์กเพื่อแก้ปัญหา
พรอมป์ต์สุดท้าย
- อัปเดตพรอมป์ต์เริ่มต้นให้รองรับอุปกรณ์มากขึ้นและมีเอนทิตีที่ไม่จำเป็นน้อยลง
- กระตุ้นให้มันไม่ดำเนินการใด ๆ หากผู้ใช้ไม่ได้ร้องขอ
- หลังลองหลายรอบ ก็ได้ระบบที่ทำงานได้เกือบสมบูรณ์แบบ (แม้จะช้านิดหน่อยเพราะข้อจำกัดของ memory bus ใน 4060Ti)
ความเห็นของ GN⁺
- โปรเจ็กต์นี้อาจน่าสนใจมากสำหรับคนที่ให้ความสำคัญกับความเป็นส่วนตัวและประสบการณ์ที่ปรับแต่งได้ตามใจ
- การใช้ LLM ที่รันแบบโลคัลเพื่อควบคุมสมาร์ตโฮมให้ข้อดีอย่างมากทั้งด้านความปลอดภัยของข้อมูลและความเร็วในการตอบสนอง
- กระบวนการที่ผู้ใช้สร้างและปรับแต่งระบบด้วยตนเองเป็นตัวอย่างที่ดีของการส่งเสริมการเรียนรู้ด้านเทคนิคและวัฒนธรรม DIY
2 ความคิดเห็น
สรุปไว้ดีมาก เลยอ่านได้เพลินเลยครับ
เห็นว่า Home Assistant มีแผนจะเพิ่มฟีเจอร์ LLM ด้วย ดังนั้นต่อไปก็น่าจะใช้งานได้ง่ายขึ้นอีกครับ
แม้แต่ช่อง YouTube แนวแต่งบ้านที่ผมดูอยู่ก็เห็นว่ากำลังจะทำสินค้า IoT เหมือนกัน ถ้าตั้งแต่แรกมีการคิดเผื่อให้ที่แบบนั้นก็สามารถใช้สิ่งนี้ได้ด้วย ก็น่าจะยิ่งน่าสนใจขึ้นครับ
ความคิดเห็นบน Hacker News
ความเห็นจากผู้ก่อตั้ง Home Assistant:
ประสบการณ์จากผู้ใช้อีกคน:
ผู้ใช้ที่ทดสอบ local LLM:
ฟีดแบ็กจากผู้ใช้ Home Assistant:
คำถามเกี่ยวกับไมโครโฟนอาเรย์:
คำถามเกี่ยวกับฮาร์ดแวร์และการตั้งค่า:
ขอข้อมูลเพิ่มเติมเกี่ยวกับการเลือกไมโครโฟนและการทำ speech recognition:
ประสบการณ์จากผู้ใช้ที่ใช้ OpenAI API:
คำถามเกี่ยวกับการตั้งค่าเครือข่าย: