การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน
วัดการใช้โทเคนต่อการเรียกใช้เครื่องมือและต่อขั้นตอนการให้เหตุผล
การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงควรวิเคราะห์การใช้โทเค็น
ค่าใช้จ่ายของส่วนเชื่อมต่อโปรแกรมประยุกต์ LLM เพิ่มขึ้นโดยตรงตามปริมาณการใช้โทเค็น การทำงานของเอเจนต์เพียงครั้งเดียวอาจเรียกใช้ LLM หลายสิบครั้ง หากไม่มีการวิเคราะห์แยกตาม Step คุณจะไม่ทราบว่า Step ใดมีค่าใช้จ่ายสูง ควรแคชตรงไหน หรือจะลดค่าใช้จ่ายได้อย่างไร
การอ่านการใช้โทเค็นจาก OpenAI
การตอบกลับจาก completion ของ OpenAI ทุกครั้งจะมีออบเจ็กต์ usage ที่ประกอบด้วย prompt_tokens, completion_tokens และ total_tokens ควรบันทึกข้อมูลนี้ไว้เสมอ
import openai
client = openai.OpenAI(api_key='sk-...')
def call_llm_with_tracking(prompt: str, model: str = 'gpt-4o-mini') -> dict:
response = client.chat.completions.create(
model=model,
messages=[{'role': 'user', 'content': prompt}]
)
usage = response.usage
return {
'content': response.choices[0].message.content,
'prompt_tokens': usage.prompt_tokens,
'completion_tokens': usage.completion_tokens,
'total_tokens': usage.total_tokens,
'model': model
}
result = call_llm_with_tracking('What is the capital of France?')
print(f'Response: {result["content"]}')
print(f'Tokens - Prompt: {result["prompt_tokens"]}, Completion: {result["completion_tokens"]}, Total: {result["total_tokens"]}')การคำนวณต้นทุนต่อการเรียกใช้
คำนวณต้นทุนเป็นดอลลาร์ของการเรียกใช้ LLM แต่ละครั้งโดยใช้ตารางราคา โดยทั่วไปต้นทุนจะคิดต่อโทเค็นหนึ่งล้านรายการ ดังนี้ cost = (prompt_tokens / 1_000_000) * input_price + (completion_tokens / 1_000_000) * output_price
# Pricing per million tokens (as of early 2025 - verify current prices)
MODEL_PRICING = {
'gpt-4o': {'input': 2.50, 'output': 10.00},
'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
'gpt-4-turbo': {'input': 10.00, 'output': 30.00},
'claude-3-5-sonnet-20241022': {'input': 3.00, 'output': 15.00},
'claude-3-haiku-20240307': {'input': 0.25, 'output': 1.25}
}
def calculate_cost(prompt_tokens: int, completion_tokens: int, model: str) -> float:
pricing = MODEL_PRICING.get(model)
if not pricing:
return 0.0
input_cost = (prompt_tokens / 1_000_000) * pricing['input']
output_cost = (completion_tokens / 1_000_000) * pricing['output']
return input_cost + output_cost
# Example
prompt_tokens = 500
completion_tokens = 200
model = 'gpt-4o-mini'
cost = calculate_cost(prompt_tokens, completion_tokens, model)
print(f'Cost for {prompt_tokens}+{completion_tokens} tokens on {model}: ${cost:.6f}')ตัวติดตามต้นทุนสะสม
ติดตามต้นทุนสะสมตลอดการทำงานของเอเจนต์หนึ่งครั้ง ตัวติดตามต้นทุนจะสะสมการใช้โทเค็นและต้นทุนของแต่ละ Step ทำให้เห็นได้ง่ายว่า Step ใดใช้ทรัพยากรตามงบประมาณมากที่สุด
from dataclasses import dataclass, field
from typing import List
@dataclass
class StepCost:
step_name: str
model: str
prompt_tokens: int
completion_tokens: int
cost_usd: float
@dataclass
class CostTracker:
steps: List[StepCost] = field(default_factory=list)
def record(self, step_name: str, model: str, prompt_tokens: int, completion_tokens: int):
cost = calculate_cost(prompt_tokens, completion_tokens, model)
self.steps.append(StepCost(
step_name=step_name,
model=model,
prompt_tokens=prompt_tokens,
completion_tokens=completion_tokens,
cost_usd=cost
))
@property
def total_cost(self) -> float:
return sum(s.cost_usd for s in self.steps)
@property
def total_tokens(self) -> int:
return sum(s.prompt_tokens + s.completion_tokens for s in self.steps)
def summary(self) -> str:
lines = ['=== Cost Summary ===']
for step in self.steps:
lines.append(f'{step.step_name}: {step.prompt_tokens}+{step.completion_tokens} tokens = ${step.cost_usd:.6f}')
lines.append(f'TOTAL: {self.total_tokens} tokens = ${self.total_cost:.6f}')
return '\n'.join(lines)
tracker = CostTracker()
tracker.record('entity_extraction', 'gpt-4o-mini', 200, 50)
tracker.record('vector_search_query', 'gpt-4o-mini', 100, 30)
tracker.record('answer_generation', 'gpt-4o-mini', 1500, 300)
print(tracker.summary())ต้นทุนแยกตามประเภทการเรียกใช้เครื่องมือ
แจกแจงต้นทุนตามประเภทการเรียกใช้เครื่องมือจากการทำงานของเอเจนต์หลายครั้ง เครื่องมือบางอย่างถูกเรียกใช้บ่อยกว่ามากและเป็นสาเหตุหลักของต้นทุน
from collections import defaultdict
class ToolCostAnalyzer:
def __init__(self):
self.tool_stats = defaultdict(lambda: {
'call_count': 0,
'total_prompt_tokens': 0,
'total_completion_tokens': 0,
'total_cost_usd': 0.0
})
def record_tool_call(self, tool_name: str, prompt_tokens: int, completion_tokens: int, model: str):
cost = calculate_cost(prompt_tokens, completion_tokens, model)
stats = self.tool_stats[tool_name]
stats['call_count'] += 1
stats['total_prompt_tokens'] += prompt_tokens
stats['total_completion_tokens'] += completion_tokens
stats['total_cost_usd'] += cost
def report(self):
print('=== Tool Cost Breakdown ===')
sorted_tools = sorted(
self.tool_stats.items(),
key=lambda x: x[1]['total_cost_usd'],
reverse=True
)
for tool_name, stats in sorted_tools:
avg_cost = stats['total_cost_usd'] / stats['call_count']
print(f'{tool_name}: {stats["call_count"]} calls, total ${stats["total_cost_usd"]:.4f}, avg ${avg_cost:.6f}/call')
analyzer = ToolCostAnalyzer()
analyzer.record_tool_call('search_web', 800, 200, 'gpt-4o-mini')
analyzer.record_tool_call('search_web', 750, 180, 'gpt-4o-mini')
analyzer.record_tool_call('read_email', 300, 100, 'gpt-4o-mini')
analyzer.record_tool_call('generate_report', 2000, 500, 'gpt-4o')
analyzer.report()การผสานการติดตามต้นทุนเข้ากับลูปของเอเจนต์
ครอบฟังก์ชันการเรียกใช้ LLM เพื่อให้ติดตามต้นทุนโดยอัตโนมัติเป็นส่วนหนึ่งของลูปเอเจนต์ ส่งตัวติดตามไปยังส่วนต่าง ๆ เพื่อให้การเรียกใช้ทุกครั้งมีส่วนรวมในยอดรวมของเซสชัน
import openai
client = openai.OpenAI(api_key='sk-...')
def tracked_completion(tracker: CostTracker, step_name: str, messages: list, model: str = 'gpt-4o-mini') -> str:
response = client.chat.completions.create(
model=model,
messages=messages
)
usage = response.usage
tracker.record(
step_name=step_name,
model=model,
prompt_tokens=usage.prompt_tokens,
completion_tokens=usage.completion_tokens
)
return response.choices[0].message.content
def run_agent_with_cost_tracking(question: str) -> dict:
tracker = CostTracker()
# Step 1: Entity extraction
entities_str = tracked_completion(
tracker, 'entity_extraction',
[{'role': 'user', 'content': f'Extract entities from: {question}'}]
)
# Step 2: Answer generation
answer = tracked_completion(
tracker, 'answer_generation',
[{'role': 'user', 'content': question}]
)
return {
'answer': answer,
'cost_summary': tracker.summary(),
'total_cost_usd': tracker.total_cost
}การประมาณจำนวนโทเค็นก่อนเรียกใช้
ใช้ tiktoken เพื่อประมาณจำนวนโทเค็นก่อนเรียกใช้ส่วนเชื่อมต่อโปรแกรมประยุกต์ วิธีนี้ช่วยให้คุณบังคับใช้ขีดจำกัดงบประมาณและตรวจจับพรอมต์ที่มีขนาดใหญ่ผิดปกติได้ตั้งแต่เนิ่น ๆ
import tiktoken
DEFAULT_ENCODER = tiktoken.encoding_for_model('gpt-4o-mini')
def estimate_tokens(text: str, model: str = 'gpt-4o-mini') -> int:
try:
encoding = tiktoken.encoding_for_model(model)
except KeyError:
encoding = DEFAULT_ENCODER
return len(encoding.encode(text))
def check_prompt_budget(messages: list, max_tokens: int = 8000) -> dict:
total = 0
breakdown = []
for msg in messages:
count = estimate_tokens(msg.get('content', ''))
total += count
breakdown.append({'role': msg['role'], 'tokens': count})
return {
'total_tokens': total,
'within_budget': total <= max_tokens,
'budget': max_tokens,
'breakdown': breakdown
}
messages = [
{'role': 'system', 'content': 'You are a helpful assistant that...'},
{'role': 'user', 'content': 'Explain the concept of quantum entanglement in simple terms.'}
]
result = check_prompt_budget(messages)
print(f'Total tokens: {result["total_tokens"]}, Within budget: {result["within_budget"]}')งบประมาณต้นทุนและจุดตัด
ป้องกันต้นทุนของเอเจนต์ที่เพิ่มขึ้นอย่างควบคุมไม่ได้ด้วยการกำหนดขีดจำกัดงบประมาณต่อการทำงานและต่อวัน หากการทำงานใช้งบประมาณเกินขีดจำกัด ให้ยุติอย่างเหมาะสมพร้อมส่งคืนผลลัพธ์บางส่วน แทนที่จะใช้จ่ายต่อไป
class BudgetGuard:
def __init__(self, max_cost_per_run: float = 0.10, max_cost_per_day: float = 5.00):
self.max_run = max_cost_per_run
self.max_day = max_cost_per_day
self.day_spend = 0.0
def check_and_spend(self, tracker: 'CostTracker', about_to_spend_estimate: float = 0.001):
if tracker.total_cost >= self.max_run:
raise RuntimeError(
f'Run budget exceeded: ${tracker.total_cost:.4f} >= ${self.max_run}'
)
if self.day_spend + tracker.total_cost >= self.max_day:
raise RuntimeError(
f'Daily budget exceeded: ${self.day_spend:.4f} daily spend'
)
def finalize_run(self, tracker: 'CostTracker'):
self.day_spend += tracker.total_cost
print(f'Run cost: ${tracker.total_cost:.6f}, Day total: ${self.day_spend:.4f}')
guard = BudgetGuard(max_cost_per_run=0.05, max_cost_per_day=2.00)
tracker = CostTracker()
tracker.record('test_step', 'gpt-4o-mini', 100, 50)
guard.check_and_spend(tracker)
guard.finalize_run(tracker)การจัดเก็บข้อมูลต้นทุนเพื่อการวิเคราะห์
บันทึกข้อมูลต้นทุนของการทำงานลงในฐานข้อมูลเพื่อวิเคราะห์แนวโน้ม แบ่งสรรค่าใช้จ่าย และประกอบการตัดสินใจเพิ่มประสิทธิภาพ ตาราง SQLite แบบง่ายเหมาะสำหรับเอเจนต์ส่วนใหญ่
import sqlite3
from datetime import datetime
def init_cost_db(db_path: str = 'agent_costs.db'):
conn = sqlite3.connect(db_path)
conn.execute('''
CREATE TABLE IF NOT EXISTS run_costs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
run_id TEXT NOT NULL,
step_name TEXT NOT NULL,
model TEXT NOT NULL,
prompt_tokens INTEGER,
completion_tokens INTEGER,
cost_usd REAL,
timestamp TEXT
)
''')
conn.commit()
return conn
def save_run_costs(conn, run_id: str, tracker: 'CostTracker'):
for step in tracker.steps:
conn.execute(
'INSERT INTO run_costs (run_id, step_name, model, prompt_tokens, completion_tokens, cost_usd, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)',
(run_id, step.step_name, step.model, step.prompt_tokens, step.completion_tokens, step.cost_usd, datetime.utcnow().isoformat())
)
conn.commit()
print(f'Saved {len(tracker.steps)} cost records for run {run_id}')
conn = init_cost_db()
print('Cost database initialized')การแจ้งเตือนการใช้โทเค็น
แจ้งเตือนเมื่อการทำงานของเอเจนต์ครั้งเดียวใช้โทเค็นเกินกว่าที่คาดไว้ การพุ่งสูงขึ้นอย่างผิดปกติมักบ่งชี้ถึงข้อบกพร่อง เช่น บริบทขยายตัวไม่สิ้นสุด การเรียกใช้เครื่องมือซ้ำ หรือไม่มีตรรกะตัดทอนข้อมูล
def check_token_spike(tracker: 'CostTracker', expected_max_tokens: int = 10000) -> dict:
total = tracker.total_tokens
if total > expected_max_tokens:
# Find the biggest steps
sorted_steps = sorted(tracker.steps, key=lambda s: s.prompt_tokens + s.completion_tokens, reverse=True)
top_steps = [
{'step': s.step_name, 'tokens': s.prompt_tokens + s.completion_tokens}
for s in sorted_steps[:3]
]
message = (
f'Token spike: {total} tokens (expected <= {expected_max_tokens}). '
f'Top consumers: {top_steps}'
)
print(f'ALERT: {message}')
return {'alert': True, 'total_tokens': total, 'message': message, 'top_steps': top_steps}
return {'alert': False, 'total_tokens': total}
tracker = CostTracker()
tracker.record('context_builder', 'gpt-4o-mini', 8000, 200) # Unusually large prompt
result = check_token_spike(tracker, expected_max_tokens=5000)
print('Spike check:', result['alert'], '-', result.get('message', 'OK'))คำสั่งสร้างรายงานต้นทุน
สอบถามฐานข้อมูลต้นทุนเพื่อสร้างรายงาน ได้แก่ ค่าใช้จ่ายรายวันแยกตามโมเดล Step ที่มีค่าใช้จ่ายสูงที่สุด และแนวโน้มต้นทุนในช่วงเวลา การทำเช่นนี้ช่วยชี้แนวทางการตัดสินใจเพิ่มประสิทธิภาพ
import sqlite3
from datetime import datetime, timedelta
def cost_report(db_path: str = 'agent_costs.db', days: int = 7) -> dict:
conn = sqlite3.connect(db_path)
since = (datetime.utcnow() - timedelta(days=days)).isoformat()
# Total cost by model
model_costs = conn.execute('''
SELECT model, SUM(cost_usd) as total_cost, COUNT(*) as call_count
FROM run_costs WHERE timestamp >= ?
GROUP BY model ORDER BY total_cost DESC
''', (since,)).fetchall()
# Top expensive steps
step_costs = conn.execute('''
SELECT step_name, SUM(cost_usd) as total_cost, AVG(cost_usd) as avg_cost
FROM run_costs WHERE timestamp >= ?
GROUP BY step_name ORDER BY total_cost DESC LIMIT 10
''', (since,)).fetchall()
conn.close()
return {
'period_days': days,
'by_model': [{'model': r[0], 'total_usd': r[1], 'calls': r[2]} for r in model_costs],
'by_step': [{'step': r[0], 'total_usd': r[1], 'avg_usd': r[2]} for r in step_costs]
}
print('Cost report function defined')แบบทดสอบความรู้: การวิเคราะห์โทเค็นและต้นทุน
ทดสอบความเข้าใจเกี่ยวกับการวิเคราะห์โทเค็นและต้นทุนแยกตาม Step
สรุปการวิเคราะห์ต้นทุน
การวิเคราะห์ต้นทุนอย่างมีประสิทธิภาพต้องทำสิ่งต่อไปนี้: บันทึกข้อมูลการใช้จากการตอบกลับของส่วนเชื่อมต่อโปรแกรมประยุกต์ทุกครั้ง คำนวณต้นทุนต่อ Step โดยใช้ตารางราคาของโมเดล ติดตามต้นทุนสะสมของการทำงานเอเจนต์แต่ละครั้ง แจกแจงต้นทุนตามประเภทการเรียกใช้เครื่องมือ บังคับใช้ขีดจำกัดงบประมาณด้วยการตรวจสอบตัวป้องกัน และบันทึกข้อมูลต้นทุนเพื่อวิเคราะห์แนวโน้มและเพิ่มประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน”
วัดการใช้โทเคนต่อการเรียกใช้เครื่องมือและต่อขั้นตอนการให้เหตุผล คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse
- การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน
- การระบุขั้นตอนที่ช้าและมีค่าใช้จ่ายสูง
- การวิเคราะห์สาเหตุรากของความล้มเหลวของเอเจนต์