การออกแบบ Helium Agent
Helium Agent เป็น AI agent น้ำหนักเบาที่สร้างด้วย Python ทำงานผ่าน terminal ของคุณ โดยถูกออกแบบมาให้มีความซับซ้อนน้อยที่สุด
นี่คือการตัดสินใจหลักในการออกแบบจากการสร้าง:
• Architecture
ระบบใช้สถาปัตยกรรมแบบแบน (flat architecture) ผมหลีกเลี่ยงการใช้ framework ที่หนักเกินไปและโครงสร้างความสัมพันธ์ (dependency trees) ที่ซับซ้อน ผมใช้ XML tags เช่น <action> แทนการใช้ OpenAI function calling ซึ่งช่วยให้ agent ไม่ยึดติดกับโมเดลใดโมเดลหนึ่ง (model agnostic) คุณจึงสามารถใช้ LLM ใดก็ได้
• Composability through Dependency Injection ผมใช้ loop ง่ายๆ ที่เรียกว่า AgenticLoop ซึ่งรับ input สองอย่างคือ: ตัวเรียกโมเดล (model caller) และตัวรันเครื่องมือ (tool executor) ทางเลือกนี้ช่วยให้รองรับโหมดการทำงานที่แตกต่างกันได้ถึง 4 รูปแบบ:
- การแชททั่วไป (General chat)
- เวิร์กโฟลว์การเขียนโค้ด (Coding workflows)
- Subagents
- ทักษะที่กำหนดเอง (Custom skills) ผมไม่ได้ใช้ subclasses หรือรูปแบบที่ซับซ้อน เพียงแค่ใช้ฟังก์ชันง่ายๆ สองฟังก์ชันเท่านั้น
• State Management Helium เป็นเครื่องมือสำหรับผู้ใช้คนเดียว ผมใช้ module-level singletons สำหรับประวัติการสนทนาและความจำ Global state เป็นวิธีที่ง่ายที่สุดในการแสดงสถานะเซสชันของผู้ใช้เพียงคนเดียว และช่วยป้องกันการออกแบบที่ซับซ้อนเกินความจำเป็น (over-engineering)
• Safety Gates ผมใช้ระบบสามระดับสำหรับการรันเครื่องมือ:
- Safe: รันงานโดยอัตโนมัติ เช่น การอ่านไฟล์หรือการค้นหา
- Risky: ต้องได้รับอนุญาตจากผู้ใช้สำหรับงานอย่างเช่นการเขียนไฟล์
- Conditional: ตรวจสอบคำสั่ง เช่น bash scripts เพื่อเช็กความเสี่ยง สิ่งนี้ช่วยป้องกันไม่ให้โมเดลที่เกิดอาการหลอน (hallucinating) เข้าไปลบไฟล์ของคุณ
• Communication ผมใช้ raw HTTP requests แทนการใช้ OpenAI SDK ซึ่งช่วยลด dependencies และทำให้โค้ดมีความโปร่งใส คุณจะเห็นสิ่งที่ส่งไปยัง API อย่างชัดเจน
• Skill System Skills เป็นเพียงไฟล์ Markdown คุณสามารถเพิ่มทักษะใหม่ได้โดยการเขียนไฟล์ข้อความที่มี YAML frontmatter ไม่มีการใช้ registration API ที่ซับซ้อน ทำให้ระบบปลั๊กอินใช้งานง่ายสำหรับทุกคน
• Lessons Learned
- Dependency injection ช่วยให้การประกอบส่วนประกอบต่างๆ (composability) ทำได้ง่ายและประหยัดทรัพยากร
- System prompt คือ API ของคุณ จงปฏิบัติกับมันเหมือนเป็นโค้ดระดับสำคัญ (first-class piece of code)
- หากคุณต้องใช้ lazy imports เพื่อแก้ปัญหา circular dependencies แสดงว่าการแบ่งขอบเขตของ module นั้นผิดพลาด ให้ไปแก้ไขที่สถาปัตยกรรมแทน
ความเรียบง่ายสามารถขยายตัวได้ (Simplicity scales) จงเลือกโซลูชันที่เรียบง่ายที่สุดที่ตอบโจทย์การใช้งานเฉพาะด้านของคุณ
Source: https://dev.to/debmalyasen34/designing-helium-agent-1b39
Optional learning community: https://t.me/GyaanSetuAi
