โมเดลและแพลตฟอร์ม AI
การฝังตัวโค้ด: คู่มือที่ครอบคลุม
การฝังตัวโค้ดเป็นวิธีการที่เปลี่ยนแปลงไปในการแสดงโค้ดส่วนเป็นเวกเตอร์ที่หนาแน่นในพื้นที่ต่อเนื่อง เหล่านี้การฝังตัวจับความสัมพันธ์ทาง语义และหน้าที่ระหว่างโค้ดส่วน ทำให้สามารถนำไปใช้ได้ในหลาย ๆ ด้าน เช่น การค้นหาโค้ด การเติมโค้ดอัตโนมัติ การตรวจสอบและแก้ไขโค้ดอัตโนมัติ และอื่น ๆ
การฝังตัวโค้ดคืออะไร?
การฝังตัวโค้ดแปลงโครงสร้างโค้ดที่ซับซ้อนให้เป็นเวกเตอร์ตัวเลขที่จับความหมายและหน้าที่ของโค้ดได้ ไม่เหมือนกับวิธีการแบบดั้งเดิมที่รักษาโค้ดเป็นลำดับของตัวอักษร การฝังตัวจับความสัมพันธ์ทาง语义ระหว่างส่วนต่าง ๆ ของโค้ด ซึ่งเป็นสิ่งสำคัญสำหรับงานวิศวกรรมซอฟต์แวร์ที่ขับเคลื่อนด้วย AI เช่น การค้นหาโค้ด การเติมโค้ดอัตโนมัติ การตรวจสอบและแก้ไขโค้ดอัตโนมัติ และอื่น ๆ
ตัวอย่างเช่น พิจารณาฟังก์ชัน Python สองตัวต่อไปนี้:
def add_numbers(a, b): return a + b
<p>def sum_two_values(x, y): result = x + y return result</p>
แม้ว่าฟังก์ชันเหล่านี้จะมีลักษณะแตกต่างกันทาง句法 แต่它们ทำหน้าที่เดียวกัน การฝังตัวโค้ดที่ดีจะแสดงฟังก์ชันเหล่านี้ด้วยเวกเตอร์ที่คล้ายกัน จับความคล้ายคลึงกันทางหน้าที่尽管มีความแตกต่างทางข้อความ
การฝังตัวโค้ดสร้างขึ้นอย่างไร?
มีเทคนิคต่าง ๆ สำหรับการสร้างการฝังตัวโค้ด วิธีการทั่วไปหนึ่งคือการใช้เครือข่ายประสาทเพื่อเรียนรู้การแสดงนี้จากชุดข้อมูลโค้ดขนาดใหญ่ เครือข่ายวิเคราะห์โครงสร้างโค้ด รวมถึงโทเค็น (คีย์เวิร์ด ไอเดนติฟายเออร์) ไวยากรณ์ (วิธีการจัดโครงสร้างโค้ด) และอาจรวมถึงคำอธิบายเพื่อเรียนรู้ความสัมพันธ์ระหว่างโค้ดส่วนต่าง ๆ
มาทำความเข้าใจกระบวนการ:
- โค้ดเป็นลำดับ: โค้ดส่วนถูกปฏิบัติเป็นลำดับของโทเค็น (ตัวแปร คีย์เวิร์ด ออปเปอร์เรเตอร์)
- การฝึกเครือข่ายประสาท: เครือข่ายประสาทประมวลผลลำดับเหล่านี้และเรียนรู้ที่จะแมปมันให้เป็นการแสดงเวกเตอร์ขนาดคงที่ เครือข่ายพิจารณาปัจจัยเช่น ไวยากรณ์ สารสนเทศ และความสัมพันธ์ระหว่างองค์ประกอบโค้ด
- การจับคล้ายคลึง: การฝึกมุ่งหมายที่จะวางโค้ดส่วนคล้ายคลึงกัน (มีหน้าที่คล้ายคลึงกัน) ใกล้กันในพื้นที่เวกเตอร์ ทำให้สามารถทำงานเช่นการค้นหาโค้ดหรือการเปรียบเทียบฟังก์ชัน
ตัวอย่าง Python ที่เรียบง่ายของการประมวลผลโค้ดสำหรับการฝังตัว:
import ast
<p>def tokenize_code(code_string):
tree = ast.parse(code_string)
tokens = []
for node in ast.walk(tree):
if isinstance(node, ast.Name):
tokens.append(node.id)
elif isinstance(node, ast.Str):
tokens.append('STRING')
elif isinstance(node, ast.Num):
tokens.append('NUMBER')
# เพิ่มประเภทโหนดตามความจำเป็น
return tokens</p>
<p># ตัวอย่างการใช้งาน
code = """
def greet(name):
print("Hello, " + name + "!")
"""
</p>
<p>tokens = tokenize_code(code)
print(tokens)
# ออกพุต: ['def', 'greet', 'name', 'print', 'STRING', 'name', 'STRING']</p>
การแสดงโทเค็นนี้สามารถป้อนเข้าเครือข่ายประสาทสำหรับการฝังตัวได้
วิธีการที่มีอยู่สำหรับการฝังตัวโค้ด
วิธีการที่มีอยู่สำหรับการฝังตัวโค้ดสามารถแบ่งออกเป็นสามประเภทหลัก:
วิธีการแบบโทเค็น
วิธีการแบบโทเค็นปฏิบัติโค้ดเป็นลำดับของโทเค็นเล็กซิเคิล เทคนิคเช่น Term Frequency-Inverse Document Frequency (TF-IDF) และโมเดลการเรียนรู้ลึก เช่น CodeBERT ตกอยู่ในหมวดหมู่นี้
วิธีการแบบต้นไม้
วิธีการแบบต้นไม้แยกโค้ดออกเป็นต้นไม้โครงสร้างนามธรรม (AST) หรือโครงสร้างต้นไม้อื่น ๆ เพื่อจับกฎไวยากรณ์และสารสนเทศของโค้ด ตัวอย่างเช่น โมเดล code2vec และ ASTNN
วิธีการแบบกราฟ
วิธีการแบบกราฟสร้างกราฟจากโค้ด เช่น กราฟการไหลของการควบคุม (CFG) และกราฟการไหลของข้อมูล (DFG) เพื่อแสดงพฤติกรรมและความสัมพันธ์แบบไดนามิกของโค้ด GraphCodeBERT เป็นตัวอย่างที่น่าสังเกต
TransformCode: แพลตฟอร์มสำหรับการฝังตัวโค้ด
TransformCode เป็นแพลตฟอร์มที่แก้ไขข้อจำกัดของวิธีการที่มีอยู่โดยการเรียนรู้การฝังตัวโค้ดในลักษณะการเรียนรู้แบบไม่มีคำสั่ง มันไม่ขึ้นอยู่กับโมเดลและภาษา สามารถใช้ได้กับโมเดลใดๆ และรองรับภาษาโปรแกรมมิ่งทั้งหมด
แผนภาพด้านบนแสดงโครงสร้างของ TransformCode สำหรับการเรียนรู้การฝังตัวโค้ดแบบไม่มีคำสั่งโดยใช้การเรียนรู้แบบไม่มีคำสั่ง มันประกอบด้วยสองเฟสหลัก: ก่อนการฝึก และ การเรียนรู้แบบไม่มีคำสั่งสำหรับการฝึก มาทำความเข้าใจส่วนประกอบแต่ละส่วน:
ก่อนการฝึก
1. การประมวลผลข้อมูล:
- ชุดข้อมูล: ข้อมูลเข้าเริ่มต้นคือชุดข้อมูลที่มีโค้ดส่วน
- โค้ดที่ปกติ: โค้ดส่วนเหล่านี้ผ่านการปกติเพื่อลบคำอธิบายและตั้งชื่อตัวแปรให้มาตรฐาน ซึ่งช่วยลดผลกระทบของการตั้งชื่อตัวแปรต่อกระบวนการเรียนรู้และปรับปรุงความสามารถในการทั่วไปของโมเดล
- การแปลงโค้ด: โค้ดที่ปกติแล้วถูกแปลงโดยใช้การแปลงทางไวยากรณ์และสารสนเทศเพื่อสร้างตัวอย่างบวก เหล่านี้การแปลงรับรองว่าความหมายทาง语义ของโค็ดไม่เปลี่ยนแปลง โดยให้ตัวอย่างที่หลากหลายและทนทานสำหรับการเรียนรู้แบบไม่มีคำสั่ง
2. การแบ่งคำ:
- การฝึกแบ่งคำ: โค้ดชุดข้อมูลถูกใช้ในการฝึกแบ่งคำเพื่อแปลงข้อความโค้ดให้เป็นการฝังตัว
- ชุดข้อมูลการฝังตัว: โค้ดชุดข้อมูลทั้งหมดถูกแปลงเป็นการฝังตัวโดยใช้แบ่งคำที่ฝึกแล้ว ซึ่งจะใช้เป็นข้อมูลเข้าสำหรับเฟสการเรียนรู้แบบไม่มีคำสั่ง
การเรียนรู้แบบไม่มีคำสั่งสำหรับการฝึก
3. กระบวนการฝึก:
- ตัวอย่างฝึก: ตัวอย่างหนึ่งจากชุดข้อมูลฝึกถูกเลือกเป็นตัวแทนการฝังตัวโค้ด
- ตัวอย่างบวก: ตัวอย่างบวกที่เกี่ยวข้องคือการแปลงของตัวแทนการฝังตัวโค้ดที่ได้รับระหว่างขั้นตอนการประมวลผลข้อมูล
- ตัวอย่างลบในแบตช์: ตัวอย่างลบคือตัวอย่างโค้ดอื่น ๆ ในแบตช์ปัจจุบันที่แตกต่างจากตัวอย่างบวก
4. เอนโคเดอร์และโมเมนตัมเอนโคเดอร์:
- เอนโคเดอร์ Transformer พร้อมการเข้ารหัสตำแหน่งสัมพัทธ์และหัว Projection MLP: ทั้งตัวแทนการฝังตัวโค้ดและตัวอย่างบวกถูกป้อนเข้าไปในเอนโคเดอร์ Transformer เอนโคเดอร์รวมการเข้ารหัสตำแหน่งสัมพัทธ์เพื่อจับโครงสร้างไวยากรณ์และความสัมพันธ์ระหว่างโทเค็นในโค้ด หัว Projection MLP ใช้สำหรับการแมปการแสดงผลที่เข้ารหัสให้เป็นพื้นที่มิติต่ำกว่าโดยที่วัตถุประสงค์การเรียนรู้แบบไม่มีคำสั่งถูกใช้
- โมเมนตัมเอนโคเดอร์: โมเมนตัมเอนโคเดอร์ถูกใช้ซึ่งอัปเดตโดยค่าเฉลี่ยเคลื่อนที่ของพารามิเตอร์เอนโคเดอร์ตัวแทนการฝังตัวโค้ด ซึ่งช่วยรักษาความสอดคล้องและความหลากหลายของการแสดงผล โดยป้องกันการล่มของการเรียนรู้แบบไม่มีคำสั่ง ตัวอย่างลบถูกเข้ารหัสโดยใช้โมเมนตัมเอนโคเดอร์และถูกจัดคิวสำหรับการเรียนรู้แบบไม่มีคำสั่ง
5. วัตถุประสงค์การเรียนรู้แบบไม่มีคำสั่ง:
- การคำนวณข้อสูญเสีย InfoNCE (การประมาณค่าความคล้ายคลึง): ข้อสูญเสีย InfoNCE (Noise Contrastive Estimation) ถูกคำนวณเพื่อเพิ่มความคล้ายคลึงระหว่างตัวแทนการฝังตัวโค้ดและตัวอย่างบวก ในขณะเดียวกันก็ลดความคล้ายคลึงระหว่างตัวแทนการฝังตัวโค้ดและตัวอย่างลบ วัตถุประสงค์นี้รับรองว่าการฝังตัวที่เรียนรู้มีความแตกต่างและทนทาน โดยจับคล้ายคลึงทาง语义ของโค้ดส่วน
แพลตฟอร์มทั้งหมดใช้ประโยชน์จากจุดแข็งของการเรียนรู้แบบไม่มีคำสั่งเพื่อเรียนรู้การฝังตัวโค้ดที่มีความหมายและทนทานจากข้อมูลที่ไม่มีคำสั่ง การใช้การแปลง AST และโมเมนตัมเอนโคเดอร์ยังเพิ่มคุณภาพและประสิทธิภาพของการแสดงผลที่เรียนรู้ ทำให้ TransformCode เป็นเครื่องมือที่ทรงพลังสำหรับงานวิศวกรรมซอฟต์แวร์ต่าง ๆ
คุณลักษณะหลักของ TransformCode
- ความยืดหยุ่นและความสามารถในการปรับขนาด: สามารถขยายได้สำหรับงานที่ต้องการการแสดงโค้ด
- ประสิทธิภาพและความสามารถในการปรับขนาด: ไม่ต้องการโมเดลขนาดใหญ่หรือข้อมูลฝึกอบรมมาก สามารถรองรับภาษาโปรแกรมมิ่งทั้งหมด
- การเรียนรู้แบบไม่มีคำสั่งและแบบมีคำสั่ง: สามารถใช้ได้ทั้งการเรียนรู้แบบไม่มีคำสั่งและแบบมีคำสั่งโดยการรวมป้ายกำกับหรือวัตถุประสงค์เฉพาะงาน
- พารามิเตอร์ที่ปรับได้: จำนวนพารามิเตอร์ของเอนโคเดอร์สามารถปรับได้ตามทรัพยากรการคำนวณที่มีอยู่
TransformCode แนะนำเทคนิคการเพิ่มข้อมูลที่เรียกว่าการแปลง AST โดยใช้การแปลงทางไวยากรณ์และสารสนเทศกับโค้ดส่วนต้นฉบับเพื่อสร้างตัวอย่างที่หลากหลายและทนทานสำหรับการเรียนรู้แบบไม่มีคำสั่ง
การประยุกต์ใช้การฝังตัวโค้ด
การฝังตัวโค้ดได้ปฏิวัติวงการวิศวกรรมซอฟต์แวร์โดยการเปลี่ยนโค้ดจากรูปแบบข้อความเป็นการแสดงผลตัวเลขที่สามารถใช้ได้กับโมเดลการเรียนรู้ของเครื่อง ต่อไปนี้คือการประยุกต์ใช้หลักๆ:
การค้นหาโค้ดที่ดีขึ้น
การค้นหาโค้ดแบบดั้งเดิมพึ่งพาการจับคู่คีย์เวิร์ด ซึ่งมักนำไปสู่ผลลัพธ์ที่ไม่เกี่ยวข้อง การฝังตัวโค้ดทำให้สามารถค้นหาโค้ดแบบ语义 โดยจัดอันดับโค้ดส่วนตามความคล้ายคลึงกันในฟังก์ชัน แม้ว่าจะใช้คีย์เวิร์ดที่แตกต่างกันก็ตาม ซึ่งปรับปรุงความแม่นยำและประสิทธิภาพในการค้นหาโค้ดที่เกี่ยวข้องภายในฐานโค้ดขนาดใหญ่
การเติมโค้ดอัตโนมัติที่ฉลาดขึ้น
เครื่องมือการเติมโค้ดอัตโนมัติแนะนำโค้ดส่วนที่เกี่ยวข้องตามบริบทปัจจุบัน โดยใช้การฝังตัวโค้ด เหล่านี้เครื่องมือสามารถให้คำแนะนำที่แม่นยำและเป็นประโยชน์มากขึ้น โดยการทำความเข้าใจความหมายทาง语义ของโค้ดที่ถูกเขียนอยู่ นำไปสู่ประสบการณ์การเขียนโค้ดที่เร็วขึ้นและมีประสิทธิภาพมากขึ้น
การตรวจสอบและแก้ไขโค้ดอัตโนมัติ
การฝังตัวโค้ดสามารถใช้เพื่อระบุรูปแบบที่บ่งบอกถึงข้อผิดพลาดหรือความไม่มีประสิทธิภาพในโค้ด โดยการวิเคราะห์ความคล้ายคลึงระหว่างโค้ดส่วนและรูปแบบข้อผิดพลาดที่ทราบ ระบบเหล่านี้สามารถแนะนำการแก้ไขอัตโนมัติหรือเน้นย้ำพื้นที่ที่อาจต้องการการตรวจสอบเพิ่มเติม
การสรุปโค้ดและสร้างเอกสารที่ดีขึ้น
ฐานโค้ดขนาดใหญ่มักขาดเอกสารที่เหมาะสม ทำให้พัฒนาสิ่งใหม่ ๆ ยาก การฝังตัวโค้ดสามารถสร้างสรุปโค้ดที่สังเขปซึ่งจับประเด็นสำคัญของฟังก์ชันโค้ด นี่ไม่เพียงแต่ปรับปรุงการบำรุงรักษาโค้ด แต่ยังอำนวยความสะดวกในการถ่ายทอดความรู้ภายในทีมพัฒนา
การตรวจสอบโค้ดที่ดีขึ้น
การตรวจสอบโค้ดเป็นสิ่งสำคัญสำหรับการรักษาคุณภาพโค้ด การฝังตัวโค้ดสามารถช่วยเหลือผู้ตรวจสอบโดยการเน้นย้ำปัญหาและแนะนำการปรับปรุง นอกจากนี้ยังสามารถอำนวยความสะดวกในการเปรียบเทียบระหว่างเวอร์ชันโค้ดที่แตกต่างกัน ทำให้กระบวนการตรวจสอบมีประสิทธิภาพมากขึ้น
การประมวลผลโค้ดแบบข้ามภาษา
โลกของการพัฒนาซอฟต์แวร์ไม่ได้จำกัดอยู่เพียงภาษาโปรแกรมมิ่งเดียว การฝังตัวโค้ดมีศักยภาพในการอำนวยความสะดวกในการประมวลผลโค้ดแบบข้ามภาษา โดยการจับความสัมพันธ์ทาง语义ระหว่างโค้ดที่เขียนในภาษาต่างๆ














