1. ภาพรวม
ในการเร่งสร้างแอปพลิเคชัน GenAI เรามักจะลืมองค์ประกอบที่สำคัญที่สุด นั่นก็คือความปลอดภัย
ลองนึกภาพการสร้างแชทบ็อตสำหรับฝ่ายทรัพยากรบุคคล คุณต้องการให้ตอบคำถาม เช่น "เงินเดือนของฉันคือเท่าไหร่" หรือ "ทีมของฉันมีผลงานเป็นอย่างไร"
- หาก Alice (พนักงานทั่วไป) ถาม เธอควรเห็นเฉพาะข้อมูลของตนเอง
- หาก Bob (ผู้จัดการ) ถาม เขาควรจะเห็นข้อมูลของทีม
ปัญหา
สถาปัตยกรรม RAG (Retrieval Augmented Generation) ส่วนใหญ่พยายามจัดการปัญหานี้ในเลเยอร์แอปพลิเคชัน โดยจะกรองข้อมูลหลังจากดึงข้อมูลมาแล้ว หรืออาศัย LLM ให้ "ทำงาน" นี่เป็นสิ่งเปราะบาง หากตรรกะของแอปทำงานไม่ถูกต้อง ข้อมูลจะรั่วไหล
วิธีแก้ปัญหา
ผลักดันการรักษาความปลอดภัยลงไปที่ชั้นฐานข้อมูล การใช้ความปลอดภัยระดับแถว (RLS) ของ PostgreSQL ใน AlloyDB ช่วยให้มั่นใจได้ว่าฐานข้อมูลจะปฏิเสธที่จะแสดงข้อมูลที่ผู้ใช้ไม่ได้รับอนุญาตให้ดู ไม่ว่า AI จะขออะไรก็ตาม
ในคู่มือนี้ เราจะสร้าง "ห้องเก็บข้อมูลส่วนตัว" ซึ่งเป็นผู้ช่วยฝ่ายทรัพยากรบุคคลที่ปลอดภัยซึ่งจะเปลี่ยนคำตอบแบบไดนามิกตามผู้ที่เข้าสู่ระบบ

สถาปัตยกรรม
เราไม่ได้สร้างตรรกะการให้สิทธิ์ที่ซับซ้อนใน Python เรากำลังใช้เครื่องมือฐานข้อมูลเอง
- อินเทอร์เฟซ: แอป Streamlit ที่เรียบง่ายซึ่งจำลองการเข้าสู่ระบบ
- สมอง: AlloyDB AI (เข้ากันได้กับ PostgreSQL)
- กลไกการทำงาน: เราตั้งค่าตัวแปรเซสชัน (
app.active_user) เมื่อเริ่มธุรกรรมทุกครั้ง นโยบายฐานข้อมูลจะตรวจสอบuser_rolesตาราง (ทำหน้าที่เป็นผู้ให้บริการข้อมูลประจำตัว) โดยอัตโนมัติเพื่อกรองแถว
สิ่งที่คุณจะสร้าง
แอปพลิเคชันผู้ช่วยฝ่ายทรัพยากรบุคคลที่ปลอดภัย คุณจะใช้การรักษาความปลอดภัยระดับแถว (RLS) ในเครื่องมือฐานข้อมูล AlloyDB โดยตรงแทนที่จะพึ่งพาตรรกะของแอปพลิเคชันเพื่อกรองข้อมูลที่ละเอียดอ่อน วิธีนี้ช่วยให้มั่นใจได้ว่าแม้โมเดล AI จะ "หลอน" หรือพยายามเข้าถึงข้อมูลที่ไม่ได้รับอนุญาต แต่ฐานข้อมูลจะไม่ยอมส่งข้อมูลดังกล่าวกลับมา
สิ่งที่คุณจะได้เรียนรู้
คุณจะได้เรียนรู้:
- วิธีออกแบบสคีมาสำหรับ RLS (แยกข้อมูลกับข้อมูลประจำตัว)
- วิธีเขียนนโยบาย PostgreSQL (
CREATE POLICY) - วิธีข้ามข้อยกเว้น "เจ้าของตาราง" โดยใช้
FORCE ROW LEVEL SECURITY - วิธีสร้างแอป Python ที่ทำ "การสลับบริบท" ให้กับผู้ใช้
ข้อกำหนด
2. ก่อนเริ่มต้น
สร้างโปรเจ็กต์
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าโปรเจ็กต์เปิดใช้การเรียกเก็บเงินแล้วหรือไม่
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
- หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
- เปิดใช้ API ที่จำเป็น: ทำตามลิงก์และเปิดใช้ API
หรือจะใช้คำสั่ง gcloud สำหรับการดำเนินการนี้ก็ได้ โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ
gcloud services enable \
alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
ข้อควรระวังและการแก้ปัญหา
กลุ่มอาการ"โปรเจ็กต์ผี" | คุณเรียกใช้ |
แผงกั้น การเรียกเก็บเงิน | คุณเปิดใช้โปรเจ็กต์แล้ว แต่ลืมบัญชีสำหรับการเรียกเก็บเงิน AlloyDB เป็นเครื่องมือที่มีประสิทธิภาพสูง จึงจะไม่เริ่มทำงานหาก "ถังน้ำมัน" (การเรียกเก็บเงิน) ว่างเปล่า |
ความล่าช้าการเผยแพร่ API | คุณคลิก "เปิดใช้ API" แต่บรรทัดคำสั่งยังคงแสดง |
คำถามที่พบบ่อยเกี่ยวกับโควต้า | หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ AlloyDB หาก |
3. การตั้งค่าฐานข้อมูล
ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ โดยจะใช้คลัสเตอร์เพื่อจัดเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง
มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่จะโหลดชุดข้อมูลทดสอบกัน
- คลิกปุ่มหรือคัดลอกลิงก์ด้านล่างไปยังเบราว์เซอร์ที่คุณเข้าสู่ระบบผู้ใช้ Google Cloud Console
- เมื่อทำขั้นตอนนี้เสร็จแล้ว ระบบจะโคลนที่เก็บไปยังโปรแกรมแก้ไข Cloud Shell ในเครื่อง และคุณจะเรียกใช้คำสั่งด้านล่างจากโฟลเดอร์โปรเจ็กต์ได้ (โปรดตรวจสอบว่าคุณอยู่ในไดเรกทอรีโปรเจ็กต์)
sh run.sh
- ตอนนี้ให้ใช้ UI (คลิกลิงก์ในเทอร์มินัลหรือคลิกลิงก์ "แสดงตัวอย่างบนเว็บ" ในเทอร์มินัล
- ป้อนรายละเอียดสำหรับรหัสโปรเจ็กต์ ชื่อคลัสเตอร์ และชื่ออินสแตนซ์เพื่อเริ่มต้นใช้งาน
- ไปหากาแฟดื่มระหว่างที่บันทึกเลื่อนลงมาเรื่อยๆ และคุณสามารถอ่านเกี่ยวกับวิธีที่ระบบดำเนินการนี้เบื้องหลังได้ที่นี่ ซึ่งอาจใช้เวลาประมาณ 10-15 นาที
ข้อควรระวังและการแก้ปัญหา
ปัญหาเรื่อง "ความอดทน" | คลัสเตอร์ฐานข้อมูลเป็นโครงสร้างพื้นฐานที่มีขนาดใหญ่ หากรีเฟรชหน้าเว็บหรือปิดเซสชัน Cloud Shell เนื่องจาก "ดูเหมือนว่าค้างอยู่" คุณอาจมีอินสแตนซ์ "ผี" ที่มีการจัดสรรบางส่วนและลบไม่ได้หากไม่ดำเนินการด้วยตนเอง |
ภูมิภาคไม่ตรงกัน | หากเปิดใช้ API ใน |
คลัสเตอร์ซอมบี้ | หากก่อนหน้านี้คุณใช้ชื่อเดียวกันสำหรับคลัสเตอร์และไม่ได้ลบคลัสเตอร์ออก สคริปต์อาจแจ้งว่ามีชื่อคลัสเตอร์อยู่แล้ว ชื่อคลัสเตอร์ต้องไม่ซ้ำกันภายในโปรเจ็กต์ |
การหมดเวลาของ Cloud Shell | หากคุณพักดื่มกาแฟเป็นเวลา 30 นาที Cloud Shell อาจเข้าสู่โหมดสลีปและยกเลิกการเชื่อมต่อกระบวนการ |
4. การจัดสรรสคีมา
ในขั้นตอนนี้ เราจะพูดถึงหัวข้อต่อไปนี้

การดำเนินการแบบทีละขั้นตอนโดยละเอียดมีดังนี้
เมื่อคลัสเตอร์และอินสแตนซ์ AlloyDB ทำงานแล้ว ให้ไปที่โปรแกรมแก้ไข SQL ของ AlloyDB Studio เพื่อเปิดใช้ส่วนขยาย AI และจัดสรรสคีมา

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จเรียบร้อย เมื่อพร้อมแล้ว ให้ลงชื่อเข้าใช้ AlloyDB โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างคลัสเตอร์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL
- ชื่อผู้ใช้ : "
postgres" - ฐานข้อมูล : "
postgres" - รหัสผ่าน : "
alloydb" (หรือรหัสผ่านที่คุณตั้งค่าไว้ตอนสร้าง)
เมื่อตรวจสอบสิทธิ์ใน AlloyDB Studio สำเร็จแล้ว ให้ป้อนคำสั่ง SQL ในเอดิเตอร์ คุณเพิ่มหน้าต่างเอดิเตอร์ได้หลายหน้าต่างโดยใช้เครื่องหมายบวกทางด้านขวาของหน้าต่างสุดท้าย

คุณจะป้อนคำสั่งสำหรับ AlloyDB ในหน้าต่างเอดิเตอร์โดยใช้ตัวเลือกเรียกใช้ จัดรูปแบบ และล้างตามที่จำเป็น
สร้างตาราง
เราต้องใช้ 2 ตาราง ได้แก่ ตารางสำหรับข้อมูลที่ละเอียดอ่อน (พนักงาน) และตารางสำหรับกฎระบุตัวตน (user_roles) การแยกทั้ง 2 อย่างนี้เป็นสิ่งสำคัญเพื่อหลีกเลี่ยงข้อผิดพลาด "การเรียกซ้ำไม่สิ้นสุด" ในนโยบาย
คุณสร้างตารางได้โดยใช้คำสั่ง DDL ด้านล่างใน AlloyDB Studio
-- 1. Create User Roles (The Identity Provider)
CREATE TABLE user_roles (
username TEXT PRIMARY KEY,
role TEXT -- 'employee', 'manager', 'admin'
);
INSERT INTO user_roles (username, role) VALUES
('Alice', 'employee'),
('Bob', 'manager'),
('Charlie', 'employee');
-- 2. Create the Data Table
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT,
salary INTEGER,
performance_review TEXT
);
INSERT INTO employees (name, salary, performance_review) VALUES
('Alice', 80000, 'Alice meets expectations but needs to improve punctuality.'),
('Bob', 120000, 'Bob is a strong leader. Team morale is high.'),
('Charlie', 85000, 'Charlie exceeds expectations. Ready for promotion.');
ข้อควรระวังและการแก้ปัญหา
ตรวจพบการเรียกซ้ำแบบไม่สิ้นสุดขณะกำหนดบทบาทภายในตารางพนักงาน | สาเหตุที่ล้มเหลว: หากนโยบายระบุว่า "ตรวจสอบตารางพนักงานเพื่อดูว่าฉันเป็นผู้จัดการหรือไม่" ฐานข้อมูลจะต้องค้นหาตารางเพื่อตรวจสอบนโยบาย ซึ่งจะทริกเกอร์นโยบายอีกครั้ง ผลลัพธ์: ตรวจพบการเรียกซ้ำแบบไม่มีที่สิ้นสุดวิธีแก้ไข: เก็บตารางการค้นหาแยกต่างหาก (user_roles) เสมอ หรือใช้ผู้ใช้ฐานข้อมูลจริงสำหรับบทบาท |
ตรวจสอบข้อมูล
SELECT count(*) FROM employees;
-- Output: 3
5. เปิดใช้และบังคับใช้การรักษาความปลอดภัย
ตอนนี้เราจะเปิดใช้โล่ นอกจากนี้ เราจะสร้าง "ผู้ใช้แอป" ทั่วไปซึ่งโค้ด Python จะใช้ในการเชื่อมต่อด้วย
เรียกใช้คำสั่ง SQL ด้านล่างจากตัวแก้ไขการค้นหา AlloyDB
-- 1. Activate RLS
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;
-- 2. CRITICAL: Force RLS for Table Owners
ALTER TABLE employees FORCE ROW LEVEL SECURITY;
-- 3. Create the Application User
DO
$do$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_user') THEN
CREATE ROLE app_user LOGIN PASSWORD 'password';
END IF;
END
$do$;
-- 4. Grant Access
GRANT SELECT ON employees TO app_user;
GRANT SELECT ON user_roles TO app_user;
ข้อควรระวังและการแก้ปัญหา
ทดสอบในฐานะ postgres (ผู้ดูแลระบบ) และดูข้อมูลทั้งหมด | สาเหตุที่ล้มเหลว: โดยค่าเริ่มต้น RLS จะไม่มีผลกับเจ้าของตารางหรือผู้ใช้ระดับสูง โดยจะข้ามผ่านนโยบายทั้งหมดการแก้ปัญหา: หากนโยบายดูเหมือน "ใช้งานไม่ได้" (อนุญาตทุกอย่าง) ให้ตรวจสอบว่าคุณเข้าสู่ระบบในฐานะ |
6. สร้างนโยบายการเข้าถึง
เราจะกำหนดกฎ 2 ข้อโดยใช้ตัวแปรเซสชัน (app.active_user) ซึ่งเราจะตั้งค่าจากโค้ดแอปพลิเคชันในภายหลัง
เรียกใช้คำสั่ง SQL ด้านล่างจากตัวแก้ไขการค้นหา AlloyDB
-- Policy 1: Self-View
-- Users can see rows where their name matches the session variable
CREATE POLICY "view_own_data" ON employees
FOR SELECT
USING (name = current_setting('app.active_user', true));
-- Policy 2: Manager-View
-- Managers can see ALL rows.
CREATE POLICY "manager_view_all" ON employees
FOR SELECT
USING (
EXISTS (
SELECT 1 FROM user_roles
WHERE username = current_setting('app.active_user', true)
AND role = 'manager'
)
);
ข้อควรระวังและการแก้ปัญหา
การใช้ current_user แทน app.active_user | ปัญหา: Current_user เป็นคีย์เวิร์ด SQL ที่สงวนไว้ซึ่งแสดงบทบาทฐานข้อมูล (เช่น app_user) เราต้องการผู้ใช้แอปพลิเคชัน (เช่น Alice)แก้ไข: ใช้เนมสเปซที่กำหนดเองเสมอ เช่น app.variable_name |
ลืมพารามิเตอร์ | ปัญหา: หากไม่ได้ตั้งค่าตัวแปรไว้ การค้นหาจะหยุดทำงานพร้อมข้อผิดพลาดการแก้ไข: current_setting('...', true) จะแสดงผล NULL แทนที่จะหยุดทำงาน ซึ่งจะส่งผลให้ระบบแสดงผล 0 แถวอย่างปลอดภัย |
7. สร้างแอป "Chameleon"
เราจะใช้ Python และ Streamlit เพื่อจำลองตรรกะของแอปพลิเคชัน

เปิดเทอร์มินัล Cloud Shell ในโหมดเอดิเตอร์ แล้วไปที่โฟลเดอร์รูทหรือไดเรกทอรีที่คุณต้องการสร้างแอปพลิเคชันนี้ สร้างโฟลเดอร์ใหม่
1. ติดตั้งทรัพยากร Dependency
เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของ Cloud Shell จากภายในไดเรกทอรีโปรเจ็กต์ใหม่
pip install streamlit psycopg2-binary
2. สร้าง app.py
สร้างไฟล์ใหม่ชื่อ app.py แล้วคัดลอกเนื้อหาจากไฟล์ repo
import streamlit as st
import psycopg2
# CONFIGURATION (Replace with your IP)
DB_HOST = "10.x.x.x"
DB_NAME = "postgres"
DB_USER = "postgres"
DB_PASS = "alloydb"
def get_db_connection():
return psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS
)
def query_database(user_name):
conn = get_db_connection()
try:
with conn.cursor() as cur:
# THE SECURITY HANDSHAKE
# We tell the database: "For this transaction, I am acting as..."
cur.execute(f"SET app.active_user = '{user_name}';")
# THE BLIND QUERY
# We ask for EVERYTHING. The database silently filters it.
cur.execute("SELECT name, role, salary, performance_review FROM employees;")
return cur.fetchall()
finally:
conn.close()
# UI
st.title("🛡️ The Private Vault")
user = st.sidebar.radio("Act as User:", ["Alice", "Bob", "Charlie", "Eve"])
if st.button("Access Data"):
results = query_database(user)
if not results:
st.error("🚫 Access Denied.")
else:
st.success(f"Viewing data as {user}")
for row in results:
st.write(row)
3. เรียกใช้แอป
เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell จากภายในไดเรกทอรีโปรเจ็กต์ใหม่
streamlit run app.py --server.port 8080 --server.enableCORS false
ข้อควรระวังและการแก้ปัญหา
Connection Pooling | ความเสี่ยง: หากคุณใช้ Connection Pool ตัวแปรเซสชัน SET app.active_user อาจยังคงอยู่ในการเชื่อมต่อและ "รั่วไหล" ไปยังผู้ใช้รายถัดไปที่ใช้การเชื่อมต่อดังกล่าววิธีแก้ไข:ในสภาพแวดล้อมการใช้งานจริง ให้ใช้ RESET app.active_user หรือ DISCARD ALL เสมอเมื่อส่งคืนการเชื่อมต่อไปยังพูล |
หน้าจอว่างเปล่าใน Cloud Shell | วิธีแก้ไข: ใช้ปุ่ม "ตัวอย่างเว็บ" บนพอร์ต 8080 อย่าคลิกลิงก์ localhost ในเทอร์มินัล |
8. ยืนยัน Zero Trust
ลองใช้แอปเพื่อให้แน่ใจว่าการติดตั้งใช้งาน Zero Trust
เลือก "Alice": เธอควรเห็น 1 แถว (ตัวเธอเอง)

เลือก "Bob": เขาควรเห็น 3 แถว (ทุกคน)

เหตุใดจึงสำคัญต่อ AI Agent
ลองนึกภาพการเชื่อมต่อโมเดลกับฐานข้อมูลนี้ หากผู้ใช้ถามโมเดลว่า "สรุปการประเมินประสิทธิภาพทั้งหมด" โมเดลจะสร้าง SELECT performance_review FROM employees
- หากไม่มี RLS: โมเดลจะดึงรีวิวส่วนตัวของทุกคนและรั่วไหลไปยังอลิซ
- เมื่อใช้ RLS โมเดลจะเรียกใช้คําค้นหาเดียวกันทุกประการ แต่ฐานข้อมูลจะแสดงเฉพาะรีวิวของอลิซ
นี่คือ AI แบบ Zero Trust คุณไม่เชื่อถือโมเดลในการกรองข้อมูล แต่บังคับให้ฐานข้อมูลซ่อนข้อมูล
การนำไปใช้ในเวอร์ชันที่ใช้งานจริง
สถาปัตยกรรมที่แสดงที่นี่เป็นระดับการใช้งานจริง แต่การติดตั้งใช้งานเฉพาะจะได้รับการลดความซับซ้อนเพื่อการเรียนรู้ หากต้องการติดตั้งใช้งานอย่างปลอดภัยในสภาพแวดล้อมขององค์กรในโลกแห่งความเป็นจริง คุณควรใช้การเพิ่มประสิทธิภาพต่อไปนี้
- การตรวจสอบสิทธิ์จริง: แทนที่เมนูแบบเลื่อนลง "Identity Switcher" ด้วยผู้ให้บริการข้อมูลประจำตัว (IDP) ที่มีประสิทธิภาพ เช่น Google Identity Platform, Okta หรือ Auth0 แอปพลิเคชันควรยืนยันโทเค็นของผู้ใช้และดึงข้อมูลประจำตัวของผู้ใช้อย่างปลอดภัยก่อนตั้งค่าตัวแปรเซสชันของฐานข้อมูล เพื่อให้มั่นใจว่าผู้ใช้จะปลอมแปลงข้อมูลประจำตัวไม่ได้
- ความปลอดภัยของ Connection Pooling: เมื่อใช้ Connection Pooling บางครั้งตัวแปรเซสชันอาจยังคงอยู่ในการร้องขอของผู้ใช้ที่แตกต่างกัน หากไม่ได้จัดการอย่างถูกต้อง ตรวจสอบว่าแอปพลิเคชันรีเซ็ตตัวแปรเซสชัน (เช่น RESET app.active_user) หรือล้างสถานะการเชื่อมต่อเมื่อส่งคืนการเชื่อมต่อไปยังพูลเพื่อป้องกันการรั่วไหลของข้อมูลระหว่างผู้ใช้
- การจัดการลับ: การฮาร์ดโค้ดข้อมูลเข้าสู่ระบบของฐานข้อมูลเป็นความเสี่ยงด้านความปลอดภัย ใช้บริการจัดการข้อมูลลับโดยเฉพาะ เช่น Google Secret Manager เพื่อจัดเก็บและดึงรหัสผ่านฐานข้อมูลและสตริงการเชื่อมต่ออย่างปลอดภัยในขณะรันไทม์
9. ล้างข้อมูล
เมื่อห้องทดลองนี้เสร็จสิ้นแล้ว อย่าลืมลบคลัสเตอร์และอินสแตนซ์ AlloyDB
ซึ่งควรล้างข้อมูลคลัสเตอร์พร้อมกับอินสแตนซ์
10. ขอแสดงความยินดี
ยินดีด้วย คุณได้ผลักดันการรักษาความปลอดภัยลงไปที่ชั้นข้อมูลเรียบร้อยแล้ว แม้ว่าโค้ด Python จะมีข้อบกพร่องที่พยายาม print(all_salaries) แต่ฐานข้อมูลก็จะไม่แสดงผลใดๆ ให้กับ Alice
ขั้นตอนถัดไป
- ลองใช้กับชุดข้อมูลของคุณเอง
- ดู เอกสารประกอบเกี่ยวกับ AlloyDB AI
- ดูเวิร์กช็อปเพิ่มเติมได้ที่เว็บไซต์ Code Vipassana