0Pricing
AI Agents · บทเรียน

การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน

วัดการใช้โทเคนต่อการเรียกใช้เครื่องมือและต่อขั้นตอนการให้เหตุผล

การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse
  2. การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน
  3. การระบุขั้นตอนที่ช้าและมีค่าใช้จ่ายสูง
  4. การวิเคราะห์สาเหตุรากของความล้มเหลวของเอเจนต์
← กลับไปที่ AI Agents