今天我們要深入探討三個模型上的差異,可以針對其應用場景選擇自己適合的這樣在未來開發上以及使用上
比較不會因為這樣對模型有錯誤的理解
Claude 是由 Anthropic 開發的大型語言模型,以其出色的對話能力和安全性著稱。
Llama 是 Meta 開發的開源大型語言模型,在開源社群中廣受歡迎
Titan 是 AWS 自主開發的語言模型,專為 AWS 生態系統優化。
特性 | Claude 3.5 Sonnet | Llama 3.1 70B | Titan Text G1 |
---|---|---|---|
參數量 | ~200B | 70B | 未公開 |
上下文長度 | 200K tokens | 128K tokens | 32K tokens |
多語言支援 | 優秀 | 良好 | 基礎 |
程式碼生成 | 優秀 | 優秀 | 良好 |
推理能力 | 頂級 | 優秀 | 良好 |
回應速度 | 中等 | 快 | 最快 |
# 每1M tokens 的大致成本(輸入/輸出)
pricing_comparison = {
"Claude 3.5 Sonnet": {"input": 3.00, "output": 15.00},
"Claude 3 Haiku": {"input": 0.25, "output": 1.25},
"Llama 3.1 70B": {"input": 0.65, "output": 0.80},
"Llama 3.1 8B": {"input": 0.15, "output": 0.20},
"Titan Text Express": {"input": 0.20, "output": 0.60}
}
# 成本效益計算範例
def calculate_cost(model, input_tokens, output_tokens):
input_cost = (input_tokens / 1000000) * pricing_comparison[model]["input"]
output_cost = (output_tokens / 1000000) * pricing_comparison[model]["output"]
return input_cost + output_cost
# 範例:處理 1000 個輸入 tokens,生成 500 個輸出 tokens
for model in pricing_comparison:
cost = calculate_cost(model, 1000, 500)
print(f"{model}: ${cost:.4f}")
Claude 適用場景
Llama 適用場景
-程式開發:代碼生成、除錯、重構
-開源專案:需要模型透明度的應用
-多語言應用:國際化產品開發
-成本敏感型應用:大量處理任務
Titan 適用場景
import boto3
import json
import time
from typing import Dict, Any
class BedrockModelComparison:
def __init__(self):
self.bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
self.models = {
'claude': 'anthropic.claude-3-5-sonnet-20240620-v1:0',
'llama': 'meta.llama3-1-70b-instruct-v1:0',
'titan': 'amazon.titan-text-express-v1'
}
def invoke_claude(self, prompt: str) -> Dict[str, Any]:
body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"messages": [{"role": "user", "content": prompt}]
}
start_time = time.time()
response = self.bedrock.invoke_model(
modelId=self.models['claude'],
body=json.dumps(body)
)
end_time = time.time()
result = json.loads(response['body'].read())
return {
'content': result['content'][0]['text'],
'response_time': end_time - start_time,
'input_tokens': result['usage']['input_tokens'],
'output_tokens': result['usage']['output_tokens']
}
def invoke_llama(self, prompt: str) -> Dict[str, Any]:
body = {
"prompt": f"<|begin_of_text|><|start_header_id|>user<|end_header_id|>\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n",
"max_gen_len": 1000,
"temperature": 0.7
}
start_time = time.time()
response = self.bedrock.invoke_model(
modelId=self.models['llama'],
body=json.dumps(body)
)
end_time = time.time()
result = json.loads(response['body'].read())
return {
'content': result['generation'],
'response_time': end_time - start_time,
'input_tokens': result.get('prompt_token_count', 0),
'output_tokens': result.get('generation_token_count', 0)
}
def invoke_titan(self, prompt: str) -> Dict[str, Any]:
body = {
"inputText": prompt,
"textGenerationConfig": {
"maxTokenCount": 1000,
"temperature": 0.7
}
}
start_time = time.time()
response = self.bedrock.invoke_model(
modelId=self.models['titan'],
body=json.dumps(body)
)
end_time = time.time()
result = json.loads(response['body'].read())
return {
'content': result['results'][0]['outputText'],
'response_time': end_time - start_time,
'input_tokens': result.get('inputTextTokenCount', 0),
'output_tokens': result.get('results', [{}])[0].get('tokenCount', 0)
}
def compare_models(self, prompt: str):
"""比較三個模型的表現"""
print(f"測試提示詞:{prompt}\n")
print("="*80)
# Claude 測試
try:
claude_result = self.invoke_claude(prompt)
print(f"📝 Claude 3.5 Sonnet")
print(f"回應時間: {claude_result['response_time']:.2f}秒")
print(f"Tokens: {claude_result['input_tokens']} → {claude_result['output_tokens']}")
print(f"回答: {claude_result['content'][:200]}...")
print("-"*40)
except Exception as e:
print(f"❌ Claude 調用失敗: {e}")
# Llama 測試
try:
llama_result = self.invoke_llama(prompt)
print(f"🦙 Llama 3.1 70B")
print(f"回應時間: {llama_result['response_time']:.2f}秒")
print(f"Tokens: {llama_result['input_tokens']} → {llama_result['output_tokens']}")
print(f"回答: {llama_result['content'][:200]}...")
print("-"*40)
except Exception as e:
print(f"❌ Llama 調用失敗: {e}")
# Titan 測試
try:
titan_result = self.invoke_titan(prompt)
print(f"⚡ Titan Text Express")
print(f"回應時間: {titan_result['response_time']:.2f}秒")
print(f"Tokens: {titan_result['input_tokens']} → {titan_result['output_tokens']}")
print(f"回答: {titan_result['content'][:200]}...")
except Exception as e:
print(f"❌ Titan 調用失敗: {e}")
# 使用範例
if __name__ == "__main__":
comparator = BedrockModelComparison()
# 測試不同類型的任務
test_cases = [
"請解釋機器學習中的過擬合問題,並提供解決方案。",
"用 Python 寫一個快速排序算法,並加上註解。",
"分析電商網站用戶流失的可能原因,並提出改善建議。"
]
for i, test_case in enumerate(test_cases, 1):
print(f"\n📊 測試案例 {i}")
comparator.compare_models(test_case)
print("\n" + "="*80 + "\n")
# 成本優化策略範例
def choose_model_by_cost_and_quality(task_type, budget_per_1k_requests):
"""根據任務類型和預算選擇最適合的模型"""
strategies = {
"high_quality_low_volume": {
"model": "Claude 3.5 Sonnet",
"use_case": "重要文件、深度分析"
},
"balanced": {
"model": "Llama 3.1 70B",
"use_case": "日常對話、程式開發"
},
"high_volume_low_cost": {
"model": "Titan Text Express",
"use_case": "大量處理、快速回應"
}
}
if budget_per_1k_requests > 50:
return strategies["high_quality_low_volume"]
elif budget_per_1k_requests > 10:
return strategies["balanced"]
else:
return strategies["high_volume_low_cost"]
import logging
from datetime import datetime
import pandas as pd
class ModelPerformanceTracker:
def __init__(self):
self.metrics = []
def log_request(self, model_name, prompt_type, response_time,
input_tokens, output_tokens, cost):
"""記錄請求指標"""
self.metrics.append({
'timestamp': datetime.now(),
'model': model_name,
'prompt_type': prompt_type,
'response_time': response_time,
'input_tokens': input_tokens,
'output_tokens': output_tokens,
'cost': cost,
'tokens_per_second': output_tokens / response_time if response_time > 0 else 0
})
def generate_report(self):
"""生成效能報告"""
if not self.metrics:
return "No data available"
df = pd.DataFrame(self.metrics)
report = f"""
📊 模型效能報告
==================
平均回應時間:
{df.groupby('model')['response_time'].mean().round(2).to_string()}
平均成本(每次請求):
{df.groupby('model')['cost'].mean().round(4).to_string()}
平均生成速度(tokens/秒):
{df.groupby('model')['tokens_per_second'].mean().round(2).to_string()}
"""
return report
aws 模型 support 狀況
antropic 官方檔案
llama 相關檔案