- zerostack คือเอเจนต์เขียนโค้ดขนาดเล็กที่เขียนด้วย Rust และรองรับทั้งผู้ให้บริการ LLM หลายรายรวมถึงผู้ให้บริการแบบกำหนดเอง
- มีเครื่องมืออ่าน·เขียน·แก้ไขไฟล์, grep, ค้นหาไฟล์, แสดงรายการไดเรกทอรี, การรัน Bash ที่มีเกตการอนุญาต, MCP และเครื่องมือเว็บของ Exa
- มีขนาดประมาณ 7 พัน LoC, ไบนารี 8.9MB โดยใช้ RAM ราว 8MB ในเซสชันว่าง·ราว 12MB ระหว่างทำงาน และใช้ CPU 0.0% เมื่อว่าง
- ผู้ให้บริการเริ่มต้นคือ OpenRouter ติดตั้งด้วย
cargo install zerostackและหากต้องการใช้การแยก Bash ใน--sandboxต้องมี bubblewrap - มี พรอมป์ต์ในตัว เช่น
code·plan·review, โหมดสิทธิ์ 4 แบบ, การกลับมาใช้เซสชันต่อ, ลูปแบบวนซ้ำ และการรวม Git worktrees
ภาพรวมของ zerostack
- zerostack คือเอเจนต์เขียนโค้ดขนาดเล็กที่เขียนด้วย Rust และได้รับแรงบันดาลใจจาก pi และ opencode
- มีสถาปัตยกรรมแบบ หลายผู้ให้บริการ ที่รองรับ OpenRouter, OpenAI, Anthropic, Gemini, Ollama และผู้ให้บริการแบบกำหนดเอง
- มีเครื่องมือจัดการไฟล์ เช่น อ่าน·เขียน·แก้ไขไฟล์, grep, ค้นหาไฟล์, แสดงรายการไดเรกทอรี และ การรัน Bash ที่มีเกตการอนุญาต
- รวมการบันทึก·โหลด·ใช้งานเซสชันต่อ, การบีบอัดอัตโนมัติเพื่อรักษาหน้าต่างคอนเท็กซ์, เทอร์มินัล UI ที่อิง crossterm, การเชื่อมต่อเซิร์ฟเวอร์ MCP และเครื่องมือ WebFetch·WebSearch ที่อิง Exa
- สามารถย้ายข้าม Git worktree ได้ด้วย
/worktreeและยังมีลูปแบบวนซ้ำสำหรับงานระยะยาวรวมอยู่ด้วย
ประสิทธิภาพและการติดตั้ง
- zerostack มีขนาดประมาณ 7 พัน LoC และไบนารีมีขนาด 8.9MB
- การใช้ RAM อยู่ที่ประมาณ 8MB ในเซสชันว่าง และประมาณ 12MB ระหว่างทำงาน เมื่อเทียบกับราว 300MB ของ opencode หรือเอเจนต์เขียนโค้ดที่ใช้ JS อื่น ๆ
- การใช้ CPU วัดได้ที่ 0.0% เมื่อว่าง และราว 1.5% ระหว่างใช้เครื่องมือ โดยเมื่อเทียบกันบน Intel i5 เจเนอเรชัน 7 opencode ใช้ราว 2% เมื่อว่าง และราว 20% ระหว่างทำงาน
- การติดตั้งต้องใช้ Cargo และ git โดยใช้คำสั่งต่อไปนี้
cargo install zerostack - หากใช้
--sandboxและต้องการรันคำสั่ง Bash ทั้งหมดในสภาพแวดล้อมแยก ต้องติดตั้ง bubblewrap# Debian/Ubuntu apt install bubblewrap # Fedora dnf install bubblewrap # Arch pacman -S bubblewrap
เริ่มต้นอย่างรวดเร็ว
- ผู้ให้บริการเริ่มต้นคือ OpenRouter และตั้งค่า API key ผ่านตัวแปรสภาพแวดล้อม
export OPENROUTER_API_KEY="[api_key]" - เซสชันแบบโต้ตอบจะรันด้วยพรอมป์ต์เริ่มต้น
codezerostack - โหมดรันครั้งเดียวสามารถส่งพรอมป์ต์ด้วย
-pzerostack -p "Explain this project" - เซสชันล่าสุดสามารถทำต่อได้ด้วย
-czerostack -c - สามารถระบุผู้ให้บริการและโมเดลได้
zerostack --provider openrouter --model deepseek/deepseek-v4-flash
ระบบพรอมป์ต์
- zerostack มีชุด system prompt ในตัว สำหรับเปลี่ยนพฤติกรรมและโทนการตอบของเอเจนต์
- เป้าหมายคือการสร้างชุดพรอมป์ต์ที่สามารถใช้แทน superpower หรือ Claude official skills ได้
- สามารถใช้
/promptเพื่อแสดงรายการพรอมป์ต์ที่ลงทะเบียนไว้หรือสลับไปใช้พรอมป์ต์อื่น -
พรอมป์ต์ในตัว
codeเป็นค่าเริ่มต้น และเป็นโหมดเขียนโค้ดที่เข้าถึงไฟล์ทั้งหมด·เครื่องมือ Bash ได้ พร้อมใช้ เวิร์กโฟลว์ TDDplanเป็นโหมดสำหรับวางแผนโดยเฉพาะ สำรวจแล้วจัดทำแผนโดยไม่เขียนโค้ดreviewเป็นโหมดรีวิวโค้ดเพื่อตรวจสอบความถูกต้อง การออกแบบ การทดสอบ และผลกระทบdebugเป็นโหมดดีบักที่ค้นหา สาเหตุราก ก่อนเสนอวิธีแก้askเป็นโหมดอ่านอย่างเดียว อนุญาตเฉพาะ read·grep·glob และไม่อนุญาตการเขียนหรือ Bashbrainstormเป็นโหมดสำหรับออกแบบโดยเฉพาะ ใช้สำรวจไอเดียและเสนอการออกแบบโดยไม่เขียนโค้ดfrontend-designเป็นโหมดออกแบบฟรอนต์เอนด์สำหรับ UI ที่โดดเด่นและพร้อมใช้งานระดับโปรดักชันreview-securityเป็นโหมดรีวิวความปลอดภัยเพื่อค้นหาช่องโหว่ที่สามารถถูกนำไปใช้โจมตีได้simplifyเป็นโหมดทำโค้ดให้ง่ายขึ้นเพื่อเพิ่มความชัดเจนโดยไม่เปลี่ยนพฤติกรรมการทำงานwrite-promptเป็นโหมดเขียนพรอมป์ต์สำหรับสร้างและปรับแต่งพรอมป์ต์ของเอเจนต์- พรอมป์ต์แบบกำหนดเองสามารถสร้างได้โดยวางไฟล์ Markdown ไว้ที่
$XDG_CONFIG_HOME/zerostack/prompts/แล้วอ้างอิงด้วยชื่อ - ระบบจะอ่าน
AGENTS.mdหรือCLAUDE.mdที่รูทโปรเจกต์หรือไดเรกทอรีแม่โดยอัตโนมัติและแทรกเข้าไปใน system prompt โดยสามารถปิดได้ด้วย-nหรือ--no-context-files
ระบบสิทธิ์
- zerostack มี โหมดสิทธิ์ 4 แบบ ตั้งแต่แบบปลอดภัยที่สุดไปจนถึงแบบเปิดกว้างที่สุด
-
โหมดสิทธิ์
restrictiveหรือ-Rจะขออนุมัติสำหรับทุกการกระทำของเครื่องมือที่ไม่ได้รับอนุญาตไว้อย่างชัดเจนในคอนฟิกstandardเป็นค่าเริ่มต้น โดยจะอนุมัติคำสั่งที่ปลอดภัยอย่างls,cd,git log,cargo checkอัตโนมัติ และจะขอการยืนยันสำหรับการเขียนหรือการกระทำที่ทำลายได้accept-allหรือ--accept-allจะอนุมัติทุกการกระทำภายในไดเรกทอรีงานโดยอัตโนมัติ และขอการยืนยันเมื่อเป็นพาธภายนอกyoloหรือ--yoloจะอนุมัติทุกการกระทำอัตโนมัติโดยไม่ถาม- สามารถกำหนดสิทธิ์อย่างละเอียดได้ด้วย glob pattern รายเครื่องมือในไฟล์คอนฟิก
- ตัวอย่างเช่น สามารถตั้งให้
write **.rsอนุญาตอัตโนมัติ แต่การเขียนไฟล์อื่นต้องยืนยันเสมอ - รายการอนุญาตของเซสชัน จะเก็บการตัดสินใจที่อนุมัติไว้ตลอดเซสชันเพื่อไม่ต้องยืนยันการกระทำเดิมซ้ำ
- หากมีการเรียกใช้เครื่องมือแบบเดียวกันซ้ำ 3 ครั้งขึ้นไป ระบบตรวจจับ doom-loop จะขึ้นพรอมป์ต์เตือนหรือปฏิเสธตามการตั้งค่า เพื่อป้องกันไม่ให้เอเจนต์ทำงานที่ทำลายได้ซ้ำ ๆ
คำสั่งสแลชและการจัดการเซสชัน
- คำสั่งสแลช หลักใช้ควบคุมโมเดล ระดับการคิด บทสนทนา เซสชัน ลูป พรอมป์ต์ และโหมดสิทธิ์
/modelใช้สลับโมเดล และ/thinkingใช้ตั้งระดับการคิด/clearใช้ล้างบทสนทนา และ/sessionใช้แสดงรายการ·บันทึก·โหลดเซสชัน/loopใช้ตั้งพรอมป์ต์แบบวนซ้ำ และ/promptใช้แสดงรายการหรือเปลี่ยนพรอมป์ต์ของเอเจนต์/modeใช้ตั้งโหมดของระบบสิทธิ์ และดูคำสั่งทั้งหมดได้ด้วย/help- เซสชันจะถูกบันทึกไว้ที่
$XDG_DATA_HOME/zerostack/sessions/ -cใช้กลับมาใช้งานเซสชันล่าสุดต่อ,-rใช้เลือกจากการเรียกดูเซสชัน และ--session <id>ใช้โหลดเซสชันที่ระบุ
ลูปแบบวนซ้ำ
- zerostack มี ลูปการเขียนโค้ดแบบวนซ้ำ สำหรับงานระยะยาว
- เอเจนต์จะอ่านงานซ้ำ ๆ เลือกรายการจากแผน ดำเนินงาน รันทดสอบ อัปเดตแผน และวนต่อไปจนกว่างานจะเสร็จหรือถึงขีดจำกัดจำนวนรอบ
- ระบบลูปเป็น ฟีเจอร์ทดลอง
-
วิธีใช้ลูป
/loop Implement the user authentication systemจะเริ่มลูปด้วยพรอมป์ต์ที่กำหนด/loop stopจะหยุดลูปที่กำลังทำงาน/loop statusจะแสดงสถานะของลูปปัจจุบัน- ในแต่ละรอบจะมีงานต้นฉบับ,
LOOP_PLAN.mdที่เปลี่ยนแปลงไป, สรุปรอบก่อนหน้า และผลลัพธ์การตรวจสอบรวมอยู่ด้วย - ระหว่างที่ลูปทำงานอยู่ อินพุตที่ไม่ใช่คำสั่งสแลชจะถูกบล็อก
-
ลูปแบบเฮดเลสผ่าน CLI
- สามารถรันลูปแบบเฮดเลสได้ด้วยคำสั่งต่อไปนี้
zerostack --loop --loop-prompt "Refactor the API" --loop-max 10 --loop-run "cargo test" --loopเปิดโหมดลูปแบบเฮดเลส--loop-prompt <text>ระบุพรอมป์ต์ที่จะใช้ในแต่ละรอบ--loop-plan <path>ระบุพาธของไฟล์แผนแบบกำหนดเอง โดยค่าเริ่มต้นคือLOOP_PLAN.md--loop-max <N>ระบุจำนวนรอบสูงสุด โดยค่าเริ่มต้นคือไม่จำกัด--loop-run <cmd>ระบุคำสั่งตรวจสอบที่จะรันหลังแต่ละรอบ
- สามารถรันลูปแบบเฮดเลสได้ด้วยคำสั่งต่อไปนี้
การรวม Git worktrees
- zerostack รองรับเวิร์กโฟลว์ การทำงานแยกตามสาขา ผ่าน git worktrees
- สามารถสร้าง worktree ทำงานภายในนั้น รวมกลับ และออกจาก worktree ได้จากในแชต UI
- การรวม Git worktrees เป็น ฟีเจอร์ทดลอง
-
คำสั่ง worktree
/worktree <name>จะสร้าง git worktree บนสาขา<name>แล้วย้ายไปที่นั่น และหากมีอยู่แล้วจะข้ามการสร้าง/wt-merge [branch]จะรวมสาขา worktree เข้ากับ[branch], push, เก็บกวาด แล้วกลับสู่รีโพซิทอรีหลัก/wt-exitจะกลับสู่รีโพซิทอรีหลักโดยไม่รวมสาขา
-
ตัวอย่างเวิร์กโฟลว์
/worktree feature-xจะสร้างสาขาใหม่และไดเรกทอรี worktree แล้วเข้าไปทำงานที่นั่น- หลังจากนั้นสามารถใช้ zerostack ตามปกติ และการเปลี่ยนแปลงจะคงอยู่ในสาขา feature
/wt-mergeจะให้เอเจนต์รวมสาขา push เก็บกวาด แล้วกลับสู่รีโพซิทอรีหลัก/wt-exitจะกลับสู่รีโพซิทอรีหลักทันทีโดยไม่รวมสาขา
ผู้ให้บริการที่รองรับและไลเซนส์
- ผู้ให้บริการเริ่มต้นคือ OpenRouter
- รองรับ vLLM, LiteLLM และอื่น ๆ ในฐานะผู้ให้บริการที่เข้ากันได้กับ OpenAI
- รองรับ Anthropic, Gemini, Ollama
- ผู้ให้บริการแบบกำหนดเองสามารถตั้งค่า base URL ใดก็ได้และตัวแปรสภาพแวดล้อมสำหรับ API key ที่
$XDG_CONFIG_HOME/zerostack/config.json - ไลเซนส์คือ GPL-3.0-only
1 ความคิดเห็น
ความเห็นจาก Hacker News
ผมไม่ค่อยรู้จักเครื่องมือแนวนี้ เลยอยากรู้ว่ามันมีข้อดีอะไรเมื่อเทียบกับโมเดล/เครื่องมืออย่าง Claude Code
ผมก็กำลังทำอะไรคล้าย ๆ กันเองตอนเวลาว่าง ตั้งใจจะทำเพื่อเข้าใจเอเจนต์ให้ลึกขึ้นและเรียน Rust ไปด้วย
แต่ก็อยากคงความ ปรับแต่งได้ แบบของ
piเอาไว้ เพราะความสามารถในการดัดแปลงตัวเองและสร้างเครื่องมือใหม่มีประโยชน์มาก และผมคิดว่าเครื่องมือแบบนี้ไม่ควรมีสิทธิ์รันโค้ดอะไรก็ได้ผ่านbashแน่นอนว่าถ้าเข้าถึง
editกับcargo runได้ ก็ยังรันโค้ดตามใจได้อยู่ดี แต่ถ้ามีงานที่เอเจนต์แบบไม่มีbashต้องทำ ผมจะให้มันสร้างเครื่องมือขึ้นมาเฉพาะกิจแทนเลยเลือกเปิดให้ปรับแต่งด้วยวิธีอื่นแทน ไลบรารีพรอมป์ต์ใน
~/.config/hypernova/prompts/เป็นทางเลือกง่าย ๆ ของ Skills และพรอมป์ต์ที่มีมาในตัวก็ควรใช้แทน superpowers กับ frontend-design ของ Claude ได้ฟีเจอร์ที่อาจทำให้เอเจนต์หนักสามารถปิดได้ตอนคอมไพล์ด้วย feature flags และโค้ดก็สั้น อ่านง่าย ถ้าจำเป็นก็เอา zerostack ไปรันกับซอร์สของ zerostack เองเพื่อทำ custom fork ได้
ส่วนโมเดลสิทธิ์ หลังจากคิดมาเยอะอย่างที่เห็นใน README ก็ทำไว้ 4 ระดับ ตั้งแต่ “Restrictive” ที่ไม่มีคำสั่งเลย ไปจนถึง “YOLO” ที่ปล่อยให้เอเจนต์ทำอะไรก็ได้ตามต้องการ และยังตั้ง regex อนุญาต/ถาม/ปฏิเสธสำหรับการเรียก
bashได้ด้วย ในกรณีนี้แค่รันzerostack -Rก็สามารถบังคับให้ทุกเครื่องมือถามสิทธิ์ก่อนทำงานได้ฟีเจอร์เอเจนต์แบบเขียนโปรแกรมได้ก็กำลังทำอยู่ แต่ยังไม่ถึงขั้นจะประกาศ
ช่วงนี้ผมเพิ่งทำตัวหนึ่งเล่น ๆ แต่ก็เอาจริงอยู่เหมือนกัน ขนาดไม่ถึง 200 บรรทัด: https://github.com/pnegahdar/nano
มีทั้ง REPL, session, การรันแบบไม่โต้ตอบ, การอนุมัติ ฯลฯ ผมมองว่ายิ่งโมเดลฉลาดขึ้น ความสำคัญของ ฮาร์เนส ก็จะยิ่งลดลง ยกเว้นเรื่องประสบการณ์นักพัฒนา
สักวันอาจจะลองไปรันกับ SWE-bench ดู
ผมเองก็เพิ่งทำตัวหนึ่งเมื่อสัปดาห์ก่อนเพื่อความสนุกและเรียนรู้ และมันทำงานรวมกับ
mcpServersที่ตั้งค่าไว้ได้เหมือนโค้ดดิ้งเอเจนต์ส่วนใหญ่ผมสรุปไว้ด้วยว่าในแต่ละขั้นตอน อะไรจำเป็นและจำเป็นเพราะอะไร: https://nb1t.sh/building-a-real-agent-step-by-step/
“RAM footprint: ~8MB on an empty session, ~12MB when working”
ตรงนี้ดีมาก Claude Code ใช้ทีเป็นหลาย GB บนโน้ตบุ๊กสเปกต่ำแล้วน่าหงุดหงิดพอสมควร
เวลาเริ่มต้นต่ำกว่า 0.5 วินาที และใช้ RAM ต่ำมาก รันบนโน้ตบุ๊กอายุ 12 ปีก็ยังไม่หน่วง
โดยแก่นแล้วมันแทบจะเป็นเครื่องต่อสตริง ซึ่งไม่ควรมีเหตุผลอะไรเลยที่จะช้าบนอุปกรณ์ไหนก็ตาม รวมถึงฮาร์ดแวร์เก่าด้วย
1: https://zed.dev/acp
กลับบ้านแล้วผมจะลองใช้ดู เครื่องมือที่เบาและเร็วทำให้ประสบการณ์การเขียนโค้ดต่างกันมาก
แต่อยากรู้เหมือนกันว่าแนวทางแบบพรอมป์ต์นี้เทียบกับการผสม สกิลและซับเอเจนต์ แบบทั่วไปแล้วเป็นยังไง ผมมักใช้แบบมี build fail ก็รันสกิล
/fix-ciแล้วให้ซับเอเจนต์ดึงข้อความ error, stack trace, log ที่เกี่ยวข้องออกมาแก้ปัญหาถ้าเป็นปัญหา query ของ DB ใน integration test บางทีก็ให้เอเจนต์เรียกสกิลเข้าถึง DB แบบอ่านอย่างเดียวมาตรวจเอง หรือผมช่วยชี้นำหน่อยก็ได้ ถ้าต้องขุดลึกนาน ๆ ผมก็จะพูดประมาณว่า “ใช้ Sonnet sub-agent แล้วสั่งให้ดีบักพฤติกรรมนี้ด้วยสกิล query DB”
สกิลให้ความสามารถเพิ่มแบบเฉพาะหน้า ส่วนซับเอเจนต์ก็ช่วยแยกบริบทไม่ให้พองเกินไป ถ้าเอเจนต์เรียกตัวเองผ่าน
bashพร้อมพรอมป์ต์อื่นก็คงทำอะไรคล้ายกันได้ แต่ดูจะไม่ลื่นเท่า เดี๋ยวคงต้องลองเองตัวอย่างเช่น
/prompt debugซึ่งเป็นหนึ่งใน integrated prompts จะเปิดเอเจนต์ที่เน้นดีบัก แล้วคุณก็คุยต่อแบบเอเจนต์ทั่วไปได้ และค่อยกลับไปเป็นเอเจนต์เขียนโค้ดมาตรฐานด้วย/prompt codeตอนนี้ยังไม่รองรับซับเอเจนต์เพราะทั้งระบบยังรันอยู่ใน context buffer เดียวกัน เพื่อให้มันเบาไว้ก่อน แต่เพราะงานแบบสำรวจค้นหามักทำให้หน้าต่างบริบทพองเร็ว ก็มีโอกาสสูงว่าจะเพิ่มซับเอเจนต์ในอนาคต
ผมก็ให้ Claude Code ทำอะไรแบบนี้ตัวหนึ่งเหมือนกัน และตอนแก้ไขก็ใส่ line hashing ของ Dirac เข้าไปด้วย
ใช้ Rust และเคยคิดจะทำ hooks เป็นปลั๊กอินเพื่อให้มันแก้ตัวเองได้ แต่สุดท้ายก็ลงเอยด้วยการให้มันสร้างไฟล์แยกไว้เก็บรายละเอียดการปรับปรุง จากนั้นอัปเดตซอร์สโค้ดแล้วคอมไพล์ใหม่
ตำแหน่งซอร์สโค้ดถูกตรึงไว้ ทำให้เอเจนต์เขียนทับตัวเองแล้ว build ใหม่ได้ ผมใช้งานมันโดยรัน DeepSeek 4 Flash บน 2x RTX 6000 Pro ได้ประมาณ 138 tok/s
พูดตรง ๆ คือก็ลอก Pi, Dirac, OpenCode มานั่นแหละ มีเทคนิคใหม่อะไรในนี้ที่น่าหยิบไปใช้บ้างไหม?
ผมลองใช้แป๊บหนึ่งแล้ว มันเร็วจริงทีเดียว
อยากรู้ว่ากำลังมองหาผู้ร่วมพัฒนาอยู่ไหม หรือทำเป็นเครื่องมือส่วนตัวอยู่
แต่ผมไปเจอปัญหาบางอย่างตอนพยายามใช้โมเดลอื่น Azure gpt-5.5 ใช้งานไม่ได้แม้จะใช้ endpoint ที่เข้ากันกับ OpenAI เพราะ
max_tokensถูกเปลี่ยนเป็นmax_completion_tokensและก็ดูเหมือนไม่มีวิธีส่ง custom headers เลย เลยตั้งค่า
reasoning_effortให้โมเดล DeepSeek ไม่ได้ที่คุณบอกมาคือบั๊กชัดเจนในโค้ดเบส ถ้าเป็นไปได้ช่วยเปิด GitHub issue แยกตามแต่ละบั๊กจะดีมาก
Claude Code กับ Opencode ใช้งานได้ดีในสภาพแวดล้อมของผม
มันก็ตลกนิด ๆ ที่โค้ดดิ้งเอเจนต์รันอยู่ในดาต้าเซ็นเตอร์ที่ใช้ไฟเกิน 1000W และหน่วยความจำเกิน 2TB แต่คนกลับไปโฟกัสกับไม่กี่วัตต์สุดท้ายและ RAM ไม่กี่ร้อย MB บนโน้ตบุ๊กของตัวเอง
ถึงยังไงมันก็คงเล็กน้อยเมื่อเทียบกับพลังงานที่ใช้ตอนคอมไพล์โค้ด แต่ก็ไม่ได้แปลว่าทำให้มันเร็วขึ้นและเบาขึ้นจะเป็นเรื่องไม่ดี
ตอนนี้เวลาใช้โค้ดดิ้งเอเจนต์ แบตก็หมดค่อนข้างไว ซึ่งก็แปลกดีเพราะงานส่วนใหญ่ไม่ได้เกิดบนโน้ตบุ๊กผมด้วยซ้ำ
การทำให้โค้ดดิ้งเอเจนต์ฝั่งไคลเอนต์มีประสิทธิภาพขึ้น ไม่ได้ทำเพื่อกอบกู้โลก แต่เพื่อให้ทำงานได้นานขึ้น จริง ๆ แล้วมันอาจแย่ต่อสภาพอากาศยิ่งกว่าเดิมด้วยซ้ำ
ซอฟต์แวร์ที่รันบนคอมพิวเตอร์ของคนอื่นไม่ใช่ปัญหาของผม ผมควบคุมไม่ได้ว่าอะไรไปรันอยู่บนเซิร์ฟเวอร์คนอื่น และถึงควบคุมได้ ผมก็ไม่ได้เป็นคนจ่ายค่า RAM พวกนั้นเลยไม่สนใจ
แต่ RAM บนอุปกรณ์ของผมนี่ผมจ่ายเอง ถ้า TUI ที่แสดงข้อความไม่ถึง 1KB ดันกินหน่วยความจำเป็นหลาย GB จนบน Windows ทำให้แอปอื่นตายเพราะ OOM หรือบน Linux ต้องสว็อปลง HDD จนทั้งเครื่องค้าง ก็เลี่ยงไม่ได้ที่จะต้องสนใจ
ในสถานการณ์ที่ราคา RAM ขึ้นจริง 5 เท่า และชิ้นส่วนอื่นก็ขึ้น 2–3 เท่าแบบนี้ การหลีกเลี่ยง การเปลืองหน่วยความจำ จึงสำคัญเป็นพิเศษ
ใช่ โมเดลมีขนาดใหญ่และกินทรัพยากรสูง แต่ ฮาร์เนส ก็ส่งผลมากต่อการใช้โมเดลด้วย
เช่น ถ้าฮาร์เนสมีชุดเครื่องมือที่ทรงพลัง โมเดลก็อาจทำงานได้มีประสิทธิภาพขึ้นมาก
โค้ดเบสเล็กพอที่ผมจะโยนเข้า DeepSeek v4 Flash ใน Pi ให้ช่วยไล่ดูว่ามีจุดเสี่ยงอันตรายไหม แล้วมันก็ไม่เจออะไรน่ากังวลนัก งานดีเลย
สำหรับโปรเจ็กต์ Rust ถ้าไม่สั่งโมเดลชัด ๆ ว่าอย่าแก้
Cargo.tomlตรง ๆ แต่ให้ใช้cargo addแทน แม้แต่ Claude 4.7 Opus ก็แทบจะใส่ dependency เวอร์ชันเก่าให้เกือบทุกครั้งตามประสบการณ์ผมผมลองเช็ก dependency ของโปรเจ็กต์นี้ด้วยมือแล้ว พบว่าทุกตัวเป็นเวอร์ชันล่าสุด ซึ่งดีมาก แน่นอนว่านั่นไม่ได้แปลว่าไม่มีปัญหาซ่อนอยู่ใน transitive dependencies
ปัญหาของการให้ LLM รีวิวโค้ดคือเดี๋ยวมันก็กลายเป็นเรื่องรสนิยมได้ง่าย อย่างเช่นตอนผมไล่ดูโค้ดด้วยตา มีเมธอดบางตัวที่แปลงไปมาระหว่างสตริงกับ enum แล้วผมก็คิดว่า “อันนี้ใช้
strumแล้วใส่#[derive]ตัวเดียวไม่พอเหรอ” เพราะน่าจะทำให้provider.rsกระชับขึ้นมาก แทนที่จะเพิ่มเพียงแค่ crate ที่ไม่มี dependencyผมลองให้ DeepSeek V4 Pro แบบ Max thinking “ตรวจสอบ” โค้ดเบสเล่น ๆ มันบอกว่าไม่พบร่องรอยชัดเจนของ telemetry แบบซ่อนเร้น แต่ก็ชี้ว่าตัวโปรเจ็กต์ตั้ง panic handler เป็น
abortซึ่งผมมีความเห็นแรงกับเรื่องนี้น่าจะทำเพื่อเลี่ยงการลิงก์
libunwindเพื่อลดขนาดไบนารีลงไม่กี่ KB แต่ผลคือถ้าล่มก็จะหยุดทันทีและไม่ให้ stack trace กับผู้ใช้ ผมคิดว่ายอมให้ไบนารีใหญ่ขึ้นราว 50KiB เพื่อแลกกับข้อมูลดีบักตอน panic จะดีกว่าอีกอย่าง ถ้ามี panic ใน async task ก็จะกู้กลับมาแสดง error message ปกติไม่ได้ เพราะทั้งโปรเซสจะหยุดทันที
เพราะ DeepSeek พลาดซ้ำ ๆ กับลอจิกการเลื่อนเคอร์เซอร์บางแบบ เรื่องการปรับหน่วยความจำให้เหมาะสมผมจัดการเองทั้งหมด และอย่างที่เขียนไว้ในคอมเมนต์อื่น ผมผสมทั้งการทำ compiler optimization และการใช้ Rust crates เพื่อใช้โครงสร้างข้อมูลที่มีประสิทธิภาพกว่า
ตลกดีที่มันออกมาวันนี้พอดี เพราะผมเองก็กำลังจะเริ่มเขียนตัวหนึ่งด้วย Rust เหมือนกัน
เวลาเห็น opencode ค่อย ๆ รั่วหน่วยความจำในโปรเจ็กต์ใหญ่จนขึ้นไป 6GB แล้วช้าลงเรื่อย ๆ มันน่าตกใจมาก
เดี๋ยวจะลองดูนะ ดูเจ๋งดี