Skip to content

Anthropic Claude API完全指南

Claude以其安全、可靠、长上下文著称,是企业级AI应用的优质选择

概述

Anthropic是一家专注于AI安全的公司,其Claude系列模型以安全、可靠、长上下文处理能力著称。本教程将带你全面掌握Claude API的使用方法。

为什么选择Claude?

优势说明
超长上下文最高支持200K Token上下文
安全可靠专注于AI安全,减少有害输出
推理能力强复杂推理任务表现出色
代码能力代码生成和理解能力强

Claude模型概览

Claude 3系列模型:

Claude 3 Opus(最强能力)
├── 最强的推理和创作能力
├── 适合复杂任务
└── 200K上下文

Claude 3 Sonnet(平衡之选)
├── 性能与成本平衡
├── 适合大多数场景
└── 200K上下文

Claude 3 Haiku(快速响应)
├── 速度最快
├── 成本最低
└── 200K上下文

Claude 3.5 Sonnet(最新版本)
├── 性能超越Claude 3 Opus
├── 速度接近Haiku
└── 200K上下文

基本概念

API Key

php
<?php
// Claude API Key格式
// sk-ant-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx

// 安全存储方式
$apiKey = getenv('ANTHROPIC_API_KEY');

消息格式

Claude API使用独特的消息格式:

php
<?php
// Claude消息格式
$messages = [
    [
        'role' => 'user',
        'content' => '你好,请介绍一下你自己'
    ]
];

// 系统提示单独设置
$systemPrompt = '你是一个专业的AI助手';

Token计算

Claude Token计算规则:

英文:约4字符 = 1 Token
中文:约1.5汉字 = 1 Token

上下文限制:
- 最大输入:200K Token
- 最大输出:4K-8K Token(取决于模型)

环境准备

安装依赖

php
<?php
// composer require guzzlehttp/guzzle

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

创建Claude客户端

php
<?php
class ClaudeClient
{
    private $client;
    private $apiKey;
    private $baseUrl = 'https://api.anthropic.com/v1';

    public function __construct(string $apiKey)
    {
        $this->apiKey = $apiKey;
        $this->client = new Client([
            'base_uri' => $this->baseUrl,
            'timeout' => 60,
            'headers' => [
                'x-api-key' => $this->apiKey,
                'anthropic-version' => '2023-06-01',
                'Content-Type' => 'application/json',
            ],
        ]);
    }

    public function messages(
        array $messages,
        string $model = 'claude-3-5-sonnet-20241022',
        string $system = '',
        int $maxTokens = 4096
    ): array {
        $params = [
            'model' => $model,
            'max_tokens' => $maxTokens,
            'messages' => $messages,
        ];

        if (!empty($system)) {
            $params['system'] = $system;
        }

        try {
            $response = $this->client->post('/messages', [
                'json' => $params,
            ]);

            return json_decode($response->getBody(), true);
        } catch (RequestException $e) {
            $errorBody = $e->getResponse() ? $e->getResponse()->getBody()->getContents() : 'Unknown error';
            throw new Exception('Claude API Error: ' . $errorBody);
        }
    }
}

// 使用示例
$apiKey = getenv('ANTHROPIC_API_KEY');
$client = new ClaudeClient($apiKey);

$result = $client->messages(
    [['role' => 'user', 'content' => '请用一句话介绍PHP语言']],
    'claude-3-5-sonnet-20241022',
    '你是一个专业的编程助手',
    1024
);

echo $result['content'][0]['text'];

运行结果:

PHP是一种开源的服务器端脚本语言,特别适合Web开发,可嵌入HTML中使用。

高级参数配置

完整参数示例

php
<?php
class ClaudeClient
{
    // ... 前面的代码 ...

    public function messagesAdvanced(
        array $messages,
        string $model = 'claude-3-5-sonnet-20241022',
        array $options = []
    ): array {
        $params = [
            'model' => $model,
            'max_tokens' => $options['max_tokens'] ?? 4096,
            'messages' => $messages,
        ];

        // 系统提示
        if (!empty($options['system'])) {
            $params['system'] = $options['system'];
        }

        // 温度:0-1,默认1
        if (isset($options['temperature'])) {
            $params['temperature'] = $options['temperature'];
        }

        // Top P:0-1
        if (isset($options['top_p'])) {
            $params['top_p'] = $options['top_p'];
        }

        // Top K:1-100
        if (isset($options['top_k'])) {
            $params['top_k'] = $options['top_k'];
        }

        // 停止序列
        if (!empty($options['stop_sequences'])) {
            $params['stop_sequences'] = $options['stop_sequences'];
        }

        try {
            $response = $this->client->post('/messages', [
                'json' => $params,
            ]);

            return json_decode($response->getBody(), true);
        } catch (RequestException $e) {
            $errorBody = $e->getResponse() ? $e->getResponse()->getBody()->getContents() : 'Unknown error';
            throw new Exception('Claude API Error: ' . $errorBody);
        }
    }
}

// 使用示例
$result = $client->messagesAdvanced(
    [['role' => 'user', 'content' => '写一首关于代码的诗']],
    'claude-3-5-sonnet-20241022',
    [
        'system' => '你是一位诗人,擅长写技术相关的诗歌',
        'temperature' => 0.8,
        'max_tokens' => 500,
    ]
);

echo $result['content'][0]['text'];

参数详解

参数范围默认值说明
max_tokens1-模型上限必填最大生成Token数
temperature0-11控制随机性,0最确定
top_p0-1-核采样参数
top_k1-100-只考虑前K个候选词
stop_sequences字符串数组-遇到停止序列时终止
system字符串-系统提示

流式响应处理

实现流式输出

php
<?php
class ClaudeClient
{
    // ... 前面的代码 ...

    public function messagesStream(
        array $messages,
        string $model = 'claude-3-5-sonnet-20241022',
        string $system = '',
        int $maxTokens = 4096
    ): Generator {
        $params = [
            'model' => $model,
            'max_tokens' => $maxTokens,
            'messages' => $messages,
            'stream' => true,
        ];

        if (!empty($system)) {
            $params['system'] = $system;
        }

        $response = $this->client->post('/messages', [
            'json' => $params,
            'stream' => true,
        ]);

        $body = $response->getBody();
        $buffer = '';

        while (!$body->eof()) {
            $chunk = $body->read(1024);
            $buffer .= $chunk;

            while (($pos = strpos($buffer, "\n")) !== false) {
                $line = substr($buffer, 0, $pos);
                $buffer = substr($buffer, $pos + 1);

                $line = trim($line);
                if (empty($line)) {
                    continue;
                }

                if (strpos($line, 'data: ') === 0) {
                    $json = substr($line, 6);
                    $data = json_decode($json, true);

                    if ($data['type'] === 'content_block_delta' && 
                        isset($data['delta']['text'])) {
                        yield $data['delta']['text'];
                    }
                }
            }
        }
    }
}

// 使用示例
echo "Claude回复:";
foreach ($client->messagesStream(
    [['role' => 'user', 'content' => '讲一个程序员笑话']],
    'claude-3-5-sonnet-20241022'
) as $chunk) {
    echo $chunk;
    flush();
}

运行结果:

Claude回复:一个程序员去面试,面试官问:"你有什么特长?"
程序员说:"我能在没有咖啡的情况下工作8小时。"
面试官:"这算什么特长?"
程序员:"你试试看就知道了。"

多轮对话实现

完整对话管理

php
<?php
class ClaudeChatSession
{
    private ClaudeClient $client;
    private array $messages = [];
    private string $systemPrompt;
    private string $model;

    public function __construct(
        ClaudeClient $client,
        string $model = 'claude-3-5-sonnet-20241022',
        string $systemPrompt = ''
    ) {
        $this->client = $client;
        $this->model = $model;
        $this->systemPrompt = $systemPrompt;
    }

    public function chat(string $userMessage): string
    {
        $this->messages[] = [
            'role' => 'user',
            'content' => $userMessage,
        ];

        $response = $this->client->messages(
            $this->messages,
            $this->model,
            $this->systemPrompt
        );

        $assistantMessage = $response['content'][0]['text'];

        $this->messages[] = [
            'role' => 'assistant',
            'content' => $assistantMessage,
        ];

        return $assistantMessage;
    }

    public function getHistory(): array
    {
        return $this->messages;
    }

    public function clearHistory(): void
    {
        $this->messages = [];
    }
}

// 使用示例
$session = new ClaudeChatSession(
    $client,
    'claude-3-5-sonnet-20241022',
    '你是一位专业的PHP开发工程师,用简洁的语言回答问题。'
);

echo "用户:PHP有哪些优点?\n";
echo "Claude:" . $session->chat('PHP有哪些优点?') . "\n\n";

echo "用户:它适合做什么?\n";
echo "Claude:" . $session->chat('它适合做什么?') . "\n";

长上下文处理

利用200K上下文处理长文档

php
<?php
class LongDocumentProcessor
{
    private ClaudeClient $client;

    public function __construct(ClaudeClient $client)
    {
        $this->client = $client;
    }

    public function analyzeDocument(string $document, string $question): string
    {
        $systemPrompt = '你是一个文档分析助手。请根据提供的文档内容回答问题。';

        $userMessage = <<<MESSAGE
以下是文档内容:

{$document}

---

请回答问题:{$question}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            4096
        );

        return $result['content'][0]['text'];
    }

    public function summarizeDocument(string $document, int $maxLength = 500): string
    {
        $systemPrompt = '你是一个文档摘要助手。请生成简洁、准确的摘要。';

        $userMessage = <<<MESSAGE
请为以下文档生成一个不超过{$maxLength}字的摘要:

{$document}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            1024
        );

        return $result['content'][0]['text'];
    }

    public function extractKeyPoints(string $document): array
    {
        $systemPrompt = '你是一个文档分析助手。请提取文档的关键要点。';

        $userMessage = <<<MESSAGE
请从以下文档中提取5-10个关键要点,以JSON数组格式返回:

{$document}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            2048
        );

        return json_decode($result['content'][0]['text'], true);
    }
}

// 使用示例
$processor = new LongDocumentProcessor($client);

// 读取长文档
$document = file_get_contents('long_article.txt');

// 分析文档
$answer = $processor->analyzeDocument($document, '这篇文章的核心观点是什么?');
echo $answer;

// 生成摘要
$summary = $processor->summarizeDocument($document);
echo "摘要:\n" . $summary;

常见错误与踩坑点

错误1:忽略max_tokens必填

php
<?php
// ❌ 错误做法:不设置max_tokens
$result = $client->messages($messages);

// ✅ 正确做法:必须设置max_tokens
$result = $client->messages($messages, 'claude-3-5-sonnet-20241022', '', 4096);

错误2:消息格式错误

php
<?php
// ❌ 错误做法:使用OpenAI格式
$messages = [
    ['role' => 'system', 'content' => '你是助手'],
    ['role' => 'user', 'content' => '你好'],
];

// ✅ 正确做法:使用Claude格式
$messages = [
    ['role' => 'user', 'content' => '你好'],
];
$systemPrompt = '你是助手';

$result = $client->messages($messages, 'claude-3-5-sonnet-20241022', $systemPrompt);

错误3:连续user消息

php
<?php
// ❌ 错误做法:连续的user消息
$messages = [
    ['role' => 'user', 'content' => '问题1'],
    ['role' => 'user', 'content' => '问题2'],
];

// ✅ 正确做法:user和assistant交替
$messages = [
    ['role' => 'user', 'content' => '问题1'],
    ['role' => 'assistant', 'content' => '回答1'],
    ['role' => 'user', 'content' => '问题2'],
];

错误4:忽略API版本头

php
<?php
// ❌ 错误做法:不设置anthropic-version
$headers = [
    'x-api-key' => $apiKey,
    'Content-Type' => 'application/json',
];

// ✅ 正确做法:设置anthropic-version
$headers = [
    'x-api-key' => $apiKey,
    'anthropic-version' => '2023-06-01',
    'Content-Type' => 'application/json',
];

常见应用场景

场景1:代码审查助手

php
<?php
class CodeReviewAssistant
{
    private ClaudeClient $client;

    public function __construct(ClaudeClient $client)
    {
        $this->client = $client;
    }

    public function review(string $code, string $language = 'PHP'): array
    {
        $systemPrompt = '你是一位资深代码审查专家。请从代码质量、安全性、性能三个维度审查代码。';

        $userMessage = <<<MESSAGE
请审查以下{$language}代码:

```{$language}
{$code}

请以JSON格式返回审查结果: { "quality": {"score": 1-10, "issues": [], "suggestions": []}, "security": {"score": 1-10, "issues": [], "suggestions": []}, "performance": {"score": 1-10, "issues": [], "suggestions": []}, "overall_score": 1-10 } MESSAGE;

    $result = $this->client->messages(
        [['role' => 'user', 'content' => $userMessage]],
        'claude-3-5-sonnet-20241022',
        $systemPrompt,
        2048
    );

    return json_decode($result['content'][0]['text'], true);
}

}


### 场景2:文档问答系统

```php
<?php
class DocumentQA
{
    private ClaudeClient $client;
    private string $document;

    public function __construct(ClaudeClient $client, string $document)
    {
        $this->client = $client;
        $this->document = $document;
    }

    public function ask(string $question): string
    {
        $systemPrompt = '你是一个文档问答助手。请根据提供的文档内容准确回答问题。如果文档中没有相关信息,请诚实说明。';

        $userMessage = <<<MESSAGE
文档内容:
{$this->document}

---

问题:{$question}

请根据文档内容回答:
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            1024
        );

        return $result['content'][0]['text'];
    }
}

场景3:内容生成器

php
<?php
class ContentGenerator
{
    private ClaudeClient $client;

    public function generateArticle(string $topic, string $style = '专业', int $wordCount = 800): string
    {
        $systemPrompt = '你是一位专业的内容创作者,擅长撰写高质量的文章。';

        $userMessage = <<<MESSAGE
请以{$style}的风格,撰写一篇关于"{$topic}"的文章。

要求:
1. 字数约{$wordCount}字
2. 结构清晰,分段明确
3. 内容准确,有实用价值
4. 语言流畅,易于理解
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            2048
        );

        return $result['content'][0]['text'];
    }
}

场景4:数据分析助手

php
<?php
class DataAnalysisAssistant
{
    private ClaudeClient $client;

    public function analyzeData(string $data, string $analysisType): string
    {
        $systemPrompt = '你是一位数据分析专家,擅长从数据中发现洞察和规律。';

        $userMessage = <<<MESSAGE
请对以下数据进行{$analysisType}分析:

{$data}

请提供详细的分析结果和建议。
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            2048
        );

        return $result['content'][0]['text'];
    }

    public function generateReport(string $data, string $reportType): string
    {
        $systemPrompt = '你是一位报告撰写专家,擅长生成结构清晰、内容详实的分析报告。';

        $userMessage = <<<MESSAGE
请根据以下数据生成一份{$reportType}报告:

{$data}

报告应包含:
1. 数据概述
2. 主要发现
3. 详细分析
4. 结论与建议
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            4096
        );

        return $result['content'][0]['text'];
    }
}

场景5:智能翻译

php
<?php
class TranslationAssistant
{
    private ClaudeClient $client;

    public function translate(
        string $text,
        string $sourceLang,
        string $targetLang,
        string $style = '自然'
    ): string {
        $systemPrompt = '你是一位专业的翻译专家,精通多种语言。';

        $userMessage = <<<MESSAGE
请将以下{$sourceLang}文本翻译成{$targetLang},翻译风格要求{$style}:

{$text}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            2048
        );

        return $result['content'][0]['text'];
    }

    public function translateDocument(string $document, string $targetLang): string
    {
        $systemPrompt = '你是一位专业的文档翻译专家,请保持原文的格式和结构。';

        $userMessage = <<<MESSAGE
请将以下文档翻译成{$targetLang},保持原文的格式和结构:

{$document}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            4096
        );

        return $result['content'][0]['text'];
    }
}

企业级进阶应用场景

场景1:构建智能客服系统

php
<?php
class IntelligentCustomerService
{
    private ClaudeClient $client;
    private array $knowledgeBase = [];
    private string $systemPrompt;

    public function __construct(ClaudeClient $client)
    {
        $this->client = $client;
        $this->systemPrompt = <<<PROMPT
你是一个专业的客服助手。请遵循以下规则:
1. 友好、专业地回答客户问题
2. 如果不确定答案,诚实告知并建议联系人工客服
3. 回答简洁明了,不超过200字
4. 使用礼貌用语
5. 如果问题涉及退款、投诉等敏感问题,建议转接人工客服
PROMPT;
    }

    public function addKnowledge(string $category, string $content): void
    {
        $this->knowledgeBase[$category] = $content;
    }

    public function handleQuery(string $query): string
    {
        $knowledgeContext = '';
        foreach ($this->knowledgeBase as $category => $content) {
            $knowledgeContext .= "【{$category}】\n{$content}\n\n";
        }

        $userMessage = <<<MESSAGE
知识库内容:
{$knowledgeContext}

客户问题:{$query}

请根据知识库内容回答客户问题:
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $this->systemPrompt,
            500
        );

        return $result['content'][0]['text'];
    }
}

场景2:构建合同审核系统

php
<?php
class ContractReviewer
{
    private ClaudeClient $client;

    public function reviewContract(string $contract): array
    {
        $systemPrompt = '你是一位资深法律顾问,专注于合同审核。请从法律风险、条款完整性、公平性等角度审核合同。';

        $userMessage = <<<MESSAGE
请审核以下合同,从以下维度进行分析:

1. 法律风险:识别可能存在的法律风险
2. 条款完整性:检查必要条款是否完整
3. 公平性:评估合同条款的公平性
4. 建议修改:提出具体的修改建议

合同内容:
{$contract}

请以JSON格式返回审核结果:
{
    "risks": [{"type": "风险类型", "description": "风险描述", "severity": "高/中/低"}],
    "missing_clauses": ["缺失条款1", "缺失条款2"],
    "fairness_score": 1-10,
    "suggestions": ["建议1", "建议2"],
    "summary": "总体评价"
}
MESSAGE;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $userMessage]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            4096
        );

        return json_decode($result['content'][0]['text'], true);
    }
}

行业最佳实践

实践1:使用Claude进行安全内容生成

php
<?php
class SafeContentGenerator
{
    private ClaudeClient $client;

    public function generateSafeContent(string $prompt): string
    {
        $systemPrompt = '你是一个内容安全审核助手。请确保生成的内容符合以下要求:
1. 不包含任何有害、违法内容
2. 不包含歧视性言论
3. 不包含虚假信息
4. 内容积极向上';

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $prompt]],
            'claude-3-5-sonnet-20241022',
            $systemPrompt,
            1024
        );

        return $result['content'][0]['text'];
    }
}

实践2:实现重试机制

php
<?php
class ResilientClaudeClient
{
    private ClaudeClient $client;
    private int $maxRetries = 3;
    private int $baseDelay = 1000;

    public function messagesWithRetry(
        array $messages,
        string $model = 'claude-3-5-sonnet-20241022',
        string $system = '',
        int $maxTokens = 4096
    ): array {
        $lastException = null;

        for ($i = 0; $i < $this->maxRetries; $i++) {
            try {
                return $this->client->messages($messages, $model, $system, $maxTokens);
            } catch (Exception $e) {
                $lastException = $e;
                
                if ($this->isRateLimitError($e)) {
                    $delay = $this->baseDelay * pow(2, $i);
                    usleep($delay * 1000);
                }
            }
        }

        throw $lastException;
    }

    private function isRateLimitError(Exception $e): bool
    {
        return strpos($e->getMessage(), 'rate_limit') !== false ||
               strpos($e->getMessage(), '429') !== false;
    }
}

实践3:实现缓存机制

php
<?php
class CachedClaudeClient
{
    private ClaudeClient $client;
    private string $cacheDir;
    private int $cacheTTL = 3600;

    public function __construct(ClaudeClient $client, string $cacheDir = '/tmp/claude_cache')
    {
        $this->client = $client;
        $this->cacheDir = $cacheDir;
        if (!is_dir($cacheDir)) {
            mkdir($cacheDir, 0755, true);
        }
    }

    public function messagesWithCache(
        array $messages,
        string $model = 'claude-3-5-sonnet-20241022',
        string $system = '',
        int $maxTokens = 4096
    ): array {
        $cacheKey = md5($model . $system . serialize($messages) . $maxTokens);
        $cacheFile = $this->cacheDir . '/' . $cacheKey . '.json';

        if (file_exists($cacheFile)) {
            $cache = json_decode(file_get_contents($cacheFile), true);
            if (time() - $cache['timestamp'] < $this->cacheTTL) {
                return $cache['data'];
            }
        }

        $result = $this->client->messages($messages, $model, $system, $maxTokens);

        file_put_contents($cacheFile, json_encode([
            'timestamp' => time(),
            'data' => $result,
        ]));

        return $result;
    }
}

常见问题答疑(FAQ)

Q1:Claude和GPT如何选择?

回答

场景推荐选择原因
长文档处理Claude200K上下文,处理长文本能力强
安全敏感场景Claude专注AI安全,有害输出更少
复杂推理Claude 3.5 Sonnet推理能力强
成本敏感Claude 3 Haiku成本低,速度快
生态丰富度GPT插件、工具更多

Q2:如何处理超长文档?

回答

php
<?php
// Claude支持200K上下文,可以直接处理长文档
$document = file_get_contents('very_long_document.txt');

// 直接发送完整文档
$result = $client->messages(
    [['role' => 'user', 'content' => "请总结以下文档:\n\n{$document}"]],
    'claude-3-5-sonnet-20241022',
    '你是一个文档摘要助手',
    2048
);

Q3:如何实现多模态输入?

回答

php
<?php
// Claude 3支持图像输入
function analyzeImage(ClaudeClient $client, string $imageBase64, string $mimeType, string $question): string
{
    $messages = [
        [
            'role' => 'user',
            'content' => [
                [
                    'type' => 'image',
                    'source' => [
                        'type' => 'base64',
                        'media_type' => $mimeType,
                        'data' => $imageBase64,
                    ],
                ],
                [
                    'type' => 'text',
                    'text' => $question,
                ],
            ],
        ],
    ];

    $result = $client->messages($messages, 'claude-3-5-sonnet-20241022', '', 1024);
    return $result['content'][0]['text'];
}

// 使用示例
$imageData = base64_encode(file_get_contents('image.png'));
$answer = analyzeImage($client, $imageData, 'image/png', '这张图片里有什么?');

Q4:如何控制输出长度?

回答

php
<?php
// 方法1:设置max_tokens
$result = $client->messages($messages, 'claude-3-5-sonnet-20241022', '', 100);

// 方法2:在Prompt中明确要求
$prompt = "请用50字以内回答:{$question}";
$result = $client->messages(
    [['role' => 'user', 'content' => $prompt]],
    'claude-3-5-sonnet-20241022',
    '',
    200
);

Q5:如何处理API错误?

回答

php
<?php
function handleClaudeError(Exception $e): string
{
    $message = $e->getMessage();
    
    if (strpos($message, 'invalid_api_key') !== false) {
        return 'API Key无效,请检查配置';
    }
    
    if (strpos($message, 'rate_limit') !== false) {
        return '请求过于频繁,请稍后重试';
    }
    
    if (strpos($message, 'context_length_exceeded') !== false) {
        return '输入内容过长,请减少输入长度';
    }
    
    if (strpos($message, 'overloaded') !== false) {
        return '服务繁忙,请稍后重试';
    }
    
    return '服务暂时不可用,请稍后重试';
}

try {
    $result = $client->messages($messages);
} catch (Exception $e) {
    echo handleClaudeError($e);
}

Q6:如何优化Token使用?

回答

php
<?php
// 1. 使用简洁的系统提示
$systemPrompt = '你是助手'; // 而不是长篇大论

// 2. 避免重复内容
$messages = [
    ['role' => 'user', 'content' => '问题'],
    ['role' => 'assistant', 'content' => '回答'],
    ['role' => 'user', 'content' => '追问'],
];

// 3. 使用缓存
$cachedClient = new CachedClaudeClient($client);

// 4. 选择合适的模型
$model = 'claude-3-haiku-20240307'; // 简单任务用Haiku

实战练习

基础练习

练习1:编写一个简单的Claude聊天程序。

参考代码

php
<?php
require 'vendor/autoload.php';

$apiKey = getenv('ANTHROPIC_API_KEY');
$client = new ClaudeClient($apiKey);

echo "Claude聊天助手 (输入 'quit' 退出)\n";

while (true) {
    echo "\n你: ";
    $input = trim(fgets(STDIN));

    if ($input === 'quit') {
        break;
    }

    $result = $client->messages(
        [['role' => 'user', 'content' => $input]],
        'claude-3-5-sonnet-20241022',
        '你是一个友好的AI助手',
        1024
    );

    echo "Claude: " . $result['content'][0]['text'] . "\n";
}

进阶练习

练习2:实现一个文档问答系统。

参考代码

php
<?php
class SimpleDocumentQA
{
    private ClaudeClient $client;
    private string $document;

    public function loadDocument(string $filePath): void
    {
        $this->document = file_get_contents($filePath);
    }

    public function ask(string $question): string
    {
        $prompt = <<<PROMPT
文档内容:
{$this->document}

问题:{$question}

请根据文档内容回答:
PROMPT;

        $result = $this->client->messages(
            [['role' => 'user', 'content' => $prompt]],
            'claude-3-5-sonnet-20241022',
            '你是文档问答助手',
            1024
        );

        return $result['content'][0]['text'];
    }
}

挑战练习

练习3:构建一个智能代码解释器。

参考代码

php
<?php
class CodeInterpreter
{
    private ClaudeClient $client;

    public function explain(string $code, string $language = 'PHP'): string
    {
        $prompt = <<<PROMPT
请详细解释以下{$language}代码的功能、逻辑和实现原理:

```{$language}
{$code}

请包括:

  1. 代码功能概述

  2. 逐行解释

  3. 关键算法说明

  4. 可能的优化建议 PROMPT;

     $result = $this->client->messages(
         [['role' => 'user', 'content' => $prompt]],
         'claude-3-5-sonnet-20241022',
         '你是代码解释专家',
         2048
     );
    
     return $result['content'][0]['text'];
    

    }

    public function debug(string $code, string $error): string { $prompt = <<<PROMPT 以下代码出现了错误,请分析原因并提供修复方案:

代码:

错误信息:

请提供:

  1. 错误原因分析

  2. 修复方案

  3. 修复后的代码 PROMPT;

     $result = $this->client->messages(
         [['role' => 'user', 'content' => $prompt]],
         'claude-3-5-sonnet-20241022',
         '你是代码调试专家',
         2048
     );
    
     return $result['content'][0]['text'];
    

    } }


---

## 知识点总结

### 核心要点

1. **API基础**:理解Claude独特的消息格式和参数
2. **长上下文**:充分利用200K上下文处理长文档
3. **安全可靠**:Claude专注于AI安全,适合企业应用
4. **模型选择**:根据任务选择合适的模型
5. **错误处理**:完善的异常处理和重试机制

### 易错点回顾

| 易错点 | 正确做法 |
|--------|---------|
| 忘记设置max_tokens | max_tokens是必填参数 |
| 使用OpenAI消息格式 | Claude系统提示单独设置 |
| 连续user消息 | user和assistant必须交替 |
| 忽略API版本头 | 设置anthropic-version |

---

## 拓展参考资料

### 官方文档

- [Anthropic API文档](https://docs.anthropic.com/)
- [Claude模型介绍](https://www.anthropic.com/claude)
- [API参考](https://docs.anthropic.com/claude/reference)

### 进阶学习路径

1. **本知识点** → Claude API基础使用
2. **下一步** → [Google Gemini API](/ai/llm-tools/gemini)
3. **进阶** → [错误处理与重试](/ai/llm-tools/error-handling)
4. **高级** → [安全与鉴权](/ai/llm-tools/security)

---

> 💡 **记住**:Claude以其安全、可靠、长上下文著称,是企业级AI应用的优质选择。善用其200K上下文,可以处理更复杂的任务。