Symphony คือข้อกำหนดแบบโอเพนซอร์สสำหรับการจัดระเบียบการทำงานของ Codex
โดย Alex Kotliarskyi, Victor Zhu และ Zach Brock
เมื่อ 6 เดือนก่อนในระหว่างที่พัฒนาเครื่องมือเพิ่มประสิทธิภาพภายในองค์กร ทีมของเราตัดสินใจครั้งสำคัญที่ถูกวิพากษ์วิจารณ์อย่างมากในตอนนั้น นั่นคือสร้าง Repository ที่ปราศจากโค้ดที่เขียนโดยมนุษย์ และตกลงกันว่า Codex จะต้องเป็นผู้สร้างโค้ดทุกบรรทัดในโปรเจกต์นี้ทั้งหมด
เพื่อให้แผนงานดังกล่าวสำเร็จ เราได้ออกแบบกระบวนการวิศวกรรมใหม่ทั้งหมดตั้งแต่ต้น โดยเราสร้าง Repository ที่เอื้อต่อการทำงานของเอเจนต์ ทุ่มเทอย่างมากกับระบบทดสอบอัตโนมัติและมาตรการป้องกันความปลอดภัย รวมถึงปฏิบัติกับ Codex ในฐานะเพื่อนร่วมทีมอย่างเต็มตัว เราได้บันทึกการเดินทางครั้งนี้ไว้ในบล็อกโพสต์เกี่ยวกับเรื่องวิศวกรรมโครงสร้างควบคุม
แม้ว่าวิธีการนี้จะใช้งานได้จริง แต่แล้วเราก็ต้องเผชิญกับอุปสรรคถัดไป นั่นคือการสลับบริบทการทำงานไปมา
เพื่อแก้ปัญหาใหม่นี้ เราจึงสร้างระบบที่ชื่อว่า Symphony ขึ้นมา โดย Symphony(เปิดในหน้าต่างใหม่) คือเครื่องมือจัดระเบียบเอเจนต์ที่เปลี่ยนบอร์ดบริหารจัดการโปรเจกต์อย่าง Linear ให้กลายเป็นแผงควบคุมสำหรับเอเจนต์เขียนโค้ด ซึ่งทุกงานที่เปิดค้างไว้จะมีเอเจนต์คอยดูแล และเหล่าเอเจนต์จะทำงานอย่างต่อเนื่องเพื่อให้มนุษย์คอยตรวจสอบผลลัพธ์ในขั้นตอนสุดท้าย
เนื้อหาในโพสต์นี้จะบอกเล่าเรื่องราวการพัฒนา Symphony ที่ส่งผลให้จำนวน Pull Request ของบางทีมเพิ่มสูงขึ้นถึง 500% และแนะนำวิธีการเปลี่ยนระบบติดตามงานของคุณให้ทำหน้าที่เป็นผู้สั่งการเอเจนต์ที่พร้อมทำงานอยู่เสมอ
เพดานของเอเจนต์เขียนโค้ดแบบโต้ตอบ
แม้ว่าเอเจนต์เขียนโค้ดจะใช้งานง่ายขึ้นเรื่อยๆ ไม่ว่าจะเข้าถึงผ่านเว็บแอปหรือ CLI แต่พวกมันก็ยังคงเป็นเครื่องมือที่เน้นการโต้ตอบเป็นหลัก
ในขณะที่การทำงานด้วยเอเจนต์ขยายตัวขึ้นภายใน OpenAI เรากลับเจออุปสรรคใหม่ที่คาดไม่ถึง นั่นคือวิศวกรต้องคอยเปิดเซสชัน Codex เพื่อสั่งงาน ตรวจงาน และคุมทิศทางของเอเจนต์สลับกันไปมา ซึ่งโดยปกติแล้วแต่ละคนจะคุมงานได้ประมาณ 3 ถึง 5 หน้าต่างพร้อมกัน แต่ถ้าเกินกว่านี้จะเริ่มเกิดปัญหาในการสลับสมองเพื่อรับข้อมูลที่ต่างกัน จนส่งผลให้งานล่าช้าลง เรามักจะสับสนว่าแต่ละงานไปถึงไหนแล้ว ต้องคอยกระโดดไปมาระหว่างหน้าจอเพื่อแก้ปัญหาเอเจนต์ที่ออกนอกลู่นอกทาง หรือต้องคอยซ่อมงานที่ค้างอยู่ครึ่งๆ กลางๆ
เราพบว่าความเร็วของเอเจนต์ไม่ใช่ปัญหา แต่ปัญหาคือความสามารถของมนุษย์ในการควบคุมงานที่จำกัดเกินไป จริงๆ แล้วเราสร้างทีมวิศวกรจูเนียร์ที่เก่งมากๆ ขึ้นมาได้แล้ว แต่เราดันเอาวิศวกรหลักไปคอยกำกับดูแลทุกฝีก้าว ซึ่งวิธีการทำงานแบบนี้ไม่สามารถนำไปปรับใช้กับโครงการขนาดใหญ่ได้
การเปลี่ยนมุมมอง
เราตระหนักได้ว่าเรากำลังปรับปรุงระบบผิดจุด เพราะเรามัวแต่ให้ความสำคัญกับเซสชันการเขียนโค้ดและการรวบรวมโค้ด (PR) ทั้งที่ความจริงแล้วสิ่งเหล่านั้นเป็นเพียงวิธีการเพื่อให้บรรลุเป้าหมายเท่านั้น โดยปกติแล้วกระบวนการทำงานของซอฟต์แวร์ส่วนใหญ่จะยึดโยงอยู่กับผลงานที่ต้องส่งมอบ ไม่ว่าจะเป็นประเด็นปัญหา ภารกิจ ตั๋วงาน หรือหมุดหมายสำคัญของโปรเจกต์
ดังนั้นเราจึงเริ่มตั้งข้อสงสัยว่า ผลลัพธ์จะเป็นอย่างไรถ้าเราเปลี่ยนจากการกำกับดูแลเอเจนต์แบบใกล้ชิด มาเป็นการให้เอเจนต์ดึงงานที่ค้างอยู่ในระบบติดตามงานมาจัดการด้วยตัวเอง
ไอเดียดังกล่าวพัฒนาจนกลายเป็น Symphony ซึ่งเป็นสเปกที่ทำหน้าที่เหมือนหัวหน้างานในการบริหารจัดการกระบวนการทำงานของเอเจนต์
เปลี่ยนเครื่องมือติดตามงานให้เป็นระบบควบคุมการทำงานของเอเจนต์
Symphony เริ่มต้นจากแนวคิดง่ายๆ ที่ว่า งานทุกชิ้นที่ยังค้างอยู่ควรได้รับการจัดการและทำให้เสร็จสิ้นโดยเอเจนต์ แทนที่เราจะคอยบริหารจัดการเซสชันของ Codex ในหลายหน้าต่าง เราได้เปลี่ยนระบบติดตามปัญหาให้กลายเป็นแผงควบคุมหลักแทน
ในการตั้งค่ารูปแบบนี้ งานแต่ละรายการที่เปิดอยู่ใน Linear จะเชื่อมโยงกับเวิร์กสเปซของเอเจนต์โดยเฉพาะ โดย Symphony จะคอยเฝ้าดูบอร์ดงานอย่างต่อเนื่องและรับประกันว่าทุกงานที่กำลังดำเนินการจะมีเอเจนต์ทำงานอยู่อย่างสม่ำเสมอจนกว่าจะเสร็จสิ้น หากเอเจนต์หยุดทำงานหรือค้างไป Symphony จะสั่งเริ่มทำงานใหม่ทันที และเมื่อมีงานใหม่ปรากฏขึ้น Symphony จะเข้าไปรับงานและเริ่มจัดระเบียบการทำงานโดยอัตโนมัติ
เราสร้างเวิร์กโฟลว์ตามสถานะของตั๋วงาน โดยใช้ระบบจัดการงานอย่าง Linear ทำหน้าที่ควบคุมลำดับขั้นตอน
ในทางปฏิบัติ Symphony แยกส่วนงานออกจากเซสชันและ Pull Request อย่างชัดเจน โดยปัญหาบางอย่างอาจสร้าง PR ได้หลายรายการในคลังรหัสที่ต่างกัน ในขณะที่งานบางอย่างเป็นเพียงการสืบสวนหรือการวิเคราะห์เท่านั้นซึ่งไม่ได้แตะต้องฐานโค้ดเลย
เมื่อเราแยกส่วนงานด้วยวิธีนี้แล้ว ตั๋วงานแต่ละใบก็จะสามารถเป็นตัวแทนของหน่วยงานที่มีขนาดใหญ่ขึ้นมากได้
เราใช้งาน Symphony เป็นประจำเพื่อจัดระเบียบฟีเจอร์ที่ซับซ้อนและการย้ายโครงสร้างพื้นฐาน ตัวอย่างเช่น เราอาจสร้างงานเพื่อให้เอเจนต์วิเคราะห์ฐานโค้ด Slack หรือ Notion และจัดทำแผนการดำเนินงาน เมื่อเราพอใจกับแผนดังกล่าวแล้วเอเจนต์จะสร้างแผนผังงานที่แตกย่อยงานออกเป็นระยะต่างๆ พร้อมระบุความเชื่อมโยงระหว่างงานแต่ละงาน
เพื่อให้การประมวลผลแบบขนานตามลำดับขั้นตอนของ DAG เป็นไปอย่างราบรื่น เอเจนต์จะเลือกทำเฉพาะงานที่พร้อมดำเนินการเท่านั้น ตัวอย่างที่เห็นได้ชัดคือเมื่อเรากำหนดให้งานอัปเกรด React ต้องรอการย้ายระบบไป Vite เอเจนต์ก็รอจนกว่าขั้นตอนของ Vite จะจบลง
จึงค่อยเริ่มอัปเกรด React ยิ่งไปกว่านั้นเอเจนต์ยังช่วยเสนอแนะงานใหม่ๆ ได้เองด้วย หากพวกมันพบช่องทางปรับปรุงระบบ เช่น เรื่องประสิทธิภาพหรือการจัดระเบียบโค้ดที่ไม่อยู่ในแผนเดิม เอเจนต์จะสร้างตั๋วงานใหม่ขึ้นมาให้เราตรวจสอบและวางแผนงานในลำดับถัดไป ซึ่งบ่อยครั้งที่เอเจนต์ ตัวอื่นจะเข้ามารับช่วงงานเหล่านี้ต่อทันที วิธีนี้ช่วยให้เอเจนต์ทำงานได้อย่างเป็นระบบและรักษาความต่อเนื่องของงานได้ดีเยี่ยมภายใต้การกำกับดูแลของเรา
วิธีการทำงานแบบนี้ช่วยลดภาระทางสมองในการเริ่มงานที่มีความคลุมเครือได้อย่างมหาศาล หากเอเจนต์ทำอะไรผิดพลาดไป ข้อมูลนั้นก็ยังถือว่ามีประโยชน์และเราแทบไม่ต้องเสียต้นทุนอะไรเลย เราสามารถสร้างตั๋วงานเพื่อให้เอเจนต์ไปลองสร้างตัวต้นแบบและสำรวจแนวทางต่างๆ ได้ด้วยต้นทุนที่ต่ำมาก และสามารถเลือกทิ้งการสำรวจที่เราไม่ชอบได้ทุกเมื่อ
การที่ระบบจัดการรันอยู่บน Devbox ตลอดเวลาทำให้เราสั่งงานได้จากทุกที่เพราะรู้ว่าจะมีเอเจนต์คอยสแตนด์บายรับงานเสมอ ดังเช่นกรณีของวิศวกรในทีมเราที่สร้างการเปลี่ยนแปลงครั้งสำคัญถึงสามครั้งผ่านแอป Linear บนโทรศัพท์มือถือ ในขณะที่เขากำลังพักผ่อนอยู่ในบ้านพักหลักเล็กๆ และต้องทนใช้ไวไฟที่ติดๆ ดับๆ
การทำงานด้วยวิธีนี้ช่วยเพิ่มโอกาสในการสำรวจและทดลองแนวคิดใหม่ๆ ได้มากขึ้น
จากการเฝ้าดูผลลัพธ์ของการใช้ Symphony เราเห็นความเปลี่ยนแปลงที่โดดเด่นที่สุดในด้านผลผลิต โดยมีบางทีมใน OpenAI ที่มียอดการส่ง PR สำเร็จเพิ่มสูงขึ้น 6 เท่าภายในเวลาเพียงสามสัปดาห์แรก และทางด้าน Karri Saarinen ผู้ก่อตั้ง Linear ก็ระบุว่ามีการสร้างเวิร์กสเปซใหม่ๆ เพิ่มขึ้นอย่างมหาศาล(เปิดในหน้าต่างใหม่)เมื่อเราเปิดตัว Symphony แต่สิ่งที่เปลี่ยนไปอย่างลึกซึ้งจริง ๆ คือกระบวนการคิดเรื่องงานของแต่ละทีม
การที่วิศวกรไม่ต้องคอยเฝ้าเซสชันของ Codex ทำให้หลักการความคุ้มค่าในการแก้ไขโค้ดเปลี่ยนรูปแบบไป เรามองว่าค่าใช้จ่ายในแต่ละการเปลี่ยนแปลงนั้นลดลงมาก เพราะมนุษย์ไม่ต้องลงไปคลุกคลีกับการขับเคลื่อนการทำงานในทุกขั้นตอนเหมือนเมื่อก่อน
สิ่งนั้นเปลี่ยนพฤติกรรมของเราไปเลย เพราะการสร้างงานทดลองใน Symphony กลายเป็นเรื่องง่ายนิดเดียว เราสามารถทดลองไอเดียใหม่ ๆ สำรวจการทำ Refactor หรือทดสอบสมมติฐานต่าง ๆ แล้วเลือกเก็บไว้เฉพาะผลลัพธ์ที่ดูมีอนาคตเท่านั้น
วิธีการดังกล่าวช่วยขยายขอบเขตให้คนอื่น ๆ สามารถสั่งงานได้มากขึ้น ซึ่งตอนนี้ฝ่ายออกแบบและผู้จัดการผลิตภัณฑ์สามารถแจ้งความต้องการฟีเจอร์ใหม่ลงใน Symphony ได้ทันที โดยไม่ต้องวุ่นวายกับการเช็คเอาต์ Repo หรือดูแลเซสชัน Codex พวกเขาแค่ระบุรายละเอียดงาน แล้วรอรับผลการตรวจทานพร้อมวิดีโอแสดงตัวอย่างการทำงานของฟีเจอร์ในระบบจริงได้เลย
Symphony ยังโดดเด่นมากในระบบ Monorepo ขนาดใหญ่ (เหมือนที่เราใช้ใน OpenAI) ซึ่งขั้นตอนสุดท้ายของการส่ง PR มักจะล่าช้าและเปราะบาง ระบบจะคอยเฝ้าดู CI ทำการ Rebase เมื่อจำเป็น แก้ไขข้อขัดแย้งของโค้ด ลองรันการตรวจสอบที่ทำงานไม่เสถียรซ้ำ และคอยประคับประคองการเปลี่ยนแปลงต่างๆ ผ่านกระบวนการทำงานจนสำเร็จ เมื่อตั๋วงานไปถึงขั้นตอนการรวมโค้ด เราจึงมั่นใจได้สูงว่าการเปลี่ยนแปลงนั้นจะเข้าสู่สาขาหลักด้โดยไม่ต้องใช้คนคอยดูแลเลย
หลังจากนำ Symphony มาใช้ เรามอบหมายงานให้เอเจนต์มากขึ้น และโฟกัสกับงานที่ยากกว่าและต้องสำรวจมากกว่า
ความก้าวหน้ามาพร้อมปัญหาใหม่ที่แตกต่างออกไป
การทำงานในระดับนี้ย่อมมีสิ่งที่ต้องแลกมา เมื่อเราเปลี่ยนจากการคอยกำกับดูแลเอเจนต์แบบโต้ตอบกันไปมา มาเป็นการมอบหมายงานในระดับตั๋วงานแทน เราก็สูญเสียความสามารถในการคอยประคับประคองหรือปรับทิศทางการทำงานในระหว่างทางไป ซึ่งบางครั้งอาจทำให้เอเจนต์สร้างผลลัพธ์ที่ผิดเพี้ยนไปจากที่ต้องการมาก ทว่าข้อผิดพลาดเหล่านั้นกลับมีค่า เพราะมันชี้ให้เห็นจุดบกพร่องในระบบและช่วยให้เราสร้างระบบที่เสถียรกว่าเดิม
แทนที่จะเข้าไปแก้ไขผลลัพธ์ด้วยตัวเอง เราเลือกเพิ่มระบบควบคุมและทักษะใหม่ๆ เข้าไปเพื่อให้เอเจนต์สามารถทำงานได้สำเร็จในครั้งต่อไป ซึ่งเมื่อเวลาผ่านไปสิ่งนี้ก็นำเราไปสู่การเพิ่มขีดความสามารถใหม่ๆ ให้กับระบบทดสอบของเรา เช่น การรันชุดทดสอบแบบต้นจนจบ การสั่งการแอปผ่าน Chrome DevTools ไปจนถึงการดูแลชุดทดสอบ QA เบื้องต้น พร้อมกันนี้เรายังได้พัฒนาคู่มือการทำงานและระบุเป้าหมายของคุณภาพงานที่ต้องการให้ชัดเจนยิ่งขึ้น
ไม่ใช่ทุกงานที่จะเหมาะกับรูปแบบการทำงานของ Symphony เพราะปัญหาบางอย่างยังคงต้องอาศัยวิศวกรลงไปทำงานร่วมกับเซสชันของ Codex โดยตรง โดยเฉพาะปัญหาที่มีความกำกวมหรืองานที่ต้องใช้การตัดสินใจและความเชี่ยวชาญสูง ซึ่งในทางปฏิบัติ งานเหล่านี้มักจะเป็นงานที่น่าสนใจและสร้างความเพลิดเพลินให้แก่วิศวกรของเรามากที่สุด
ข้อแตกต่างคือ Symphony สามารถรับภาระงานในขั้นตอนปฏิบัติงานประจำส่วนใหญ่ไปทำได้ ซึ่งช่วยให้วิศวกรสามารถจดจ่อกับปัญหาที่ยากเพียงปัญหาเดียวในแต่ละครั้ง แทนที่จะต้องคอยสลับสมาธิไปมาระหว่างงานย่อยๆ อยู่ตลอดเวลา
เราเรียนรู้ด้วยว่าการปฏิบัติกับเอเจนต์เหมือนเป็นโหนดที่ตายตัวในระบบนั้นไม่ได้ผลดีนัก เพราะโมเดลเก่งขึ้นจนก้าวข้ามกรอบเดิมๆ ที่เราวางไว้ทำงานได้ไม่ดีนัก ตัวอย่างเช่น เวอร์ชันแรกๆ เรากำหนดให้การเชื่อมต่อกับ GitHub ทั้งหมดเป็นส่วนหนึ่งของระบบควบคุมภายนอก โดยคาดหวังให้ Codex ทำเพียงแค่การแก้ไขโค้ดเท่านั้น โดยใช้การเขียนโปรแกรมควบคุมขั้นตอนการส่งงานและการรันเทสแทน การสั่งงานเอเจนต์ในตอนนั้นจึงจำกัดอยู่แค่การให้ Codex ลงมือทำตามโจทย์ ซึ่งมันตีกรอบงานแคบเกินไป แต่เมื่อเราพบว่า Codex สามารถสร้าง PR และตอบโต้กับข้อเสนอแนะในการรีวิวได้ด้วยตนเอง เราจึงเสริมเครื่องมือ gh CLI และความสามารถในการวิเคราะห์บันทึก CI เข้าไป ปัจจุบัน Codex จึงทำงานได้หลากหลายกว่าเดิมมาก ตั้งแต่การจัดการ PR เก่าไปจนถึงการจัดทำรายงานสรุปผลงาน ซึ่งเป็นงานที่อยู่นอกเหนือเป้าหมายหลักในการพัฒนาฟีเจอร์ในช่วงแรก
ในที่สุดเราก็เปลี่ยนมาเป็นการมอบหมายเป้าหมายให้เอเจนต์แทนการสั่งงานเป็นขั้นตอนที่ตายตัว เหมือนกับที่ผู้จัดการเก่งๆ มอบหมายเป้าหมายให้ลูกน้องในทีมนั่นเอง พลังที่แท้จริงของโมเดลมาจากความสามารถในการใช้เหตุผล ดังนั้นเราแค่ให้เครื่องมือและบริบทที่จำเป็นกับมัน แล้วปล่อยให้มันแสดงฝีมือจัดการงานเองได้เลย
ใช้ Symphony เพื่อสร้าง Symphony
เมื่อคุณเปิดคลังข้อมูลของ Symphony สิ่งแรกที่จะสังเกตเห็นคือในทางเทคนิคแล้ว Symphony เป็นเพียงไฟล์ SPEC.md หรือไฟล์ที่ระบุรายละเอียดของปัญหาและแนวทางแก้ไขที่ตั้งใจไว้เท่านั้น แทนที่จะสร้างระบบควบคุมที่ซับซ้อน เราเลือกที่จะนิยามปัญหาและแนวทางแก้ไขที่ต้องการ เพื่อให้เอเจนต์ได้รับแนวทางการทำงานในภาพรวม
ต้นแบบอ้างอิงเขียนขึ้นด้วย Elixir เพราะในวันที่โค้ดไม่ใช่เรื่องที่ต้องจ่ายแพงอีกต่อไป คุณจะเลือกภาษาใดก็ได้ตามความเหมาะสมของงาน เช่น การเลือก Elixir เพราะเก่งเรื่องการทำงานขนานกัน อย่างไรก็ตามแนวคิดหลักก็ยังคงสามารถอธิบายได้ง่ายๆ ในเอกสาร Markdown เพียงฉบับเดียว เราอยากให้คุณลองส่งข้อกำหนดนี้ให้เอเจนต์สำหรับเขียนโค้ดที่คุณใช้ประจำ เพื่อพัฒนาโปรแกรมในรูปแบบของคุณเอง
เริ่มต้นนั้น Symphony เวอร์ชันแรกทำงานผ่าน Codex ใน tmux โดยคอยตรวจสอบงานจาก Linear และสร้างเอเจนต์ย่อยขึ้นมาเพื่อจัดการงานใหม่ๆ แม้มันจะใช้งานได้แต่ก็ยังไม่มีความเสถียรมากนัก ส่วนเวอร์ชันที่สองนั้นทำงานอยู่ภายในพื้นที่เก็บโปรเจกต์หลักของเราซึ่งออกแบบมาเพื่อรองรับเอเจนต์โดยเฉพาะ เราได้สร้างระบบควบคุมเพื่อให้เอเจนต์มีทักษะและข้อมูลบริบทที่จำเป็นในการสร้างสรรค์งานคุณภาพสูงในพื้นที่นี้อยู่แล้ว Symphony จึงทำหน้าที่เพียงแค่เชื่อมต่อทุกส่วนเข้าด้วยกัน
เมื่อมีฟังก์ชันพื้นฐานแล้ว เราก็ใช้ Symphony เพื่อสร้าง Symphony
ผลตอบรับจากการสาธิตระบบจัดการงานภายในพร้อมแสดงวิดีโอผลงานจริงนั้นดีเกินคาด ส่งผลให้ช่องทางการสื่อสารของโปรเจกต์ Symphony มีสมาชิกเพิ่มขึ้น และทีมต่าง ๆ เริ่มนำไปประยุกต์ใช้ในงานของตนเอง การบรรลุเป้าหมายการใช้งานภายในถือเป็นด่านแรกก่อนการเปิดตัวภายนอกของ OpenAI เสมอ ซึ่งความนิยมที่เราพบเห็นภายในองค์กรทำให้เรามั่นใจว่าถึงเวลาแล้วที่จะเผยแพร่ Symphony ออกไปนอกรั้วบริษัท
เราจึงแยกแนวคิดดังกล่าวออกมาเป็นเอกสาร SPEC.md แยกต่างหาก แล้วสั่งให้ Codex ลงมือพัฒนาระบบขึ้นมา โดยเราเลือกภาษา Elixir สำหรับการสร้างระบบต้นแบบเนื่องจากมีคุณสมบัติที่โดดเด่นในการบริหารจัดการงานที่รันขนานกันได้อย่างมีประสิทธิภาพ Codex พัฒนาโค้ด Elixir เสร็จสมบูรณ์ในรอบเดียว และเราได้ต่อยอดงานทั้งในส่วนของสเปกและโค้ดอย่างต่อเนื่อง เพื่อให้ข้อกำหนดมีความชัดเจนที่สุด เราจึงสั่งให้ Codex ลองเขียนระบบในภาษาอื่นๆ ทั้ง TypeScript, Go, Rust, Java และ Python เพื่อดูว่ามีส่วนไหนที่ยังสับสนอยู่หรือไม่ ซึ่ง Codex ก็สามารถพิสูจน์ให้เห็นว่าระบบนี้ใช้งานได้จริงในทุกภาษา
ในระหว่างขั้นตอนการพัฒนา Codex เราได้ตัดความซับซ้อนส่วนเกินออกไปมากมาย เช่น การพึ่งพา Repository เฉพาะทางหรือ Linear MCP ทำให้ในตอนนี้ Symphony ไม่ต้องขึ้นตรงกับคลังเก็บรหัสหรือกระบวนการทำงานภายในของเราอีกต่อไป และส่งผลให้แนวคิดหลักของระบบมีความเรียบง่ายขึ้นดังนี้
สำหรับทุกงานที่ยังเปิดอยู่ ต้องรับประกันว่ามีเอเจนต์กำลังทำงานอยู่ในเวิร์กสเปซของตัวเอง
นอกจากจะช่วยงานที่กำลังทำอยู่แล้ว ตอนนี้เอเจนต์ยังรับรู้และปฏิบัติตามขั้นตอนการพัฒนาโปรแกรมด้วย ขั้นตอนการทำงาน ตั้งแต่การจัดการตั๋วงาน การดึงไฟล์จากคลังโค้ด การเปลี่ยนสถานะงานเพื่อให้ PM ทราบว่ากำลังดำเนินการอยู่ การส่ง PR ไปจนถึงการย้ายงานไปสู่สถานะรอตรวจทานและแนบวิดีโอประกอบ ทั้งหมดนี้ถูกบันทึกไว้ในไฟล์ WORKFLOW.md อย่างง่าย ซึ่งแต่เดิมเป็นกระบวนการที่มนุษย์ทำตามกันมาโดยไม่ได้เขียนเป็นลายลักษณ์อักษร แทนที่จะพึ่งพาขั้นตอนที่รู้กันเองภายใน ตอนนี้เราบันทึกมันไว้แล้ว และ Symphony จะคอยดูแลให้เอเจนต์ทำตามขั้นตอนเหล่านั้น ซึ่งช่วยให้เราสร้างเอเจนต์ที่ทำงานร่วมกับเราได้จริง หากเราต้องการให้เอเจนต์แนบการสรุปบทเรียนจากงานที่ทำเสร็จแล้ว เราก็แค่เพิ่มลงในไฟล์ WORKFLOW.md และ Symphony จะนำทางให้เอเจนต์ไปทำขั้นตอนนั้นเอง
เรามีโอกาสได้ใช้งาน Codex ในโหมด App Server(เปิดในหน้าต่างใหม่) ซึ่งเป็นโหมดแบบ Headless ที่ติดตั้งมาในตัว โหมดนี้ช่วยให้เราสามารถรัน Codex และสื่อสารกับมันผ่านโปรแกรมด้วย JSON-RPC API ที่มีเอกสารประกอบชัดเจน เพื่อสั่งงานต่าง ๆ เช่น การเริ่มเธรดงานใหม่หรือการตอบโต้ในแต่ละเทิร์น วิธีการนี้ถือเป็นทางเลือกที่สะดวกและเหมาะสมกับการเพิ่มปริมาณงานในอนาคต เมื่อเทียบกับการต้องมานั่งพิมพ์คำสั่งผ่าน CLI หรือคอยเฝ้าดูเซสชัน tmux ด้วยตัวเอง
Codex App Server เหมาะกับงานของเรามาก เพราะช่วยให้เราดึงศักยภาพของระบบ Codex มาใช้ในขณะที่ยังสามารถปรับแต่งส่วนต่างๆ ได้เอง เช่น การใช้ Dynamic Tool Calls(เปิดในหน้าต่างใหม่) เพื่อเรียกฟังก์ชัน linear_graphql แทนการส่ง Access Token ของ Linear ให้กับเอเจนต์ย่อยโดยตรง วิธีนี้ช่วยให้เราสื่อสารกับ Linear ได้อย่างอิสระโดยไม่ต้องผ่าน MCP และรักษาความปลอดภัยของรหัสผ่านใน Container ได้อย่างดีเยี่ยม
ก้าวต่อไป
Symphony เป็นเลเยอร์สำหรับการจัดลำดับงานที่ออกแบบมาให้เรียบง่ายที่สุดเท่าที่จะเป็นไปได้ เราเปิดเป็นโอเพนซอร์สเพื่อแสดงให้เห็นถึงพลังของ Codex App Server เมื่อใช้งานร่วมกับเครื่องมือจัดการลำดับงานต่างๆ อย่าง Linear ด้วยเหตุนี้เราจึงไม่ได้วางแผนที่จะดูแล Symphony ในฐานะผลิตภัณฑ์แยกต่างหาก แต่ขอให้มองว่ามันเป็นตัวอย่างการนำไปใช้งานจริง เราหวังว่าคุณจะลองให้เอเจนต์เขียนโค้ดที่คุณชื่นชอบศึกษาข้อกำหนด(เปิดในหน้าต่างใหม่)และ Repository(เปิดในหน้าต่างใหม่) ของ Symphony เพื่อสร้างเวอร์ชันของคุณเองให้เหมาะสมกับสภาพแวดล้อมการทำงาน เช่นเดียวกับที่นักพัฒนาหลายคนเคยใช้บทความวิศวกรรมเป็นแนวทางในการวางโครงสร้าง Repository มาก่อน
หัวใจสำคัญของเรื่องนี้คือ Codex และ App Server ส่วน Symphony คือเครื่องมือที่เราใช้เชื่อมโยง Codex เข้ากับ Linear เพื่อจัดระเบียบการทำงานให้ราบรื่น เราคาดว่าเมื่อเอเจนต์เขียนโค้ดสามารถใช้เหตุผลและรับคำสั่งได้แม่นยำขึ้น งานหลักของบริษัทต่างๆ จะเปลี่ยนไปเน้นที่การคุมงานของเอเจนต์แทนงานเขียนโค้ดทั่วไป ที่น่าตื่นเต้นคือตอนนี้กำแพงในการเริ่มทดลองระบบเอเจนต์เขียนโค้ดนั้นบางลงมาก เปิดโอกาสให้คุณสร้างระบบต่างๆ ขึ้นมาได้ง่ายๆ โดยใช้ Codex เป็นพื้นฐาน
เสียงตอบรับจากชุมชน
เรารู้สึกตื่นเต้นมากที่เห็นชุมชนวิศวกรนำ Symphony ไปใช้งานในช่วงหลายสัปดาห์นับตั้งแต่เปิดตัว จนมียอดดาวใน GitHub สูงกว่า 15,000 ดวง(เปิดในหน้าต่างใหม่)แล้ว เมื่อนับถึงวันที่ 23 เมษายน