@llm-translate/cli 1.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +51 -0
- package/.env.example +33 -0
- package/.github/workflows/docs-pages.yml +57 -0
- package/.github/workflows/release.yml +49 -0
- package/.translaterc.json +44 -0
- package/CLAUDE.md +243 -0
- package/Dockerfile +55 -0
- package/README.md +371 -0
- package/RFC.md +1595 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +4494 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +1152 -0
- package/dist/index.js +3841 -0
- package/dist/index.js.map +1 -0
- package/docker-compose.yml +56 -0
- package/docs/.vitepress/config.ts +161 -0
- package/docs/api/agent.md +262 -0
- package/docs/api/engine.md +274 -0
- package/docs/api/index.md +171 -0
- package/docs/api/providers.md +304 -0
- package/docs/changelog.md +64 -0
- package/docs/cli/dir.md +243 -0
- package/docs/cli/file.md +213 -0
- package/docs/cli/glossary.md +273 -0
- package/docs/cli/index.md +129 -0
- package/docs/cli/init.md +158 -0
- package/docs/cli/serve.md +211 -0
- package/docs/glossary.json +235 -0
- package/docs/guide/chunking.md +272 -0
- package/docs/guide/configuration.md +139 -0
- package/docs/guide/cost-optimization.md +237 -0
- package/docs/guide/docker.md +371 -0
- package/docs/guide/getting-started.md +150 -0
- package/docs/guide/glossary.md +241 -0
- package/docs/guide/index.md +86 -0
- package/docs/guide/ollama.md +515 -0
- package/docs/guide/prompt-caching.md +221 -0
- package/docs/guide/providers.md +232 -0
- package/docs/guide/quality-control.md +206 -0
- package/docs/guide/vitepress-integration.md +265 -0
- package/docs/index.md +63 -0
- package/docs/ja/api/agent.md +262 -0
- package/docs/ja/api/engine.md +274 -0
- package/docs/ja/api/index.md +171 -0
- package/docs/ja/api/providers.md +304 -0
- package/docs/ja/changelog.md +64 -0
- package/docs/ja/cli/dir.md +243 -0
- package/docs/ja/cli/file.md +213 -0
- package/docs/ja/cli/glossary.md +273 -0
- package/docs/ja/cli/index.md +111 -0
- package/docs/ja/cli/init.md +158 -0
- package/docs/ja/guide/chunking.md +271 -0
- package/docs/ja/guide/configuration.md +139 -0
- package/docs/ja/guide/cost-optimization.md +30 -0
- package/docs/ja/guide/getting-started.md +150 -0
- package/docs/ja/guide/glossary.md +214 -0
- package/docs/ja/guide/index.md +32 -0
- package/docs/ja/guide/ollama.md +410 -0
- package/docs/ja/guide/prompt-caching.md +221 -0
- package/docs/ja/guide/providers.md +232 -0
- package/docs/ja/guide/quality-control.md +137 -0
- package/docs/ja/guide/vitepress-integration.md +265 -0
- package/docs/ja/index.md +58 -0
- package/docs/ko/api/agent.md +262 -0
- package/docs/ko/api/engine.md +274 -0
- package/docs/ko/api/index.md +171 -0
- package/docs/ko/api/providers.md +304 -0
- package/docs/ko/changelog.md +64 -0
- package/docs/ko/cli/dir.md +243 -0
- package/docs/ko/cli/file.md +213 -0
- package/docs/ko/cli/glossary.md +273 -0
- package/docs/ko/cli/index.md +111 -0
- package/docs/ko/cli/init.md +158 -0
- package/docs/ko/guide/chunking.md +271 -0
- package/docs/ko/guide/configuration.md +139 -0
- package/docs/ko/guide/cost-optimization.md +30 -0
- package/docs/ko/guide/getting-started.md +150 -0
- package/docs/ko/guide/glossary.md +214 -0
- package/docs/ko/guide/index.md +32 -0
- package/docs/ko/guide/ollama.md +410 -0
- package/docs/ko/guide/prompt-caching.md +221 -0
- package/docs/ko/guide/providers.md +232 -0
- package/docs/ko/guide/quality-control.md +137 -0
- package/docs/ko/guide/vitepress-integration.md +265 -0
- package/docs/ko/index.md +58 -0
- package/docs/zh/api/agent.md +262 -0
- package/docs/zh/api/engine.md +274 -0
- package/docs/zh/api/index.md +171 -0
- package/docs/zh/api/providers.md +304 -0
- package/docs/zh/changelog.md +64 -0
- package/docs/zh/cli/dir.md +243 -0
- package/docs/zh/cli/file.md +213 -0
- package/docs/zh/cli/glossary.md +273 -0
- package/docs/zh/cli/index.md +111 -0
- package/docs/zh/cli/init.md +158 -0
- package/docs/zh/guide/chunking.md +271 -0
- package/docs/zh/guide/configuration.md +139 -0
- package/docs/zh/guide/cost-optimization.md +30 -0
- package/docs/zh/guide/getting-started.md +150 -0
- package/docs/zh/guide/glossary.md +214 -0
- package/docs/zh/guide/index.md +32 -0
- package/docs/zh/guide/ollama.md +410 -0
- package/docs/zh/guide/prompt-caching.md +221 -0
- package/docs/zh/guide/providers.md +232 -0
- package/docs/zh/guide/quality-control.md +137 -0
- package/docs/zh/guide/vitepress-integration.md +265 -0
- package/docs/zh/index.md +58 -0
- package/package.json +91 -0
- package/release.config.mjs +15 -0
- package/schemas/glossary.schema.json +110 -0
- package/src/cli/commands/dir.ts +469 -0
- package/src/cli/commands/file.ts +291 -0
- package/src/cli/commands/glossary.ts +221 -0
- package/src/cli/commands/init.ts +68 -0
- package/src/cli/commands/serve.ts +60 -0
- package/src/cli/index.ts +64 -0
- package/src/cli/options.ts +59 -0
- package/src/core/agent.ts +1119 -0
- package/src/core/chunker.ts +391 -0
- package/src/core/engine.ts +634 -0
- package/src/errors.ts +188 -0
- package/src/index.ts +147 -0
- package/src/integrations/vitepress.ts +549 -0
- package/src/parsers/markdown.ts +383 -0
- package/src/providers/claude.ts +259 -0
- package/src/providers/interface.ts +109 -0
- package/src/providers/ollama.ts +379 -0
- package/src/providers/openai.ts +308 -0
- package/src/providers/registry.ts +153 -0
- package/src/server/index.ts +152 -0
- package/src/server/middleware/auth.ts +93 -0
- package/src/server/middleware/logger.ts +90 -0
- package/src/server/routes/health.ts +84 -0
- package/src/server/routes/translate.ts +210 -0
- package/src/server/types.ts +138 -0
- package/src/services/cache.ts +899 -0
- package/src/services/config.ts +217 -0
- package/src/services/glossary.ts +247 -0
- package/src/types/analysis.ts +164 -0
- package/src/types/index.ts +265 -0
- package/src/types/modes.ts +121 -0
- package/src/types/mqm.ts +157 -0
- package/src/utils/logger.ts +141 -0
- package/src/utils/tokens.ts +116 -0
- package/tests/fixtures/glossaries/ml-glossary.json +53 -0
- package/tests/fixtures/input/lynq-installation.ko.md +350 -0
- package/tests/fixtures/input/lynq-installation.md +350 -0
- package/tests/fixtures/input/simple.ko.md +27 -0
- package/tests/fixtures/input/simple.md +27 -0
- package/tests/unit/chunker.test.ts +229 -0
- package/tests/unit/glossary.test.ts +146 -0
- package/tests/unit/markdown.test.ts +205 -0
- package/tests/unit/tokens.test.ts +81 -0
- package/tsconfig.json +28 -0
- package/tsup.config.ts +34 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# llm-translate init
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
프로젝트를 위한 설정 파일을 초기화합니다.
|
|
8
|
+
|
|
9
|
+
## 개요
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
llm-translate init [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 옵션
|
|
16
|
+
|
|
17
|
+
| 옵션 | 기본값 | 설명 |
|
|
18
|
+
|--------|---------|-------------|
|
|
19
|
+
|`--provider `,`-p`| claude | 기본 제공자 |
|
|
20
|
+
|`--model `,`-m`| 다양함 | 기본 모델 |
|
|
21
|
+
|`--quality`| 85 | 기본 품질 임계값 |
|
|
22
|
+
|`--glossary`| 없음 | 용어집 템플릿 생성 |
|
|
23
|
+
|`--force `,`-f`| false | 기존 설정 덮어쓰기 |
|
|
24
|
+
|
|
25
|
+
## 예제
|
|
26
|
+
|
|
27
|
+
### 기본 초기화
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
llm-translate init
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`.translaterc.json` 를 생성합니다:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"provider": {
|
|
38
|
+
"name": "claude",
|
|
39
|
+
"model": "claude-haiku-4-5-20251001"
|
|
40
|
+
},
|
|
41
|
+
"translation": {
|
|
42
|
+
"qualityThreshold": 85,
|
|
43
|
+
"maxIterations": 4
|
|
44
|
+
},
|
|
45
|
+
"paths": {}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 제공자 지정
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
llm-translate init --provider openai --model gpt-4o
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 용어집 템플릿과 함께
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
llm-translate init --glossary
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
또한 `glossary.json` 를 생성합니다:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"sourceLanguage": "en",
|
|
66
|
+
"version": "1.0.0",
|
|
67
|
+
"terms": [
|
|
68
|
+
{
|
|
69
|
+
"source": "example",
|
|
70
|
+
"targets": {
|
|
71
|
+
"ko": "예시"
|
|
72
|
+
},
|
|
73
|
+
"context": "Replace with your terms"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 사용자 정의 품질
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
llm-translate init --quality 95
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 대화형 모드
|
|
86
|
+
|
|
87
|
+
옵션 없이 실행하면 init가 대화형으로 실행됩니다:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
$ llm-translate init
|
|
91
|
+
|
|
92
|
+
llm-translate Configuration Setup
|
|
93
|
+
|
|
94
|
+
? Select provider: (Use arrow keys)
|
|
95
|
+
❯ claude
|
|
96
|
+
openai
|
|
97
|
+
ollama
|
|
98
|
+
|
|
99
|
+
? Select model: (Use arrow keys)
|
|
100
|
+
❯ claude-haiku-4-5-20251001 (fast, cost-effective)
|
|
101
|
+
claude-sonnet-4-5-20250929 (balanced)
|
|
102
|
+
claude-opus-4-5-20251101 (highest quality)
|
|
103
|
+
|
|
104
|
+
? Quality threshold: (85)
|
|
105
|
+
? Create glossary template? (y/N)
|
|
106
|
+
|
|
107
|
+
✓ Created .translaterc.json
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 출력 파일
|
|
111
|
+
|
|
112
|
+
### .translaterc.json
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"$schema": "https://llm-translate.dev/schema.json",
|
|
117
|
+
"provider": {
|
|
118
|
+
"name": "claude",
|
|
119
|
+
"model": "claude-haiku-4-5-20251001"
|
|
120
|
+
},
|
|
121
|
+
"translation": {
|
|
122
|
+
"qualityThreshold": 85,
|
|
123
|
+
"maxIterations": 4,
|
|
124
|
+
"preserveFormatting": true
|
|
125
|
+
},
|
|
126
|
+
"chunking": {
|
|
127
|
+
"maxTokens": 1024,
|
|
128
|
+
"overlapTokens": 150
|
|
129
|
+
},
|
|
130
|
+
"paths": {
|
|
131
|
+
"glossary": "./glossary.json",
|
|
132
|
+
"cache": "./.translate-cache"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### glossary.json (--glossary와 함께)
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"$schema": "https://llm-translate.dev/glossary-schema.json",
|
|
142
|
+
"sourceLanguage": "en",
|
|
143
|
+
"version": "1.0.0",
|
|
144
|
+
"description": "Project glossary",
|
|
145
|
+
"terms": []
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 기존 설정 덮어쓰기
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Will fail if config exists
|
|
153
|
+
llm-translate init
|
|
154
|
+
# Error: .translaterc.json already exists. Use --force to overwrite.
|
|
155
|
+
|
|
156
|
+
# Force overwrite
|
|
157
|
+
llm-translate init --force
|
|
158
|
+
```
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Chunking 전략
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
대용량 문서는 번역을 위해 청크로 분할됩니다. Chunking을 이해하면 품질과 비용을 최적화하는 데 도움이 됩니다.
|
|
8
|
+
|
|
9
|
+
## 왜 Chunking인가?
|
|
10
|
+
|
|
11
|
+
LLM은 컨텍스트 제한이 있으며 집중된 콘텐츠에서 더 나은 성능을 발휘합니다:
|
|
12
|
+
|
|
13
|
+
| 이유 | 설명 |
|
|
14
|
+
|--------|-------------|
|
|
15
|
+
| **컨텍스트 제한** | 모델에는 최대 입력 크기가 있습니다 |
|
|
16
|
+
| **품질** | 작은 청크는 더 집중된 주의를 받습니다 |
|
|
17
|
+
| **비용** | 반복되는 콘텐츠의 캐싱을 허용합니다 |
|
|
18
|
+
| **진행률** | 진행률 추적 및 재개를 가능하게 합니다 |
|
|
19
|
+
|
|
20
|
+
## 기본 구성
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"chunking": {
|
|
25
|
+
"maxTokens": 1024,
|
|
26
|
+
"overlapTokens": 150
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 청크 크기 옵션
|
|
32
|
+
|
|
33
|
+
### maxTokens
|
|
34
|
+
|
|
35
|
+
청크당 최대 토큰 수(프롬프트 오버헤드 제외).
|
|
36
|
+
|
|
37
|
+
| 크기 | 최적 용도 | 트레이드오프 |
|
|
38
|
+
|------|----------|-----------|
|
|
39
|
+
| 512 | 높은 품질 요구사항 | 더 많은 API 호출 |
|
|
40
|
+
| **1024** | 일반 사용 (기본값) | 균형 잡힌 |
|
|
41
|
+
| 2048 | 비용 최적화 | 품질이 저하될 수 있음 |
|
|
42
|
+
|
|
43
|
+
### overlapTokens
|
|
44
|
+
|
|
45
|
+
이전 청크의 컨텍스트가 경계 간 연속성을 보장합니다.
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Chunk 1: [Content A ]
|
|
49
|
+
Chunk 2: [overlap][Content B ]
|
|
50
|
+
Chunk 3: [overlap][Content C ]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
::: tip 권장 오버랩
|
|
54
|
+
`maxTokens` 값의 10-15%를 사용하세요. 1024 토큰의 경우 100-150 오버랩 토큰이 잘 작동합니다.
|
|
55
|
+
:::
|
|
56
|
+
|
|
57
|
+
## Markdown 인식 Chunking
|
|
58
|
+
|
|
59
|
+
llm-translate는 문서 구조를 존중하는 AST 기반 chunking을 사용합니다.
|
|
60
|
+
|
|
61
|
+
### 보존되는 경계
|
|
62
|
+
|
|
63
|
+
청크 분할기는 다음 요소들을 절대 분할하지 않습니다:
|
|
64
|
+
|
|
65
|
+
| 요소 | 동작 |
|
|
66
|
+
|---------|----------|
|
|
67
|
+
| 헤더 | 섹션 경계가 보존됨 |
|
|
68
|
+
| 코드 블록 | 항상 온전하게 유지됨 |
|
|
69
|
+
| 목록 | 가능한 경우 항목들이 그룹화됨 |
|
|
70
|
+
| 테이블 | 청크 간에 절대 분할되지 않음 |
|
|
71
|
+
| 단락 | 자연스러운 경계에서 분할됨 |
|
|
72
|
+
|
|
73
|
+
### 예시
|
|
74
|
+
|
|
75
|
+
::: details 클릭하여 chunking 예시 보기
|
|
76
|
+
|
|
77
|
+
**입력 문서:**
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
# Introduction
|
|
81
|
+
|
|
82
|
+
This is the introduction paragraph that explains
|
|
83
|
+
the purpose of the document.
|
|
84
|
+
|
|
85
|
+
## Getting Started
|
|
86
|
+
|
|
87
|
+
### Prerequisites
|
|
88
|
+
|
|
89
|
+
- Node.js 20+
|
|
90
|
+
- npm or yarn
|
|
91
|
+
|
|
92
|
+
### Installation
|
|
93
|
+
|
|
94
|
+
npm install @llm-translate/cli
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**결과:**
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Chunk 1: # Introduction + paragraph
|
|
101
|
+
Chunk 2: ## Getting Started + ### Prerequisites + list
|
|
102
|
+
Chunk 3: ### Installation + code block
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
:::
|
|
106
|
+
|
|
107
|
+
## 구성
|
|
108
|
+
|
|
109
|
+
::: code-group
|
|
110
|
+
|
|
111
|
+
```bash [CLI]
|
|
112
|
+
llm-translate file doc.md --target ko --chunk-size 2048
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```json [.translaterc.json]
|
|
116
|
+
{
|
|
117
|
+
"chunking": {
|
|
118
|
+
"maxTokens": 2048,
|
|
119
|
+
"overlapTokens": 200,
|
|
120
|
+
"preservePatterns": [
|
|
121
|
+
"```[\\s\\S]*?```",
|
|
122
|
+
"\\|[^\\n]+\\|"
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```typescript [Programmatic]
|
|
129
|
+
import { chunkContent } from '@llm-translate/cli';
|
|
130
|
+
|
|
131
|
+
const chunks = chunkContent(content, {
|
|
132
|
+
maxTokens: 1024,
|
|
133
|
+
overlapTokens: 150,
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
:::
|
|
138
|
+
|
|
139
|
+
## 최적화 프리셋
|
|
140
|
+
|
|
141
|
+
우선순위에 따라 선택하세요:
|
|
142
|
+
|
|
143
|
+
::: code-group
|
|
144
|
+
|
|
145
|
+
```json [Quality Focus]
|
|
146
|
+
{
|
|
147
|
+
"chunking": {
|
|
148
|
+
"maxTokens": 512,
|
|
149
|
+
"overlapTokens": 100
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```json [Cost Focus]
|
|
155
|
+
{
|
|
156
|
+
"chunking": {
|
|
157
|
+
"maxTokens": 2048,
|
|
158
|
+
"overlapTokens": 50
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```json [Long Documents]
|
|
164
|
+
{
|
|
165
|
+
"chunking": {
|
|
166
|
+
"maxTokens": 1500,
|
|
167
|
+
"overlapTokens": 150
|
|
168
|
+
},
|
|
169
|
+
"translation": {
|
|
170
|
+
"maxIterations": 3
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
:::
|
|
176
|
+
|
|
177
|
+
::: info 각 프리셋을 언제 사용할지
|
|
178
|
+
- **품질 중심**: 기술 문서, 법적 콘텐츠
|
|
179
|
+
- **비용 중심**: 블로그 포스트, 일반 콘텐츠
|
|
180
|
+
- **긴 문서**: 책, 포괄적인 가이드
|
|
181
|
+
:::
|
|
182
|
+
|
|
183
|
+
## 콘텐츠 보존
|
|
184
|
+
|
|
185
|
+
### 보호되는 것
|
|
186
|
+
|
|
187
|
+
llm-translate는 특정 콘텐츠를 번역에서 자동으로 보호합니다:
|
|
188
|
+
|
|
189
|
+
| 콘텐츠 유형 | 예시 | 동작 |
|
|
190
|
+
|--------------|---------|----------|
|
|
191
|
+
| 코드 블록 |` __INLINE_CODE_16__ `| 절대 번역되지 않음 |
|
|
192
|
+
| 인라인 코드 |`` ` variable ` ``| 보존됨 |
|
|
193
|
+
| URL |`https://...`| 보존됨 |
|
|
194
|
+
| 파일 경로 |`./path/to/file`| 보존됨 |
|
|
195
|
+
|
|
196
|
+
### 링크 처리
|
|
197
|
+
|
|
198
|
+
링크 URL은 보존되지만 링크 텍스트는 번역됩니다:
|
|
199
|
+
|
|
200
|
+
```markdown
|
|
201
|
+
[Getting Started](./getting-started.md)
|
|
202
|
+
↓
|
|
203
|
+
[시작하기](./getting-started.md)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 디버깅
|
|
207
|
+
|
|
208
|
+
### 청크 미리보기
|
|
209
|
+
|
|
210
|
+
`--dry-run` 를 사용하여 문서가 어떻게 청크로 나뉠지 확인하세요:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
llm-translate file doc.md --target ko --dry-run --verbose
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
출력:
|
|
217
|
+
```
|
|
218
|
+
Document Analysis:
|
|
219
|
+
Total tokens: ~5,200
|
|
220
|
+
Chunks: 6
|
|
221
|
+
Average chunk size: ~867 tokens
|
|
222
|
+
|
|
223
|
+
Chunk breakdown:
|
|
224
|
+
[1] Lines 1-45 (Introduction) - 823 tokens
|
|
225
|
+
[2] Lines 46-89 (Getting Started) - 912 tokens
|
|
226
|
+
[3] Lines 90-134 (Configuration) - 878 tokens
|
|
227
|
+
...
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 프로그래밍 방식 검사
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
import { chunkContent, getChunkStats } from '@llm-translate/cli';
|
|
234
|
+
|
|
235
|
+
const chunks = chunkContent(content, { maxTokens: 1024 });
|
|
236
|
+
const stats = getChunkStats(chunks);
|
|
237
|
+
|
|
238
|
+
console.log(`Total chunks: ${stats.count}`);
|
|
239
|
+
console.log(`Average size: ${stats.avgTokens} tokens`);
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## 문제 해결
|
|
243
|
+
|
|
244
|
+
::: warning 청크가 너무 작음
|
|
245
|
+
**증상**: 많은 작은 청크, 과도한 API 호출
|
|
246
|
+
|
|
247
|
+
**해결책**:`maxTokens` 를 증가시키세요
|
|
248
|
+
```json
|
|
249
|
+
{ "chunking": { "maxTokens": 2048 } }
|
|
250
|
+
```
|
|
251
|
+
:::
|
|
252
|
+
|
|
253
|
+
::: warning 청크 간 컨텍스트 손실
|
|
254
|
+
**증상**: 섹션 간 일관성 없는 용어
|
|
255
|
+
|
|
256
|
+
**해결책**: 오버랩을 증가시키거나 용어집을 사용하세요
|
|
257
|
+
```json
|
|
258
|
+
{ "chunking": { "overlapTokens": 300 } }
|
|
259
|
+
```
|
|
260
|
+
:::
|
|
261
|
+
|
|
262
|
+
::: danger 코드 블록이 분할됨
|
|
263
|
+
**증상**: 출력에서 구문 오류
|
|
264
|
+
|
|
265
|
+
**원인**: 이는 절대 발생해서는 안 됩니다. 발생한다면 [이슈를 신고](https://github.com/selenehyun/llm-translate/issues)해 주세요.
|
|
266
|
+
:::
|
|
267
|
+
|
|
268
|
+
::: warning 테이블이 손상됨
|
|
269
|
+
**증상**: 깨진 테이블 형식
|
|
270
|
+
|
|
271
|
+
**해결책**: 테이블은 자동으로 온전하게 유지되어야 합니다. 매우 큰 테이블(100+ 행)의 경우 수동으로 분할하는 것을 고려하세요.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# 설정
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate는 계층화된 설정 시스템을 사용합니다. 설정은 다음 순서로 적용됩니다(나중 설정이 이전 설정을 덮어씁니다):
|
|
8
|
+
|
|
9
|
+
1. 내장 기본값
|
|
10
|
+
2. 설정 파일 (`.translaterc.json`)
|
|
11
|
+
3. 환경 변수
|
|
12
|
+
4. CLI 인수
|
|
13
|
+
|
|
14
|
+
## 설정 파일
|
|
15
|
+
|
|
16
|
+
프로젝트 루트에 `.translaterc.json` 를 생성하세요:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"provider": {
|
|
21
|
+
"name": "claude",
|
|
22
|
+
"model": "claude-haiku-4-5-20251001",
|
|
23
|
+
"apiKey": null
|
|
24
|
+
},
|
|
25
|
+
"translation": {
|
|
26
|
+
"qualityThreshold": 85,
|
|
27
|
+
"maxIterations": 4,
|
|
28
|
+
"preserveFormatting": true
|
|
29
|
+
},
|
|
30
|
+
"chunking": {
|
|
31
|
+
"maxTokens": 1024,
|
|
32
|
+
"overlapTokens": 150
|
|
33
|
+
},
|
|
34
|
+
"paths": {
|
|
35
|
+
"glossary": "./glossary.json",
|
|
36
|
+
"cache": "./.translate-cache"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 제공자 설정
|
|
42
|
+
|
|
43
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
44
|
+
|--------|------|---------|-------------|
|
|
45
|
+
|`name `| string |`"claude"`| 제공자 이름:` claude `,` openai `,` ollama`|
|
|
46
|
+
|`model`| string | 다양함 | 모델 식별자 |
|
|
47
|
+
|`apiKey`| string | null | API 키 (환경 변수 권장) |
|
|
48
|
+
|`baseUrl`| string | null | 사용자 정의 API 엔드포인트 |
|
|
49
|
+
|
|
50
|
+
### 번역 설정
|
|
51
|
+
|
|
52
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
53
|
+
|--------|------|---------|-------------|
|
|
54
|
+
|`qualityThreshold `| number |` 85`| 최소 품질 점수 (0-100) |
|
|
55
|
+
|`maxIterations `| number |` 4`| 최대 개선 반복 횟수 |
|
|
56
|
+
|`preserveFormatting `| boolean |` true`| Markdown/HTML 구조 보존 |
|
|
57
|
+
|
|
58
|
+
### Chunking 설정
|
|
59
|
+
|
|
60
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
61
|
+
|--------|------|---------|-------------|
|
|
62
|
+
|`maxTokens `| number |` 1024`| 청크당 최대 토큰 수 |
|
|
63
|
+
|`overlapTokens `| number |` 150`| 청크 간 컨텍스트 중복 |
|
|
64
|
+
|
|
65
|
+
### 경로 설정
|
|
66
|
+
|
|
67
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
68
|
+
|--------|------|---------|-------------|
|
|
69
|
+
|`glossary`| string | null | 용어집 파일 경로 |
|
|
70
|
+
|`cache`| string | null | 번역 캐시 경로 |
|
|
71
|
+
|
|
72
|
+
## 환경 변수
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# API Keys
|
|
76
|
+
ANTHROPIC_API_KEY=sk-ant-xxxxx
|
|
77
|
+
OPENAI_API_KEY=sk-xxxxx
|
|
78
|
+
OLLAMA_BASE_URL=http://localhost:11434
|
|
79
|
+
|
|
80
|
+
# Default Settings
|
|
81
|
+
LLM_TRANSLATE_PROVIDER=claude
|
|
82
|
+
LLM_TRANSLATE_MODEL=claude-haiku-4-5-20251001
|
|
83
|
+
LLM_TRANSLATE_QUALITY_THRESHOLD=85
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## CLI 재정의 예시
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Override provider
|
|
90
|
+
llm-translate file doc.md -o doc.ko.md --target ko --provider openai
|
|
91
|
+
|
|
92
|
+
# Override model
|
|
93
|
+
llm-translate file doc.md -o doc.ko.md --target ko --model claude-sonnet-4-5-20250929
|
|
94
|
+
|
|
95
|
+
# Override quality threshold
|
|
96
|
+
llm-translate file doc.md -o doc.ko.md --target ko --quality 90
|
|
97
|
+
|
|
98
|
+
# Override max iterations
|
|
99
|
+
llm-translate file doc.md -o doc.ko.md --target ko --max-iterations 6
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 프로젝트별 설정
|
|
103
|
+
|
|
104
|
+
모노레포나 다중 프로젝트 설정의 경우, 각 프로젝트 디렉토리에 `.translaterc.json` 을 배치하세요:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
my-monorepo/
|
|
108
|
+
├── packages/
|
|
109
|
+
│ ├── frontend/
|
|
110
|
+
│ │ ├── .translaterc.json # Frontend-specific terms
|
|
111
|
+
│ │ └── docs/
|
|
112
|
+
│ └── backend/
|
|
113
|
+
│ ├── .translaterc.json # Backend-specific terms
|
|
114
|
+
│ └── docs/
|
|
115
|
+
└── .translaterc.json # Shared defaults
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
llm-translate는 현재 디렉토리부터 상위로 설정 파일을 검색합니다.
|
|
119
|
+
|
|
120
|
+
## 모델 선택 가이드
|
|
121
|
+
|
|
122
|
+
| 모델 | 속도 | 품질 | 비용 | 최적 용도 |
|
|
123
|
+
|-------|-------|---------|------|----------|
|
|
124
|
+
|`claude-haiku-4-5-20251001`| 빠름 | 좋음 | 낮음 | 일반 문서, 대용량 |
|
|
125
|
+
|`claude-sonnet-4-5-20250929`| 보통 | 우수 | 보통 | 기술 문서, 품질 중요 |
|
|
126
|
+
|`claude-opus-4-5-20251101`| 느림 | 최고 | 높음 | 복잡한 내용, 미묘한 텍스트 |
|
|
127
|
+
|`gpt-4o-mini`| 빠름 | 좋음 | 낮음 | Haiku 대안 |
|
|
128
|
+
|`gpt-4o`| 보통 | 우수 | 보통 | Sonnet 대안 |
|
|
129
|
+
|
|
130
|
+
## 품질 임계값 가이드라인
|
|
131
|
+
|
|
132
|
+
| 임계값 | 사용 사례 |
|
|
133
|
+
|-----------|----------|
|
|
134
|
+
| 70-75 | 초안 번역, 내부 문서 |
|
|
135
|
+
| 80-85 | 표준 문서 (기본값) |
|
|
136
|
+
| 90-95 | 공개용, 마케팅 콘텐츠 |
|
|
137
|
+
| 95+ | 법률, 의료, 규제 콘텐츠 |
|
|
138
|
+
|
|
139
|
+
높은 임계값은 더 많은 반복이 필요하며 비용이 더 많이 듭니다.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 비용 최적화
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4.5를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
이 가이드는 번역 품질을 유지하면서 API 비용을 최소화하는 전략을 다룹니다.
|
|
8
|
+
|
|
9
|
+
## 비용 구조
|
|
10
|
+
|
|
11
|
+
### 토큰 가격 (2025년 기준)
|
|
12
|
+
|
|
13
|
+
| 모델 | 입력 (1K) | 출력 (1K) | 캐시 읽기 | 캐시 쓰기 |
|
|
14
|
+
|-------|-----------|-------------|------------|-------------|
|
|
15
|
+
| Claude Haiku 4.5 | $0.001 | $0.005 | $0.0001 | $0.00125 |
|
|
16
|
+
| Claude Sonnet 4.5 | $0.003 | $0.015 | $0.0003 | $0.00375 |
|
|
17
|
+
| Claude Opus 4.5 | $0.015 | $0.075 | $0.0015 | $0.01875 |
|
|
18
|
+
| GPT-4o-mini | $0.00015 | $0.0006 | 자동 | 자동 |
|
|
19
|
+
| GPT-4o | $0.0025 | $0.01 | 자동 | 자동 |
|
|
20
|
+
|
|
21
|
+
### 비용 요소
|
|
22
|
+
|
|
23
|
+
- [ ] 표준 문서에는 Haiku를 사용합니다
|
|
24
|
+
- [ ] 품질 임계값을 적절히 설정합니다 (필요 이상으로 높게 설정하지 않습니다)
|
|
25
|
+
- [ ] 프롬프트 캐싱을 활성화하고 최대화합니다
|
|
26
|
+
- [ ] 파일을 배치로 처리합니다
|
|
27
|
+
- [ ] 용어집을 간결하게 유지합니다
|
|
28
|
+
- [ ] 증분 업데이트를 위해 번역 캐시를 사용합니다
|
|
29
|
+
- [ ] 상세 출력으로 비용을 모니터링합니다
|
|
30
|
+
- [ ] 대규모 작업 전에 비용을 추정합니다
|