วันนี้ ฉันอยากจะนำเสนอแนวคิดที่บ้าระห่ำยิ่งกว่านี้:
เราสามารถใช้โมเดลขนาดใหญ่เพื่อควบคุม p5.js และสร้างการเขียนโปรแกรมเชิงสร้างสรรค์ได้เพียงแค่การพูดคุยหรือไม่
p5.js คืออะไร?
ก่อนที่เราจะเริ่ม ขอแนะนำ p5.js สั้นๆ ก่อน หากคุณเป็นนักพัฒนาฝั่งฟรอนต์เอนด์หรือสนใจการเขียนโปรแกรมเชิงสร้างสรรค์ คุณต้องเคยได้ยินเรื่องนี้มาบ้าง

p5.js คือไลบรารี JavaScript ที่ช่วยให้เราสร้างกราฟิก แอนิเมชัน และเอฟเฟกต์แบบโต้ตอบต่างๆ ด้วยโค้ดที่เรียบง่ายและใช้งานง่าย เป้าหมายของ p5.js คือการทำให้การเขียนโปรแกรมเข้าถึงได้และแสดงออกได้มากขึ้น โดยเฉพาะอย่างยิ่งสำหรับศิลปิน นักออกแบบ นักการศึกษา และผู้เริ่มต้น
เหตุใดจึงต้องรวมโมเดลขนาดใหญ่เข้ากับ p5.js?
คุณอาจถามว่าทำไม p5.js (https://github.com/processing/p5.js) จึงควรเชื่อมโยงกับโมเดลขนาดใหญ่?
จริงๆ แล้ว มีสองสาเหตุเบื้องหลังเรื่องนี้:
-
1. ลดเกณฑ์สำหรับการเขียนโปรแกรมเชิงสร้างสรรค์ : แม้ว่า p5.js จะเรียบง่ายมาก แต่ก็ยังมีค่าใช้จ่ายในการเรียนรู้บางอย่างสำหรับผู้ที่ไม่มีพื้นฐานการเขียนโปรแกรมเลย ถ้าเราสามารถใช้ภาษาธรรมชาติในการอธิบายเอฟเฟ็กต์ภาพที่เราต้องการ และปล่อยให้โมเดลขนาดใหญ่สร้างโค้ด p5.js โดยอัตโนมัติ ทุกคนก็สามารถเป็นศิลปินได้ใช่หรือไม่ -
2. สำรวจวิธีการโต้ตอบแบบใหม่ : โมเดลขนาดใหญ่ไม่เพียงแต่เข้าใจภาษาธรรมชาติเท่านั้น แต่ยังสร้างเนื้อหาสร้างสรรค์ต่างๆ ได้อีกด้วย หากเราสามารถผสมผสาน “จินตนาการ” ของโมเดลขนาดใหญ่เข้ากับความสามารถในการแสดงออกของ p5.js ได้ เราจะสร้างประสบการณ์แบบโต้ตอบที่ไม่เคยมีมาก่อนได้!
ไอเดียของฉัน: MCP + WebSocket
ได้รับแรงบันดาลใจจากแพ็กเกจ Unity MCP ฉันจึงได้คิดโซลูชันในการเชื่อมต่อโมเดลขนาดใหญ่ด้วย p5.js: MCP + WebSocket
สถาปัตยกรรมโดยรวม

-
1. LLM/Client : อาจเป็นแหล่งใดก็ได้ที่สามารถส่งคำสั่งข้อความ เช่น Claude, Cursor หรืออินเทอร์เฟซบรรทัดคำสั่งแบบง่ายๆ -
2. เซิร์ฟเวอร์ Python MCP : -
• ทำหน้าที่เป็นเซิร์ฟเวอร์ WebSocket โดยรับคำสั่งจาก LLM/Client -
• วิเคราะห์คำสั่งและแยกพารามิเตอร์ที่สำคัญ (เช่น สี รูปร่าง ตำแหน่ง ฯลฯ) -
• ส่งพารามิเตอร์ไปยัง p5.js Sketch ผ่านทางข้อความ WebSocket
-
-
3. โครงร่าง p5.js : -
• ประกอบด้วยไคลเอนต์ WebSocket ที่เชื่อมต่อกับเซิร์ฟเวอร์ Python MCP -
• รับข้อความจากเซิร์ฟเวอร์และอัพเดทรูปวาดตามเนื้อหาของข้อความ -
• แสดงผลการวาดภาพบนเบราว์เซอร์
-
-
4. การแสดงผล : เบราว์เซอร์ของผู้ใช้ ซึ่งใช้แสดงเอาท์พุตของ p5.js Sketch
เหตุใดจึงควรเลือก WebSocket?
-
• แบบเรียลไทม์ : WebSocket ให้ความสามารถในการสื่อสารสองทางแบบเรียลไทม์ ซึ่งเหมาะมากสำหรับสถานการณ์ที่ต้องมีปฏิสัมพันธ์บ่อยครั้ง -
• ข้ามแพลตฟอร์ม : WebSocket เป็นมาตรฐานเว็บและสามารถใช้งานได้บนแพลตฟอร์มต่างๆ และในภาษาต่างๆ -
• ใช้งานง่าย : ทั้ง Python และ JavaScript ต่างก็มีไลบรารี WebSocket ที่สมบูรณ์แบบซึ่งทำให้การพัฒนาเป็นเรื่องง่ายมาก
หลักฐานแนวคิด: การนำโค้ดไปใช้
เพื่อตรวจสอบความเป็นไปได้ของแนวคิดนี้ ฉันจึงได้สร้างต้นแบบที่เรียบง่ายมากขึ้นมา
เซิร์ฟเวอร์ Python MCP (เวอร์ชันที่เรียบง่าย)
# server.py
import asyncio
import websockets
import json
asyncdefhandler(websocket, path):
print(f"New connection from {websocket.remote_address}")
try:
asyncfor message in websocket:
print(f"Received: {message}")
try:
data = json.loads(message)
# 假设指令格式: {"command": "draw", "shape": "circle", "x": 100, "y": 100, "color": "red"}
if data.get("command") == "draw":
# 简单起见,直接将收到的数据转发给 p5.js
await websocket.send(json.dumps(data))
except json.JSONDecodeError:
print("Invalid JSON format")
except websockets.exceptions.ConnectionClosedError:
print("Connection closed")
asyncdefstart_server():
server = await websockets.serve(handler, "localhost", 6500)
print("WebSocket server started on ws://localhost:6500")
await server.wait_closed()
if __name__ == "__main__":
asyncio.run(start_server())
โค้ดนี้ใช้งานเซิร์ฟเวอร์ WebSocket ง่ายๆ ที่รับฟังบนพอร์ต 6500 บนคอมพิวเตอร์ภายในเครื่อง เมื่อได้รับข้อความจากไคลเอนต์ จะพยายามแยกวิเคราะห์ข้อมูลที่จัดรูปแบบเป็น JSON และถ้ามี ก็ "command": "draw"
จะส่งต่อข้อมูลทั้งหมดไปยังไคลเอนต์ p5.js ที่เชื่อมต่อ
p5.js Sketch (เวอร์ชั่นง่าย)
// sketch.js
let socket;
functionsetup() {
createCanvas(400, 400);
socket = newWebSocket("ws://localhost:6500");
socket.onopen = function(event) {
console.log("Connected to server");
};
socket.onmessage = function(event) {
let data = JSON.parse(event.data);
console.log("Received from server:", data);
if (data.command === "draw") {
drawShape(data.shape, data.x, data.y, data.color);
}
};
socket.onclose = function(event) {
console.log("Disconnected from server");
};
}
functiondrawShape(shape, x, y, color) {
fill(color);
if (shape === "circle") {
circle(x, y, 50);
} elseif (shape === "square") {
rect(x, y, 50, 50);
}
}
functiondraw() {
// 可以根据需要添加动画或其他交互
}
โค้ด p5.js นี้จะสร้างไคลเอนต์ WebSocket และเชื่อมต่อกับพอร์ต 6500 ในเครื่อง (ซึ่งคือเซิร์ฟเวอร์ Python ของเรา) เมื่อได้รับข้อความจากเซิร์ฟเวอร์ ระบบจะวิเคราะห์ข้อมูล JSON และหาก command
ข้อมูลถูกต้อง ระบบ draw
จะเรียกใช้ drawShape
ฟังก์ชันเพื่อวาดกราฟิกที่เกี่ยวข้อง
มันทำงานอย่างไร
-
1. เริ่มต้นเซิร์ฟเวอร์ Python : รันในบรรทัดคำ python server.py
สั่ง -
2. เปิดสเก็ตช์ p5.js : วาง sketch.js
โค้ดลงในไฟล์ HTML จากนั้นเปิดไฟล์ HTML ในเบราว์เซอร์ -
3. ส่งคำแนะนำ : ตอนนี้คุณสามารถใช้เครื่องมือใดๆ ที่สามารถส่งข้อความ WebSocket ได้ (แม้กระทั่งสคริปต์ Python ธรรมดา) เพื่อ ws://localhost:6500
ส่งคำแนะนำที่จัดรูปแบบ JSON ไปยังไคลเอนต์ เช่น:
{"command": "draw", "shape": "circle", "x": 100, "y": 100, "color": "red"}
คุณควรจะเห็นวงกลมสีแดงบนผืนผ้าใบ p5.js!
แนวโน้มในอนาคต
นี่เป็นเพียงต้นแบบพื้นฐานมาก ๆ แต่มันพิสูจน์ว่าเป็นไปได้ที่จะเชื่อมต่อโมเดลขนาดใหญ่ด้วย p5.js โดยใช้โปรโตคอล MCP!
ต่อไปเราจะสามารถ:
-
• ปรับปรุงชุดคำสั่ง : รองรับกราฟิก คุณสมบัติ เอฟเฟ็กต์แอนิเมชัน ฯลฯ มากขึ้น -
• บูรณาการ LLM : เชื่อมโยงต้นแบบนี้เข้ากับ LLM เช่น Claude เพื่อให้สามารถควบคุมภาษาธรรมชาติได้อย่างแท้จริง -
• การจัดการข้อผิดพลาด : เพิ่มกลไกการจัดการข้อผิดพลาดที่แข็งแกร่งยิ่งขึ้น -
• การสื่อสารสองทาง : อนุญาตให้ p5.js ส่งข้อความไปยังเซิร์ฟเวอร์ได้ด้วย (เช่น รายงานสถานะปัจจุบัน เหตุการณ์ทริกเกอร์ ฯลฯ) -
• อินเทอร์เฟซผู้ใช้ : พัฒนาอินเทอร์เฟซผู้ใช้ที่เป็นมิตรมากขึ้นเพื่ออำนวยความสะดวกในการกำหนดค่าและการใช้งานของผู้ใช้ -
• บรรจุภัณฑ์ : บรรจุภัณฑ์เซิร์ฟเวอร์ Python และโค้ด p5.js ลงในไลบรารีหรือเครื่องมือที่ใช้งานง่ายกว่า
หากคุณสนใจทิศทางนี้ ยินดีที่จะสื่อสารและสำรวจไปด้วยกัน! บางทีในอนาคตอันใกล้ เราอาจสามารถใช้ภาษาธรรมชาติเพื่อสร้างสรรค์งานศิลปะภาพอันน่าทึ่งได้ทุกประเภท!