หน่วย 6 / 11

การควบคุมการเข้าถึง เทมเพลตพร้อมท์ และการจัดการการสนทนา

กำไร:

  • ตั้งค่าการควบคุมการเข้าถึง (ACL) ที่กรองการดึงข้อมูลตามสิทธิ์ของผู้ใช้
  • การเขียนเทมเพลตพร้อมท์ที่ชัดเจนซึ่งวางบริบทและคำถามของผู้ใช้อย่างถูกต้อง
  • ฝึกการใช้คำถามอย่างเป็นอิสระและการจัดการประวัติศาสตร์ในการสนทนาหลายรอบ

เราสถาปนาสถาปัตยกรรม ตอนนี้เรามาทำให้มันปลอดภัย สม่ำเสมอ และพูดคุยกันกันดีกว่า มีหัวข้อสำคัญสามหัวข้อในหน่วยนี้: (1) การควบคุมการเข้าถึงที่กรองการดึงข้อมูลตามสิทธิ์ของผู้ใช้ (2) เทมเพลตข้อความแจ้งที่มีประสิทธิภาพซึ่งวางบริบทและคำถามอย่างถูกต้อง (3) ความเป็นอิสระของคำถามและการจัดการประวัติการสนทนาในการแชทแบบหลายรอบ หากไม่มีทั้งสามสิ่งนี้ ผู้ช่วยก็จะรั่วไหลข้อมูล ให้คำตอบที่ไม่สอดคล้องกัน หรือแยกประเด็นออกจากคำถามติดตามผล

การควบคุมการเข้าถึง: ข้อมูลที่ไม่ได้รับอนุญาตไม่ควรมาถึง

ความเสี่ยงที่ใหญ่ที่สุดขององค์กร: เอกสารที่ผู้ใช้ไม่ควรเห็นการรั่วไหลในการตอบกลับ ข้อผิดพลาดที่พบบ่อยมากสำหรับผู้เริ่มต้นคือ "บอกโมเดลให้ 'แสดงเอกสารที่ซ่อน' ทันทีที่พร้อมท์" สิ่งนี้ไม่ปลอดภัย โมเดลอาจลืมคำสั่งหรือการฉีดทันทีอาจหลบเลี่ยงได้ สถานที่ที่ถูกต้องคือขั้นตอนการรับคืน: ไม่ควรนำชิ้นส่วนที่ไม่ได้รับอนุญาตเข้ามาเลย

วิธีดำเนินการคือการใช้ข้อมูลเมตาของหน่วยงาน (แผนก บทบาท ระดับความเป็นส่วนตัว) ที่คุณใส่ไว้ในแต่ละส่วนเป็นตัวกรองระหว่างการค้นหา คุณกำหนดได้อย่างปลอดภัยว่าผู้ใช้คือใคร (ข้อมูลประจำตัวและบทบาท) ที่เลเยอร์แอปพลิเคชัน และเพิ่มตัวกรอง ACL (รายการควบคุมการเข้าถึง) ให้กับการโทร

# กรองโดยการเรียกสิทธิ์ (แนวความคิด) ผู้ใช้ = รับรองความถูกต้อง (เซสชัน) # รับรองความถูกต้องจากแหล่งที่เชื่อถือได้ = user.roles + ["ทุกคน"] # เช่น ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": allowance}, # อนุญาตเฉพาะส่วนที่ "privacy": {"lte": user.level}} # ต่ำกว่าระดับ)

ข้อควรระวัง: ห้ามขออำนาจจากโมเดลหรืออาศัยข้อความแจ้ง ตัวตนและอำนาจถูกกำหนดที่เลเยอร์ที่เชื่อถือได้ของแอปพลิเคชัน จำเป็นต้องมีตัวกรองการดึงข้อมูล คำแนะนำพร้อมท์เป็นเพียงเลเยอร์เพิ่มเติม "ฉันเขียนไว้ในพรอมต์" ไม่ใช่ความปลอดภัย

เทมเพลตพรอมต์ที่เป็นของแข็ง

เทมเพลตพร้อมท์คือโครงกระดูกที่รวบรวมบริบท คำถามของผู้ใช้ และคำแนะนำด้านพฤติกรรมจากการดึงข้อมูล ส่วนของเทมเพลตที่ดี: คำอธิบายบทบาท/งาน กฎการปฏิบัติ (พื้นฐาน ฉันไม่ทราบสิทธิ์ คำขอทรัพยากร น้ำเสียง) บริบท คำถาม

คุณเป็นผู้ช่วยทรัพยากรบุคคลขององค์กร งานของคุณคือการตอบคำถามของพนักงานตามบริบทต่อไปนี้เท่านั้น กฎ:- หากคำตอบไม่ชัดเจนในบริบท ให้เขียนว่า "ฉันไม่พบข้อมูลเกี่ยวกับเรื่องนี้ในเอกสารประกอบ โปรดตรวจสอบกับทีมทรัพยากรบุคคล" อย่าเดา อย่าแต่ง- หากแหล่งที่มาในบริบทขัดแย้งกัน ให้ยึดนโยบายอย่างเป็นทางการเป็นพื้นฐานและระบุความขัดแย้ง- เพิ่มแหล่งที่มาที่คุณเชื่อถือเป็น [แหล่งที่มา: ไฟล์, ส่วน] ต่อท้ายข้อเรียกร้องแต่ละรายการ- ตอบด้วยภาษาสั้น ๆ ชัดเจน และเป็นมืออาชีพ บริบท:{numbered_parts}คำถาม: {user_question}

การกำหนดหมายเลขส่วนบริบท ([1], [2], ...) ช่วยให้อ้างอิงแบบจำลองได้ง่ายขึ้น นอกจากนี้ ให้เขียนแหล่งที่มาที่จุดเริ่มต้นของแต่ละชิ้นเพื่อให้แบบจำลองสามารถอ้างอิงได้อย่างถูกต้อง

เคล็ดลับ: รักษาเทมเพลตพร้อมท์ให้คงที่และวางตัวแปร (บริบท คำถาม) ไว้ในที่เดียวกันเสมอ เทมเพลตแบบตายตัวช่วยเพิ่มความสามารถในการทดสอบและลดต้นทุนด้วยการแคชที่รวดเร็วในบางระบบ

บริบท:[1] (ที่มา: ik_el_kitabi.pdf, หัวข้อ 5.2) วันลาโดยได้รับค่าจ้างรายปีคือ 14 วัน...[2] (ที่มา: ik_el_kitabi.pdf, Section 5.4) ลาได้ 20 วัน สำหรับผู้ที่ทำงานครบ 5 ปี...

พรอมต์ที่อ่อนแอ / พรอมต์ที่แข็งแกร่ง

อ่อนแอ (ไม่มีการต่อสายดิน ไม่มีแหล่งที่มา เอกลักษณ์ปะปน):

ใช้เอกสารเหล่านี้และตอบคำถาม: {parts}ผู้ใช้: {question}# ปัญหา: โมเดลไม่มีบริบท สร้างขึ้นมา ไม่ได้อ้างอิงแหล่งที่มา # มีพฤติกรรมที่ขัดแย้งกันโดยพลการ

เข้มงวด (บทบาท + กฎ + บริบทที่มีหมายเลข + แหล่งที่มาบังคับ):

คุณคือ... เพียงแค่พึ่งพาบริบท มิฉะนั้นให้พูดว่า "ฉันไม่รู้" ในกรณีที่ขัดแย้งกัน ให้เลือกนโยบายอย่างเป็นทางการ เพิ่ม [Source: ...] ลงในการอ้างสิทธิ์แต่ละรายการ CONTEXT: [1]... [2]... คำถาม: {question}# ผลลัพธ์: คำตอบที่ตรงตามบริบท มีแหล่งที่มา และจัดการความขัดแย้งได้อย่างถูกต้อง

การจัดการการสนทนาหลายทัวร์

ผู้ใช้จริงไม่ถามคำถามเดียวและปล่อยมันไว้ตามลำพัง พูด “ฉันมีวันหยุดประจำปีกี่วัน?” → “แล้วพนักงานอายุ 6 ปีล่ะ?” → “ฉันจะสมัครได้อย่างไร?” คำถามที่สองและสามเพียงอย่างเดียวก็ไม่มีความหมาย ขึ้นอยู่กับบริบทก่อนหน้า

คุณต้องแก้ปัญหาสองข้อ ประการแรกคือการดึงข้อมูล: ทำให้คำถามติดตามผลเป็นอิสระ (การเขียนคำถามใหม่) “แล้วพนักงานอายุ 6 ปีล่ะ?” → “พนักงานอายุ 6 ปีมีสิทธิลาพักผ่อนประจำปีได้กี่วัน” คุณค้นหาด้วยคำถามอิสระนี้ ประการที่สองคือสำหรับการผลิต: คุณยังมอบประวัติการสนทนาให้กับโมเดลเพื่อให้ดำเนินต่อได้อย่างต่อเนื่อง

# สองขั้นตอน: เป็นอิสระ → ค้นหา → สร้างด้วยประวัติ (แนวความคิด) อิสระ = model.uret( "ใช้ประวัติการสนทนาเพื่อทำให้คำถามเข้าใจได้ด้วยตัวเอง:\nประวัติ: {history}\nคำถาม: {follow_question}") บริบท = การดึงข้อมูล(อิสระ) # ค้นหาด้วยคำถามอิสระคำตอบ = model.uret(prompt(context, history, follow_question))

เมื่อประวัติศาสตร์เติบโตขึ้น (การสนทนาที่ยาวนาน) การส่งทั้งหมดในคราวเดียวจะมีราคาแพงและเต็มหน้าต่างบริบท วิธีแก้ไข: สรุปรอบก่อนหน้าหรือเก็บรอบ N สุดท้ายไว้และลดรอบก่อนหน้าเป็นสรุป ดังนั้นต้นทุนจึงอยู่ภายใต้การควบคุมและรักษาความสม่ำเสมอ

สถานะ

ปัญหา

โซลูชั่น

คำถามติดตามผลไม่มีบริบท

การค้นหาการสืบค้นไม่มีความหมาย

ทำให้คำถามเป็นอิสระ (เขียนใหม่)

คุยกันยาวๆ

ราคาและหน้าต่างบวม

สรุปทัวร์ที่ผ่านมา

ผู้ใช้เปลี่ยนหัวข้อ

บริบทเก่าติดไวรัส

ลดอิทธิพลในอดีตในหัวข้อใหม่

อำนาจอาจแตกต่างกันไปในแต่ละทัวร์

เสี่ยงต่อการรั่วไหล

ใช้ตัวกรอง ACL ซ้ำทุกรอบ

มินิเคสสามอัน

กรณีที่ 1 — ความผิดพลาด “ความปลอดภัย” พร้อมแจ้ง บริษัทแห่งหนึ่งวางเอกสารเงินเดือนที่เป็นความลับไว้กับผู้ช่วยซึ่งใครๆ ก็สามารถถามได้ แต่เขียนเพียงว่า "อย่าให้ข้อมูลเงินเดือน" ในข้อความแจ้งเท่านั้น แบบจำลองทำให้ช่วงเงินเดือนรั่วไหลเมื่อผู้ใช้ถามคำถามแบบวงเวียน เมื่อเพิ่มตัวกรอง ACL ในการดึงข้อมูล (ส่วนเงินเดือนสำหรับบทบาท HR เท่านั้น) การรั่วไหลจะถูกปิดสนิท เพราะส่วนนั้นไม่เคยเอามาแล้ว

กรณีที่ 2 — การสะกดรอยตามแบบไร้บริบท ในผู้ช่วยฝ่ายสนับสนุน ผู้ใช้ถาม "ระยะเวลาการคืนสินค้า" → “แล้วสินค้าที่เสียหายล่ะ?” ระบบนำชิ้นส่วนที่ไม่เกี่ยวข้องมาสำหรับ "ผลิตภัณฑ์ที่เสียหาย" เมื่อเพิ่มความเป็นอิสระของคำถาม ("ระยะเวลาคืนสินค้าสำหรับสินค้าที่เสียหายคือเท่าไร") อัตราคำตอบที่ถูกต้องเพิ่มขึ้นจาก 44% เป็น 90%

กรณีที่ 3 — อดีตที่บวม ในการแชทกับผู้ช่วย 30 รอบ แต่ละสายจะส่งประวัติทั้งหมด ค่าใช้จ่ายเพิ่มขึ้น 3 ครั้งต่อรอบ และการตอบรับก็ช้าลง เมื่อเราเปลี่ยนไปใช้โครงสร้างที่เก็บ 6 รอบล่าสุดและสรุปรอบก่อนหน้า ราคาโทเค็นลดลง 62% และยังคงความสม่ำเสมอไว้

ข้อผิดพลาดทั่วไป

  • ออกจากอำนาจตามพร้อมท์: โมเดลลืม/บายพาส; จำเป็นต้องมีตัวกรอง ACL ในการดึงข้อมูล
  • ไม่ระบุบริบท: โมเดลไม่สามารถอ้างอิงแหล่งที่มาที่ถูกต้องได้
  • ไม่เป็นอิสระจากคำถามติดตามผล: การสืบค้นการค้นหาอย่างไม่มีจุดหมาย
  • ส่งคนตาบอดประวัติศาสตร์ทั้งหมด: ระเบิดด้วยต้นทุนและความล่าช้า สรุป.
  • ไม่เขียนกฎข้อขัดแย้ง: โมเดลอาจนำเสนอแหล่งที่มาที่ไม่น่าเชื่อถืออย่างเป็นทางการ

โดยสรุป

  • การควบคุมการเข้าถึงจะดำเนินการด้วยตัวกรองข้อมูลเมตาในระหว่างขั้นตอนการดึงข้อมูล ไม่ควรนำชิ้นส่วนที่ไม่ได้รับอนุญาตมาด้วย
  • ข้อมูลประจำตัวและสิทธิ์จะถูกกำหนดที่เลเยอร์แอปพลิเคชันที่เชื่อถือได้ คำสั่งทันทีเป็นเพียงการป้องกันเพิ่มเติมอีกชั้นหนึ่ง
  • เทมเพลตข้อความแจ้งที่มีประสิทธิภาพประกอบด้วยบทบาท กฎการปฏิบัติ (พื้นฐาน ไม่ทราบสิทธิ์ แหล่งที่มา ข้อขัดแย้ง) บริบทที่เป็นตัวเลข และคำถาม
  • ในการสนทนาหลายรอบ คำถามติดตามผลจะถูกแยกออกจากกัน และแบบจำลองจะสร้างคำตอบที่สอดคล้องกับประวัติศาสตร์
  • ด้วยการสรุปประวัติอันยาวนาน ต้นทุนและกรอบเวลาบริบทจึงถูกควบคุม ACL จะถูกนำไปใช้ใหม่ทุกรอบ

งานสมัคร

(1) กำหนดกลุ่มการอนุญาตอย่างน้อยสามกลุ่มสำหรับผู้ช่วยของคุณ (เช่น ทุกคน แผนก ผู้จัดการ) และเขียนลงในตารางว่าประเภทเอกสารใดที่จะเปิดให้กลุ่มใด (2) ปรับและเขียนเทมเพลตพร้อมท์ข้างต้นตามบทบาทและน้ำเสียงของคุณ ทำให้บริบทมีหมายเลขและเป็นแหล่งที่มา (3) เขียนสถานการณ์การสนทนาที่สมจริงสามรอบ (คำถาม → การติดตามผล → การติดตามผล) และสร้างคำถามติดตามผลแต่ละคำถามในเวอร์ชันอิสระด้วยตนเอง (4) อธิบายเป็นประโยคเดียวว่าเหตุใดจึงควรใช้ตัวกรอง ACL ซ้ำในแต่ละรอบในสถานการณ์นี้

รายการตรวจสอบ

  • [ ] ฉันใช้การควบคุมการเข้าถึงกับตัวกรองการดึงข้อมูล ฉันแค่ไม่ต้องพึ่งพาพรอมต์
  • [ ] ฉันเพิ่มการต่อสายดิน ฉันไม่ทราบสิทธิ์ แหล่งที่มา และกฎข้อขัดแย้งในเทมเพลตพร้อมท์ของฉัน
  • [ ] ฉันให้หมายเลขส่วนบริบทและการอ้างอิง
  • [ ] ฉันตั้งคำถามติดตามผลอย่างเป็นอิสระก่อนที่จะดึงข้อมูล
  • [ ] ฉันจัดการค่าใช้จ่ายและกรอบเวลาโดยการสรุปประวัติการสนทนาที่ยาวนาน