Web playground นั้นยอดเยี่ยมสำหรับการทำ Demo คุณแค่แปะข้อความลงไป ดูโมเดลสร้างสรุปที่ดูดี แล้วก็ปิดแท็บไป แต่นั่นไม่ใช่การทำวิศวกรรมซอฟต์แวร์ (Engineering) งานในระดับ Production หมายถึงการใช้ API, การจัดการข้อผิดพลาด (error handling) และโค้ดที่สามารถทำงานได้เองแม้ในขณะที่คุณหลับ หากคุณต้องการประมวลผลบันทึกการประชุม (meeting transcripts), ตั๋วสนับสนุน (support tickets) หรือเอกสารวิจัยจำนวนมากตามกำหนดเวลา คุณจำเป็นต้องมี pipeline
คู่มือนี้จะพาคุณไปสร้างสิ่งนั้น: สคริปต์สรุปเอกสารแบบอัตโนมัติที่มีน้ำหนักเบา โดยใช้ Python, AWS SDK for Python (boto3) และ Amazon Bedrock เราจะใช้ Anthropic’s Claude 3 Haiku ซึ่งเป็นโมเดลที่ตอบโจทย์ทั้งในด้านความเร็วและราคาสำหรับการทำงานสรุปข้อความ
Why Bedrock and Claude 3 Haiku?
Amazon Bedrock เป็นบริการแบบ managed service ที่เปิดให้ใช้งาน foundation models ผ่านชุด AWS APIs เพียงชุดเดียว แทนที่จะต้องนำ endpoint ภายนอกมาประกอบกันและวุ่นวายกับการจัดการระบบเรียกเก็บเงินและโมเดลความปลอดภัยที่แยกจากกัน คุณสามารถเรียกใช้งาน AWS endpoint ด้วยการควบคุมผ่าน IAM มาตรฐานได้ทันที และข้อมูลของคุณจะยังคงอยู่ภายในสภาพแวดล้อม AWS ของคุณ
Claude 3 Haiku เป็นโมเดลที่คล่องตัวที่สุดในตระกูล Claude 3 ของ Anthropic มันถูกสร้างมาเพื่อการตอบสนองที่รวดเร็วและต้นทุนต่ำ ซึ่งทำให้เหมาะอย่างยิ่งสำหรับการสรุปข้อความปริมาณมากที่คุณต้องการผลลัพธ์ที่คาดเดาได้ โดยไม่ต้องจ่ายเงินซื้อพลังประมวลผลมหาศาลของโมเดลขนาดใหญ่สำหรับงานอ่านเอกสารทั่วไป
What You Need
ก่อนที่จะเริ่มเขียนโค้ด ตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้พร้อมแล้ว:
- บัญชี AWS ที่ใช้งานได้
- ติดตั้ง Python 3.9 หรือสูงกว่าไว้ในเครื่อง
- ตั้งค่า AWS CLI ด้วย credentials ที่มีสิทธิ์ในการเรียกใช้งาน (invoke) โมเดล Bedrock หากคุณยังไม่ได้รัน
aws configureให้ทำตอนนี้เลย หากคุณพบข้อผิดพลาดด้านสิทธิ์ (permission errors) ในภายหลัง คุณอาจจำเป็นต้องแนบสิทธิ์การเรียกใช้งาน Bedrock ที่เหมาะสมให้กับ IAM user หรือ role ของคุณ - เปิดใช้งานการเข้าถึงโมเดล (Model access) สำหรับ Anthropic Claude 3 Haiku โดยเฉพาะภายใน AWS Bedrock console เนื่องจาก AWS กำหนดให้คุณต้องเลือกใช้งาน (opt in) สำหรับผู้ให้บริการโมเดลแต่ละรายอย่างชัดเจนก่อนที่จะเรียกใช้งานได้
Step 1: Enable Model Access
Bedrock ไม่ได้อนุญาตให้คุณเรียกใช้งานโมเดลได้ทันที (out of the box) คุณต้องไปเปิดใช้งานในคอนโซลก่อน
- เข้าสู่ระบบ AWS Management Console
- ใช้แถบค้นหาเพื่อหา Amazon Bedrock
- ในแผงนำทางด้านซ้าย ให้เลือก Model access
- คลิก Modify model access
- ติ๊กที่ช่อง Anthropic (Claude 3 Haiku) และส่งคำขอของคุณ
เมื่อสถานะเปลี่ยนเป็น "Access granted" คุณก็พร้อมที่จะเรียกใช้งานโมเดลผ่านโค้ดได้แล้ว
Step 2: Set Up Your Environment
สภาพแวดล้อม Python ที่สะอาดจะช่วยแยก dependencies ออกจากกันและทำให้สามารถทำซ้ำได้ (reproducible) เปิด terminal ของคุณและรันคำสั่งเหล่านี้:
mkdir bedrock-summarizer && cd bedrock-summarizer
python3 -m venv venv
source venv/bin/activate
pip install boto3
สำหรับผู้ใช้ Windows ให้เปลี่ยนคำสั่ง activation เป็น venv\Scripts\activate หลังจาก pip install boto3 เสร็จสิ้น คุณก็จะมีทุกอย่างที่จำเป็นในการสื่อสารกับ AWS APIs
Step 3: Write the Script
สร้างไฟล์ชื่อ summarize.py เป้าหมายคือการอ่านเอกสารจากดิสก์ ส่งไปยัง Bedrock Converse API และพิมพ์สรุปที่กระชับออกมา
ด้านล่างนี้คือตัวอย่างการเขียนโค้ดที่สมบูรณ์และใช้งานได้จริง เราใช้ Converse API เพราะมันช่วยลดความยุ่งยากในการจัดการรูปแบบ JSON ดิบที่ผู้ให้บริการโมเดลแต่ละรายต้องการ คุณเพียงแค่ส่งรายการข้อความ (messages) และการตั้งค่าการอนุมาน (inference settings) เข้าไปเท่านั้น
import boto3
def summarize_document(text: str) -> str:
client = boto3.client("bedrock-runtime")
model_id = "anthropic.claude-3-haiku-20240307-v1:0"
messages = [
{
"role": "user",
"content": [
{
"text": (
"Provide a concise summary of the following document. "
"Focus on the main points and avoid unnecessary detail:\n\n"
f"{text}"
)
}
]
}
]
response = client.converse(
modelId=model_id,
messages=messages,
inferenceConfig={
"temperature": 0.3,
"maxTokens": 512
}
)
summary = response["output"]["message"]["content"][0]["text"]
return summary.strip()
if __name__ == "__main__":
with open("document.txt", "r", encoding="utf-8") as f:
document_text = f.read()
result = summarize_document(document_text)
print("\n--- Summary ---\n")
print(result)
รายละเอียดเชิงปฏิบัติบางประการที่ควรทราบมีดังนี้:
- boto3.client("bedrock-runtime") มุ่งเป้าไปที่ runtime endpoint ที่จัดการเรื่อง inference ตรวจสอบให้แน่ใจว่า AWS region ใน
~/.aws/configของคุณรองรับ Bedrock และคุณได้เปิดใช้งาน Haiku ในภูมิภาค (region) นั้นแล้ว - Model ID
anthropic.claude-3-haiku-20240307-v1:0คือ identifier ที่ถูกต้องที่ Bedrock ต้องการ โปรดคัดลอกให้แม่นยำ - การตั้งค่า Temperature ไว้ที่ 0.3 จะช่วยให้ผลลัพธ์มีความแม่นยำและไม่ออกนอกลู่นอกทาง (grounded) สำหรับการสรุปความ คุณต้องการความสม่ำเสมอและความซื่อตรงต่อข้อความต้นฉบับ ไม่ใช่การแต่งเติมอย่างสร้างสรรค์ หากคุณเพิ่มค่า temperature ไปใกล้ 1.0 โมเดลจะเริ่มใช้สำนวนที่อิสระเกินไปและอาจมีการแต่งรายละเอียดขึ้นมาเองในบางครั้ง
- ตัว Prompt เองมีความเฉพาะเจาะจง แทนที่จะโยนข้อความดิบใส่โมเดลด้วยคำสั่งคลุมเครืออย่าง "summarize this" เราจะสั่งอย่างชัดเจนว่าให้สรุปประเด็นสำคัญและสั่งให้ข้ามเนื้อหาที่ไม่จำเป็น (fluff) ความชัดเจนในลักษณะนี้จะช่วยแยกผลลัพธ์ที่ใช้งานไม่ได้ออกจากสิ่งที่สามารถนำไปใช้งานจริงได้
วางไฟล์ข้อความใดก็ได้ที่คุณต้องการสรุปไว้ในไดเรกทอรีเดียวกันและตั้งชื่อว่า document.txt
Step 4: Run It
เมื่อเปิดใช้งาน virtual environment แล้ว ให้รันคำสั่ง:
python summarize.py
หาก credentials และสิทธิ์การเข้าถึงโมเดลของคุณถูกต้อง คุณควรเห็นสรุปที่เรียบร้อยพิมพ์ออกมาใน terminal ภายในไม่กี่วินาที หากคุณพบข้อผิดพลาดด้านการเข้าถึง (access error) ให้ตรวจสอบสิทธิ์ IAM ของคุณอีกครั้ง และยืนยันว่าคุณได้เปิดใช้งาน Claude 3 Haiku ในคอนโซลแล้ว
Pushing Beyond the Script
Pipeline นี้ถูกออกแบบมาให้เรียบง่ายโดยตั้งใจ แต่นี่คือรากฐานสำหรับการทำ automation ที่ใช้งานได้จริง ต่อไปนี้คือวิธีที่คุณสามารถขยายขีดความสามารถของมันได้โดยไม่ทำให้ระบบซับซ้อนเกินความจำเป็น
Batch processing. เปลี่ยนจากการอ่านไฟล์เดียวเป็นการใช้ loop วนลูปผ่าน directory แทน เพียงแค่ใส่ไฟล์ PDF หรือ text จำนวน 50 ไฟล์ลงในโฟลเดอร์ input จากนั้นวนลูปประมวลผลไฟล์เหล่านั้น และเขียนสรุปผลลงในโฟลเดอร์ output หากคุณต้องการดึงข้อมูลจาก PDF โดยตรง คุณจะต้องมีขั้นตอนการทำ preprocessing โดยใช้ library อย่าง PyPDF2 หรือ pdfplumber เพื่อดึงข้อความดิบ (raw text) ออกมาก่อนที่จะส่งไปยัง Bedrock
Chunking strategy. เอกสารที่มีความยาวมากอาจเกินขีดจำกัด context ของโมเดล เมื่อเกิดเหตุการณ์นี้ ให้แบ่งข้อความออกเป็นส่วนๆ (chunks) ตามย่อหน้าหรือหัวข้อที่เหมาะสม สรุปแต่ละส่วนแยกกัน แล้วจึงส่งสรุปผลระหว่างทางเหล่านั้นกลับไปยังโมเดลอีกครั้งเพื่อทำการสังเคราะห์ข้อมูลในขั้นตอนสุดท้าย แนวทางแบบสองขั้นตอนนี้จะช่วยให้คุณอยู่ภายใต้ขีดจำกัดของ token ในขณะที่ยังคงรักษาเนื้อหาที่ครอบคลุมเอกสารทั้งหมดไว้ได้
Error handling. โค้ดสำหรับใช้งานจริง (production code) ควรดักจับ boto3.exceptions.ClientError โดยเฉพาะ เนื่องจาก AWS อาจจำกัดความเร็ว (throttle) ของคำขอหากคุณเรียกใช้ API ถี่เกินไป ควรครอบการเรียกใช้ converse ด้วย retry loop ที่มีระบบ exponential backoff หรือใช้ library อย่าง tenacity เพื่อจัดการกับ rate limits อย่างเหมาะสม
Prompt engineering. ความแตกต่างระหว่างสรุปผลที่ธรรมดาๆ กับสรุปผลที่มีประโยชน์ มักขึ้นอยู่กับ prompt หากคุณต้องการให้อ่านง่าย ให้สั่งให้สรุปเป็น bullet points หากกลุ่มเป้าหมายคือผู้บริหารระดับสูง ให้สั่งให้สรุปเป็น executive summary ความยาวหนึ่งย่อหน้า คุณยังสามารถกำหนดข้อจำกัดด้านรูปแบบได้ เช่น "จำกัดการสรุปให้เหลือเพียงสามประโยค" หรือ "ส่งผลลัพธ์กลับมาเป็น JSON โดยมี keys สำหรับ topic, key_points และ action_items"
บทสรุปที่สำคัญ
การเปลี่ยนจากการทดลองใน chat playground มาเป็นสคริปต์ที่ใช้งานได้จริง คือจุดเปลี่ยนสำคัญที่ทำให้ AI กลายเป็นโครงสร้างพื้นฐาน (infrastructure) เมื่อ pipeline นี้ทำงานได้ในเครื่องของคุณแล้ว คุณสามารถนำมันไปรันบน AWS Lambda function ที่ทำงานเมื่อมีการอัปโหลดไฟล์ไปยัง S3, ตั้งเวลาทำงานบน ECS Fargate หรือเชื่อมต่อเข้ากับ data workflow ที่มีอยู่เดิม การเรียกใช้ API เป็นเพียงส่วนที่ง่ายที่สุด แต่คุณค่าทางวิศวกรรมที่แท้จริงมาจากการนำการเรียกใช้นั้นมาห่อหุ้มด้วย logic ที่จัดการทั้งเรื่องไฟล์, ข้อผิดพลาด และการจัดรูปแบบ เพื่อที่คุณจะได้ไม่ต้องคัดลอกและวางข้อความลงในเบราว์เซอร์อีกต่อไป
สำหรับข้อมูลเพิ่มเติมและรูปแบบอื่นๆ ของการตั้งค่านี้ สามารถดูคู่มือฉบับเต็มได้ที่ Dev.to หากคุณต้องการพูดคุยเกี่ยวกับ AWS architectures, LLM pipelines หรือ prompt engineering กับชุมชนนักพัฒนา สามารถเข้าร่วมพูดคุยได้ที่ [GyaanSetu AI on Telegram](https://t.me/GyaanSet
