@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,232 @@
|
|
|
1
|
+
# 제공자
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate는 여러 LLM 제공자를 지원합니다. 각각은 서로 다른 장점과 트레이드오프를 가지고 있습니다.
|
|
8
|
+
|
|
9
|
+
## 지원되는 제공자
|
|
10
|
+
|
|
11
|
+
| 제공자 | 캐싱 | 최적 용도 | 설정 복잡도 |
|
|
12
|
+
|----------|---------|----------|------------------|
|
|
13
|
+
| Claude | 완전 지원 | 품질 + 비용 | 쉬움 |
|
|
14
|
+
| OpenAI | 자동 | 생태계 | 쉬움 |
|
|
15
|
+
| Ollama | 없음 | 프라이버시/오프라인 | 보통 |
|
|
16
|
+
|
|
17
|
+
## Claude (권장)
|
|
18
|
+
|
|
19
|
+
### Claude를 선택하는 이유?
|
|
20
|
+
|
|
21
|
+
- **프롬프트 캐싱**: 최대 90% 비용 절감
|
|
22
|
+
- **높은 품질**: 뛰어난 번역 정확도
|
|
23
|
+
- **긴 컨텍스트**: 200K 토큰 컨텍스트 윈도우
|
|
24
|
+
- **다양한 계층**: Haiku (빠름), Sonnet (균형), Opus (최고)
|
|
25
|
+
|
|
26
|
+
### 설정
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
export ANTHROPIC_API_KEY=sk-ant-xxxxx
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 모델 선택
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Fast and cheap (default)
|
|
36
|
+
llm-translate file doc.md --target ko --model claude-haiku-4-5-20251001
|
|
37
|
+
|
|
38
|
+
# Balanced quality/cost
|
|
39
|
+
llm-translate file doc.md --target ko --model claude-sonnet-4-5-20250929
|
|
40
|
+
|
|
41
|
+
# Highest quality
|
|
42
|
+
llm-translate file doc.md --target ko --model claude-opus-4-5-20251101
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 각 모델 사용 시기
|
|
46
|
+
|
|
47
|
+
| 모델 | 사용 사례 |
|
|
48
|
+
|-------|----------|
|
|
49
|
+
| Haiku | README 파일, 간단한 문서, 대용량 |
|
|
50
|
+
| Sonnet | 기술 문서, API 참조 |
|
|
51
|
+
| Opus | 법률, 마케팅, 미묘한 내용 |
|
|
52
|
+
|
|
53
|
+
## OpenAI
|
|
54
|
+
|
|
55
|
+
### 설정
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
export OPENAI_API_KEY=sk-xxxxx
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 사용법
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
llm-translate file doc.md --target ko --provider openai --model gpt-4o
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 사용 가능한 모델
|
|
68
|
+
|
|
69
|
+
| 모델 | 속도 | 품질 | 비용 |
|
|
70
|
+
|-------|-------|---------|------|
|
|
71
|
+
| gpt-4o-mini | 빠름 | 좋음 | 매우 낮음 |
|
|
72
|
+
| gpt-4o | 보통 | 뛰어남 | 보통 |
|
|
73
|
+
| gpt-4-turbo | 보통 | 뛰어남 | 높음 |
|
|
74
|
+
|
|
75
|
+
### 사용 시기
|
|
76
|
+
|
|
77
|
+
- 다른 서비스에서 이미 OpenAI를 사용하는 경우
|
|
78
|
+
- 특정 OpenAI 기능이 필요한 경우
|
|
79
|
+
- Azure OpenAI를 선호하는 경우 (사용자 정의 baseUrl 설정)
|
|
80
|
+
|
|
81
|
+
## Ollama
|
|
82
|
+
|
|
83
|
+
프라이버시나 오프라인 사용을 위한 로컬, 자체 호스팅 LLM입니다. API 키가 필요하지 않습니다.
|
|
84
|
+
|
|
85
|
+
::: warning 모델에 따라 품질이 달라집니다
|
|
86
|
+
Ollama 번역 품질은 **모델 선택에 크게 의존합니다**. 신뢰할 수 있는 번역 결과를 위해서는:
|
|
87
|
+
|
|
88
|
+
- **최소**: 14B+ 매개변수 모델 (예:`qwen2.5:14b `,` llama3.1:14b`)
|
|
89
|
+
- **권장**: 32B+ 모델 (예:`qwen2.5:32b `,` llama3.3:70b`)
|
|
90
|
+
- **권장하지 않음**: 7B 미만 모델은 일관성이 없고 종종 사용할 수 없는 번역을 생성합니다
|
|
91
|
+
|
|
92
|
+
작은 모델(3B, 7B)은 간단한 내용에서는 작동할 수 있지만 기술 문서에서는 자주 실패하거나, 불완전한 출력을 생성하거나, 형식 지침을 무시합니다.
|
|
93
|
+
:::
|
|
94
|
+
|
|
95
|
+
### 빠른 설정
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 1. Install (macOS)
|
|
99
|
+
brew install ollama
|
|
100
|
+
|
|
101
|
+
# 2. Pull qwen2.5:14b (recommended)
|
|
102
|
+
ollama pull qwen2.5:14b
|
|
103
|
+
|
|
104
|
+
# 3. Translate
|
|
105
|
+
llm-translate file doc.md -s en -t ko --provider ollama --model qwen2.5:14b
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 권장 모델
|
|
109
|
+
|
|
110
|
+
| 모델 | RAM | 품질 | 최적 용도 |
|
|
111
|
+
|-------|-----|---------|----------|
|
|
112
|
+
|`qwen2.5:14b`| 16GB | 매우 좋음 | **최고의 균형 (권장)** |
|
|
113
|
+
|`qwen2.5:32b`| 32GB | 뛰어남 | 더 높은 품질 |
|
|
114
|
+
|`llama3.1:8b`| 8GB | 좋음 | 가벼운 무게 |
|
|
115
|
+
|`llama3.2`| 4GB | 보통 | 간단한 내용만 |
|
|
116
|
+
|
|
117
|
+
### 사용 시기
|
|
118
|
+
|
|
119
|
+
- 민감한/개인 문서
|
|
120
|
+
- 오프라인 환경
|
|
121
|
+
- 비용 최적화 (API 수수료 없음)
|
|
122
|
+
- 간단하거나 보통 복잡도의 내용
|
|
123
|
+
|
|
124
|
+
::: tip 전체 가이드
|
|
125
|
+
완전한 설정 지침, GPU 최적화, 문제 해결 및 고급 구성은 [Ollama를 사용한 로컬 번역](./ollama)을 참조하세요.
|
|
126
|
+
:::
|
|
127
|
+
|
|
128
|
+
## 제공자 비교
|
|
129
|
+
|
|
130
|
+
### 품질
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Opus > Sonnet ≈ GPT-4o > Haiku ≈ GPT-4o-mini > Qwen2.5:32b > Qwen2.5:14b
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 비용 (100만 토큰당)
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Ollama ($0) < GPT-4o-mini ($0.15) < Haiku ($1) < GPT-4o ($2.5) < Sonnet ($3) < Opus ($15)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 속도
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
Haiku ≈ GPT-4o-mini > Sonnet ≈ GPT-4o > Opus > Ollama (varies with hardware)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 제공자 전환
|
|
149
|
+
|
|
150
|
+
### CLI
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Different providers
|
|
154
|
+
llm-translate file doc.md -s en -t ko --provider claude
|
|
155
|
+
llm-translate file doc.md -s en -t ko --provider openai
|
|
156
|
+
llm-translate file doc.md -s en -t ko --provider ollama
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 설정 파일
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"provider": {
|
|
164
|
+
"name": "openai",
|
|
165
|
+
"model": "gpt-4o"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 프로그래밍 방식
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import {
|
|
174
|
+
createClaudeProvider,
|
|
175
|
+
createOpenAIProvider,
|
|
176
|
+
createOllamaProvider,
|
|
177
|
+
TranslationEngine,
|
|
178
|
+
} from '@llm-translate/cli';
|
|
179
|
+
|
|
180
|
+
// Switch providers easily
|
|
181
|
+
const providers = {
|
|
182
|
+
claude: createClaudeProvider(),
|
|
183
|
+
openai: createOpenAIProvider(),
|
|
184
|
+
ollama: createOllamaProvider(),
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const engine = new TranslationEngine({
|
|
188
|
+
provider: providers[selectedProvider],
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 폴백 구성
|
|
193
|
+
|
|
194
|
+
신뢰성을 위한 폴백 제공자를 구성합니다:
|
|
195
|
+
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"provider": {
|
|
199
|
+
"name": "claude",
|
|
200
|
+
"model": "claude-haiku-4-5-20251001",
|
|
201
|
+
"fallback": [
|
|
202
|
+
{ "name": "openai", "model": "gpt-4o-mini" },
|
|
203
|
+
{ "name": "ollama", "model": "llama3.1" }
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 사용자 정의 엔드포인트
|
|
210
|
+
|
|
211
|
+
### Azure OpenAI
|
|
212
|
+
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"provider": {
|
|
216
|
+
"name": "openai",
|
|
217
|
+
"baseUrl": "https://your-resource.openai.azure.com",
|
|
218
|
+
"apiKey": "your-azure-key"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 자체 호스팅
|
|
224
|
+
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"provider": {
|
|
228
|
+
"name": "ollama",
|
|
229
|
+
"baseUrl": "https://your-server.com:11434"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 품질 관리
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate는 Self-Refine 알고리즘을 사용하여 번역 품질이 요구사항을 충족하도록 보장합니다.
|
|
8
|
+
|
|
9
|
+
## Self-Refine 작동 방식
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────┐
|
|
13
|
+
│ Initial Translate│
|
|
14
|
+
└────────┬────────┘
|
|
15
|
+
▼
|
|
16
|
+
┌─────────────────┐
|
|
17
|
+
│ Evaluate Quality │◀──────────────┐
|
|
18
|
+
└────────┬────────┘ │
|
|
19
|
+
▼ │
|
|
20
|
+
Score >= Threshold? │
|
|
21
|
+
│ │
|
|
22
|
+
No │ Yes │
|
|
23
|
+
│ │ │
|
|
24
|
+
▼ ▼ │
|
|
25
|
+
┌─────────┐ ┌──────┐ │
|
|
26
|
+
│ Reflect │ │ Done │ │
|
|
27
|
+
└────┬────┘ └──────┘ │
|
|
28
|
+
▼ │
|
|
29
|
+
┌─────────────────┐ │
|
|
30
|
+
│ Improve │───────────────┘
|
|
31
|
+
└─────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 1. 초기 번역
|
|
35
|
+
|
|
36
|
+
첫 번째 번역은 다음과 함께 생성됩니다:
|
|
37
|
+
- 전체 용어집 컨텍스트
|
|
38
|
+
- 문서 구조 정보
|
|
39
|
+
- 이전 청크 컨텍스트 (연속성을 위해)
|
|
40
|
+
|
|
41
|
+
### 2. 품질 평가
|
|
42
|
+
|
|
43
|
+
각 번역은 네 가지 기준으로 점수가 매겨집니다:
|
|
44
|
+
|
|
45
|
+
| 기준 | 가중치 | 설명 |
|
|
46
|
+
|------|--------|------|
|
|
47
|
+
| 의미 정확성 | 40% | 올바른 의미를 전달하는가? |
|
|
48
|
+
| 유창성 | 25% | 대상 언어로 자연스럽게 읽히는가? |
|
|
49
|
+
| 용어집 준수 | 20% | 모든 용어집 용어가 올바르게 적용되었는가? |
|
|
50
|
+
| 형식 보존 | 15% | Markdown/HTML 구조가 유지되었는가? |
|
|
51
|
+
|
|
52
|
+
### 3. 성찰
|
|
53
|
+
|
|
54
|
+
품질이 임계값 이하인 경우, LLM이 다음을 분석합니다:
|
|
55
|
+
- 어떤 구체적인 문제가 존재하는지
|
|
56
|
+
- 어떤 용어집 용어가 누락되었는지
|
|
57
|
+
- 유창성을 어디서 개선할 수 있는지
|
|
58
|
+
|
|
59
|
+
### 4. 개선
|
|
60
|
+
|
|
61
|
+
성찰 피드백을 바탕으로 대상 수정이 적용되고, 그 후 사이클이 반복됩니다.
|
|
62
|
+
|
|
63
|
+
## 구성
|
|
64
|
+
|
|
65
|
+
### 품질 임계값
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# CLI
|
|
69
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --quality 90
|
|
70
|
+
|
|
71
|
+
# Config file
|
|
72
|
+
{
|
|
73
|
+
"translation": {
|
|
74
|
+
"qualityThreshold": 90
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 최대 반복 횟수
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# CLI
|
|
83
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --max-iterations 6
|
|
84
|
+
|
|
85
|
+
# Config file
|
|
86
|
+
{
|
|
87
|
+
"translation": {
|
|
88
|
+
"maxIterations": 6
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 엄격 모드
|
|
94
|
+
|
|
95
|
+
품질 임계값이 충족되지 않으면 실패:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --strict-quality
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
종료 코드:
|
|
102
|
+
-`0`- 성공
|
|
103
|
+
-`4`- 품질 임계값 미충족 (엄격 모드)
|
|
104
|
+
|
|
105
|
+
## 품질 점수 해석
|
|
106
|
+
|
|
107
|
+
| 점수 | 품질 수준 | 설명 |
|
|
108
|
+
|------|----------|------|
|
|
109
|
+
| 95-100 | 우수 | 출판 준비 완료 |
|
|
110
|
+
| 85-94 | 양호 | 사소한 문제, 대부분의 용도에 허용 가능 |
|
|
111
|
+
| 75-84 | 보통 | 눈에 띄는 문제, 검토가 필요할 수 있음 |
|
|
112
|
+
| 60-74 | 미흡 | 심각한 문제, 수동 검토 필요 |
|
|
113
|
+
| < 60 | 허용 불가 | 주요 문제, 재번역 고려 |
|
|
114
|
+
|
|
115
|
+
## 출력 이해하기
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✓ Translation complete
|
|
119
|
+
Quality: 92/85 (threshold met)
|
|
120
|
+
Breakdown:
|
|
121
|
+
- Accuracy: 38/40
|
|
122
|
+
- Fluency: 24/25
|
|
123
|
+
- Glossary: 18/20
|
|
124
|
+
- Format: 12/15
|
|
125
|
+
Iterations: 2
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 세부 분석
|
|
129
|
+
|
|
130
|
+
- **정확성 (38/40)**: 번역이 의미적으로 정확함
|
|
131
|
+
- **유창성 (24/25)**: 대상 언어로 자연스럽게 읽힘
|
|
132
|
+
- **용어집 (18/20)**: 대부분의 용어가 적용됨, 일부 변형 있음
|
|
133
|
+
- **형식 (12/15)**: 사소한 형식 조정 필요
|
|
134
|
+
|
|
135
|
+
## 품질 조정
|
|
136
|
+
|
|
137
|
+
### 더 높은 품질을 위해
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# VitePress 통합
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate는 번역된 문서 구조를 기반으로 VitePress i18n 구성을 자동으로 생성하는 헬퍼 함수를 제공합니다.
|
|
8
|
+
|
|
9
|
+
## 개요
|
|
10
|
+
|
|
11
|
+
`llm-translate dir` 로 문서를 번역한 후, 내장된 VitePress 헬퍼를 사용하여 각 로케일에 대한 네비게이션 및 사이드바 구성을 자동 생성할 수 있습니다.
|
|
12
|
+
|
|
13
|
+
## 설치
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @llm-translate/cli
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 기본 사용법
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// docs/.vitepress/config.ts
|
|
23
|
+
import { defineConfig } from 'vitepress';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
import { dirname, resolve } from 'node:path';
|
|
26
|
+
import { generateLocaleConfig } from '@llm-translate/cli';
|
|
27
|
+
|
|
28
|
+
// Get docs directory path relative to this config file
|
|
29
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const docsDir = resolve(__dirname, '..');
|
|
31
|
+
|
|
32
|
+
const locales = generateLocaleConfig(docsDir, {
|
|
33
|
+
defaultLocale: 'en',
|
|
34
|
+
locales: ['ko', 'ja'],
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export default defineConfig({
|
|
38
|
+
title: 'My Project',
|
|
39
|
+
locales,
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
::: tip 절대 경로를 사용하는 이유는?
|
|
44
|
+
VitePress 구성은 프로젝트 루트에서 실행되므로 `'./docs'` 와 같은 상대 경로는 올바르게 해석되지 않을 수 있습니다.`import.meta.url` 를 사용하면 구성 파일 위치를 기준으로 경로가 계산됩니다.
|
|
45
|
+
:::
|
|
46
|
+
|
|
47
|
+
이는 다음과 같은 작업을 수행합니다:
|
|
48
|
+
1. `./docs` 디렉토리 구조를 스캔합니다
|
|
49
|
+
2. 사이드바 디렉토리(guide, api, cli 등)를 자동 감지합니다
|
|
50
|
+
3. 각 로케일에 대한 nav 및 사이드바를 생성합니다
|
|
51
|
+
4. UI 요소에 대한 기본 번역을 적용합니다
|
|
52
|
+
|
|
53
|
+
## 구성 옵션
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
interface GenerateOptions {
|
|
57
|
+
/** Default locale code (e.g., 'en') - defaults to 'en' */
|
|
58
|
+
defaultLocale?: string;
|
|
59
|
+
|
|
60
|
+
/** List of locale codes to generate (auto-detected if omitted) */
|
|
61
|
+
locales?: string[];
|
|
62
|
+
|
|
63
|
+
/** Locale display labels */
|
|
64
|
+
labels?: Record<string, string>;
|
|
65
|
+
|
|
66
|
+
/** Locale lang codes for HTML */
|
|
67
|
+
langCodes?: Record<string, string>;
|
|
68
|
+
|
|
69
|
+
/** Locale descriptions */
|
|
70
|
+
descriptions?: Record<string, string>;
|
|
71
|
+
|
|
72
|
+
/** Directories to include in sidebar (auto-detected if omitted) */
|
|
73
|
+
sidebarDirs?: string[];
|
|
74
|
+
|
|
75
|
+
/** Use title from file's first heading (default: true) */
|
|
76
|
+
useTitleFromHeading?: boolean;
|
|
77
|
+
|
|
78
|
+
/** Custom locale translations */
|
|
79
|
+
translations?: Record<string, LocaleTranslations>;
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 예제
|
|
84
|
+
|
|
85
|
+
### 로케일 자동 감지
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { generateLocaleConfig, detectLocales } from '@llm-translate/cli';
|
|
89
|
+
|
|
90
|
+
// Automatically detect locales from directory structure
|
|
91
|
+
// (looks for 2-letter directories like 'ko', 'ja', 'zh')
|
|
92
|
+
const locales = generateLocaleConfig('./docs');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 사용자 정의 레이블 및 설명
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const locales = generateLocaleConfig('./docs', {
|
|
99
|
+
defaultLocale: 'en',
|
|
100
|
+
locales: ['ko', 'ja'],
|
|
101
|
+
labels: {
|
|
102
|
+
en: 'English',
|
|
103
|
+
ko: '한국어',
|
|
104
|
+
ja: '日本語',
|
|
105
|
+
},
|
|
106
|
+
descriptions: {
|
|
107
|
+
en: 'Documentation for My Project',
|
|
108
|
+
ko: 'My Project 문서',
|
|
109
|
+
ja: 'My Projectのドキュメント',
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 사이드바 디렉토리 지정
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const locales = generateLocaleConfig('./docs', {
|
|
118
|
+
sidebarDirs: ['guide', 'api', 'examples'],
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 사용자 정의 번역
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
const locales = generateLocaleConfig('./docs', {
|
|
126
|
+
translations: {
|
|
127
|
+
ko: {
|
|
128
|
+
editLinkText: 'GitHub에서 편집',
|
|
129
|
+
docFooter: { prev: '이전', next: '다음' },
|
|
130
|
+
outline: { label: '목차' },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 사이드바 전용 생성
|
|
137
|
+
|
|
138
|
+
nav는 수동으로 구성하고 사이드바만 자동 생성하려는 경우:
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { defineConfig } from 'vitepress';
|
|
142
|
+
import { generateSidebarConfig } from '@llm-translate/cli';
|
|
143
|
+
|
|
144
|
+
const sidebars = generateSidebarConfig('./docs', {
|
|
145
|
+
defaultLocale: 'en',
|
|
146
|
+
locales: ['ko'],
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
export default defineConfig({
|
|
150
|
+
locales: {
|
|
151
|
+
root: {
|
|
152
|
+
label: 'English',
|
|
153
|
+
themeConfig: {
|
|
154
|
+
nav: [/* custom nav */],
|
|
155
|
+
sidebar: sidebars.root,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
ko: {
|
|
159
|
+
label: '한국어',
|
|
160
|
+
themeConfig: {
|
|
161
|
+
nav: [/* custom nav */],
|
|
162
|
+
sidebar: sidebars.ko,
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 단일 로케일 생성
|
|
170
|
+
|
|
171
|
+
단일 로케일에 대한 구성 생성:
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { generateLocale } from '@llm-translate/cli';
|
|
175
|
+
|
|
176
|
+
const koConfig = generateLocale('./docs', 'ko', {
|
|
177
|
+
defaultLocale: 'en',
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Use in your config
|
|
181
|
+
export default defineConfig({
|
|
182
|
+
locales: {
|
|
183
|
+
ko: koConfig,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 유틸리티 함수
|
|
189
|
+
|
|
190
|
+
### detectLocales
|
|
191
|
+
|
|
192
|
+
로케일 디렉토리를 스캔하여 사용 가능한 로케일을 자동 감지합니다:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { detectLocales } from '@llm-translate/cli';
|
|
196
|
+
|
|
197
|
+
const locales = detectLocales('./docs', 'en');
|
|
198
|
+
// Returns: ['ko', 'ja', 'zh'] (based on directories found)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### detectSidebarDirs
|
|
202
|
+
|
|
203
|
+
사이드바에 표시되어야 하는 디렉토리를 자동 감지합니다:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { detectSidebarDirs } from '@llm-translate/cli';
|
|
207
|
+
|
|
208
|
+
const dirs = detectSidebarDirs('./docs');
|
|
209
|
+
// Returns: ['guide', 'api', 'cli'] (excludes locale dirs, assets, etc.)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 제목 추출
|
|
213
|
+
|
|
214
|
+
헬퍼는 다음 순서로 페이지 제목을 추출합니다:
|
|
215
|
+
1. Frontmatter `title` 필드
|
|
216
|
+
2. 파일의 첫 번째 `#` 헤딩
|
|
217
|
+
3. Title Case로 변환된 파일명
|
|
218
|
+
|
|
219
|
+
Frontmatter 예제:
|
|
220
|
+
```yaml
|
|
221
|
+
---
|
|
222
|
+
title: Getting Started
|
|
223
|
+
---
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 기본 번역
|
|
227
|
+
|
|
228
|
+
일반적인 로케일에 대한 내장 번역이 제공됩니다:
|
|
229
|
+
|
|
230
|
+
| 로케일 | 레이블 | 문서 푸터 | 목차 |
|
|
231
|
+
|--------|-------|------------|---------|
|
|
232
|
+
| ko | 한국어 | 이전/다음 페이지 | 목차 |
|
|
233
|
+
| ja | 日本語 | 前/次のページ | 目次 |
|
|
234
|
+
| zh | 中文 | 上/下一页 | 目录 |
|
|
235
|
+
|
|
236
|
+
## 워크플로우
|
|
237
|
+
|
|
238
|
+
다국어 문서화를 위한 일반적인 워크플로우:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# 1. Write documentation in English
|
|
242
|
+
docs/
|
|
243
|
+
guide/
|
|
244
|
+
getting-started.md
|
|
245
|
+
configuration.md
|
|
246
|
+
api/
|
|
247
|
+
index.md
|
|
248
|
+
|
|
249
|
+
# 2. Translate to Korean
|
|
250
|
+
llm-translate dir ./docs ./docs/ko --target-lang ko --glossary glossary.json
|
|
251
|
+
|
|
252
|
+
# 3. Update VitePress config to use auto-generation
|
|
253
|
+
# (see examples above)
|
|
254
|
+
|
|
255
|
+
# 4. Build and preview
|
|
256
|
+
npm run docs:build
|
|
257
|
+
npm run docs:preview
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 주의사항
|
|
261
|
+
|
|
262
|
+
- **절대 경로 사용**: 기본 사용법에서 보여준 것처럼 항상 `import.meta.url` 를 사용하여 docs 디렉토리 경로를 해석하십시오. VitePress가 프로젝트 루트에서 실행되므로 상대 경로는 올바르게 작동하지 않을 수 있습니다.
|
|
263
|
+
- 로케일 디렉토리는 2글자 코드를 사용해야 합니다(예:`ko `,` ja `,` zh`)
|
|
264
|
+
- 헬퍼는 번역된 문서가 소스 구조를 미러링한다고 가정합니다
|
|
265
|
+
- 사용자 정의 nav 항목(외부 링크, 드롭다운)은 수동 구성이 필요합니다
|
package/docs/ko/index.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: home
|
|
3
|
+
|
|
4
|
+
hero:
|
|
5
|
+
name: llm-translate
|
|
6
|
+
text: LLM 기반 문서 번역
|
|
7
|
+
tagline: 용어집 적용, 품질 관리, 비용 최적화를 통한 문서 번역
|
|
8
|
+
actions:
|
|
9
|
+
- theme: brand
|
|
10
|
+
text: 시작하기
|
|
11
|
+
link: ./guide/getting-started
|
|
12
|
+
- theme: alt
|
|
13
|
+
text: GitHub에서 보기
|
|
14
|
+
link: https://github.com/selenehyun/llm-translate
|
|
15
|
+
|
|
16
|
+
features:
|
|
17
|
+
- icon: 📚
|
|
18
|
+
title: 용어집 적용
|
|
19
|
+
details: 잘못 번역되지 않는 강제 용어집 용어를 통해 번역 전반에 걸쳐 일관된 용어를 보장합니다.
|
|
20
|
+
- icon: 🔄
|
|
21
|
+
title: Self-Refine 품질 관리
|
|
22
|
+
details: AI 기반 품질 평가를 사용한 반복적 번역 개선으로 품질 임계값을 충족합니다.
|
|
23
|
+
- icon: 💰
|
|
24
|
+
title: 비용 최적화
|
|
25
|
+
details: 프롬프트 캐싱으로 용어집 및 시스템 프롬프트와 같은 반복 콘텐츠에 대한 API 비용을 최대 90%까지 절감합니다.
|
|
26
|
+
- icon: 🔌
|
|
27
|
+
title: 다중 제공자 지원
|
|
28
|
+
details: Claude, OpenAI, Ollama와 함께 작동합니다. 워크플로우를 변경하지 않고도 제공자를 전환할 수 있습니다.
|
|
29
|
+
- icon: 📄
|
|
30
|
+
title: 형식 보존
|
|
31
|
+
details: 번역 중에 Markdown 형식, 코드 블록, 링크 및 문서 구조를 유지합니다.
|
|
32
|
+
- icon: ⚡
|
|
33
|
+
title: 일괄 처리
|
|
34
|
+
details: 병렬 처리 및 진행률 추적으로 전체 디렉토리를 번역합니다.
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 빠른 시작
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Install globally
|
|
41
|
+
npm install -g @llm-translate/cli
|
|
42
|
+
|
|
43
|
+
# Set your API key
|
|
44
|
+
export ANTHROPIC_API_KEY=your-key-here
|
|
45
|
+
|
|
46
|
+
# Translate a file
|
|
47
|
+
llm-translate file README.md -o README.ko.md --target ko
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 왜 llm-translate인가요?
|
|
51
|
+
|
|
52
|
+
기존 번역 도구는 기술 문서에서 어려움을 겪습니다:
|
|
53
|
+
|
|
54
|
+
- **일관성 없는 용어** - "API endpoint"가 매번 다르게 번역됨
|
|
55
|
+
- **깨진 형식** - 코드 블록과 Markdown이 손상됨
|
|
56
|
+
- **품질 관리 없음** - LLM이 출력하는 것을 그대로 수용
|
|
57
|
+
|
|
58
|
+
llm-translate는 다음과 같이 이러한 문제를 해결합니다:
|