การสร้างเอเจนต์วิเคราะห์ข้อมูล
สร้างเอเจนต์วิเคราะห์ข้อมูลตั้งแต่ต้นจนจบที่รับไฟล์ CSV และคำถามภาษาธรรมชาติ เขียนโค้ด pandas กับ matplotlib แบบทำซ้ำปรับปรุง และสร้างรายงานที่เรียบร้อยพร้อมใช้งาน
การสร้างเอเจนต์วิเคราะห์ข้อมูล เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
แนวคิดของเอเจนต์วิเคราะห์ข้อมูล
เอเจนต์วิเคราะห์ข้อมูลรับไฟล์ CSV และคำถามภาษาธรรมชาติ จากนั้นสำรวจข้อมูล ทำความสะอาดข้อมูล คำนวณสถิติ สร้างภาพข้อมูล และจัดทำรายงานที่เรียบเรียงอย่างดีโดยอัตโนมัติ ทั้งหมดนี้ผ่านการสร้างและประมวลผลโค้ดแบบทำซ้ำเป็นรอบ ๆ นี่เป็นหนึ่งในการประยุกต์ใช้เอเจนต์โค้ดที่ใช้งานได้จริงมากที่สุด และจำลองกระบวนการทำงานของนักวิเคราะห์ข้อมูลโดยตรง โดยลดภาระงานของมนุษย์ออกไป
สถาปัตยกรรมโดยรวมของเอเจนต์
เอเจนต์วิเคราะห์ข้อมูลมีสี่ระยะตามแนวคิด ได้แก่ การสำรวจ (ทำความเข้าใจรูปร่าง ชนิดข้อมูล และคุณภาพของข้อมูล) การทำความสะอาด (จัดการค่าที่หายไป ค่าผิดปกติ และการแปลงชนิดข้อมูล) การวิเคราะห์ (คำนวณตัวชี้วัดและสถิติที่ตอบคำถาม) และ การจัดทำรายงาน (สร้างแผนภูมิและสรุปข้อค้นพบเป็นข้อความ) แต่ละระยะสอดคล้องกับการประมวลผลโค้ด 1-5 รอบ
DATA_AGENT_SYSTEM_PROMPT = '''
You are a data analysis agent. Given a CSV file and a question, answer it through iterative Python code.
Phases to follow:
1. EXPLORE: Load the data, print shape, dtypes, head(), describe(), and check for nulls.
2. CLEAN: Handle missing values, fix dtypes, remove outliers.
3. ANALYZE: Compute statistics, groupbys, correlations - whatever answers the question.
4. REPORT: Generate a matplotlib chart saved to /workspace/chart.png and write a text summary.
Rules:
- Write code in ```python ... ``` blocks.
- Save intermediate results to /workspace/ for use in later steps.
- Print key findings after each computation so you can observe them.
- When all phases are done, say TASK COMPLETE and summarize the answer.
'''ระยะที่ 1: โค้ดสำรวจข้อมูล
ระยะการสำรวจจะโหลดข้อมูลและแสดงข้อมูลทั้งหมดที่จำเป็นต่อการวางแผนการวิเคราะห์ทันที ได้แก่ รูปร่าง ชื่อและชนิดของคอลัมน์ แถวตัวอย่าง สถิติสรุป และจำนวนค่าว่าง LLM จะอ่านผลลัพธ์นี้และใช้ประกอบการตัดสินใจอย่างมีข้อมูลเกี่ยวกับการทำความสะอาดและการวิเคราะห์ในรอบถัดไป
import pandas as pd
import numpy as np
# Load dataset
df = pd.read_csv('/workspace/data.csv')
# Basic exploration
print('=== SHAPE ===' )
print(df.shape)
print('\n=== DTYPES ===')
print(df.dtypes)
print('\n=== HEAD ===')
print(df.head())
print('\n=== DESCRIBE ===')
print(df.describe(include='all'))
print('\n=== NULL COUNTS ===')
print(df.isnull().sum())
print('\n=== UNIQUE VALUES (categorical) ===')
for col in df.select_dtypes(include='object').columns:
print(f'{col}: {df[col].nunique()} unique values: {df[col].unique()[:5]}')
# Save for next iteration
df.to_parquet('/workspace/raw.parquet')
print('\nData saved to workspace.')ระยะที่ 2: การทำความสะอาดข้อมูล
หลังจากสำรวจแล้ว เอเจนต์จะเขียนโค้ดทำความสะอาดที่มุ่งเป้าไปยังปัญหาต่าง ๆ ตามสิ่งที่สังเกตพบ กลยุทธ์การทำความสะอาดจะปรับเปลี่ยนตามข้อมูล หาก LLM สังเกตว่าคอลัมน์หนึ่งมีค่าว่าง 15% ก็จะตัดสินใจว่าจะลบค่าหรือเติมค่า หากพบค่าติดลบในคอลัมน์ที่ควรมีค่าไม่ติดลบ ก็จะกรองค่าเหล่านั้นออก การทำความสะอาดแบบปรับตามข้อมูลและขับเคลื่อนด้วยสิ่งที่สังเกตพบนี้ทำให้เอเจนต์มีประโยชน์อย่างแท้จริง แทนที่จะเพียงเรียกใช้กระบวนการแบบตายตัว
import pandas as pd
import numpy as np
# Load from previous iteration
df = pd.read_parquet('/workspace/raw.parquet')
# Fill numeric nulls with median (robust to outliers)
for col in df.select_dtypes(include='number').columns:
if df[col].isnull().sum() > 0:
median_val = df[col].median()
df[col] = df[col].fillna(median_val)
print(f'Filled nulls in {col} with median {median_val:.2f}')
# Drop rows where categorical key columns are null
df = df.dropna(subset=['category', 'date'])
# Fix date column type
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df = df.dropna(subset=['date']) # drop unparseable dates
# Remove clear outliers: revenue > 3 std deviations from mean
if 'revenue' in df.columns:
z_scores = (df['revenue'] - df['revenue'].mean()) / df['revenue'].std()
df = df[z_scores.abs() < 3]
print(f'Removed outliers, rows remaining: {len(df)}')
df.to_parquet('/workspace/cleaned.parquet')
print('Cleaning complete:', df.shape)ระยะที่ 3: การตอบคำถาม
ในระยะการวิเคราะห์ เอเจนต์จะมุ่งคำนวณคำตอบเฉพาะสำหรับคำถามของผู้ใช้ หากคำถามคือ 'หมวดหมู่สินค้าใดมีรายได้สูงสุดในไตรมาสที่ผ่านมา' เอเจนต์จะเขียนโค้ดเพื่อกรองตามวันที่ จัดกลุ่มตามหมวดหมู่ รวมรายได้ และเรียงลำดับ โค้ดวิเคราะห์จะถูกสร้างขึ้นใหม่ตามทั้งคำถามและสิ่งที่เอเจนต์สังเกตพบระหว่างการสำรวจ ไม่ใช่แม่แบบทั่วไป
import pandas as pd
import matplotlib
matplotlib.use('Agg') # non-interactive backend for server use
import matplotlib.pyplot as plt
df = pd.read_parquet('/workspace/cleaned.parquet')
# Analysis: revenue by category for last quarter
df['date'] = pd.to_datetime(df['date'])
last_quarter = df[df['date'] >= '2024-10-01']
revenue_by_category = (
last_quarter
.groupby('category')['revenue']
.sum()
.sort_values(ascending=False)
)
print('Revenue by category (last quarter):')
print(revenue_by_category)
print(f'\nTop category: {revenue_by_category.index[0]} (${revenue_by_category.iloc[0]:,.0f})')
# Save analysis result
revenue_by_category.to_json('/workspace/analysis_result.json')ระยะที่ 4: การสร้างแผนภูมิ
ภาพข้อมูลช่วยให้ข้อค้นพบจากการวิเคราะห์ชัดเจนและน่าสนใจยิ่งขึ้น เอเจนต์วิเคราะห์ข้อมูลจะสร้างแผนภูมิ matplotlib และบันทึกเป็นไฟล์ PNG ในพื้นที่ทำงาน การตัดสินใจสำคัญด้านการออกแบบแผนภูมิ เช่น ชนิดแผนภูมิ ชุดสี ป้ายกำกับแกน ชื่อเรื่อง และคำอธิบายประกอบ จะดำเนินการโดย LLM ตามลักษณะของข้อมูล เอเจนต์จะบันทึกแผนภูมิไว้ที่ /workspace/ เสมอ เพื่อให้สามารถนำไปรวมในรายงานสุดท้ายได้
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import json
with open('/workspace/analysis_result.json') as f:
data = json.load(f)
categories = list(data.keys())
values = [data[k] / 1e6 for k in categories] # convert to millions
fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.barh(categories, values, color='steelblue', edgecolor='white')
# Add value labels on bars
for bar, val in zip(bars, values):
ax.text(bar.get_width() + 0.05, bar.get_y() + bar.get_height()/2,
f'${val:.1f}M', va='center', fontsize=11)
ax.set_xlabel('Revenue ($ Millions)', fontsize=12)
ax.set_title('Revenue by Product Category - Q4 2024', fontsize=14, fontweight='bold')
ax.invert_yaxis() # highest on top
plt.tight_layout()
plt.savefig('/workspace/chart.png', dpi=150, bbox_inches='tight')
print('Chart saved to /workspace/chart.png')การสร้างรายงานเป็นลายลักษณ์อักษร
การทำงานรอบสุดท้ายจะสร้างรายงานสรุปเป็นลายลักษณ์อักษร LLM จะอ่านผลการวิเคราะห์และคำอธิบายแผนภูมิ จากนั้นเขียนเนื้อหาที่กระชับและถูกต้องเพื่อตอบคำถามเดิมด้วยตัวเลขที่เจาะจง รายงานจะอ้างอิงแผนภูมิและประกอบด้วยข้อค้นพบสำคัญ ข้อมูลสนับสนุน และคำแนะนำหรือผลกระทบต่อธุรกิจ
import json
with open('/workspace/analysis_result.json') as f:
revenue_data = json.load(f)
top_category = max(revenue_data, key=revenue_data.get)
top_revenue = revenue_data[top_category]
total_revenue = sum(revenue_data.values())
share = top_revenue / total_revenue * 100
report = f'''# Q4 2024 Revenue Analysis
## Answer
The **{top_category}** category generated the highest revenue in Q4 2024:
**${top_revenue:,.0f}** ({share:.1f}% of total Q4 revenue).
## Key Findings
- Total Q4 revenue: ${total_revenue:,.0f}
- Top 3 categories: {list(revenue_data.items())[:3]}
- The top category outperformed the average by {top_revenue / (total_revenue / len(revenue_data)):.1f}x
## Chart
See chart.png for the full breakdown by category.
## Recommendation
Consider reallocating marketing budget toward {top_category} to
capitalize on its demonstrated strong performance.
'''
with open('/workspace/report.md', 'w') as f:
f.write(report)
print('TASK COMPLETE')
print(report)การประกอบตัวประสานงานเอเจนต์
ตัวประสานงานจะเชื่อมทุกระยะเข้าด้วยกัน ได้แก่ เริ่มต้นพื้นที่ทำงาน คัดลอก CSV อินพุต เรียกใช้ลูปการประมวลผลโค้ด ตรวจสอบสัญญาณ TASK COMPLETE และรวบรวมไฟล์ผลลัพธ์ (report.md, chart.png) ตัวประสานงานยังจัดการข้อผิดพลาด การลองใหม่ และการล้างไฟล์ระหว่างการประมวลผลในขั้นตอนสุดท้ายด้วย
import shutil
from pathlib import Path
def run_data_analysis_agent(csv_path: str, question: str) -> dict:
workspace = setup_workspace()
shutil.copy(csv_path, workspace / 'data.csv')
messages = [
{'role': 'system', 'content': DATA_AGENT_SYSTEM_PROMPT},
{'role': 'user', 'content': f'File: /workspace/data.csv\nQuestion: {question}'}
]
state = ExecutionState(task=question)
for iteration in range(15): # max 15 iterations
response = llm.complete(messages)
code = extract_code_block(response)
if not code or 'TASK COMPLETE' in response:
break
stdout, stderr = execute_in_docker(code, workspace=workspace)
observation = format_observation(stdout, stderr)
messages += [
{'role': 'assistant', 'content': response},
{'role': 'user', 'content': observation}
]
state.after_execution(stdout, f'iteration_{iteration}')
return {
'report': (workspace / 'report.md').read_text() if (workspace / 'report.md').exists() else '',
'chart_path': str(workspace / 'chart.png'),
'iterations': state.iteration
}การจัดการคำถามที่กำกวม
ผู้ใช้มักถามคำถามที่กำกวม เช่น 'สินค้าชนิดใดกำลังทำผลงานได้ดี' เอเจนต์วิเคราะห์ข้อมูลที่มีประสิทธิภาพจะ ทำให้คำถามชัดเจนก่อนเริ่มต้น โดยเริ่มจากสำรวจข้อมูล ระบุตัวชี้วัดที่มีอยู่ แล้วจึงอนุมานความหมายที่สมเหตุสมผลที่สุดหรือขอให้ผู้ใช้ชี้แจง ขั้นตอนการไตร่ตรองนี้ช่วยป้องกันไม่ให้เอเจนต์สร้างคำตอบที่ถูกต้องในทางเทคนิคแต่ไร้ประโยชน์ในทางปฏิบัติ
def handle_ambiguous_question(question: str, df_summary: dict) -> str:
clarification_prompt = f'''The user asked: '{question}'
Available data:
- Columns: {df_summary['columns']}
- Date range: {df_summary['date_range']}
- Metrics available: {df_summary['numeric_columns']}
Is the question clear enough to answer definitively?
If yes, restate the specific interpretation you will use.
If no, list the 2-3 clarifications needed to proceed.'''
response = llm.complete([{'role': 'user', 'content': clarification_prompt}])
return responseการตรวจสอบคุณภาพผลลัพธ์ของเอเจนต์
หลังจากเอเจนต์ทำงานเสร็จแล้ว ให้ตรวจสอบคุณภาพของผลลัพธ์ ตรวจสอบว่าไฟล์รายงานถูกสร้างขึ้นจริง แผนภูมิ PNG เป็นไฟล์ภาพที่ถูกต้อง ตัวเลขในรายงานตรงกับข้อมูลใน analysis_result.json และรายงานตอบคำถามเดิมได้จริง ขั้นตอน QA อัตโนมัติโดยใช้การเรียก LLM ครั้งที่สองสามารถตรวจจับกรณีที่เอเจนต์ทำงานครบกระบวนการแล้ว แต่สร้างคำตอบที่มีคุณภาพต่ำได้
def validate_analysis_output(workspace: str, question: str, report: str) -> dict:
validation_prompt = f'''Original question: {question}
Agent report:
{report[:2000]}
Rate this analysis on a scale of 1-5 for:
1. Does it directly answer the question? (1=No, 5=Yes)
2. Are specific numbers cited? (1=No, 5=Yes)
3. Is the conclusion clearly stated? (1=No, 5=Yes)
Return JSON: {{"question_answered": N, "numbers_cited": N, "clear_conclusion": N, "overall": N}}'''
result = llm.complete([{'role': 'user', 'content': validation_prompt}],
response_format={'type': 'json_object'})
scores = json.loads(result)
passed = scores['overall'] >= 4
return {'scores': scores, 'passed': passed}การขยายเอเจนต์ด้วยเครื่องมือเฉพาะด้าน
เอเจนต์เขียนโค้ดพื้นฐานจะมีความสามารถมากยิ่งขึ้นเมื่อเพิ่มเครื่องมือเฉพาะด้านเข้าไป สำหรับเอเจนต์ข้อมูลทางการเงิน ให้เพิ่มฟังก์ชันที่ดึงราคาหุ้นล่าสุด สำหรับเอเจนต์ข้อมูลการตลาด ให้เพิ่มการเข้าถึง API ของ Google Analytics และสำหรับเอเจนต์ฝ่ายขาย ให้เพิ่มคำสั่งค้นหาข้อมูลจาก Salesforce เครื่องมือเหล่านี้จะพร้อมให้ LLM ใช้งานผ่านคำจำกัดความของฟังก์ชันในพรอมต์ระบบ หรือผ่านตัวตกแต่ง @tool ของ LangChain
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับเอเจนต์วิเคราะห์ข้อมูลจากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า เอเจนต์วิเคราะห์ข้อมูลทำงานผ่านสี่ระยะ ได้แก่ สำรวจ ทำความสะอาด วิเคราะห์ และรายงาน โดยแต่ละระยะทำผ่านการสร้างและเรียกใช้โค้ดแบบวนซ้ำ การสร้างแผนภูมิด้วย matplotlib และการเก็บสถานะไว้ในไฟล์ช่วยเชื่อมทุกระยะให้เป็นกระบวนการทำงานเดียวกันที่สอดคล้องกัน และ การตรวจสอบผลลัพธ์ช่วยให้มั่นใจว่าคำตอบสุดท้ายของเอเจนต์ตอบคำถามเดิมได้จริง บทถัดไป เราจะสำรวจการสังเกตการณ์และการติดตามร่องรอยของ LLM
คำถามที่พบบ่อย
บทเรียน “การสร้างเอเจนต์วิเคราะห์ข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างเอเจนต์วิเคราะห์ข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างเอเจนต์วิเคราะห์ข้อมูล”
สร้างเอเจนต์วิเคราะห์ข้อมูลตั้งแต่ต้นจนจบที่รับไฟล์ CSV และคำถามภาษาธรรมชาติ เขียนโค้ด pandas กับ matplotlib แบบทำซ้ำปรับปรุง และสร้างรายงานที่เรียบร้อยพร้อมใช้งาน คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างเอเจนต์วิเคราะห์ข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม
ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ลูปการเรียกใช้โค้ด
- การทำแซนด์บ็อกซ์ด้วย Docker และ RestrictedPython
- การจัดการสถานะระหว่างขั้นตอนการเรียกใช้
- การสร้างเอเจนต์วิเคราะห์ข้อมูล