แพตเทิร์น SQL ที่ใช้ตรวจจับการฉ้อโกงธุรกรรม
(analytics.fixelsmith.com)- การตรวจจับการฉ้อโกงมักเริ่มจากการจัดการ ตารางและการ join ให้ถูกต้องก่อนแมชชีนเลิร์นนิง และใช้ SQL ค้นหารูปแบบผิดปกติด้านความเร็ว ตำแหน่ง จำนวนเงิน ร้านค้า และช่วงเวลา
- Velocity คือการหาระยะที่ธุรกรรมของเจ้าของบัตรเดียวกันกระจุกตัวในช่วงเวลาสั้น ๆ โดยต้องปรับหน้าต่างเวลา ค่าขีดจำกัด และมีไวต์ลิสต์สำหรับ false positive
- Impossible travel ใช้
LAG()และการคำนวณระยะทางเพื่อตรวจจับสัญญาณบัตรถูกโคลนที่รุนแรง เช่น จ่ายเงินที่ Chicago แล้วอีก 7 นาทีต่อมาจ่ายที่ Los Angeles ซึ่งเป็นการเคลื่อนที่ที่เป็นไปไม่ได้ทางกายภาพ - ความผิดปกติของจำนวนเงิน จะหาช่วงยอดอย่าง
$1.00,$99.99,$499.99ที่บ่งชี้การทดสอบบัตรหรือการหลบเลี่ยงกฎ แต่ไม่ค่อยเหมาะกับธุรกรรมสวัสดิการ - เมื่อใช้การพุ่งขึ้นของร้านค้า ธุรกรรมนอกช่วงเวลาปกติ และคอลัมน์อนุพันธ์จาก window function ร่วมกัน ก็สามารถ ให้คะแนนธุรกรรมจากหลายสัญญาณ และลดรอบการทำซ้ำจากหลายสัปดาห์เหลือไม่กี่ชั่วโมงได้
แพตเทิร์น SQL สำหรับหาสัญญาณการฉ้อโกงในข้อมูลธุรกรรม
- การตรวจจับการฉ้อโกงมักเริ่มจาก ตารางและการ join ที่ถูกต้อง รวมถึงการใช้ SQL เพื่อหารูปแบบธุรกรรมแปลก ๆ ก่อนจะไปถึงแมชชีนเลิร์นนิงหรือกราฟดาต้าเบส
- ใช้ได้กับข้อมูลที่มีการเคลื่อนย้ายเงินและมีบันทึกล็อก เช่น บัตรเครดิต การเคลมค่ารักษาพยาบาล อีคอมเมิร์ซ POS และโครงการสวัสดิการภาครัฐ
- เมื่อเจอชุดข้อมูลใหม่ มักค่อย ๆ สะสมแพตเทิร์นตามลำดับ ความเร็ว การเดินทางที่เป็นไปไม่ได้ ความผิดปกติของจำนวนเงิน การกระจุกตัวของร้านค้า ช่วงเวลาผิดปกติ และสัญญาณที่อิง window function
1. Velocity: ธุรกรรมมากเกินไปในช่วงเวลาสั้น ๆ
- หากมีการพยายามรูดใช้บัตรหรือบัญชีที่ถูกขโมยให้หมดอย่างรวดเร็ว มักจะเห็น รูปแบบที่ธุรกรรมกระจุกตัวในช่วงเวลาสั้น ๆ กับเจ้าของบัตรคนเดิม
- คิวรีพื้นฐานจะจัดกลุ่มธุรกรรม 30 วันล่าสุดเป็นรายชั่วโมง แล้วหาระยะที่จำนวนธุรกรรมต่อ
cardholder_idเกินเกณฑ์ - ค่าที่ต้องปรับหลัก ๆ คือ ขนาดหน้าต่างเวลา และ ค่าขีดจำกัดจำนวนธุรกรรม
- สามารถรันเวอร์ชัน 1 นาที 5 นาที และ 1 ชั่วโมงแบบขนานเพื่อเปรียบเทียบได้
- กลุ่มที่ทดสอบบัตรมักอัดธุรกรรมภายในไม่กี่วินาที ขณะที่กลุ่มทุจริตสวัสดิการอาจกระจายการเคลื่อนไหวตลอดครึ่งวัน จึงมีสเกลต่างกัน
- ผู้ใช้ปกติก็อาจเกินเกณฑ์ได้
- ผู้ดูแลตู้ขายสินค้าอัตโนมัติ
- คนที่เติมเงินบัตรเติมเงินจำนวนมาก
- หลังจากสำรวจรอบแรกแล้ว จึงต้องมี ไวต์ลิสต์สำหรับ false positive เหล่านี้
- วิธี sliding window ใช้
COUNT(*) OVER (...) RANGE BETWEEN INTERVAL '5 minutes' PRECEDING AND CURRENT ROWเพื่อคำนวณจำนวนธุรกรรมใน 5 นาทีล่าสุด QUALIFYใช้งานได้ใน Snowflake, BigQuery, Databricks, Teradata- ใน Postgres ต้องครอบคิวรีทั้งหมดด้วย CTE แล้วค่อยกรองด้านนอก
2. Impossible travel: การเคลื่อนที่ที่เป็นไปไม่ได้ทางกายภาพ
- หากบัตรใบเดียวกันจ่ายเงินที่ Chicago แล้วอีก 7 นาทีต่อมาจ่ายที่ Los Angeles มีโอกาสสูงว่าหนึ่งในสองรายการเป็นของปลอม
- แพตเทิร์นนี้เป็นสัญญาณแรงในการจับ บัตรที่ถูกโคลน เพราะแทบไม่มีเหตุผลปกติที่บัตรใบเดียวจะไปอยู่สองสถานที่ไกลกันภายในไม่กี่นาที
- คิวรีจะใช้
LAG()ดึงเวลาและตำแหน่งของธุรกรรมก่อนหน้า จากนั้นคำนวณระยะทางและเวลาระหว่างตำแหน่งก่อนหน้ากับตำแหน่งปัจจุบัน haversineเป็นฟังก์ชันสำหรับคำนวณ ระยะทางตามแนววงกลมใหญ่ (great-circle distance)- ดาต้าแวร์เฮาส์ส่วนใหญ่มีให้
- ถ้าไม่มี ก็เป็นฟังก์ชันที่เขียนเองได้ไม่ยาก
- ตัวอย่างค่าขีดจำกัดคือ 600mph
- เพราะความเร็วเดินทางของเครื่องบินพาณิชย์อยู่ราว 575mph จึงหมายถึงเร็วเกินกว่าจะเป็นไปได้แม้เดินทางด้วยเครื่องบิน
- ถ้าลดลงเหลือ 100mph ก็จะจับการเคลื่อนที่เร็วบนพื้นดินได้ด้วย แต่จะเริ่มกินธุรกรรมปกติของผู้โดยสารเครื่องบินจริง หรือพ่อแม่ที่ขับรถพาลูกไปส่ง
- ยังมีสัญญาณอื่นในตระกูลเดียวกันที่ดูเพิ่มได้
- ถ้ามีธุรกรรมในสองเมืองที่ห่างกันมากภายในรัฐเดียวกันในเวลา 5 นาที อาจบ่งชี้ ขบวนการโคลนบัตรในพื้นที่
- ถ้ามีธุรกรรมในหลาย ZIP code ภายใน 1 ชั่วโมง อาจบ่งชี้ ขบวนการ skimmer ที่เคลื่อนไหวอยู่ในพื้นที่เดียวกัน
- ธุรกรรมที่ข้ามพรมแดนภายใน 10 นาที อาจเป็นสัญญาณของ ขบวนการระหว่างประเทศ
3. Amount anomalies: ธุรกรรมผิดปกติที่จำนวนเงินบางช่วง
- ในการฉ้อโกงมี รูปแบบจำนวนเงิน ที่พบได้บ่อย แต่ไม่ค่อยเกิดในการใช้งานปกติ
- ตัวอย่างเงื่อนไขจะหาช่วงจำนวนเงินต่อไปนี้
$1.00,$5.00,$10.00- ตั้งแต่
$99.50ขึ้นไปแต่ต่ำกว่า$100.00 - ตั้งแต่
$499.50ขึ้นไปแต่ต่ำกว่า$500.00
- จำนวนเงินดอลลาร์เต็ม ๆ ที่เล็กมักเป็นสัญญาณของ การทดสอบบัตร
- คือการตรวจว่าหมายเลขบัตรที่ได้มาจาก card dump ใช้งานได้จริงหรือไม่ก่อนนำไปขายต่อ
- โดยทั่วไปเจ้าของบัตรจริงไม่ค่อยซื้อของราคาเป๊ะ ๆ ที่
$1.00 - กาแฟมักเป็น
$4.73ค่าน้ำมันมักเป็น$52.81มากกว่าจะเป็นยอดปัดกลมพอดี
- จำนวนเงินที่อยู่ต่ำกว่าค่าขีดจำกัดเล็กน้อยมีความหมายอีกแบบ
$99.99อาจเป็นรูปแบบที่พยายามหลบเส้นที่หลายแห่งกำหนดให้ต้องตรวจบัตรประชาชนตั้งแต่$100ขึ้นไป$499.99อาจเป็นรูปแบบที่พยายามหลบวงเงินถอน ATM รายวัน$500- เป็นสัญญาณว่าผู้ทำธุรกรรมรู้กฎและตั้งใจอยู่ต่ำกว่าเกณฑ์
- สำหรับธุรกรรมสวัสดิการ แพตเทิร์นจำนวนเงินแบบปัดกลม ไม่ค่อยช่วยมาก
- สวัสดิการไม่ได้ถูกทดสอบบัตรในลักษณะเดียวกัน
- ปกติแล้วผู้รับสิทธิ์ซ้ำซ้อนมักเป็นสัญญาณที่สำคัญกว่า
4. Suspicious merchants: การกระจุกตัวผิดปกติในระดับร้านค้า
- หากเครื่องอ่านบัตรเฉพาะจุด เช่น เครื่องอ่านที่ปั๊มน้ำมัน ติด skimmer ขึ้นมา มันอาจไม่จบแค่รายการเดียว แต่ลามเป็น ธุรกรรมฉ้อโกงหลายสิบรายการ
- บัตรทุกใบที่ใช้กับเครื่องอ่านนั้นตลอดหลายสัปดาห์อาจถูกเก็บเข้าไปในฐานข้อมูลของใครบางคน
- ในมุมร้านค้า มักเห็นเป็นรูปแบบที่ภายในช่วงเวลาสั้น ๆ จำนวนบัตรที่ไม่เกี่ยวข้องกันเพิ่มขึ้นมากกว่าปกติ และยอดธุรกรรมก็สูงขึ้นด้วย
- ตัวอย่างเกณฑ์แบบง่ายคือจัดกลุ่มตามร้านค้าและรายชั่วโมงในช่วง 7 วันล่าสุด แล้วคำนวณ
- จำนวนบัตรไม่ซ้ำ
- จำนวนธุรกรรมรวม
- มูลค่าธุรกรรมรวม
- ค้นหาช่วงเวลาที่มีบัตรไม่ซ้ำเกิน 20 ใบ และยอดรวมเกิน
$5000
- ค่าขีดจำกัดแบบคงที่มีปัญหาเรื่องการชดเชยขนาด
- Costco อาจเกินเกณฑ์นี้ได้ภายใน 90 วินาที
- แต่ร้านหนังสือมือสองอาจแทบไม่เคยเกินเลย
- วิธีที่ดีกว่าคือเทียบแต่ละร้านค้าเข้ากับ ค่า baseline ในอดีตของตัวเอง
- จัดกลุ่มธุรกรรม 60 วันล่าสุดเป็นรายชั่วโมง
- คำนวณค่าเฉลี่ยจำนวนบัตรไม่ซ้ำของแต่ละร้านค้าโดยอิงจาก 168 hourly bucket ย้อนหลัง
- หาช่วงที่จำนวนบัตรไม่ซ้ำปัจจุบันมากกว่าค่าเฉลี่ยในอดีต 3 เท่า
- 168 hourly bucket คือ ช่วงรายชั่วโมงของ 7 วันที่ผ่านมา
- เพราะ seasonality รายวันและรายสัปดาห์มีความสำคัญ
- แม้เป็นร้านกาแฟเดียวกัน baseline ตอนบ่าย 2 วันอังคารกับ 9 โมงเช้าวันเสาร์ก็ไม่เหมือนกัน
- จุดตั้งต้นอาจใช้ 3 เท่าของค่าปกติ
- หลวมพอที่จะไม่ทำให้มี alert ถล่มเข้ามามากเกินไป
- แต่ก็ยังเข้มพอจะจับช่วงเวลาที่ผิดปกติจริงได้
5. Off-hours: ธุรกรรมนอกช่วงเวลาที่บุคคลนั้นมักใช้งาน
- คนส่วนใหญ่มีรูปแบบการใช้จ่ายของตัวเอง
- ถ้าคนที่ทำงาน 9 โมงถึง 5 โมงเย็นจู่ ๆ ไปเติมน้ำมันตอนตี 3 ก็อาจหมายถึงบัตรถูกคนอื่นใช้ หรือกำลังเดินทางอยู่
- เรื่องกำลังเดินทางหรือไม่สามารถตรวจเพิ่มด้วยสัญญาณอื่นได้
- คิวรีจะนับจำนวนธุรกรรมตามเจ้าของบัตรและชั่วโมงในช่วง 90 วันล่าสุด แล้วถือว่าเฉพาะชั่วโมงที่มีธุรกรรมอย่างน้อย 2 ครั้งเท่านั้นเป็น ช่วงเวลาปกติ
- จากนั้นถ้าเวลาของธุรกรรมใหม่อยู่นอกช่วง
earliest_hourถึงlatest_hourของเจ้าของบัตรนั้น ก็จะถูกตรวจจับ - เงื่อนไข “อย่างน้อย 2 รายการในชั่วโมงนั้น” ในคิวรีด้านในมีความสำคัญ
- เพื่อกันไม่ให้การเติมน้ำมันดึก ๆ เพียงครั้งเดียวเมื่อ 3 เดือนก่อนถูกนับเป็นช่วงเวลาปกติ
- ทำให้เกณฑ์อิงกับ พฤติกรรมจริง ไม่ใช่ “เคยเกิดขึ้นครั้งหนึ่ง”
- ข้อเสียคือ ต้องมีข้อมูลประวัติ
- บัญชีใหม่ยังไม่มี baseline
- สำหรับบัญชีใหม่อาจใช้แพตเทิร์นช่วงเวลาของผู้ใช้ทั้งหมด หรือข้ามแพตเทิร์นนี้ไปจนกว่าจะมีข้อมูลสะสมหลายเดือน
6. การรวมสัญญาณด้วย window function
- แพตเทิร์น window function ไม่ใช่ประเภทการฉ้อโกงแยกต่างหาก แต่เป็นงานเตรียมให้แพตเทิร์นทั้งห้าก่อนหน้านี้กลายเป็น สัญญาณที่นำมาประกอบกันได้
- สามารถสร้างคอลัมน์อนุพันธ์ต่อธุรกรรมไว้ล่วงหน้าได้ เช่น
- เวลาที่ผ่านไปนับจากธุรกรรมก่อนหน้า:
timestamp - LAG(timestamp) - มีการเปลี่ยนร้านค้าหรือไม่: เปรียบเทียบ
merchant_idก่อนหน้ากับmerchant_idปัจจุบัน - ยอดสะสมใน 24 ชั่วโมงล่าสุด:
SUM(amount) OVER (...) - เป็นธุรกรรมลำดับที่เท่าไรของวันนั้น:
ROW_NUMBER()
- เวลาที่ผ่านไปนับจากธุรกรรมก่อนหน้า:
- เมื่อ materialize คอลัมน์เหล่านี้ไว้ กฎตรวจจับการฉ้อโกงก็จะยุบเหลือแค่ filter expression ง่าย ๆ
- กลุ่มทดสอบบัตรอาจหาได้ด้วยเงื่อนไขต่อไปนี้
- เป็นธุรกรรมลำดับที่ 5 ของวันหรือมากกว่า
- ห่างจากธุรกรรมก่อนหน้าไม่ถึง 60 วินาที
- ร้านค้าแตกต่างจากธุรกรรมก่อนหน้า
- ถ้าสามารถเขียนสมมติฐานการฉ้อโกงใหม่เป็น SQL filter แทนการเปิด engineering ticket ได้ รอบการทำซ้ำก็จะลดจาก หลายสัปดาห์เหลือไม่กี่ชั่วโมง
- ผลลัพธ์คือจับการฉ้อโกงได้มากขึ้นและเร็วขึ้น
วิธีใช้แพตเทิร์นร่วมกัน
- ไม่มีแพตเทิร์นใดแพตเทิร์นหนึ่งเพียงลำพังที่เพียงพอ
- แต่ละแพตเทิร์นมีข้อจำกัดชัดเจน
- Velocity มี false positive อย่างผู้ดูแลตู้ขายสินค้าอัตโนมัติ
- การเคลื่อนที่ที่เป็นไปไม่ได้ทางภูมิศาสตร์จะพลาดการฉ้อโกงที่เกิดภายในเขตเมืองใหญ่เดียวกัน
- ความผิดปกติของจำนวนเงินไม่ค่อยแม่นนอกบริบทการทดสอบบัตร
- กฎช่วงเวลาผิดปกติต้องอาศัยประวัติ
- ในงานจริง วิธีที่ใช้ได้ผลคือรันทุกแพตเทิร์น แล้ว ให้คะแนนแต่ละธุรกรรมจากหลายสัญญาณ
- ธุรกรรมที่โดน 3 หรือ 4 สัญญาณพร้อมกันแทบจะเป็นการฉ้อโกงเสมอ
- ธุรกรรมที่โดนแค่ 1 สัญญาณอาจเป็นเพียงการใช้งานแปลก ๆ ของเจ้าของบัตรปกติที่กำลังเดินทาง
- ถ้าเพิ่งเริ่มทำการตรวจจับการฉ้อโกง ควรเริ่มจาก Velocity
- เปิดให้เห็นการฉ้อโกงได้ในปริมาณที่มีประโยชน์
- จับกิจกรรมปกติค่อนข้างน้อย
- และมีต้นทุนในการรันต่ำ
- ถ้ามีข้อ 1 ถึง 5 อยู่แล้ว จุดที่ควรลงทุนต่อคือ raw column ที่อิง window function
- สร้างครั้งเดียวแล้วนักวิเคราะห์ทุกคนในทีมใช้ต่อได้
- การเพิ่มแพตเทิร์นฉ้อโกงถัดไปก็ไม่ต้องกลายเป็นอีกโปรเจกต์หนึ่ง
ข้อควรระวัง
-
การจัดการ NULL
- ตารางธุรกรรมจริงมักไม่ได้ใช้
NULLแบบในตำรา SQL เบื้องต้น - ระบบ legacy จำนวนมากใช้ sentinel value อย่าง
9999-12-31สำหรับ “ไม่มีวันสิ้นสุด” และ0001-01-01สำหรับ “ไม่มีวันเริ่มต้น” - ถ้ากรองด้วย
IS NULLอาจพลาดแถวเหล่านี้ไปแบบเงียบ ๆ - ควรตรวจธรรมเนียมของตารางนั้นก่อน แล้วค่อยเขียน
WHEREclause
- ตารางธุรกรรมจริงมักไม่ได้ใช้
-
False positive
- ทุกกฎสามารถจับเจ้าของบัตรจริงที่มีพฤติกรรมผิดปกติแต่ถูกต้องตามกฎหมายได้
- เคสที่ถูกปักธงต้องมี การตรวจสอบโดยมนุษย์
- ต้องมี feedback loop เพื่อปรับค่าขีดจำกัดโดยอิงจากสิ่งที่เป็นการฉ้อโกงจริงและไม่ใช่จริง
- ถ้าบล็อกอัตโนมัติด้วยกฎเดี่ยวเพียงข้อเดียว อาจเสียลูกค้าได้
-
ข้อมูลส่วนบุคคล
- หากข้อมูลมี PII ต้องปฏิบัติตาม นโยบายการใช้ข้อมูล ที่เกี่ยวข้อง
- ควรเริ่มจากข้อมูลที่ไม่ระบุตัวตนหรือข้อมูลตัวอย่างก่อน และใช้ข้อมูลโปรดักชันหลังได้รับอนุมัติแล้วเท่านั้น
-
ต้นทุน
- window function บนพาร์ทิชันขนาดใหญ่ไม่ได้ราคาถูก
- ควรกรองช่วงวันที่ก่อน แล้วค่อยใช้ window function
- ถ้ารัน
LAG()กับธุรกรรม 2 ปีของทั้งชุดข้อมูลก่อน แล้วค่อยใส่WHEREทีหลัง อาจกินงบ warehouse credit อย่างมาก
4 ความคิดเห็น
ดูเป็นวิธีที่เคยถูกนำมายืมใช้ในระบบบัญชีธนาคารและระบบช่องทางมาก่อนนะครับ
ความคิดเห็นใน Hacker News
เกณฑ์ที่ว่าผู้ถือบัตรตัวจริงแทบไม่ค่อยซื้อของราคา $1.00 เป๊ะ ๆ ดูจะขึ้นอยู่กับว่าผู้ขายตั้งราคาอย่างไรไม่ใช่หรือ
เวลาจะทดสอบบัตรเครดิตที่ขโมยมาโดยซื้ออะไรสักอย่างบนเว็บไซต์ ผู้ซื้อก็ไม่ได้กำหนดราคาเองได้ตามใจ
อีกอย่างมันยังดูคิดอยู่บนสมมติฐานแบบสหรัฐฯ มากเกินไป ซึ่งราคาไม่รวมภาษี แต่ในภูมิภาคอื่น ๆ ราคากลม ๆ เป็นเรื่องปกติมาก
เกณฑ์อื่น ๆ ในบทความก็น่าสงสัยว่าจะใช้ได้ดีแค่ไหน เช่น ถ้าตั้งธงคนที่ทำธุรกรรมนอกช่วงเวลาที่ปกติทำเกิน 2 ครั้งในช่วง 90 วันที่ผ่านมา แบบนั้นคงจับคนได้สักครึ่งหนึ่งหรือเปล่า
ไม่ชัดว่านี่เป็นบทความที่เอาความรู้เฉพาะทางซับซ้อนมาทำให้ง่ายเกินไปด้วย SQL query ธรรมดา ๆ หรือเป็นแค่การเดาและแต่งขึ้นทั้งหมด ประโยค “หกแพตเทิร์น SQL ที่ใช้จับธุรกรรมฉ้อโกง” กับ “ไม่มีอะไรในนี้ที่ฉันเคยทำจริงหรือเคยเห็นจริง” มันขัดกันเอง
ปกติคงไม่ไปซื้อน้ำมัน กาแฟ หรือขนมตอนตี 2 แต่ถ้าเกิดทำแบบนั้นนาน ๆ ที ก็น่าจะเป็นเหตุฉุกเฉินส่วนตัว และคงไม่อยากโทรหาธนาคารในจังหวะนั้น
เข้าใจว่าโจรแบบฉวยโอกาสก็อาจออกปฏิบัติการเวลานั้นได้ แต่ ต้นทุนของ false positive ก็มีจริงเหมือนกัน
อีกทั้งยังมีปั๊มน้ำมันที่ให้เลือกยอดตายตัวอย่าง 10, 20 หรือ 50 ยูโรด้วย
ปรากฏว่าบัตรถูกบล็อกเพราะสงสัยว่าเป็นการฉ้อโกง ซึ่งน่าหงุดหงิดมาก ไม่ใช่เรื่องที่อยากจัดการตอนตี 2 ขณะเมา
บางทีอาจพูดได้ว่ามันปกป้องฉันจากตัวเอง แต่ก็ยังน่ารำคาญอยู่ดี
และการรู้จำแพตเทิร์นแบบ heuristic ที่ไม่ได้หวังความแม่นยำเกือบ 100% แบบนี้ ไม่ใช่งานที่ AI ควรจะถนัดพอดีหรือ
เกณฑ์ “ข้ามพรมแดนภายใน 10 นาทีคือองค์กรข้ามชาติ” ใช้ได้กับคนธรรมดาที่อาศัยอยู่ใน พื้นที่ติดชายแดนของยุโรป ด้วยเหมือนกัน
ต่อให้ตัดธุรกรรมแบบไม่ใช้บัตรจริงออกไป ก็ยังดูเหมือนตั้งสมมติฐานผิด ๆ ว่าตำแหน่งร้านค้าทั้งหมดถูกตั้งค่าอย่างแม่นยำ การขายทั้งหมดเกิดในร้านออฟไลน์ ไม่มีการขายเคลื่อนที่ และทุกธุรกรรมถูกประมวลผลแบบออนไลน์
อ่านจนจบแล้วจะเห็นว่ามันเป็นคำแนะนำที่กลวงและขัดแย้งกันเอง ดูแทบจะแน่ใจได้ว่าเป็น บทความที่ LLM สร้าง
บอกว่า “ทีมของคุณ” ไม่ควรพึ่งพาแพตเทิร์นใดแพตเทิร์นหนึ่ง แต่ก็กลับบอกว่าแพตเทิร์นแรกเพียงอย่างเดียวก็เผย “ปริมาณการฉ้อโกงที่มีประโยชน์” ได้
ยังมีประโยคประหลาดอย่าง “นักวิเคราะห์ทุกคนในทีมจะใช้สิ่งเหล่านั้น นั่นคือ window function เมื่อมีมัน และการเพิ่มแพตเทิร์นฉ้อโกงถัดไปจะไม่ใช่โปรเจกต์”
อีกทั้งตัวอย่างแทบทั้งหมดไม่ได้ใช้
IS NULLเลย แต่กลับมีการอภิปรายที่ไม่เกี่ยวกันว่าการกรองIS NULLอาจไม่ถูกนำไปใช้ และตัวอย่างเดียวที่ใช้ก็อยู่คนละบริบทโดยรวมคือ คุณภาพต่ำและยาวเกินไป
Hacker News เรื่องนี้ต้องพูดกันตรง ๆ
“Fixel Smith” คือ ตัวตนที่ AI สร้างขึ้น และบทความนี้แทบไม่เกี่ยวกับการวิเคราะห์การฉ้อโกงเลย ชื่อนี้ถูกใช้เป็นแทบทุกตัวตนที่นึกออกได้ ทั้งนักดนตรี (1) นักเขียนนิยาย (2) นักวิเคราะห์การฉ้อโกง (3) อินฟลูเอนเซอร์ (4)
ได้คะแนนเกิน 220 และมีคอมเมนต์เกิน 70 แต่แทบไม่มีใครสังเกตว่าบทความนี้ปลอมพอตัว และไม่มีใครเห็นว่าผู้เขียนเป็นตัวละครที่ AI สร้าง
https://www.amazon.it/Forged-Soundtrack-Explicit-Fixel-Smith...
https://fixelsmith.com
https://analytics.fixelsmith.com/
https://www.instagram.com/fixeltales/
เลยชวนสงสัยว่าน้ำท่วมจาก AI นี้กำลังเปิดเผยความจริงที่น่าอึดอัดเกี่ยวกับวิจารณญาณของชุมชน หรือเป็นแค่ความล้มเหลวของกลไกป้องกันเดิมที่แก้ไขได้ถ้าปรับให้ถูกจุด
ถ้าสมมติว่าคอมเมนต์ทั้งหมดเขียนด้วยความสุจริตใจ แม้แต่ที่นี่ยังมี ความรู้เท่าทัน AI ต่ำ ก็ถือว่าน่ากังวลพอสมควร
งานนิยายแทบไม่เกี่ยวอะไรกับบทความวิเคราะห์ และบทความวิเคราะห์ก็ดูมี สำนวนแบบ LLM เลยยิ่งน่าสงสัยไปหมด พอนึกว่าหัวข้อของต้นฉบับคือการฉ้อโกงก็ยิ่งประชดดี
พูดตรง ๆ คือปกติฉันแทบไม่ดูแม้แต่ชื่อผู้เขียน และยิ่งไม่ค่อยไปดูส่วนอื่นของเว็บไซต์
จะเป็นข้อมูลแต่งหรือไม่ก็ยังไม่ชัด แต่เราก็วิจารณ์เนื้อหาของบทความได้โดยไม่ต้องเดาว่า LLM เขียนหรือเป็นนิยาย เพราะมีข้อบกพร่องที่เจาะจงกว่านั้นอีกมาก
พวกเรากำลังพัฒนาเฟรมเวิร์กความปลอดภัยโอเพนซอร์ส tirreno
ฉันสงสัยแนวทางที่อธิบายไว้ที่นี่ เช่น impossible travel เป็นเทคนิคที่ใช้จริงและแพร่หลาย แต่เกี่ยวกับพฤติกรรมผู้ใช้ออนไลน์ที่อิงจากที่อยู่ IP
ใน tirreno มี rule แยกสำหรับกรณีที่ชัดเจนว่า IP มาจาก Apple Relay หรือ VPN/Tor และพวกนั้นก็เป็นแฟล็กอีกชุดหนึ่งต่างหาก
ฉันคิดว่าตัวอย่างบางส่วนหรือทั้งหมดน่าจะถูกสร้างโดย LLM เพราะบริบทปนกันมั่ว และในโลกจริงไม่มีใครเก็บตำแหน่ง GPS ของการจ่ายเงินผ่านบัตรในปริมาณมากแบบนั้น
นี่ใกล้เคียงกับ ตรรกะแบบอิงกฎ ที่เข้ารหัสเป็น SQL query โดยไม่มีข้อมูลหลักฐานมารองรับมากกว่า
มี threshold เต็มไปหมด แต่ไม่มีข้อมูลว่าค่า threshold เหล่านั้นมีความหมายจริง
คำยืนยันทำนองว่า “การตรวจจับการฉ้อโกงในข้อมูลธุรกรรมส่วนใหญ่คือ SQL ไม่ใช่ machine learning ไม่ใช่ graph database และไม่ใช่อะไรก็ตามที่ Gartner กำลังปั่นในปีนี้” จะพอฟังขึ้นก็ต่อเมื่อกำลังพูดถึงงานด้าน program integrity ทั้งหมด
ถ้าวิธีที่ง่ายกว่าและหยาบกว่าช่วยแก้ปัญหาในโดเมนได้ มันก็อาจดีกว่า
ลูกค้า fintech มักอยากรู้ว่าธุรกรรมที่กำลังเกิดขึ้นตอนนี้เป็นการฉ้อโกงหรือไม่ และต้องการคำตอบภายในไม่กี่มิลลิวินาทีบนข้อมูลมิติสูง งานนี้มีขนาดและข้อจำกัดแบบเรียลไทม์ที่ relational database มักรองรับได้ยาก จึงมักถูกใช้กับอย่างอื่นแทน เช่น การโหลดข้อมูลย้อนหลัง
นั่นจึงเป็นเหตุผลที่มีทั้งฐานข้อมูล in-memory, stream processing engine และ machine learning เข้ามาเกี่ยวข้อง
ถึงอย่างนั้นบางประเด็นของผู้เขียนก็สมเหตุสมผล โดยเฉพาะปัญหาการรับมือกับการแจ้งเตือนที่มีสัญญาณรบกวนเยอะ ซึ่งเป็นปัญหาทั่วไปที่ไกลเกินกว่าแค่งาน performance engineering เลยทำให้อยากอ่านบทความถัดไป
ฝั่งการป้องกันจะถูกจำกัดด้วยข้อกำหนดด้าน latency ข้อมูลที่มีให้ใช้ และภาพพฤติกรรมของผู้ใช้ที่ไม่สมบูรณ์เสมอ เราใช้ machine learning และกฎเพื่อให้ตัดสินใจได้เร็วและจัดการเคสส่วนใหญ่ แต่ด้วยข้อจำกัดเหล่านั้นจึงไม่อาจหยุดการฉ้อโกงทั้งหมดได้อย่างแม่นยำ
ส่วนการตรวจจับจะจัดการกับผลลัพธ์หลังจากนั้น โดยทั่วไปจะมีทีมนักวิเคราะห์คอยวิเคราะห์ธุรกรรมที่ได้รับอนุมัติแล้วเพื่อหาสัญญาณการฉ้อโกง เรื่องนี้สำคัญมากโดยเฉพาะกับประเภทการฉ้อโกงที่ไม่มีสัญญาณภายนอกอย่าง chargeback หรือคำร้องเรียนจากลูกค้า เช่น platform integrity ก็เป็นตัวอย่างหนึ่ง และระบบต่อต้านการฟอกเงินของ fintech ก็ต้องออกตามหาการฉ้อโกงเช่นกัน
ที่ว่าทั้งสองเสริมกันก็เพราะธุรกรรมที่ตรวจพบภายหลังจะกลายเป็น label สำหรับฝึกและประเมินโมเดลการป้องกันรุ่นถัดไป
เขาบอกว่าถ้ารูดบัตรในชิคาโกแล้วอีก 7 นาทีต่อมารูดอีกครั้งที่ลอสแอนเจลิส อย่างใดอย่างหนึ่งต้องปลอม ฉันเลยสงสัยว่าแล้วในกรณี การช็อปปิงออนไลน์ มันทำงานยังไง
ถ้านั่งบนโซฟาแล้วซื้อของจาก Amazon ระบบจะลงที่อยู่ว่าอยู่ที่ไหน
และยังมีกรณีขอบอย่างคู่สมรสใช้บัญชีออนไลน์ร่วมกัน แล้วอีกคนกำลังเดินทางและซื้อของด้วยข้อมูลบัตรที่บันทึกไว้ด้วย
ร้านค้าและธนาคารแยกความต่างนี้ได้
ประเด็นที่ว่า “วิธีนี้ใช้ไม่ได้จนกว่าจะมีประวัติสะสมพอ และบัญชีใหม่ไม่มี baseline” เป็นองค์ประกอบด้าน ประสบการณ์ลูกค้า ที่คนมองข้ามกันมาก
ถ้าฉันเป็นลูกค้าใหม่หรือมีพฤติกรรมใหม่ แล้วบัตรถูกปฏิเสธ มันจะรู้สึกเหมือนซอฟต์แวร์ทำงานดี
แต่ถ้าฉันมีประวัติที่ผ่านมาแล้วว่าเป็นคนยืนยันธุรกรรมจริง และยังถูกปฏิเสธอีก แบบนั้นจะรู้สึกรำคาญกับอัลกอริทึมที่ทั้งใสซื่อและหวาดระแวง
ธุรกรรมฉ้อโกงสุดท้ายแล้วมักถูกยกเลิกหรือคืนเงิน ทำให้ธนาคารต้องรับภาระขาดทุนเอง ส่วนธุรกรรมที่ถูกปฏิเสธก็แค่ทำให้มีลูกค้าโกรธเพิ่มอีกคนหนึ่ง และลูกค้าก็มักบ่นแล้วก็ลืมไปในไม่ช้า ดังนั้นภาระของต้นทุนที่ถูกผลักออกไปจึงตกอยู่กับลูกค้า
เพราะฉะนั้นธนาคารจึงมีแรงจูงใจให้พลาดไปในทางระวังเกินไว้ก่อน และพร้อมจะปฏิเสธธุรกรรมแม้จะมี false positive ก็ตาม
แก่นของ machine learning ไม่ใช่การเรียนรู้กฎแบบนี้จากข้อมูลหรือ
ฉันคิดว่าแนวทางที่ถูกคือใช้โมเดล machine learning หาแพตเทิร์นที่สัมพันธ์กับการฉ้อโกง แล้วประเมินว่ามีอันไหนที่ฟังขึ้นบ้าง แบบนั้นอาจค้นพบ สมมติฐานใหม่ ได้ด้วย
นักวิเคราะห์ที่เป็นมนุษย์ควรจะอธิบายให้ทีม compliance ฟังได้ด้วย อีเมล 5 นาที ว่าทำไมธุรกรรมหนึ่งจึงถูกปฏิเสธ และถ้าอยากเลี่ยงการตัดสินใจเชิงลบต้องทำอะไรให้ต่างออกไป
เวลาซ่อมปัญหาหนึ่งด้วย machine learning มักจะได้ปัญหาใหม่อีกสองอย่างที่ยังมองไม่ชัดตามมา พอเวลาผ่านไปและสิ่งต่าง ๆ เปลี่ยนไป SQL ก็มักมีเรื่องให้ประหลาดใจน้อยกว่า ทั้งในแง่ regression และผลข้างเคียงที่คาดไม่ถึง
พอเห็นว่าเป็นจำนวนเงินลงท้ายเลขกลม ๆ ก็สงสัยว่าคืออะไร.. ที่แท้ก็หมายถึง rounded นี่เอง
ทำไมถึงแปลแบบนั้นนะ T_T ฉันแก้ไว้แล้วครับ