พัฒนา AI Agent: จากต้นแบบสู่โปรดักชัน
เดือนพฤศจิกายน 2024 เจ้าของบริษัทนายหน้าขนส่งในเมืองกดัญสก์ขอให้ฉันพาตัวช่วยงานดีสแพตช์จากเดโมสู่งานประจำวัน เดโมตอบคำถามตัวอย่างยี่สิบข้อเรื่องงานขนส่ง ภาษี ท่าโหลด มันรันบนเอกสารสะอาดสี่สิบไฟล์ มันเรียกเสียงประทับใจเต็มห้อง ฉันเชื่อมตัวช่วยตัวเดียวกันเข้าคลังเอกสารจริงหนึ่งพันหนึ่งร้อยไฟล์ เปิดทางให้พนักงานดีสแพตช์สี่สิบคน แล้วเห็นมันพลาดสี่ครั้งก่อนเที่ยง มันอ้างภาษีจากสัญญาที่หมดอายุตั้งแต่มีนาคม มันแต่งเลขท่าโหลดให้คลังสินค้าที่มีหกท่า มันใช้เวลาตอบยี่สิบสองวินาทีกับคำถามงานล่าช้าหนึ่งข้อ มันเผาเงินเก้าเซ็นต์ต่อการเรียกหนึ่งครั้งด้วยวอลุ่มของเขา เจ้าของกดหยุดงานเปิดใช้บ่ายวันนั้น ทุกวันนี้ Agent ทุกตัวที่ฉันส่งถึงมือลูกค้าต้องเดินเส้นทางด้านล่าง หกขั้นพามันจากเช้าที่ล้มเหลวนั้นสู่งานประจำที่นิ่ง ฉันรันตามลำดับ ทุกขั้นมีตัวเลขที่ฉันวัดจากงานลูกค้าจริง
ทำไมเดโมตายในโปรดักชัน
เดโมอยู่ในเรือนกระจก คำถามตัวอย่างยี่สิบข้อ เอกสารสดสี่สิบไฟล์ ผู้ใช้หนึ่งคน มิเตอร์ค่าใช้จ่ายศูนย์ โปรดักชันเปิดประตู คำถามจริงสองพันข้อมาพร้อมตัวสะกดผิด ประโยคครึ่งท่อน รูปถ่ายเอกสาร เอกสารหนึ่งพันหนึ่งร้อยไฟล์มีทั้งสัญญาหมดอายุ ภาษีซ้ำซ้อน ตารางราคาเดียวกันสามรุ่น คนสี่สิบคนถามพร้อมกันเช้าวันจันทร์ ทุกการเรียกเก็บลงบิล
ตัวฆ่าสามตัวจบเดโมส่วนใหญ่ในสัปดาห์แรก งานค้นคืนเก่าป้อนหน้ากระดาษหมดอายุให้โมเดล โมเดลอ้างมันด้วยความมั่นใจเต็มที่ ชุดประเมินที่ขาดหายซ่อนความเสียหาย เพราะไม่มีใครรันชุดคำถามตายตัวซ้ำหลังทุกการเปลี่ยน ดริฟต์เลยลามโดยไม่มีใครเห็น ต้นทุนกับเวลาที่ไม่เคยวัดช็อกเจ้าของตอนสิ้นเดือน หนึ่งหมื่นการเรียกคูณเก้าเซ็นต์เป็นเงินเก้าร้อยดอลลาร์ แลกคำตอบที่ไม่มีใครไว้ใจ
ลำดับการซ่อมสำคัญ ฉันตรึงงานค้นคืนก่อน เพราะประโยคสวยแค่ไหนก็รอดไม่ได้ถ้าหน้าต้นทางผิด ฉันเติมชุดประเมินเป็นขั้นที่สอง เพราะฉันต้องการสกอร์บอร์ดก่อนเปลี่ยนอย่างอื่น ฉันคุมงบต้นทุนกับงบเวลาเป็นขั้นที่สาม เพราะงบกำหนดทางเลือกโมเดล ฉันปิดชั้นข้อมูลเป็นขั้นที่สี่ เพราะชื่อลูกค้ากับเบอร์โทรสมควรมีรอบตรวจของตัวเอง จากนั้นฉันส่งมอบ ข้ามลำดับแล้วคุณจะได้นั่งแต่งประโยคบนงานค้นหาที่พัง
ไปป์ไลน์ RAG ที่พึ่งพาได้
ฉันเก็บเอกสารใน Postgres ด้วย pgvector บน Neon ตารางเดียวถือชิ้นส่วนคือ chunk_id uuid tenant_id text source_url text updated_at timestamptz content text embedding vector(1536) ดัชนี HNSW บนคอลัมน์ embedding เสิร์ฟค้นหาเพื่อนบ้านใกล้สุดด้วย m 16 กับ ef_construction 64 ดัชนี btree บน tenant_id กับ updated_at กรองทุกคำค้นเข้าลูกค้าถูกคน เอกสารสดมาก่อน
ฉันหั่นข้อความเป็นชิ้นชิ้นละสี่ร้อยถึงหกร้อยโทเคน ซ้อนทับกันแปดสิบโทเคน ทุกชิ้นจำหน้าต้นทางกับวันที่ ชิ้นสั้นเสียบริบทในการวัดของฉัน ค่ารีคอลบนชุดคำถามตายตัวอยู่ที่หกสิบเอ็ดเปอร์เซ็นต์ ชิ้นยาวเจือจางผลจับคู่ โมเดลยกมาทั้งหน้าแทนทีละบรรทัด หน้าต่างสี่ร้อยถึงหกร้อยดันรีคอลขึ้นแปดสิบแปดเปอร์เซ็นต์บนชุดเดียวกัน
ทุกคำค้นกรองด้วย tenant_id ค้นห้าชิ้นใกล้สุด ทิ้งของที่เจ้าของปักว่าหมดอายุ คำตอบพิมพ์แหล่งที่มาใต้ข้อคือชื่อเอกสาร หน้า วันที่ พนักงานดีสแพตช์คลิกเปิดดู ไว้ใจของที่ตรวจเอง ฉันรันตรวจรีคอลทุกสัปดาห์ เอกสารหนึ่งฉบับมีเจ้าของหนึ่งคน สำเนาเก่าออกจากคลังวันที่เจ้าของเปลี่ยนไฟล์
การประเมิน: นิสัยชุดตัวอย่างสองร้อยข้อ
ฉันถือคำถามตายตัวสองร้อยข้อพร้อมคำตอบลายลักษณ์อักษรกับหน้าต้นทาง แปดสิบข้อคุมงานประจำคือเลขงาน ภาษี เวลาท่าโหลด หกสิบข้อแบกตัวสะกดผิด ถนนหาย ชื่อจำครึ่งๆ สี่สิบข้อบังคับปฏิเสธ บอตต้องบอกว่าหาเอกสารไม่พบ แล้วส่งแชตให้นักดีสแพตช์ ยี่สิบข้อวางกับดักคือภาษีหมดอายุ ตารางราคาขัดกัน โกดังสองแห่งชื่อถนนเดียวกัน
ฉันรันครบชุดก่อนทุกงานปล่อย บันทึกวัน รุ่นโมเดล คะแนน คะแนนตกเกินสามแต้มเบรกงานปล่อย กฎนี้ไม่ต่อรอง งานกดัญสก์สอนเหตุผล ไฟล์ภาษีมีนาคมฉบับเดียวหมดอายุ ชุดจับใบอ้างผิดสิบเอ็ดใบในรันเดียว งานปล่อยรอหนึ่งวันขณะที่ฉันเปลี่ยนไฟล์ ไร้ชุดนี้ใบอ้างสิบเอ็ดใบถึงมือผู้ขนส่งสี่สิบราย
ทุกจุดพลาดจากงานจริงเข้าชุดวันเดียวกับวันที่โผล่ คนขับโทรเรื่องหน้าต่างส่งของผิด ฉันเติมคำถามข้อนั้นพร้อมคำตอบถูกกับแหล่งที่มา ชุดโตเกินสองร้อยตามเวลา ชื่อคงเดิม สองร้อยคือขั้นต่ำ ขั้นต่ำคุมเส้น
งบต้นทุนกับงบเวลา
ฉันคิดราคาทุกการเรียกก่อนเลือกโมเดล คำตอบกดัญสก์หนึ่งข้อดึงห้าชิ้น ชิ้นละราวสามร้อยห้าสิบโทเคน บวกคำสั่งกับประวัติสามร้อยโทเคน เขียนตอบสามร้อยห้าสิบโทเคน ขาเข้ารวมแถวสองพันหนึ่งร้อยโทเคน ขาออกสามร้อยห้าสิบ
ด้วยเรทโมเดลเล็กขาเข้าล้านโทเคนสิบห้าเซ็นต์ ขาออกล้านโทเคนหกสิบเซ็นต์ การเรียกหนึ่งครั้งต้นทุนราวห้าส่วนหมื่นดอลลาร์ ขาเข้าสองพันหนึ่งร้อยโทเคนที่ $0.15 ต่อล้านได้ $0.00032 ขาออกสามร้อยห้าสิบโทเคนที่ $0.60 ต่อล้านได้ $0.00021 งาน embedding เติม $0.00002 รวมแถว $0.0005 หนึ่งหมื่นครั้งต่อเดือนเงินห้าดอลลาร์ ทรงเดียวกันบนโมเดลเรือธงขาเข้าล้านละ $5 ขาออกล้านละ $15 ต้นทุนแถว $0.016 ต่อครั้ง หรือเดือนละหนึ่งร้อยหกสิบดอลลาร์สำหรับหนึ่งหมื่นครั้งเท่าเดิม
ฉันเลยส่งงานอ่านประจำให้โมเดลเล็ก เก็บเรือธงไว้จดหมายเคลมค่าเสียหายที่เงื่อนไขผิดข้อเดียวแพงกว่าเงินทั้งเดือน ฉันขีดเส้นเวลาสองเส้น ตอบแรกที่เห็นได้ในสองวินาทีผ่านสถานะสตรีม คำตอบเต็มในเก้าวินาที ฉันอ่าน p50 กับ p95 ทุกสัปดาห์จากบันทึกการเรียก p95 ข้ามเส้นสองสัปดาห์ติด ฉันหั่นชิ้นส่วนก่อนแตะโมเดล
ชั้นกำกับดูแลข้อมูล
Agent ที่อ่านชื่อลูกค้า เบอร์โทร สัญญาต้องมีชั้นข้อมูลเล็กๆ ตั้งแต่วันแรก ฉันบันทึกทุกการเรียกเครื่องมือพร้อมเลขอ้างอิงการอนุมัติ ล้างตัวระบุตนก่อนลงบันทึก ปักวันลบทุกแถวให้บทสนทนาเก่าออกจากคลังตามตาราง ตารางจริง วิธีล้าง งานลบทุกคืนฉันเขียนไว้ใน ทำไม AI Agent ของคุณต้องมีชั้นกำกับดูแลข้อมูล ฉันเติมชั้นนี้ให้ทุกงานจริงก่อนรับทราฟฟิกจริง
เช็กลิสต์ก่อนส่งมอบ
ลิสต์นี้ฉันรันเช้าก่อนเปิดใช้ทุกครั้ง
- งานค้นคืนกรองด้วย tenant_id ทิ้งไฟล์หมดอายุ
- ทุกคำตอบพิมพ์ชื่อแหล่งที่มา หน้า วันที่
- ชุดสองร้อยข้อรันเขียว ไม่มีตกเกินสามแต้ม
- ต้นทุนต่อการเรียกอยู่บนกระดาษพร้อมคณิตวอลุ่มรายเดือน
- p95 ตอบในเก้าวินาทีสองสัปดาห์ติด
- ข้อความขาออกรอเลขอ้างอิงการอนุมัติ
- ทุกแถวที่เก็บปักวันลบพร้อมงานลบทุกคืนหนุนหลัง
- ธงเดียวถอยงานปล่อยในไม่กี่นาที
ถ้าตัวช่วยของคุณยังอยู่ในรูปเดโม ขอรับการตรวจ AI แล้วฉันจะประเมินงานของคุณตามทุกขั้นข้างบน