การออกแบบ 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

  1. Dependency injection ช่วยให้การประกอบส่วนประกอบต่างๆ (composability) ทำได้ง่ายและประหยัดทรัพยากร
  2. System prompt คือ API ของคุณ จงปฏิบัติกับมันเหมือนเป็นโค้ดระดับสำคัญ (first-class piece of code)
  3. หากคุณต้องใช้ lazy imports เพื่อแก้ปัญหา circular dependencies แสดงว่าการแบ่งขอบเขตของ module นั้นผิดพลาด ให้ไปแก้ไขที่สถาปัตยกรรมแทน

ความเรียบง่ายสามารถขยายตัวได้ (Simplicity scales) จงเลือกโซลูชันที่เรียบง่ายที่สุดที่ตอบโจทย์การใช้งานเฉพาะด้านของคุณ

Source: https://dev.to/debmalyasen34/designing-helium-agent-1b39

Optional learning community: https://t.me/GyaanSetuAi