[이제와서 시작하는 Claude AI 마스터하기 #17] API 활용과 자동화
[이제와서 시작하는 Claude AI 마스터하기 #17] API 활용과 자동화
Claude API로 지능형 자동화 구축
Claude API를 활용하면 단순한 챗봇을 넘어 복잡한 워크플로우를 자동화하고, 지능형 시스템을 구축할 수 있습니다. 이번 편에서는 실무에서 활용 가능한 다양한 자동화 사례를 다룹니다.
학습 목표
- 🎯 Claude API 설정과 인증 방법 이해
- ⚡ 스트리밍 응답과 레이트 리미트 처리
- 🤖 문서 처리, 코드 리뷰, 고객 지원 자동화
- 🔄 이벤트 기반 워크플로우 오케스트레이션
- 🔒 보안과 거버넌스 베스트 프랙티스
Claude API 기초
API 주요 기능 비교
graph TB
subgraph "Claude API 기능"
A[📤 Messages API<br/>기본 대화]
B[🔄 Streaming<br/>실시간 응답]
C[🇺️ System Prompts<br/>역할 지정]
D[📊 Token Counting<br/>사용량 추적]
E[🌡️ Temperature<br/>창의성 조절]
F[🔒 API Keys<br/>보안 인증]
end
A --> G[지능형 자동화]
B --> G
C --> G
D --> G
E --> G
F --> G
1. API 설정 및 인증
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Claude API 클라이언트 설정
import Anthropic from '@anthropic-ai/sdk';
class ClaudeAPIClient {
private client: Anthropic;
private rateLimiter: RateLimiter;
constructor(apiKey: string) {
this.client = new Anthropic({
apiKey,
// 2025년 8월 기준 최신 설정
baseURL: 'https://api.anthropic.com/v1',
defaultHeaders: {
'anthropic-version': '2025-08-01',
'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15'
}
});
// 레이트 리밋 관리
this.rateLimiter = new RateLimiter({
maxRequests: 1000,
perMinutes: 1,
maxTokensPerMinute: 100000
});
}
async createMessage(params: MessageParams): Promise<Message> {
await this.rateLimiter.checkLimit();
try {
const response = await this.client.messages.create({
model: params.model || 'claude-3-opus-20240229',
max_tokens: params.maxTokens || 4096,
temperature: params.temperature || 0.7,
system: params.system,
messages: params.messages,
stream: params.stream || false
});
this.rateLimiter.recordUsage(response.usage);
return response;
} catch (error) {
this.handleError(error);
}
}
private handleError(error: any) {
if (error.status === 429) {
throw new RateLimitError('Rate limit exceeded', {
retryAfter: error.headers['retry-after']
});
}
if (error.status === 401) {
throw new AuthenticationError('Invalid API key');
}
throw error;
}
}
2. 스트리밍 응답 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 실시간 스트리밍 응답
class StreamingHandler {
async streamCompletion(
prompt: string,
onChunk: (text: string) => void,
onComplete: () => void
) {
const stream = await claude.messages.create({
model: 'claude-3-sonnet-20240229',
messages: [{ role: 'user', content: prompt }],
max_tokens: 1000,
stream: true
});
for await (const chunk of stream) {
if (chunk.type === 'content_block_delta') {
onChunk(chunk.delta.text);
}
}
onComplete();
}
}
// 사용 예시
const handler = new StreamingHandler();
await handler.streamCompletion(
'긴 보고서를 작성해주세요...',
(text) => process.stdout.write(text),
() => console.log('\n완료!')
);
지능형 자동화 시스템
자동화 시스템 아키텍처
flowchart LR
subgraph "Input Sources"
A1[📄 Documents]
A2[💻 Code]
A3[📧 Emails]
A4[🌐 Web Data]
end
subgraph "Claude Processing"
B1[🧠 분석]
B2[📝 요약]
B3[🏷️ 분류]
B4[🔍 추출]
end
subgraph "Outputs"
C1[📊 Reports]
C2[✅ Reviews]
C3[📨 Responses]
C4[📋 Tasks]
end
A1 & A2 & A3 & A4 --> B1
B1 --> B2 & B3 & B4
B2 & B3 & B4 --> C1 & C2 & C3 & C4
1. 문서 처리 파이프라인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// 대량 문서 자동 처리 시스템
class DocumentProcessingPipeline {
private claude: ClaudeAPIClient;
private queue: Queue<Document>;
async processDocuments(documents: Document[]) {
const pipeline = [
this.extractInformation,
this.summarize,
this.categorize,
this.generateMetadata,
this.translateIfNeeded
];
const results = await Promise.all(
documents.map(doc => this.runPipeline(doc, pipeline))
);
return results;
}
private async extractInformation(doc: Document) {
const response = await this.claude.createMessage({
system: `You are a document analyzer. Extract key information:
- Main topic
- Key entities (people, organizations, locations)
- Important dates
- Action items
- Sentiment
Return as structured JSON.`,
messages: [{
role: 'user',
content: doc.content
}],
temperature: 0.3
});
return JSON.parse(response.content[0].text);
}
private async summarize(doc: Document, extracted: ExtractedInfo) {
const response = await this.claude.createMessage({
system: 'Create concise summaries at three levels: 1 sentence, 1 paragraph, 1 page.',
messages: [{
role: 'user',
content: `Document: ${doc.content}\n\nExtracted info: ${JSON.stringify(extracted)}`
}],
temperature: 0.5
});
return {
...extracted,
summaries: JSON.parse(response.content[0].text)
};
}
private async categorize(doc: Document, data: ProcessedData) {
const categories = await this.claude.createMessage({
system: `Categorize documents into:
Primary: [Legal, Financial, Technical, Marketing, HR, Other]
Secondary: More specific subcategories
Tags: Relevant keywords
Confidence: 0-1 score`,
messages: [{
role: 'user',
content: JSON.stringify(data)
}],
temperature: 0.2
});
return {
...data,
categories: JSON.parse(categories.content[0].text)
};
}
}
// 사용 예시
const pipeline = new DocumentProcessingPipeline();
const results = await pipeline.processDocuments([
{ id: '1', content: '계약서 내용...' },
{ id: '2', content: '기술 문서...' },
{ id: '3', content: '마케팅 자료...' }
]);
2. 코드 리뷰 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// AI 코드 리뷰어
class AICodeReviewer {
async reviewPullRequest(pr: PullRequest): Promise<Review> {
const files = await this.getPRFiles(pr.id);
const reviews = [];
for (const file of files) {
const review = await this.reviewFile(file);
reviews.push(review);
}
const summary = await this.generateSummary(reviews);
await this.postReview(pr.id, summary, reviews);
return { summary, fileReviews: reviews };
}
private async reviewFile(file: PRFile): Promise<FileReview> {
const prompt = `
Review this code change:
File: ${file.filename}
Language: ${file.language}
Previous version:
\`\`\`${file.language}
${file.previousContent}
\`\`\`
New version:
\`\`\`${file.language}
${file.newContent}
\`\`\`
Analyze:
1. Potential bugs or issues
2. Performance implications
3. Security concerns
4. Code style and best practices
5. Test coverage needs
Format as:
- severity: error|warning|info
- line: line number
- message: description
- suggestion: how to fix
`;
const response = await claude.createMessage({
model: 'claude-3-opus-20240229',
messages: [{ role: 'user', content: prompt }],
temperature: 0.3,
max_tokens: 2000
});
return {
filename: file.filename,
issues: JSON.parse(response.content[0].text),
score: this.calculateScore(response.content[0].text)
};
}
private async postReview(prId: string, summary: string, reviews: FileReview[]) {
// GitHub API에 리뷰 포스트
const comments = reviews.flatMap(review =>
review.issues.map(issue => ({
path: review.filename,
line: issue.line,
body: `**${issue.severity}**: ${issue.message}\n\n💡 ${issue.suggestion}`
}))
);
await github.createReview({
pull_number: prId,
event: this.hasErrors(reviews) ? 'REQUEST_CHANGES' : 'APPROVE',
body: summary,
comments
});
}
}
3. 고객 지원 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// 지능형 고객 지원 시스템
class CustomerSupportAutomation {
private knowledgeBase: KnowledgeBase;
private escalationRules: EscalationRules;
async handleTicket(ticket: SupportTicket): Promise<TicketResponse> {
// 1. 티켓 분석
const analysis = await this.analyzeTicket(ticket);
// 2. 지식 베이스 검색
const relevantDocs = await this.knowledgeBase.search(analysis.keywords);
// 3. 응답 생성
const response = await this.generateResponse(ticket, analysis, relevantDocs);
// 4. 품질 검증
const quality = await this.validateResponse(response);
// 5. 에스컬레이션 결정
if (quality.score < 0.8 || analysis.complexity > 0.7) {
return this.escalateToHuman(ticket, response, analysis);
}
return {
response,
automated: true,
confidence: quality.score
};
}
private async analyzeTicket(ticket: SupportTicket) {
const response = await claude.createMessage({
system: `Analyze support ticket:
- Category (technical, billing, feature request, complaint)
- Urgency (1-5)
- Sentiment (-1 to 1)
- Complexity (0-1)
- Keywords for knowledge base search
- Required actions`,
messages: [{
role: 'user',
content: `Subject: ${ticket.subject}\n\nMessage: ${ticket.message}`
}],
temperature: 0.3
});
return JSON.parse(response.content[0].text);
}
private async generateResponse(
ticket: SupportTicket,
analysis: TicketAnalysis,
docs: Document[]
) {
const prompt = `
Generate a helpful customer support response.
Ticket: ${ticket.message}
Analysis: ${JSON.stringify(analysis)}
Knowledge base articles: ${docs.map(d => d.summary).join('\n')}
Guidelines:
- Be empathetic and professional
- Provide specific solutions
- Include relevant links
- Set clear expectations
- Match the customer's language style
Previous interactions: ${await this.getCustomerHistory(ticket.userId)}
`;
const response = await claude.createMessage({
messages: [{ role: 'user', content: prompt }],
temperature: 0.7,
max_tokens: 1000
});
return response.content[0].text;
}
}
// 지식 베이스 관리
class KnowledgeBase {
private embeddings: EmbeddingService;
private vectorDB: VectorDatabase;
async addDocument(doc: Document) {
// Claude로 문서 구조화
const structured = await claude.createMessage({
system: 'Extract Q&A pairs, procedures, and key information from this document.',
messages: [{ role: 'user', content: doc.content }]
});
// 임베딩 생성
const embeddings = await this.embeddings.create(structured.content[0].text);
// 벡터 DB에 저장
await this.vectorDB.upsert({
id: doc.id,
embeddings,
metadata: {
title: doc.title,
category: doc.category,
lastUpdated: new Date()
}
});
}
async search(query: string, k: number = 5): Promise<Document[]> {
const queryEmbedding = await this.embeddings.create(query);
const results = await this.vectorDB.similaritySearch(queryEmbedding, k);
return results.map(r => r.document);
}
}
워크플로우 자동화
콘텐츠 생성 워크플로우
stateDiagram-v2
[*] --> Research: 🔍 주제 입력
Research --> Outline: 📄 리서치 완료
Outline --> Draft: 📋 아웃라인 생성
Draft --> Edit: ✍️ 초안 작성
Edit --> SEO: 🔄 편집 및 개선
SEO --> Media: 🎯 SEO 최적화
Media --> [*]: 🎨 미디어 추가
Research --> Error: ⚠️ 오류
Outline --> Error: ⚠️ 오류
Draft --> Error: ⚠️ 오류
Error --> Research: 재시도
1. 콘텐츠 생성 파이프라인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 멀티모달 콘텐츠 생성 시스템
class ContentGenerationPipeline {
async generateBlogPost(topic: string, style: ContentStyle): Promise<BlogPost> {
// 1. 리서치
const research = await this.conductResearch(topic);
// 2. 아웃라인 생성
const outline = await this.createOutline(topic, research);
// 3. 초안 작성
const draft = await this.writeDraft(outline, style);
// 4. 편집 및 개선
const edited = await this.editAndImprove(draft);
// 5. SEO 최적화
const optimized = await this.optimizeForSEO(edited);
// 6. 이미지 및 미디어 제안
const media = await this.suggestMedia(optimized);
return {
title: optimized.title,
content: optimized.content,
metadata: optimized.metadata,
media,
publishReady: true
};
}
private async conductResearch(topic: string) {
const response = await claude.createMessage({
system: `Research the topic thoroughly:
- Key facts and statistics
- Recent developments
- Expert opinions
- Controversies or debates
- Related topics`,
messages: [{ role: 'user', content: `Research topic: ${topic}` }],
temperature: 0.5
});
return JSON.parse(response.content[0].text);
}
private async createOutline(topic: string, research: Research) {
const response = await claude.createMessage({
system: `Create a detailed blog post outline:
- Engaging introduction
- 3-5 main sections with subsections
- Examples and case studies
- Actionable takeaways
- Compelling conclusion`,
messages: [{
role: 'user',
content: `Topic: ${topic}\nResearch: ${JSON.stringify(research)}`
}],
temperature: 0.7
});
return JSON.parse(response.content[0].text);
}
private async editAndImprove(draft: Draft) {
// 다단계 편집 프로세스
const edits = [
{ focus: 'clarity', prompt: 'Improve clarity and remove jargon' },
{ focus: 'engagement', prompt: 'Make it more engaging and add hooks' },
{ focus: 'flow', prompt: 'Improve transitions and flow' },
{ focus: 'accuracy', prompt: 'Fact-check and verify claims' }
];
let content = draft.content;
for (const edit of edits) {
const response = await claude.createMessage({
system: `You are an expert editor. ${edit.prompt}`,
messages: [{
role: 'user',
content: content
}],
temperature: 0.5
});
content = response.content[0].text;
}
return { ...draft, content };
}
}
2. 데이터 분석 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// AI 기반 데이터 분석 엔진
class AIDataAnalyzer {
async analyzeDataset(
data: any[],
analysisType: AnalysisType
): Promise<AnalysisReport> {
// 1. 데이터 프로파일링
const profile = await this.profileData(data);
// 2. 패턴 발견
const patterns = await this.discoverPatterns(data, profile);
// 3. 이상치 탐지
const anomalies = await this.detectAnomalies(data, patterns);
// 4. 예측 모델링
const predictions = await this.generatePredictions(data, patterns);
// 5. 인사이트 생성
const insights = await this.generateInsights({
profile,
patterns,
anomalies,
predictions
});
// 6. 시각화 제안
const visualizations = await this.suggestVisualizations(insights);
return {
summary: insights.executive_summary,
detailed_findings: insights.findings,
recommendations: insights.recommendations,
visualizations,
raw_analysis: { profile, patterns, anomalies, predictions }
};
}
private async discoverPatterns(data: any[], profile: DataProfile) {
const prompt = `
Analyze this dataset for patterns:
Data Profile: ${JSON.stringify(profile)}
Sample Data: ${JSON.stringify(data.slice(0, 100))}
Find:
1. Correlations between variables
2. Temporal patterns
3. Clusters or segments
4. Trends and seasonality
5. Causal relationships
Return findings with statistical significance.
`;
const response = await claude.createMessage({
model: 'claude-3-opus-20240229',
messages: [{ role: 'user', content: prompt }],
temperature: 0.4,
max_tokens: 3000
});
return JSON.parse(response.content[0].text);
}
private async generateInsights(analysis: CompleteAnalysis) {
const response = await claude.createMessage({
system: `You are a senior data analyst. Generate actionable insights:
- Executive summary (2-3 sentences)
- Key findings (bulleted list)
- Business implications
- Recommended actions
- Risks and limitations`,
messages: [{
role: 'user',
content: JSON.stringify(analysis)
}],
temperature: 0.6
});
return JSON.parse(response.content[0].text);
}
}
통합 및 오케스트레이션
1. 이벤트 기반 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// 이벤트 드리븐 AI 오케스트레이터
class AIOrchestrator {
private eventBus: EventEmitter;
private workflows: Map<string, Workflow>;
constructor() {
this.setupEventHandlers();
}
private setupEventHandlers() {
// 새 이슈 생성 시
this.eventBus.on('issue.created', async (issue) => {
await this.runWorkflow('issue-triage', { issue });
});
// PR 생성 시
this.eventBus.on('pull_request.opened', async (pr) => {
await this.runWorkflow('code-review', { pr });
});
// 고객 문의 접수 시
this.eventBus.on('ticket.created', async (ticket) => {
await this.runWorkflow('customer-support', { ticket });
});
// 모니터링 알림 시
this.eventBus.on('alert.triggered', async (alert) => {
await this.runWorkflow('incident-response', { alert });
});
}
async runWorkflow(name: string, context: any) {
const workflow = this.workflows.get(name);
if (!workflow) throw new Error(`Workflow ${name} not found`);
const execution = new WorkflowExecution(workflow, context);
try {
await execution.run();
await this.notifySuccess(name, execution.results);
} catch (error) {
await this.handleFailure(name, error, context);
}
}
}
// 워크플로우 정의
class Workflow {
constructor(
private name: string,
private steps: WorkflowStep[]
) {}
async execute(context: WorkflowContext): Promise<any> {
let result = context.input;
for (const step of this.steps) {
result = await step.execute(result, context);
if (step.condition && !step.condition(result)) {
break;
}
}
return result;
}
}
// 구체적인 워크플로우 예시
const codeReviewWorkflow = new Workflow('code-review', [
{
name: 'analyze-changes',
execute: async (pr) => {
return await aiCodeReviewer.analyzePR(pr);
}
},
{
name: 'security-scan',
execute: async (analysis) => {
return await securityScanner.scan(analysis);
}
},
{
name: 'generate-review',
execute: async (results) => {
return await claude.createMessage({
system: 'Generate comprehensive code review',
messages: [{ role: 'user', content: JSON.stringify(results) }]
});
}
},
{
name: 'post-review',
execute: async (review) => {
await github.postReview(review);
return review;
}
}
]);
2. 스케일링과 모니터링
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 분산 처리 시스템
class DistributedAIProcessor {
private workers: Worker[];
private queue: Queue;
private metrics: MetricsCollector;
async processLargeDataset(
dataset: LargeDataset,
processingFunction: ProcessingFunction
) {
// 데이터셋 분할
const chunks = this.splitDataset(dataset, this.workers.length);
// 병렬 처리
const results = await Promise.all(
chunks.map((chunk, i) =>
this.workers[i].process(chunk, processingFunction)
)
);
// 결과 병합
return this.mergeResults(results);
}
// 처리 성능 모니터링
monitorPerformance() {
this.metrics.gauge('queue_size', this.queue.size());
this.metrics.gauge('active_workers', this.getActiveWorkerCount());
this.metrics.histogram('processing_time', this.getProcessingTimes());
this.metrics.counter('api_calls', this.getAPICallCount());
// Claude API 사용량 추적
this.metrics.gauge('claude_tokens_used', this.getTokenUsage());
this.metrics.gauge('claude_cost_estimate', this.estimateCost());
}
}
보안과 거버넌스
보안 체크리스트
| 보안 항목 | 구현 방법 | 중요도 |
|---|---|---|
| 🔒 API 키 관리 | 환경변수, 시크릿 매니저 | 필수 |
| 🧑💻 PII 검사 | 입력 필터링 | 필수 |
| 📝 감사 로깅 | 모든 API 호출 기록 | 필수 |
| 🔄 비율 제한 | 요청 레이트 제한 | 권장 |
| ✅ 응답 검증 | 출력 필터링 | 권장 |
| 🔐 암호화 | 전송 중 데이터 보호 | 권장 |
안전한 API 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// API 보안 래퍼
class SecureClaudeAPI {
private sanitizer: ContentSanitizer;
private validator: ResponseValidator;
private logger: AuditLogger;
async createSecureMessage(params: MessageParams): Promise<Message> {
// 입력 검증 및 삭제
const sanitized = this.sanitizer.sanitize(params);
// PII 검사
if (this.containsPII(sanitized)) {
throw new SecurityError('PII detected in input');
}
// API 호출
const response = await this.claude.createMessage(sanitized);
// 응답 검증
this.validator.validate(response);
// 감사 로깅
await this.logger.log({
timestamp: new Date(),
user: getCurrentUser(),
action: 'claude_api_call',
params: this.redactSensitive(params),
response: this.redactSensitive(response)
});
return response;
}
}
실전 팁
효율적인 API 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 💡 비용 최적화 팁
const costOptimizer = {
// 1. 모델 선택 최적화
selectModel: (task: TaskType) => {
switch(task) {
case 'simple': return 'claude-3-haiku'; // 빠르고 저렴
case 'complex': return 'claude-3-opus'; // 고성능
case 'coding': return 'claude-3-sonnet'; // 균형
}
},
// 2. 토큰 최적화
optimizeTokens: (prompt: string) => {
return prompt
.trim()
.replace(/\s+/g, ' ') // 공백 정리
.substring(0, 10000); // 길이 제한
},
// 3. 캐싱 활용
cacheResponses: new Map<string, CachedResponse>()
};
트러블슈팅 체크리스트
| 문제 상황 | 해결 방법 |
|---|---|
| 🔴 429 에러 (레이트 리미트) | 지수 백오프 재시도 |
| 🟡 느린 응답 | 스트리밍 모드 사용 |
| 🔵 토큰 초과 | max_tokens 조정 |
| 🟢 비용 관리 | 사용량 모니터링 |
다음 편 예고
다음 편에서는 “커스텀 워크플로우 구축”을 다룰 예정입니다. 복잡한 비즈니스 프로세스를 Claude와 함께 자동화하는 고급 기법을 알아보겠습니다.
💡 오늘의 과제: Claude API를 사용해 간단한 자동화 스크립트를 만들어보세요. 예를 들어, 이메일 요약기나 코드 문서화 도구를 구현해보세요!
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.